上课讲得太烂还得自己看自己总结
前置简单知识
sql中的变量类型
- char(n)
- varchar(n)
- int
- smallint
- numeric(p,d) 小数点前p位后d位
- real , double precision 浮点数
- float(n) 精度至少n位浮点数
varchar 和 char 比较可能有问题
创建表(定义关系)
create table department
(dept_name varchar(20),
ID primary key varchar(20)
<完整性约束>
)
完整性约束包括:
primary key (A1,A2,A3,...), 通常不重复,一定not null
foreign key (A1,...)reference s, 表明A1,... 列中元素必须来自于表s的同名主码
更改表
alter table <tablename> add <待添加属性名称> <属性类型>
alter table <tablename> drop <属性名称>
drop table r 删除表
delete (*可以省) from r 删除所有元组
查询
注意,查询select from where 类似于:
for i=from1
for j=form2
...
tmp=i x j
if(where(tmp))
add select(tmp)
默认不去重
去重要用 select distinct
as
as用作给别名
select student as S
like
模糊匹配like,用作匹配字符串
%表示任意个字符,_表示一个字符
更多的可见https://www.runoob.com/sql/sql-like.html
order by
在where后面加order by name,最后结果按照name排序
加一个 desc 表明降序,asc 表明升序
可以用,链接过个关键字,越往前关键字优先级越高
如:
order by salary desc,name asc;
between l and r
就是在\([l,r]\)里面
(a1,a2)<(b1,b2) -> a1<a2 and b1<b2
集合运算
union intersect except
并(会去重,保留重复使用union all)
交(去重,保留重复用intersect all)
差(同前面)
not exsit + A except B 可以用来表示包含关系
null
null运算没有肯定结果时为unknown,unknown不会被select
肯定结果如 T or null = true
注意:
- (A,null) 和 (A,null) 在 select distinct中会被去重
- null != null
group by
group by(A1,A2,...)运算,把所有属性相同的分为一组
有group by 时,select 中出现的只能是group by 后面出现的列(聚集函数的参数除外)
主要作用是使用如下的聚集函数
- avg
- min, max
- sum
- count
以每个group为一个单位进行计算,没有group by直接使用这些函数时,默认每一个元组就是一个group
having语句
用于限定每一个group的条件,出现的也只能是group by中出现的列(聚集函数参数除外)
空值处理
没看,见P97
嵌套子查询,集合操作
in
在一个集合里面,当然也有not in
注意in 前后要对应,前面是ID 后面就是一组 ID
也可以: name in ('Mozart','Einstein')
还可以 (name,year) in (select name,year from ...)
some/all (集合)
用于> < = 等等
注意本质是枚举集合内的元素,some就是有一个满足条件即可,all是每一个都满足条件 所以= all (>=2个元素) 一定为false
exsits
测试里面有没有元组,也有not exsits
unique
测试里面有没有重复元组,当然也有not unique
lateral
from instructor as I1, (select * from where I1 ...)是不行的,from中子查询不能使用同一句from中前面定义的东西。
使用lateral可以解决这一问题,
lateral(select * from where I1...)即可
with
语法:
with 临时表名称(临时表列A1,A2,...)as
(
select... 或者其他产生一个表的方式
),
临时表2(....)...
select
from
标量子查询
就是说子查询可以出现在任何需要单个值的表达式出现的地方,例如在select where having 中都可以出现
什么
select (select count(*) from instructor where department.name=instructor.name)
from department
都是可以的
修改
删除
delete from 表
where ...
插入
insert into course
value(.....)//按顺序
insert into course(A1,A2,A3,...)
value(v1,v2,v3,... )
insert into course
select ID,name,...
from
where...
更新
update 表
set salary = salary*1.05
where ...
在更新时使用case:
set salary = salary*case
when d1 then r1
when d2 then r2
else r3
就是case返回某一个then后面的值
标签:语句,...,group,name,SQL,数据库系统,null,where,select From: https://www.cnblogs.com/lytql/p/18076935