【例3.29】查询学号为201215121的学生的详细情况。
SELECT *
FROM Student
WHERE Sno LIKE '201215121';
等价于
SELECT *
FROM Student
WHERE Sno = '201215121';
【例3.30】 查询所有姓刘学生的姓名、学号和性别。
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '刘%';
字符串匹配的一般格式
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
含义是查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>可以是一个完整的字符串,也可以含有通配符%和_。
其中,%代表任意长度的字符串。
_代表任意单个字符。
通过指定属性名可实现只显示需要部分的数据。
【例3.31】查询姓"刘"且全名为两个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE '刘_';
注意:不同字符集的环境下,代表一个汉字所需要的_数量不同。
数据库字符集为ASCII时,一个汉字需要两个_
数据库字符集为 GBK 时,一个汉字需要一个_
这里的_代表一个字符,与字节相区别。
ASCII码下,一个字符只占一个字节,但是汉字需要两个字符。
GBK下,一个汉字需要两个字节,但是一个汉字却只需要一个字符。
在SQLserver中查询字符集
SELECT COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage')
936代表GBK码。
【例3.32】查询名字中第2个字为"阳"的学生的姓名和学号。
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 Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design'ESCAPE '\';
【例3.35】查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i__'ESCAPE '\';
【例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;
【例3.39】查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT Sno,Grade
FROM SC
WHERE Cno= ' 3 '
ORDER BY Grade DESC;
对于空值,排序时显示的次序由具体系统实现来决定。
GROUP BY:
细化聚集函数的作用对象
如果未对查询结果分组,聚集函数将作用于整个查询结果
对查询结果分组后,聚集函数将分别作用于每个组
按指定的一列或多列值分组,值相等的为一组
【例3.40】查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sdept ASC, Sage DESC;
【例3.41】 查询学生总人数。
SELECT COUNT(*)
FROM Student;
【例3.42】查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno)
FROM SC;
【例3.43】1号课程的学生平均成绩。
SELECT AVG(Grade)
FROM SC
WHERE Cno='1';
【例3.44】查询选修1号课程的学生最高分数。
SELECT MAX(Grade)
FROM SC
WHERE Cno='1';
【例3.45】 查询学生201215012选修课程的总学分数。
SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215122' AND SC.Cno=Course.Cno;
【例3.46】求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
【例3.47】查询选修了三门以上课程的学生学号。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;
【例3.48】查询平均成绩大于等于90分的学生学号和平均成绩。
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=80;
注意WHERE作用于聚合前,HAVING作用于聚合后。