本文参考 CMU数据库神课 15-445 中的SQL语法讲解部分
SQL数据定义
create table department ( dept_name varchar(20), building varchar(20), budget numeric(12, 2), primary key (dept_name) );
可以指定not null 外码等等。
删除表
.drop department
删除表中的内容
.delete department
增加一个空列
alter table r add A D;
A attribute
D domain
从关系中删除属性
alter tabel r drop A;
SQL基本结构
select from where基本类型
distinct关键字或者函数可以去重。
all 关键字显式指明不去重
SQL查询的子句实际顺序
尽管子句必须以select from where的次序写出,但理解查询代表的运算最容易的方法是一运算次序来观察子句,首先是from,然后是where 最后是select
FROM定义了多个关系的笛卡尔积,或者可以理解为一个迭代(多重循环) ,这个过程中产生了组合的元组,并且使用where来限制创建笛卡尔积的组合,选取有意义的元组。where的条件被称为谓词。
附加的基本运算
更名运算 AS
as后会被当做一个拷贝,在同一个关系的内部操作时很有用
字符串运算
字符串使用单引号, 需要在内部使用的时候用两次
比较运算对大小写敏感(不同软件不同)
|| 拼接
substr 子串
upper
lower
trim去除后面的空格
like结合 % 任意长度子串, _下划线,任意一个字符 like语法对大小写敏感, 还可以使用not like
排列元组显示次序
order by attribute asc升序, desc降序
where 子句
可以结合between使用, between a and b 寻找ab之间的值。 还可以 not between
还可以使用(v1,v2,v3)这种行构造器来进行元组比较
集合运算
或运算 union, 可以直接使用()自动去重, 或者union all 保留重复项
与运算 intersect 会自动去重
非运算 except 会自动去重 想保留的话可以使用except all
空值
运算任一项为空,结果也为空。
为了判断空 可以使用 a is null 来判断,不要使用=
null的布尔运算会成unknow 这是使用 is unknown来判断
聚集函数
avg
min
max
sum
count
sum和avg必须对数组计算
基本聚集与分组聚集
有基本聚集,在整个表上进行聚集,还可以先分组再聚集。
任何没出现在group by的属性,只能出现在select的聚集函数中,不能直接选中
having子句
having子句对分组限制条件, where是对元组的限制条件。
from where group having 聚集函数 select的计算次序(重点)
- from计算关系
- 如果有where,where计算满足关系的元组
- 如果有group by 对满足2的分组
- 如果有having,应用到每个分组上
- select利用通过4的分组产生查询的元组,即这一步会在分组上调用聚集函数得到元组