SQL
- 综合统一
集数据定义语言( DDL ),数据操纵语言( DML ),数据控制语言( DCL )功能于一体。
可以独立完成数据库生命周期中的全部活动:
定义关系模式,插入数据,建立数据库;
对数据库中的数据进行查询和更新;
数据库重构和维护
数据库安全性、完整性控制等
用户数据库投入运行后,可根据需要随时逐步修改模式,不影响数据的运行。
数据操作符统一
SQL 的数据定义功能 : 模式定义、表定义、视图和索引的定义
单表SQL查询
sql语句格式
SELECT [ALL|DISTINCT] < 目标列表达式 >
[ , < 目标列表达式 >] …
FROM < 表名或视图名 >[ ,
< 表名或视图名 > ] …
[ WHERE < 条件表达式 > ]
[ GROUP BY < 列名 1> [ HAVING < 条件表达式 > ] ]
[ ORDER BY < 列名 2> [ ASC|DESC ] ] ;
GROUP BY 子句分组:
细化聚集函数的作用对象(与聚合函数联合使用)
未对查询结果分组,聚集函数将作用于整个查询结果
对查询结果分组后,聚集函数将分别作用于每个组
作用对象是查询的中间结果表
按指定的一列或多列值分组,值相等的为一组
HAVING 短语与 WHERE 子句的区别:
作用对象不同
WHERE 子句作用于基表或视图,从中选择满足条件的元组
HAVING 短语作用于组,从中选择满足条件的组,与group by联合使用。
多表连接查询
1.等值连接:连接运算符为 =
SELECT Student.* , SC.*
FROM Student , SC
WHERE Student.Sno = SC.Sno ;
2.自身连接:一个表与其自己进行连接
需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用别名前缀
eg:查询每一门课的间接先修课(即先修课的先修课)
SELECT FIRST.Cno , SECOND.Cpno
FROM Course FIRST , Course SECOND
WHERE FIRST.Cpno = SECOND.Cno ;
3.外连接
外连接与普通连接的区别:
普通连接操作只输出满足连接条件的元组
外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
eg:查询每一门课的间接先修课(即先修课的先修课)
SELECT
Student.Sno , Sname , Ssex , Sage , Sdept , Cno , Grade
FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno) ;
嵌套查询
一个 SELECT-FROM-WHERE 语句称为一个查询块
将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为嵌套查询
eg:
SELECT Sname /* 外层查询 / 父查询*/
FROM Student
WHERE Sno IN
( SELECT Sno /* 内层查询 / 子查询*/
FROM SC
WHERE Cno= ’ 2 ’ );
子查询的限制
- 不能使用 ORDER BY 子句
- 层层嵌套方式反映了 SQL 语言的结构化
- 有些嵌套查询可以用连接运算替代(内查询与外查询不相关的查询可用连接运算代替)
不相关子查询:
子查询的查询条件不依赖于父查询
- 由里向外 逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件
嵌套查询
一、带有 IN 谓词的子查询
eg:查询与“刘晨”在同一个系学习的学生。 此查询要求可以分步来完成
SELECT Sno , Sname , Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= ‘ 刘晨 ’ ) ;
用自身连接完成 eg 查询要求
SELECT S1.Sno , S1.Sname , S1.Sdept
FROM Student S1 , Student S2
WHERE S1.Sdept = S2.Sdept AND S2.Sname = ' 刘晨 ' ;
二、 带有比较运算符的子查询
- 当能确切知道内层查询返回单值时,可用比较运算符( > , < , = ,>=,<=, != 或 < > )。
- 与 ANY 或 ALL 谓词配合使用
三、 带有 ANY ( SOME )或 ALL 谓词的子查询
- 需要配合使用比较运算符
ANY 大于子查询结果中的某个值
ALL 大于子查询结果中的所有值
< ANY 小于子查询结果中的某个值
< ALL 小于子查询结果中的所有值
= ANY 大于等于子查询结果中的某个值
= ALL 大于等于子查询结果中的所有值
<= ANY 小于等于子查询结果中的某个值
<= ALL 小于等于子查询结果中的所有值
= ANY 等于子查询结果中的某个值
=ALL 等于子查询结果中的所有值(通常没有实际意义)
!= (或 <> ) ANY 不等于子查询结果中的某个值
!= (或 <> ) ALL 不等于子查询结果中的任何一个值
- ANY (或 SOME ), ALL 谓词与聚集函数、 IN 谓词的等价转换关系
四、 带有 EXISTS 谓词的子查询
集合查询
集合操作的种类
并操作 UNION
交操作 INTERSECT
差操作 EXCEPT
参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同
UNION - 将多个查询结果合并起来时,系统自动去掉重复元组。
UNION ALL - 将多个查询结果合并起来时,保留重复元组
视图
视图的特点
虚表,是从一个或几个基本表(或视图)导出的表
只存放视图的定义,不存放视图对应的数据
基表中的数据发生变化,从视图中查询出的数据也随之改变
创建视图
语句格式
CREATE VIEW
< 视图名 > [(< 列名 > [ , < 列名 >]…)]
AS < 子查询 >
[WITH CHECK OPTION] ;
组成视图的属性列名:全部省略或全部指定
子查询不允许含有 ORDER BY 子句和 DISTINCT短语
删除视图
语句的格式:DROP VIEW < 视图名 > ;
该语句从数据字典中删除指定的视图定义;
如果该视图上还导出了其他视图,使用 CASCADE 级联删除语句,把该视图和由它导出的所有视图一起删除 ;
删除基表时,由该基表导出的所有视图定义都必须显式地使用 DROP VIEW 语句删除;