SELECT
字符匹配
可以用LIKE来进行字符串的匹配,语法一般如下:
[NOT] LIKE ‘<匹配串>’ [ESCAPE’<换码字符>’]
含义是找到指定的属性列值与<匹配串>相匹配的元组,<匹配串>可以是一个完整的字符串,也可以含有通配符%和_。
%:表示为代表容易长度(长度可以为0)的字符串,例如a%b表示以a开头,以b结尾的任意长度的字符串。如acb、abbbbd。
_:表示的是代表任意的单个字符。例如a_b表示的是以a开头,又以b结尾的长度为3的容易字符串。如acb、adb。
【例3.29】查询学号为201215121的学生的详细情况
SELECT *
FROM Student
WHERE Sno='201215121'
SELECT *
FROM Student
WHERE Sno='201215121'
在此处,LIKE后面的匹配串是不含调配符,则可以使用“="代替LIKE。也可以用“!=”或“<>”(不等于)来代替NOT LIKE
【例3.30】查询所有姓刘的学生的姓名、学号和性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '刘%'
【例3.31】查询姓“佟”且全名为两个汉字的学生的姓名
SELECT Sname
FROM Student
WHERE Sname LIKE '佟_'
SELECT Sname
FROM Student
WHERE Sname LIKE '佟__'
数据库字符集为ASCII时,一个汉字需要两个_;当字符集为GBK(国标库)时需要一个_;
【例3.32】查询名字中第二个字为“陆”的学生的姓名和学号
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '_陆%'
【例3.33】查询所有不姓“佟”的学生的姓名、学号和性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '佟%'
【例3.34】查询DB_Design课程的课程号和学分
SELECT Cname,Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE'\';
ESCAPE“\”表示的是“\”为换码字符。这样的匹配串中紧跟在“\”后面的字符“”不再具有通配符的含义,被转义为普通的“”字符
【例3.35】查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%__' ESCAPE'\';
第一个“”前有换码字符\,所以它被转移为普通的""字符,而i后面的两个_的前面均没有换码字符\,所以它们作为通配符。
【例3.36】查询有选课记录但是缺少成绩的学生学号和相应的课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL
【例3.37】查询所有有成绩的学生的学号和课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL
【例3.38】查询计算机科学系年龄在20岁以下的学生姓名
SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20
多重条件查询AND和OR可以用来连接多个查询条件,AND的优先级高于OR
【例3.39】查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列
SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC
对于空值的显示,排序的显示的次序由具体的系统决定实现。
【例3.40】查询全体学生的情况,查询结果按所在系的系号升序排列,同一系的学生按照年龄降序排列
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC
【例3.41】查询学生的总人数
SELECT COUNT(*)
FROM Student
COUNT(*):聚集函数,统计元组的个数
【例3.42】查询选修了课程的学生的总人数
SELECT COUNT(DISTINCT Sno)
FROM SC
COUNT([DISTINCT|ALL]<列名>):聚集函数,统计一列中值的个数。
学生每选修一门课,就会在SC中有一条相应的记录,一个学生要选修多门课程,为避免重复计算学生人数,必须在COUNT函数中用DISTINCT短语。
【例3.43】计算选修1号课程的学生的平均成绩
SELECT AVG(Grade)
FROM SC
WHERE Cno='1';
AVG([DISTINCT|ALL]<列名>):聚集函数,计算一列值的平均值(此列必须是数值型)
【例3.44】查询选修1号课程的学生最高分数
SELECT MAX(Grade)
FROM SC
WHERE Cno='1';
MAX([DISTINCT|ALL]<列名>):聚集函数,计算一列值的最大值(此列必须是数值型)
【例3.45】查询学生201215121选修课程的总学分数
SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215121'AND SC.Cno=Course.Cno;
SUM([DISTINCT|ALL]<列名>):聚集函数,计算一列值的总和(此列必须是数值型)
当聚集函数遇到空值的时候,除COUNT(*)外,都跳过空值而只处理非空值。
【例3.46】求各个课程号及对应的选课人数
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno
【例3.47】查询选修两门以上的课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>2
【例3.48】查询平均成绩大于等于80分的学生学号和平均成绩
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=80
GROUP BY Sno
出现错误,提示为:“聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。”
因为WHERE语句是不能够用聚集函数作为条件表达式的,正确的查询语句为:
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=80