SQL有以下七部分:
- 数据定义语言(DDL):SQL DDL提供定义关系模式,删除关系以及修改关系模式的命令
- 数据操纵语言(DML):SQL DNL提供从数据库中查询信息,以及在数据库中插入元组,删除元组,修改元组的能力
- 完整性:SQL DDL包括定义完整约束的命令
- 视图定义
- 事务控制
- 嵌入式SQL和动态SQL
- 授权
SQL数据定义
数据中的关系集合必须由数据定义语言(DDL)指定给系统。SQL的DDL不仅能够定义一组关系,还能定义每个关系(关系即表)的信息,包括:
- 每个关系的模式
- 每个属性的取值范围
- 完整性约束
- 每个关系维护的索引集合
- 每个关系的安全性和权限信息
- 每个关系在磁盘上的物理存储结构
SQL中的完整性约束
- primary key(属性1,属性2,属性3……):声明表示属性1,属性2,属性3等构成关系的主码**,主码属性必须非空且唯一**,也就是说没有一个元组在主码属性上取空值
- forelgn key(属性1,属性2,属性3……)references:表示关系中任意元组在属性1,属性2,属性3等上的取值必须对应关系s中某元组在主码属性上的取值(通俗来讲,就是某个表的外键属性是另外一个表的主键)
- not null:一个属性上的not null约束表明在该属性上不允许控制,此约束把空值排除在该属性域之外
drop table r和delete from r
如果想要从SQL数据库中去掉一个关系,我们可以使用命令drop table,drop table命令从数据库中删除关于被去掉关系的所有信息,相比较delete from r,后者保留关系r,但删除r中的所有元组,前者不仅删除r的所有元组,还删除r的模式
SQL查询的含义
- 为from子句中列出的关系产生笛卡儿乘积
- 在步骤1的结果上应用where子句中指定的谓词
- 对于步骤2结果中的每个元组,输出select子句中指定的属性
自然连接
自然连接运算作用于两个关系,并产生一个关系作为结果。不同于两个关系上的笛卡儿乘积,它将第一个关系的每个元组域第二关系的所有元组都进行连接;自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元组对
观察下面的语句:
->select name,cource_id
->from instructor,teachers
->where instructor.ID=teachers.ID;
->select name,cource_id
->from instructor natural join teaches;
以上两个查询产生相同的结果
自然连接运算的结果是关系。从概念上来将,from子句中的“instructor natural join teachers”表达式可以替换成该自然连接后所得到的关系。
自然连接需要输入的元组既要在属性上取值相同,还要在相同属性的取值相同
字符串运算
SQL使用一对单引号来标示字符串,如果单引号是字符串的组成部分,那就用两个单引号字符串来表示
使用通配符来进行字符串的匹配
在字符串中可以使用like操作符来实现模式的匹配:
- 百分号(%):匹配任意子串
- 下划线(_):匹配而且只能匹配一个字符,不能多,也不能少
在模式匹配中是大小写敏感的,也就是说大写字符和小写字符不匹配
集合运算
SQL作用在关系上的union,intersect和except运算对应于数学集合论中的U,∩,—运算,即:
- union——U
- intersect——∩
- except—— —
聚集函数
聚集函数是以值的一个集合为输入,返回单个值的函数。SQL提供了五个固有聚集函数:
- 平均值:avg
- 最小值:min
- 最大值:max
- 总和:sum
- 计数:count
sum和avg的输入必须是数字集,但其他运算(max,min,count)还可以作用在非数字数据类型的集合上
分组聚集
有时候我们不仅希望聚集函数作用在单个元组集上,而且也希望将其作用到一组元组集上;在SQL中可用group by子句来实现这个愿望。在group by子句中的所有属性上取值都相同的元组将被分到一个组
当使用SQL查询使用分组时,一个很重要的事情就是保证出现在select语句中但没有被聚集的属性只能是出现在group by子句中的那些属性,换句话说,任何没有出现在group by子句中的属性如果出现在select子句中的话,它只能出现在聚集函数内部,否则这样的查询就是错误的。因为一个分组就是一组在属性取值上都相同的集合,每个分组只输出一个元组(即输出属性取值相同的元组)
having子句
有时候,对分组限定条件比对元组限定条件更有用。为表达这样的查询,我们使用SQL的having子句。having子句中的谓词在形成分组后才起作用
与select子句的情况类似,任何出现在having子句中,但没有被聚集的属性必须出现在group by子句中
小结
对于select和having,出现的属性要么是group by中的属性,要么就是在聚集函数中的属性
包含聚集,group by或having子句的查询的含义可通过下述操作序列来定义:
- 最先根据from子句来计算出一个关系
- 如果出现where子句,where子句中的谓词将应用到from子句的结果关系上
- 如果出现group by子句,满足where谓词的元组通过group by子句形成分组。如果没有group by子句,满足where谓词的整个元组被当作一个分组
- 如果出现having子句,它将应用到每个分组上,不满足having子句谓词的分组将被抛弃
- select子句利用剩下的分组产生出查询结果中的元组