一 数据查询知识框架
二 数据查询
一般格式:
DISTINCT 为去掉重复列。
HAVING 为满足条件才输出。1
2
3
4
5SELECT [ALL|DISTINCT] <目标列表达式>,...
FROM <表名或视图名>,...
WHERE <条件表达式>
GROUP BY <列名> HAVING <条件表达式>
ORDER BY <列名> [ASC|DESC];
1 单表查询(仅涉及一个表)
<目标列表达式> 可以为 * 星号、可以为算术表达式、字符串常量、函数等(原来没有的列会新增显示出来)。
如 SELECT sname,"year of birthday",2004-sage,LOWER(sdept)
常用查询条件(WHERE):
确定集合:查找属性值属于指定集合的元组。
WHERE sdept IN("CS","MA")
字符匹配:
[NOT] LIKE "<匹配串>" [ESCAPE "<换码字符>"]
;
任意长度字符用%
,单个字符用_
;
查询内容中有百分号或下划线须在前加\
转义,并加上ESCAPE 转义符号
。
例:查询 cname 列以 DB_ 开头,倒数第三个字符为 i 的情况,WHERE cname LIKE "DB\_%I__" ESCAPE "\"
。
多重条件:
用 AND、OR 来联结多个查询条件。聚合函数:
1
2
3
4
5
6COUNT([DISTINCT|ALL] *) 统计元组个数
COUNT([DISTINCT|ALL] <列名>) 统计列中值的个数
SUM([DISTINCT|ALL] <列名>) 计算一列值的总和
AVG([DISTINCT|ALL] <列名>) 一列平均值
MAX([DISTINCT|ALL] <列名>) 一列中最大值
MIN([DISTINCT|ALL] <列名>) 一列中最小值
2 连接查询
条件中使用等于号的为等值连接,其他为非等值连接;
连接中列名类型必须是可比的;
列属性名唯一可省略表名;
去掉重复列为自然连接。
等值与非等值连接:
1
2
3
4例:
SELECT student.sno,sname,cno
FROM student,course
WHERE student.sno=course.cno;自身连接:
把自身虚拟为两张表操作。
1 | 例: |
外连接:
保留属性为空的元组。
LEFT OUT JOIN 为保留左表值(表名1)。
USING(列名) 为去掉该列重复值。1
2
3SELECT <列>,...
FROM <表名1>
LEFT OUT JOIN <表名2> ON (条件);复合条件:
多个条件用 AND 连接。
3 嵌套查询
一个 SELECT-FROM-WHERE 为一个查询块,将查询块嵌套在另一个查询块 WHERE 子句或 HAVING 短语条件中查询。
带有 IN 谓词的子查询(不相关子查询):
1
2
3
4SELECT <列名>,...
FROM <表名>
WHERE <列名> IN
(一个查询块);带有比较运算符的子查询(相关子查询例子):
子查询的查询条件依赖于父查询。
取外查询值传入内查询,通过内查询筛选外查询值;再接着取下一个外查询的值,循环。1
2
3
4
5
6
7
8例:找出每个学生超过他选修课程的平均成绩。 // x y 是表 SC 的别名,从外查询取出 SC 的一个元组 x,将元组 x 的值传给内查询。
SELECT sno,cno
FROM SC x
WHERE grade >=
(SELECT AVG(grade)
FROM SC y
WHERE y.sno=x.sno);带有 ANY、SOME、ALL 谓词的子查询:
用 ANY、ALL 来修饰子查询结果返回值。
例:1
2
3> ANY 表示大于子查询结果中的某个值。
> ALL 表示大于子查询结果的全部值。
...
等价:1
2
3
4=ANY 等价 IN
<ANY 等价 <MAX
<> 等价 NOT IN
<ALL 等价 <MIN
- 带有 EXIXTS 谓词的子查询:
带有 EXISTS 或 NOT EXISTS 的子查询不返回任何数据,只产生逻辑值 True 或 False。
其子查询通常用SELECT *
因为只返回真假,给出列名无意义。
4 集合查询
将多个查询块结果进行集合操作。
并:UNION、交:INTERSECT、差:EXCEPT。
1 | 查询块1 |