数据查询
4.4.1 SELECT 语句的一般格式
SELECT [ALL | DISTINCT] 选择序列
FROM 表, 表, …, 表
WHERE 条件
GROUP BY 分组列 {, 分组列} [ HAVING 分组选择条件 ]
ORDER BY 排序列 [ASC | DESC] { ,排序列 [ASC | DESC] }
SELECT语句相当于关系代数的投影运算 缺省时为ALL,ALL不删除结果的重复行,DISTINCT将删除结果的重复行
FROM 语句相当于关系代数的笛卡尔积运算
WHERE语句相当于关系代数中的选择运算
问题:先FROM求基本表或导出表的笛卡尔积,再用WHERE选择满足查询条件的元组,这样的执行顺序似乎并不如关系代数中的先选择再连接优化效率高啊?
4.4.2 不带WHERE的简单查询
SELECT 列1,列2,…,列n FROM 表 这样最后出来的属性的顺序跟选择时的顺序一致
SELECT * FROM 表,如果使用 * 这种形式,最后属性的顺序跟表定义的次序一致
4.4.3 带WHERE的简单查询
见课本p82
LIKE表达式 有两种通配符 " _ " 和 " % ":
_可以和任意单个字符匹配
%可以和零个或多个任意字符匹配
如果需要用到_和%的字面意思,则使用转义字符 ESCAPE 某个转移字符 例如:
WHERE Cname LIKE ‘C_%’ ESCAPE ’ \ ';
用ESCAPE定义 \ 为转义字符,将_转义为普通字符,转移只能转移其后一个字符,所以%仍然是通配符
4.4.4 排序和分组
1. 将查询结果排序
ORDER BY 排序列 [ASC | DESC] { ,排序列 [ASC | DESC] }
排序列可以是属性名,也可以是别名
ORDER BY 可以有多个排序列,先按照第一个排序列的值排序,第一个值相同的结果元组按第二个排序列的值排序
2. 聚集函数
对一组数据进行计算,对比于单行函数
见课本p84
count函数计算指定列的个数时,是不计算NULL值的
等效于WHERE 属性 IS NOT NULL;
但是 count * 会统计NULL值
所有的函数也是有 [ ALL | DISTINCT ] 两种 如:COUNT(DISTINCT 列名)
缺省为ALL, DISTINCT先删除重复的值
3. 分组
GROUD BY 分组列 {, 分组列} [ HAVING 分组选择条件 ]
SELECT 的结果列只能是 分组属性 和 聚集函数
分组列是属性,它所在的表出现在FROM语句中。Having 用来过滤不满足分组选择条件的分组
SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno HAVING AVG(Grade) > 85;
4.4.5 连接查询
课本中连接查询知识设计很少,只有自然连接
FROM 表1,表2
WHERE 连接条件 && 其他条件
多表查询中有相同列时,属性名前加前缀