数据库系统,SQL语句

上课讲得太烂还得自己看自己总结

前置简单知识

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后面的值

posted @ 2024-04-05 13:26  lei_yu  阅读(8)  评论(0编辑  收藏  举报