数据库SQL语句期末总复习

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

SQL的分类

DDL数据定义语言

数据库的定义与撤销

-- 创建数据库
create database <数据库名>;
-- 删除数据库
drop database <数据库名>;

基本表的定义与维护

约束条件(Constraint):

  • not null(非空约束):约束的字段不允许出现空值
  • unique(唯一约束):约束的字段不允许重复
  • primary key(主键约束):用于定义表的主键,起唯一标识作用
  • foreign key(外键约束):用于定义表的外键,建立两张表之间的联系
    foreign key (<列名>) references <主表名>(<列名>)
  • check(检查约束):用来约束检查字段值所允许的范围
    在多个字段上定义的check约束必须为表级约束
    格式:check (<条件>)
-- 创建表
create table <表名> on (<列名> <数据类型> <约束条件>,
	                   <列名> <数据类型> <约束条件>,
	                   <列名> <数据类型> <约束条件>);

-- 删除表
drop table <表名> [cascade|restrict]
-- cascade(默认):在删除表时,表中的数据、表本身以及在该表上建立的索引和视图全部删除
-- restrict:只有在清空表中的记录以及表上的索引和视图,才能执行删除表操作

-- 修改表结构
-- 添加新列
alter table <表名> add [<新列名> <数据类型> <约束条件>, ...];
-- 删除列
alter table <表名> drop <列名> [cascade|restrict];
-- 添加约束
alter table <表名> add constraint <约束名> <约束条件>;
-- 删除约束
alter table <表名> drop constraint <约束名>;
-- 修改列
alter table <表名> alter column <列名> <数据类型>;

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

create table t_user(
	userId int primary key, --列级约束
	userName char(6),
	userAge int not null, -- 列级约束
	userTel char(11),
	unique(userName,userTel) -- 表级约束
);

索引的建立与删除

索引的分类:

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

DQL数据查询语言

单表查询

-- 查询表中所有数据
select * from <表名>;

-- 查询指定列
select [<列名>,<列名>, ...] from <表名>;
-- 案例:找出所有零件的名称及重量
select PNAME,WEIGHT from P;

-- 条件查询 where关键字
select <列名> from <表名> where <条件>;
-- 案例:供应工程J1零件P1的的供应商号码SNO
select distinct SNO from SPJ where JNO='J1' and PNO='P1'

--去除重复记录 distinct关键字
select distinct <列名> from <表名>; //注意:distinct只能放在第一个列名前面
--案例:供应工程J1零件的供应商号码SNO
select distinct SNO from SPJ where JNO='J1'

常用的查询条件

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

查询结果排序

-- 查询结果按升序排 order by关键字
select [<列名>, ...] from <表名> order by <列名> asc;
-- 查询结果按降序排
select [<列名>, ...] from <表名> order by <列名> desc;

-- 案例:对所有已选课的学生按学号进行升序排列,同时要求每个学生按成绩降序排列
select * from SC order by Sno,Grade desc

分组查询

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

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

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

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

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

-- 错误案例
select avg(sal) from emp where avg(sal)>2900 group by deptno; //错误,原因是where的执行顺序大于group by这种情况只能用having过滤

-- 一条完整的sql语句的执行顺序
select ...    5
from ...      1
where ...     2
group by ...  3
having ...    4
order by ...  6 //数字越小表示越早执行

连接查询

--内连接之等值连接
select [<别名.列名>,<别名.列名>,...] 
from <表名> <别名> 
inner join <表名> <别名>             //inner可以省略 
on <别名.列名> = <别名.列名> 
where <条件>;
-- 案例:求供应数量超过300的供应信息,包括供应商名,零件名,项目名和供应数量。
   select S.SNAME,P.PNAME,J.JNAME,SPJ.QTY 
   from SPJ 
   join S 
   on SPJ.SNO=S.SNO 
   join J 
   on SPJ.JNO=J.JNO 
   join P 
   on SPJ.PNO=P.PNO
   where SPJ.QTY>300;

--内连接之非等值连接
select [<别名.列名>,<别名.列名>,...]
from <表名> <别名>
inner join <表名> <别名>             //inner可以省略
on <表名.列名> between <表名.列名> and <表名.列名>;

--内连接之自身连接(将一张表看作两张表)
-- 案例:查询每一门的课程的间接先修课程
   select C1.Cname,C2.Cpno as '间接先修课程' 
   from Course C1
   join Course C2 
   on C1.Cpno=C2.Cno

--外连接
select [<别名.列名>,<别名.列名>,...] 
from <表名> <别名> 
[left|right] outer join <表名> <别名>             //outer可以省略 
on <别名.列名> = <别名.列名> 						 //left左外连接right右外连接
where <条件>;
-- 案例:查询所有的学生的选课情况,要求没有选课的情况也能在结果显示出来
   select Student.Sname,SC.Cno 
   from SC 
   right outer join Student 
   on SC.Sno=Student.Sno

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

嵌套查询

-- 嵌套查询(子查询)可以出现在哪?
--子查询可以出现在select、from、where、having后面
select
...(select...)
from
...(select...)
where
...(select...)

-- where子句中使用子查询
select * from emp where sal >      //父查询/外层查询
(select avg(sal) from emp);        //子查询/内层查询

--from子句种使用子查询
select t.*,s.grade from
(select deptno,avg(sal) as avgsal from emp group by deptno) t	//子查询/内层查询
join salgrade s
on t.avgsal between s.losal and s.hisal;

-- select子句中使用子查询
select e.ename,
(select d.dname from dept d where e.deptno=d.deptno) as dname	//子查询/内层查询
from emp e;

集合查询

  • union 并集运算
  • intersect 交集运算
  • except 差集运算
-- union将查询结果合并起来,系统会自动去掉重复记录 如果需要保留重复记录可以使用union all
select * from Doctor where Department='内科'
union
select * from Dactor where Title='主任医师'

-- intersect返回多条查询语句中都包含的重复数据
select dId from Doctor where Department='呼吸科'
intersect
select dId from CureFee;

--except比较左右两个查询结果的差集,并从左侧的查询结果中返回在右侧查询结果中找不到的数据
select dId from Doctor where Department='呼吸科'
except
select dId from CureFee

DML数据操作语言

插入数据

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

更新数据

-- 更新数据 update set关键字
update <表名|视图名> set <列名>=<列值> where <条件>;  //如果省略where将会修改表中的所有数据
--案例:把全部红色零件的颜色改成蓝色
update P set COLOR='蓝' where COLOR='红';

-- 带子查询的修改语句
-- 案例:将所有CS系的成绩不及格学生的成绩加5分
update SC set Grade=Grade+5 where Sno in (select Sno from Student where Sdept='cs')

删除数据

delete和truncate的区别

  • truncate删除数据的速度比delete快
  • delete删除数据可回滚,truncate删除数据不可回滚
--删除数据 delete关键字
delete from <表名> where <条件>

-- 删除全部数据 truncate关键字
truncate table <表名>  //谨用,最好别用

视图

视图的定义与删除

-- 创建视图
create view <视图名> as <子查询> [with check option] 

-- 删除视图
drop view <视图名>

-- 修改视图
alter view <视图名> as <子查询> [with check option]

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

查询视图

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

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

更新视图

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

-- 插入数据(与基本表插入数据用法相同)
insert into <视图名> values(<列值1>,<列值2>,<列值3>,...)

-- 修改数据(与基本表修改数据用法相同)
update <视图名> set [<列名1>=<列值1>,<列名2>=<列值2>...] where <条件>

--删除数据
delete from <视图名> where <条件> //如果视图建立再多张表上不允许删除

TCL (不考)

  • 什么事务?
    一个事务是一个完整的业务逻辑单元,不可再分
  • 事务的四大特性ACID
    原子性:事务是最小的工作单元,不可再分
    一致性:事务必须保证多条DML语句同时成功或者失败
    隔离性:事务A与事务B之间存在隔离性
    持久性:将数据持久化到硬盘事务才算成功结束
  • 事务的隔离级别
    第一级别:读未提交(read uncommitted)
    第二级别:读已提交(read committed)
    第三级别:可重复读(repeatable read)
    第四级别:串行化读(serializable)
    SqlServer默认第二级别
    MySql默认第三级别
-- 设置事务隔离级别
set global transaction isolation level <隔离级别> //这是Mysql中的设置方式
set transaction isolation level <隔离级别>        //这是sqlServer中的设置方式

--设置第一级别
set global transaction isolation level read uncommitted
--设置第四级别
set global transaction isolation level serializable

--查看隔离级别 
select @@global.tx_isolation; //这是Mysql中的查看方式
dbcc useroptions;             //这是sqlServer中的查看方式

-- 关闭事务自动提交
set autocommit = 0; //mysql
start transaction;  //mysql
begin transaction;  //sqlserver

-- 提交事务
commit;

--回滚事务
rollback;

DCL(不考)

常用数据对象权限

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

相关文章