1,消除取值重复的行。
例如:查成绩不及格的学号:SELECT DISTINCT sno FROM SC WHERE grade<60.
这里使用DISTINCT表示取消取值重复的行。
2,比较。
例如:查计算机系全体学生的姓名:SELECT Sname FROM Student WHERE Sdept='CS'.
查所有年龄在20岁以下的学生姓名和年龄:
SELECT Sname,Sage
FROM Student
WHERE Sage<20(或者WHERE NOT Sage>=20)
3,确定范围。
例如:查询002号课程且成绩在80到90分之间的学生号。
SELECT sno
FROM SC
WHERE snp='002' AND grade BETWEEN 80 AND 90;
4,确定集合。
例如:查询信息院,数学系,计算机学院学生的姓名和性别。
SELECT sname,sex
FROM Student
WHERE dept IN(‘信息院’,‘数学系’,‘计算机学院’)
5,字符匹配。
%:代表任意长度的字符串。
_:代表任意单个字符。
例如:查询所有姓刘或姓王的学生姓名,学号和性别。
SELECT sname,sno,sex
FROM Student
WHERE sname LIKE '刘%' OR sname LIKE '王%'
查询姓欧阳且全名为三个汉字的学生姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳__'
(注意,由于一个汉字占两个字符的位置,所以欧阳后面是两个'_'。
查询第二个字为阳的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '__阳%'
若要查询的串本身就具有%或者_,则使用ESCAPE<换行字符>对通配符进行转义,ESCAPE'\'短语表示\为换码字符,这样匹配串中紧跟在\后面的字符"_"就不在具有通配符的含义,而是取其本身含义,被转义为普通的_符号。
例如:查询以"DB_"开头且倒数第二个字符为i的课程情况。|
SELECT *
FROM Course
WHERE cname LIKE 'DB\_%i_' ESCAPE '\'
6,涉及空值的查询
例如:某些学生没有考试成绩,查询缺少成绩的学生的学号和相应的课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL(这里使用IS而不是=)
类似,查询所有成绩都记录的学生学号和课程号只需要将IS替换成IS NOT。
7,多重条件查询
例如:查询计算机系年龄在20岁以下学生的姓名。
SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20
查询计算机系,信息系,数学系学生的姓名和性别。
SELECTSname,Ssex
FROM Student
WHERE Sdept IN ('IS','MA','CS') || WHERE Sdept='IS' OR Sdept='MA' OR Sdept='CS'
8,对查询结果排序
例如:查询所有男生的学号,系,年龄,结果按照所在的系进行升序排序,同一系中学生按照年龄降序排序。
SELECT sno,dept,age
FROM Student
WHERE sex='男'
ORDER BY dept,age DESC
9,使用集函数
COUNT(*)统计元组个数
COUNT(<列名>)统计一列中值的个数
注意,WHERE子句中是不能使用聚集函数作为条件表达式的,聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。
例如:查询女学生的总人数和平均年龄。
SELECT COUNT(sno),AVG(age)
FROM Student
WHERE sex=‘女’
查询选修001号课程并及格的学生的最高分,最低分和总分。
SELECT MAX(grade),MIN(grade),SUM(grade)
FROM SC
WHERE cno='001' AND grade>=60
10,对查询结果进行分组。
将查询结果按照某一行或者多行进行分组,值相等为一组。
目的是:细化集函数的作用对象,如果未对查询结果进行分组,集函数将作用于整个查询结果,即整个查询结果只有一个函数值,否则,集函数将作用于每一组,即每一组都有一个函数值。
例如:查询各个课程号与对应的选课人数。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno(过程是先进行分组,再对每一组作用集函数COUNT以求得该组的学生人数)
查询结果如下:
11,筛选。
如果分组之后还要按照一定条件对这些组进行筛选,最终只输出满足条件的组,使用HAVING短句指定筛选条件。
例如:求每个学生的平均成绩,并将超过80分的进行输出。
SELECT sno,AVG(grade)
FROM SC
GROUP BY sno
HAVING AVG(grade)>88
注意区别:HAVING:在各组中选择满足条件的小组
WHERE:在表中选择满足条件的元组
找出选课学生超过30人的课程平均成绩以及选课人数
SELECT cno,AVG(grade),COUNT(*) AS st_number
FROM SC
GROUP BY cno
HAVING st_number>=30
求学生关系中女生的每一年龄组(超过20人)有多少,要求查询结果按照人数升序,人数相同时按照年龄降序排列。
SELECT age,COUNT(sno)AS number
FROM Student
WHERE sex=‘女’
GROUP BY age
HAVING number>20
ORDER BY number,age DESC
剩下练习题:
按照平均成绩降序给出所有课程都及格的学生号及其平均成绩,其中成绩统计时不包括008号考察课。
SELECT sno,AVG(grade) AS avg_g
FROM SC
WHERE cno<>'008'
GROUP BY sno
HAVING MIN(grade)>=60
ORDER BY avg_g DESC
查询选修了三门以上课程的学生学号。
SELECT Sno From SC
GROUP BY sno
HAVING COUNT(*)>3(拥有词条数量大于3)
查询平均成绩大于等于90的学生学号和平均成绩
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90
查询每个学生及其选修课程的情况
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno
自然连接,若在等值连接中把目标列中重复属性去掉则为自然连接。
SELECT Student.Sno,Sname,Ssex,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno
或者SELECT*
FROM Student,SC
WHERE Student.Sno=SC.Sno
查询系别为信息,课程成绩在90分以上的学生档案及其成绩情况。
SELECT*
FROM Student NATRUAL JOIN SC
WHERE dept='信息' AND grade>=90
查询年龄比王玲大的同学的姓名和年龄
SELECT s1.sname,s1.age
FROM S AS s1,S AS s2
WHERE s1.age>s2.age AND s2.sname='王玲'
查询每个学生学号,姓名,选修课程名及成绩。
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno
查询与刘晨在同一个系中的学生的学号,姓名,系
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN(
SELECT Sdept
FROM Student
WHERE Sname='刘晨')
由内而外,每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
当然,也可以使用自身连接。
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept=S2.Sdept
AND S2.Sname='刘晨'
查询选修了课程名为'信息系统'的学生学号和姓名
SELECT Sno,Sname
FROM Student
WHERE Sno IN(
SELECT Sno
FROM SC
WHERE Cno IN
(SELECT Cno
FROM Course
WHERE Cname=‘信息系统’))
或者:
SELECT Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname='信息系统'
查询与刘晨在同一个系学习的学生学号姓名系
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname='刘晨')
当确切知道返回值是单个值的时候,可以使用=,!=,>,<,>=,<=。
如可将上述的IN改成=。
找出年龄超过平均年龄的学生的姓名:
SELECT sname FROM Student
WHERE age>(
SELECT AVG(age)
FROM Student)
查询有一门课在90分以上的学生的姓名
SELECT sname FROM Student
WHERE sno=SOME
(SELECT DISTINCT sno
FROM SC
WHERE grade>90)
找出平均成绩最高的学生学号
SELECT sno
FROM SC
GROUP BY sno
HAVING AVG(grade)>ALL
(SELECT AVG(grade)
FROM SC
GROUP BY sno)
查询其他系中比IS系任意学生大的学生名单。
SELECT Sname,Sage
FROM Student
WHERE Sage>ALL
(SELECT Sage
FROM Student
WHERE Sdept='IS'
)
AND Sdept<>'IS'
FROM子句查询:
查出选课成绩在80分以上女学生的姓名,课程名和成绩。
SELECT sname,cname,grade
FROM(SELECT sname,cname,grade
FROM Student,SC,Course
WHERE Student.sno=SC.sno
AND SC.cno=Course.cno AND sex='女')AS Temp(sname,cname,grade)
WHERE grade>=80