数据库SQL语句期末总复习

x33g5p2x  于2021-12-13 转载在 其他  
字(7.7k)|赞(0)|评价(0)|浏览(571)

SQL的分类

DDL数据定义语言

数据库的定义与撤销

  1. -- 创建数据库
  2. create database <数据库名>;
  3. -- 删除数据库
  4. drop database <数据库名>;

基本表的定义与维护

约束条件(Constraint):

  • not null(非空约束):约束的字段不允许出现空值
  • unique(唯一约束):约束的字段不允许重复
  • primary key(主键约束):用于定义表的主键,起唯一标识作用
  • foreign key(外键约束):用于定义表的外键,建立两张表之间的联系
    foreign key (<列名>) references <主表名>(<列名>)
  • check(检查约束):用来约束检查字段值所允许的范围
    在多个字段上定义的check约束必须为表级约束
    格式:check (<条件>)
  1. -- 创建表
  2. create table <表名> on (<列名> <数据类型> <约束条件>,
  3. <列名> <数据类型> <约束条件>,
  4. <列名> <数据类型> <约束条件>);
  5. -- 删除表
  6. drop table <表名> [cascade|restrict]
  7. -- cascade(默认):在删除表时,表中的数据、表本身以及在该表上建立的索引和视图全部删除
  8. -- restrict:只有在清空表中的记录以及表上的索引和视图,才能执行删除表操作
  9. -- 修改表结构
  10. -- 添加新列
  11. alter table <表名> add [<新列名> <数据类型> <约束条件>, ...];
  12. -- 删除列
  13. alter table <表名> drop <列名> [cascade|restrict];
  14. -- 添加约束
  15. alter table <表名> add constraint <约束名> <约束条件>;
  16. -- 删除约束
  17. alter table <表名> drop constraint <约束名>;
  18. -- 修改列
  19. alter table <表名> alter column <列名> <数据类型>;

列级约束和表级约束
在单个字段上定义的约束使用列级约束
在多个字段上定义的约束必须使用表级约束
注意:not null只有列级约束没有表级约束

  1. create table t_user(
  2. userId int primary key, --列级约束
  3. userName char(6),
  4. userAge int not null, -- 列级约束
  5. userTel char(11),
  6. unique(userName,userTel) -- 表级约束
  7. );

索引的建立与删除

索引的分类:

  • unique(唯一索引)
  • clustered(聚集索引)
  • nonclustered(非聚集索引)
  • 复合索引
  1. -- 创建索引
  2. create <索引类型> index <索引名> on <表名>(<列名>[asc|desc],<列名>[asc|desc], ...);
  3. -- 删除索引
  4. drop index <索引名> on <表名>;
  5. -- 索引可以建立在单列或者多列上,格列之间用逗号隔开
  6. --
  7. create unique index xxx on t_user(userId asc,userAge desc); //sc(默认)升序 desc降序

DQL数据查询语言

单表查询

  1. -- 查询表中所有数据
  2. select * from <表名>;
  3. -- 查询指定列
  4. select [<列名>,<列名>, ...] from <表名>;
  5. -- 案例:找出所有零件的名称及重量
  6. select PNAME,WEIGHT from P;
  7. -- 条件查询 where关键字
  8. select <列名> from <表名> where <条件>;
  9. -- 案例:供应工程J1零件P1的的供应商号码SNO
  10. select distinct SNO from SPJ where JNO='J1' and PNO='P1'
  11. --去除重复记录 distinct关键字
  12. select distinct <列名> from <表名>; //注意:distinct只能放在第一个列名前面
  13. --案例:供应工程J1零件的供应商号码SNO
  14. select distinct SNO from SPJ where JNO='J1'

常用的查询条件

运算符说明
=,<>或!=,<,<=,>,>=等于,不等于,小于,小于等于,大于,大于等于
between … and …两个值之间,等同于>=and<=
is null为null(is not null不为空)
and并且
or或者
in包含,相当于多个or(not in不在这个范围中)
like模糊查询 ‘%’ 相当于多个字符 ‘_’ 相当于一个字符

查询结果排序

  1. -- 查询结果按升序排 order by关键字
  2. select [<列名>, ...] from <表名> order by <列名> asc;
  3. -- 查询结果按降序排
  4. select [<列名>, ...] from <表名> order by <列名> desc;
  5. -- 案例:对所有已选课的学生按学号进行升序排列,同时要求每个学生按成绩降序排列
  6. select * from SC order by Sno,Grade desc

分组查询

分组函数(多行处理函数)

函数功能
count计数
sum求和
avg平均值
max最大值
min最小值

分组函数自动忽略null
count()与count(<字段>)的区别:
count(
):不是统计某个字段的记录条数,而是统计总记录条数
count(<字段>):统计该字段中不为null的记录条数

  1. -- group by having
  2. -- group by:按照某个字段或者某些字段分组
  3. -- having:having是对分组之后的数据进行再次过滤
  4. select <列名xxx>,<分组函数> from <表名> group by <列名xxx>;
  5. -- 案例:统计每门课程的选课人数
  6. select Cno,COUNT(*)as '选课人数' from SC group by Cno

当sql语句中有group by的话,select后面只能跟分组函数和参与分组的字段
分组函数(count、sum、avg、max、min)都是在group by语句执行结束后才会执行的
where后面不能使用分组函数

  1. -- 错误案例
  2. select avg(sal) from emp where avg(sal)>2900 group by deptno; //错误,原因是where的执行顺序大于group by这种情况只能用having过滤
  3. -- 一条完整的sql语句的执行顺序
  4. select ... 5
  5. from ... 1
  6. where ... 2
  7. group by ... 3
  8. having ... 4
  9. order by ... 6 //数字越小表示越早执行

连接查询

  1. --内连接之等值连接
  2. select [<别名.列名>,<别名.列名>,...]
  3. from <表名> <别名>
  4. inner join <表名> <别名> //inner可以省略
  5. on <别名.列名> = <别名.列名>
  6. where <条件>;
  7. -- 案例:求供应数量超过300的供应信息,包括供应商名,零件名,项目名和供应数量。
  8. select S.SNAME,P.PNAME,J.JNAME,SPJ.QTY
  9. from SPJ
  10. join S
  11. on SPJ.SNO=S.SNO
  12. join J
  13. on SPJ.JNO=J.JNO
  14. join P
  15. on SPJ.PNO=P.PNO
  16. where SPJ.QTY>300;
  17. --内连接之非等值连接
  18. select [<别名.列名>,<别名.列名>,...]
  19. from <表名> <别名>
  20. inner join <表名> <别名> //inner可以省略
  21. on <表名.列名> between <表名.列名> and <表名.列名>;
  22. --内连接之自身连接(将一张表看作两张表)
  23. -- 案例:查询每一门的课程的间接先修课程
  24. select C1.Cname,C2.Cpno as '间接先修课程'
  25. from Course C1
  26. join Course C2
  27. on C1.Cpno=C2.Cno
  28. --外连接
  29. select [<别名.列名>,<别名.列名>,...]
  30. from <表名> <别名>
  31. [left|right] outer join <表名> <别名> //outer可以省略
  32. on <别名.列名> = <别名.列名> //left左外连接right右外连接
  33. where <条件>;
  34. -- 案例:查询所有的学生的选课情况,要求没有选课的情况也能在结果显示出来
  35. select Student.Sname,SC.Cno
  36. from SC
  37. right outer join Student
  38. on SC.Sno=Student.Sno

给表取别名有什么好处?
1、执行效率高
2、可读性好

嵌套查询

  1. -- 嵌套查询(子查询)可以出现在哪?
  2. --子查询可以出现在selectfromwherehaving后面
  3. select
  4. ...(select...)
  5. from
  6. ...(select...)
  7. where
  8. ...(select...)
  9. -- where子句中使用子查询
  10. select * from emp where sal > //父查询/外层查询
  11. (select avg(sal) from emp); //子查询/内层查询
  12. --from子句种使用子查询
  13. select t.*,s.grade from
  14. (select deptno,avg(sal) as avgsal from emp group by deptno) t //子查询/内层查询
  15. join salgrade s
  16. on t.avgsal between s.losal and s.hisal;
  17. -- select子句中使用子查询
  18. select e.ename,
  19. (select d.dname from dept d where e.deptno=d.deptno) as dname //子查询/内层查询
  20. from emp e;

集合查询

  • union 并集运算
  • intersect 交集运算
  • except 差集运算
  1. -- union将查询结果合并起来,系统会自动去掉重复记录 如果需要保留重复记录可以使用union all
  2. select * from Doctor where Department='内科'
  3. union
  4. select * from Dactor where Title='主任医师'
  5. -- intersect返回多条查询语句中都包含的重复数据
  6. select dId from Doctor where Department='呼吸科'
  7. intersect
  8. select dId from CureFee
  9. --except比较左右两个查询结果的差集,并从左侧的查询结果中返回在右侧查询结果中找不到的数据
  10. select dId from Doctor where Department='呼吸科'
  11. except
  12. select dId from CureFee

DML数据操作语言

插入数据

  1. -- 插入数据 insert into valuesu关键字
  2. -- 插入一条数据 注意:未指定属性列 插入的列值数据顺序应严格按照表中各列定义的顺序
  3. insert into <表名> values (<列值1>,<列值2>,<列值3>,...) //未指定属性列
  4. insert into <表名>(<列名1>,<列名2>) values(<列值1>,<列值2>) //指定属性列
  5. -- 插入多条数据
  6. insert into <表名> values (<列值1>,<列值2>,<列值3>,...),
  7. (<列值1>,<列值2>,<列值3>,...),
  8. (<列值1>,<列值2>,<列值3>,...),
  9. (<列值1>,<列值2>,<列值3>,...)

更新数据

  1. -- 更新数据 update set关键字
  2. update <表名|视图名> set <列名>=<列值> where <条件>; //如果省略where将会修改表中的所有数据
  3. --案例:把全部红色零件的颜色改成蓝色
  4. update P set COLOR='蓝' where COLOR='红';
  5. -- 带子查询的修改语句
  6. -- 案例:将所有CS系的成绩不及格学生的成绩加5
  7. update SC set Grade=Grade+5 where Sno in (select Sno from Student where Sdept='cs')

删除数据

delete和truncate的区别

  • truncate删除数据的速度比delete快
  • delete删除数据可回滚,truncate删除数据不可回滚
  1. --删除数据 delete关键字
  2. delete from <表名> where <条件>
  3. -- 删除全部数据 truncate关键字
  4. truncate table <表名> //谨用,最好别用

视图

视图的定义与删除

  1. -- 创建视图
  2. create view <视图名> as <子查询> [with check option]
  3. -- 删除视图
  4. drop view <视图名>
  5. -- 修改视图
  6. alter view <视图名> as <子查询> [with check option]

with check option:当对视图进行update、insert和delete操作时,要保证更新、插入或删除的行满足视图定义中的子查询的条件。

查询视图

通过视图检索数据时,对查询语句几乎没有什么限制,但在修改数据时却存在这较多的限制

  1. -- 视图查询语法与表查询相同
  2. select * from <视图名>

更新视图

1、如果视图带有with check option那么在进行数据更新的时候操作的数据必须满足子查询的条件
2、不能再使用了distinct、group by、having语句的视图上插入数据

  1. -- 插入数据(与基本表插入数据用法相同)
  2. insert into <视图名> values(<列值1>,<列值2>,<列值3>,...)
  3. -- 修改数据(与基本表修改数据用法相同)
  4. update <视图名> set [<列名1>=<列值1>,<列名2>=<列值2>...] where <条件>
  5. --删除数据
  6. delete from <视图名> where <条件> //如果视图建立再多张表上不允许删除

TCL (不考)

  • 什么事务?
    一个事务是一个完整的业务逻辑单元,不可再分
  • 事务的四大特性ACID
    原子性:事务是最小的工作单元,不可再分
    一致性:事务必须保证多条DML语句同时成功或者失败
    隔离性:事务A与事务B之间存在隔离性
    持久性:将数据持久化到硬盘事务才算成功结束
  • 事务的隔离级别
    第一级别:读未提交(read uncommitted)
    第二级别:读已提交(read committed)
    第三级别:可重复读(repeatable read)
    第四级别:串行化读(serializable)
    SqlServer默认第二级别
    MySql默认第三级别
  1. -- 设置事务隔离级别
  2. set global transaction isolation level <隔离级别> //这是Mysql中的设置方式
  3. set transaction isolation level <隔离级别> //这是sqlServer中的设置方式
  4. --设置第一级别
  5. set global transaction isolation level read uncommitted
  6. --设置第四级别
  7. set global transaction isolation level serializable
  8. --查看隔离级别
  9. select @@global.tx_isolation; //这是Mysql中的查看方式
  10. dbcc useroptions; //这是sqlServer中的查看方式
  11. -- 关闭事务自动提交
  12. set autocommit = 0; //mysql
  13. start transaction; //mysql
  14. begin transaction; //sqlserver
  15. -- 提交事务
  16. commit;
  17. --回滚事务
  18. rollback;

DCL(不考)

常用数据对象权限

  • all: 所有可用的权限
  • create: 创建库、表和索引
  • lock_tables: 锁定表
  • alter: 修改表
  • delete: 删除表
  • insert: 插入表或列
  • select: 检索表或列的数据
  • create_view: 创建视图
  • show_databases: 列出数据库
  • drop: 删除库、表和视图
  1. -- 以下这些都是关于mysql用户权限设置的 sqlserver的请点文章末尾链接
  2. --创建mysql用户
  3. create user '<用户名>'@'localhost' identified by '<密码>';
  4. create user 'myuser'@'localhost' identified by 'mypassword';
  5. -- 查看用户在否存在
  6. select host, user, password from mysql.user where user='<用户名>';
  7. -- 设置用户权限
  8. grant [<权限1>,<权限2>,...] on <数据库名>.<表名> to '<用户名>'@'localhost';
  9. -- myuser赋予对whynodet_user表的插入和查询操作
  10. grant select,insert on whynode.t_user to 'myuser'@'localhost';
  11. -- myuser赋予所有库所有表的所有权限
  12. grant all ON *.* TO 'myuser'@'localhost';
  13. -- 查看用户权限
  14. show grants for 'myuser'@'localhost';
  15. -- 撤销用户权限
  16. revoke [<权限1>,<权限2>,...] on <数据库名>.<表名> from '<用户名>'@'localhost';
  17. revoke insert on whynode.t_user from 'myuser'@'localhost';
  18. -- 刷新权限
  19. flush privileges

相关文章