接着上次写
挑些不太好懂的写加强印象
例 3.27 查询CS、MA、IS系学生的姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');
等价于后面多条件查询
SELECT Sname,Ssex
FROM Student
WHERE Sdept='CS'OR Sdept='MA' OR Sdept='IS';
在满足条件的元组集合中输出Sname列和Ssex列
字符匹配
语法格式: [NOT] LIKE ‘<匹配串>′ [ESCAPE ‘<换码字符>′ ]
** % (百分号)代表任意长度(长度可以为0)的字符串。例如a%b表示以a开头,以b结尾的任意长度的字符串。
** _ (下划线)代表任意单个字符。例如a_b表示以a开头,以b结尾的长度为3的任意字符串
例 3.35 查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况
SELECT*
FROM Course
WHERE Cname LIKE 'DB\_%i__'ESCAPE'\';
匹配串’DB_%i__'中第一个_因前有 ’ \ ‘,被转义成普通字符’’。i后面的两个’'仍作通配符
ORDER BY 子句
ORDER BY 子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序。
例 3.40 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
多个属性列的排序原理:
聚集函数
COUNT(*) 统计元组个数
COUNT([DISTINCT | ALL] <列名>) 统计一列中值的个数
SUM([DISTINCT | ALL] <列名>) 计算一列值的总和
AVG([DISTINCT | ALL] <列名>) 计算一列值的平均值
MAX([DISTINCT | ALL] <列名>) 求一列值中的最大值
MIN([DISTINCT | ALL] <列名>) 求一列值中的最小值
例 3.42 查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno)
FROM SC;
一个学生要选修多门课程,为避免重复计算学生人数,必须在COUNT函数中使用DISTINCT
GROUP BY 子句
比较难懂,详细写一下
GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组
对查询结果分组的目的是为了细化聚集函数的作用对象。如果未对查询结果分组,聚集函数将作用于整个查询结果,分组后聚集函数将作用于每一个组,即每一组都有一个函数值
例 3.46 求各个课程号及相应的选课人数
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
该语句对查询结果按Cno的值分组,所有具有相同Cno值的元组为一组,然后对每一组作用聚集函数COUNT进行计算,以求得该组的学生人数。
如果分组后还要求按一定的条件对这些组进行筛选,这种只输出满足指定条件的组则可以使用HAVING短语指定筛选条件。
例 3.47查询选修的三门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>2;
这里先用GROUP子句按Sno进行分组,再用聚集函数COUNT对每一组计数。HAVING短语给出了选择组的条件,只有满足条件的组才会被选出来