数据库SQL语句期末总复习
SQL语句的分类DDL(数据定义语言):create、drop、alter对表结构进行增删改DQL(数据查询语言):select查询语句DML(数据操作语言):insert、delete、update对表中数据进行增删改DCL(数据控制语言):grant、revoke授权与撤销授权TCL(事务控制语言):commit、rollback提交事务与回滚事务DDL数据定义语言-- 创建数据库create
文章目录
SQL的分类
- SQL语句的分类
DDL(数据定义语言):create、drop、alter对表结构进行增删改
DQL(数据查询语言):select查询语句
DML(数据操作语言):insert、delete、update对表中数据进行增删改
DCL(数据控制语言):grant、revoke授权与撤销授权
TCL(事务控制语言):commit、rollback提交事务与回滚事务
DDL数据定义语言
数据库的定义与撤销
-- 创建数据库
create database <数据库名>;
-- 删除数据库
drop database <数据库名>;
基本表的定义与维护
约束条件(Constraint):
- not null(非空约束):约束的字段不允许出现空值
- unique(唯一约束):约束的字段不允许重复
- primary key(主键约束):用于定义表的主键,起唯一标识作用
- foreign key(外键约束):用于定义表的外键,建立两张表之间的联系
foreign key (<列名>) references <主表名>(<列名>) - check(检查约束):用来约束检查字段值所允许的范围
在多个字段上定义的check约束必须为表级约束
格式:check (<条件>)
-- 创建表
create table <表名> (<列名> <数据类型> <约束条件>,
<列名> <数据类型> <约束条件>,
<列名> <数据类型> <约束条件>);
-- 删除表
drop table <表名> [cascade|restrict]
-- cascade(默认):在删除表时,表中的数据、表本身以及在该表上建立的索引和视图全部删除
-- restrict:只有在清空表中的记录以及表上的索引和视图,才能执行删除表操作
-- 修改表结构
-- 添加新列
alter table <表名> add [<新列名> <数据类型> <约束条件>, ...];
-- 删除列
alter table <表名> drop column <列名> [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 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
更多推荐
所有评论(0)