单表查询
(1)选择表中的若干列
查询指定列
SELECT Sno,Sname
FROM Student;
查询经过计算的值
- SELECT 子句的目标表达式可以为
- 算术表达式
- 字符串常量
- 函数
- 列别名
算数表达式
查全体学生的i姓名及其出生年份,
SELECT Sname,2021-Sage
FROM Student
字符串常量及函数
查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名,这里假定目前年份是2004年
SELECT Sname,'YEAR OF BIRTH',2021-Sage,LOWER(Sdept)
FROM Student;
选择表中的若干元组
关键词DISTINCT去掉表中重复的行
SELECT Sno FROM SC
去掉表中重复的行
SELECT DISTINCT SNO
FROM SC
查询信息系,数学系和计算机科学系学生的姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('IS','MA','CS')
查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN ('IS','MA','CS')
查询所有不姓刘的学生姓名。
SELECT Sname
FROM Student
WHERE Sname NOT LIKE '刘%'
** 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。**
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
查所有有成绩的学生学号和课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL
ORDRY BY
- 可以按一个或多个属性列排序
- 升序:ASC
- 降序:DESC
- 缺省值为升序
查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT Sno,Grade
FROM SC
WHERE Sno='3'
ORDER BY Grade DESC
查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
聚集函数
查询学生总人数。
SELECT COUNT(*)
FROM Student
** 计算2号课程的学生平均成绩。**
SELECT AVG(Grade)
FROM Student
WHERE Cno='2'
查询,选修2号课程的,学生最高分数
SELECT MAX(Grade)
FROM SC
WHERE Cno='2'
查询,学生201215121,选修课程的,总学分数
SELECT SUM(Credit)
FROM SC,Course
WHERE Sno='201215121' AND SC.Cno=Course.Cno;
GROUP BY子句
GROUP BY子句分组:
细化聚集函数的作用对象
- 为对查询结果分组,聚集函数将作用于整个查询结果
- 对查询结果分组后,聚集函数将分别作用于每个组
- 作用对象是查询的中间结果表
- 按指定的一列或多列值分组,值相等的为一组
HAVING和WHERE的区别
- 作用对象不同
- WHERE子句作用于基表或视图,从中选择满足条件的元组
- HAVING 短语作用于组,从中选择满足条件的组
求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
查询选修了2门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>2;
连接查询
连接条件中的各连接字段类型必须是可比的,但名字不必是相同的
等值连接与非等值连接
查询每个学生及其选修课程的情况
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno
用自然连接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
连接JOIN
INNER JOIN
SELECT Sno,SC.Cno,Grade,Course.Cno,Cname,Cpno,Credit
FROM SC INNER JOIN Course ON(SC.Cno=Couse.Cno);
复合条件连接
查询,选修2号课程,且成绩在88分以上的所有学生
SELECT Student.Sno,Sname
FROM Student,SC
WHERE Student.Sno=SC.sno AND
SC.Cno='2' ADN SC.Grade>88
查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.sno and SC.cno=Course.cno;
嵌套查询
SELECT Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno='2');
- 子查询的限制:不能使用ORDER BY子句
- 层层嵌套方式反映了SQL语言的结构化
- 有些嵌套查询可以用连接运算代替
查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno
AND SC.Cno=Course.Cno
AND Course.Cname=='信息系统'
带有比较运算符的子查询
- 带有比较运算符的子查询是指父查询与子查询用比较运算符进行连接。当用户能确切知道内层返回的是单个值时,可以用>,<,=,>=,<=,<>
- 与ANY或ALL谓词配合使用
找出每个学生超过他选修课程平均成绩的课程号
SELECT Sno,Cno
FROM SC,X
WHERE Grade >=(SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno
);
查询其他系中比计算机科学某一学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<ANY(SELECT Sage
From Student
WHERE Sdept='CS')
AND Sdept<>'CS';
方法二:用聚集函数
SELECT Sname,Sage
FROM Student
WHERE Sage<(SELECT MIN(Sage)
FROM Student
WHERE Sdept='CS')
AND Sdept<>'CS'
查询所有选修了1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE EXISTS(SELECT *
FROM SC
WHERE Sno=Student.Sno
AND Cno='1');
用连接运算(推荐使用这种方法)
SELECT Sname
FROM Student,SC
WHERE Student.Sno=Sc.Sno
AND SC.Cno='1';
查询没有选修1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS(SELECT *
FROM SC
WHERE Sno=Student.Sno
AND Cno='1')