目录
选择表中若干元组
消除取值重复的行
如果没有指定DISTINCT关键词,
则缺省为ALL
【例】查询选修了课程的学生学号。 SELECT Sno FROM SC;等价于:SELECT ALL Sno FROM SC;
没distinct默认为all。
【例】指定DISTINCT关键词,去掉表中重复的行。 SELECT DISTINCT Sno FROM SC;
查询满足条件的元组
查询满足条件的元组可以通过where子句实珂,where常用的查询条件如下:
确定范围 BETWEEN AND,NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE
空值 IS NULL,IS NOT NULL
多重条件(逻辑运算) AND,OR,NOT
还有比较>,<,>=等,其中<>是不等于的意思与!=同义
比较大小
【例】查询所有年龄在20岁以下的学生姓名及其年龄。 SELECT Sname,Sage FROM Student WHERE Sage<20;
【例】查询考试成绩有不及格的学生的学号。 SELECT DISTINCT Sno FROM SC WHERE Grade<60;
distinct保证查出的学号不重复。
确定范围
【例】查询年龄在20~23岁(包括20岁和23岁)之间的学生,姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;
【例】查询年龄不在20~23岁之间的学生,姓名、系别和年龄 SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;
确定集合
【例】查询信息系数学系和计算机科学系学生的姓名和性别 SELECT Sname,Ssex FROM Student WHERE SdeptIN('IS','MA','CS');
【例】查询既不是信息系、数学系,也不是计算机科学系学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN (IS','MA','CS');
字符匹配
【例】查询学号为200215121的学生的详细情况。 SELECT FROM Student WHERE Sno LIKE 200215121';等价于: SELECT FROM Student WHERE Sno='200215121';
匹配串为含通配符的字符串
【例】查询所有姓刘学生的姓名、学号和性别。 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE刘%
【例】查询姓“欧阳”且全名为三个汉字的学生的姓名 SELECT Sname FROM Student WHERE Sname LIKE‘欧阳_’;
【例】查询名字中第二个字为“阳”字的学生的姓名和学号。 SELECT Sname,Sno FROM Student WHERE Sname LIKE‘_阳%’
【例】查询所有不姓刘的学生姓名、学号和性别。 SELECT Sname,Sno,Ssex FROM Student WHERE S Sname NOT LIKE 刘%;
使用换码字符将通配符转义为普通字符
SELECT FROM Course WHERE Cname LIKE'DB\_%i ESCAPE \
说明:ESCAPE表示为换码字符。这里的\表示like里出现的一个_是实际的_而不是空出来的一个字符。
涉及空值的查询
谓词:IS NULL或IS NOT NULL“1S”不能用=代替。
多重条件查询
用逻辑运算符AND和OR来联结多个查询条件,AND的优先级高于 OR,可以用括号改变优先级。可用来实现多种其他谓词:[NOT] IN[NOT]BETWEEN AND
order by字句
ORDER BY子句可以按一个或多个属性列排序:
升序:ASC;降序:DESC;缺省值为升序。
当排序列含空值时:空值默认为最大值
ASC:排序列为空值的元组最后显示。
DESC:排序列为空值的元组最先显示。
例子
【例】查询选修了3男课程的学生的学号及其成绩,查询结果按分数降序排列。 SELECT Sno,Grade FROM SC WHERE Cno='3'ORDER BY Grade DESC;
聚集函数
COUNT([DISTINCT|ALL]统计元组个数
COUNT[DISTINCT |ALL<列名>)统计一列中值的个数
SUM([DISTINCT|ALL]列名>)计算一列值的总和(此列必须是数值型
AVG ([DISTINCT |ALL]<列名>)计算一列值的平均值(此列必须是数值型)
MAX[DISTINCT ALL]<列名>)求一列值的最大值
MIN[DISTINCT ALL]<列名>)求一列值的最小值
【注意】,WHERE子句中是不能用聚集函数作为条件表达式的。聚集函数只能用于SELECT子句和GROUPBY中的HAVING子句。
GROUP BY 子句
GROUP BY子句作用是:按指定的一列或多列值分组,值相等为一组,来细化聚集函数的作用对象
【说明】①未对查询结果分组,聚集函数将作用于整个查询结
②对查询结果分组后,聚集函数将分别作用于每个组。
GROUPE BY子句分组后,可以使用HAVING:短语指定筛选条件。
【例】查询选修了3门以上课程的学生学号 SELECT Sno FROM SC GROUP BY Sno HAVING COUNT (*)>3
HAVING语句与WHERE语句的区别
①作用对象不同:WHERE-子句作用千基表或视图,从中选择满足条件的元组。
HAVING短语作用于组,从中选择满足条件的组。
②WHERE子句中是不能用聚集函数作为条件表达式的
【例】查询平均成绩大于等于90分的学生学号和平均成绩。
下面的语句是不对的: SELECT Sno,AVG (Grade) FROM SC WHERE AVG (Grade)>=90 GROUP BY Sno
正确的查询语句应该是: SELECT Sno,AVG (Grade) FROM SC GROUP BY Sno HAVING AVG (Grade)>=90;