在SQL语言中,只提供了一个动词SELECT用来进行数据查询操作,但这个动词的参数十分复杂,且能嵌套使用,其通用格式如下:
SELECT [All|Distinct]<目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名>[,<表名或视图名>]...
[WHERE<条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
1、单表查询
数据查询主要通过一些例子来说明SELECT语句的使用。假设有学生表Student(Sno,Sname,Ssex,Sage,Sdept),还有课程表Course(Cno,Cname,Credit,Cpno)和选修表SC(Sno,Cno,Grade)。其中Cno为课程表,Cname为课程名称,Cpno为先修课程号,Credit为学分,Grade为成绩。
- 查询全体学生的学号与姓名的命令格式为:
SELECT Sno,Sname
FROM Student;
- 查询全体男同学的详细记录的命令格式为:
SELECT *
FROM Student
WHERE Ssex="男";
- 查询所有年龄大于21岁的学生的姓名、出生年份和所在系,要求用小写字母表示所在系名。
SELECT Sname,'Year of birth',2004-Sage,lower(Sdept)
FROM Student
WHERE Sage>21;
- 查询IS系、MA系和CS系学生的姓名和性别的命令格式为:
SELECT Sname,Ssex
FROM Student
WHERE Sdept In('IS','MA','CS');
- 查询名字中第二个字为'阳'的学生的姓名、学号的命令格式为:
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE'_ _阳%'; //其中的“_”代表一个字符,而“%”代表0到若干个字符。
- 查询DB_Design课程的课程号和学分的命令格式为:
SELECT Cno,Credit
FROM Course
WHERE Cname LIKE 'DB/_Design'Escape'/';
- 查询选修了3号课程的学生的学号及成绩,查询结果按分数的降序排列所有有成绩的学生学号和课程号。
SELECT Sno,Credit
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;
在SQL语言中,也可以使用集函数:
Count([Distinct|All]*):统计元组个数;
Count([Distinct|All]<列名>):统计一列中值的个数;
Sum([Distinct|All]<列名>):计算一列值的总和;
Avg([Distinct|All]<列名>):计算一列值的平均值;
Max([Distinct|All]<列名>):求一列值中的最大值;
Min([Distinct|All]<列名>):求一列值中的最小值;
- 求各个课程号及相应的选课人数。
SELECT Cno,Count(Sno)
FROM SC
GROUP BY Cno;
2、连接查询
- 查询每个学生及其选修课程的情况
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;
- 查询每个学生及其选修课程的情况
SELECT Student.Sno,Sname,Ssex,Sage,Cno,Grade
FROM Student Left Outer join SC
WHERE Student.Sno=SC.Sno;
- 查询每一门课程的间接选修课 //区别间接选修课和直接选修课
SELECT F.Cno,S.Cpno
FROM Course F,Course S
WHERE F.Cpno=S.Cno;
其中的F和S称为课程的别名
- 查询每个学生的学号、姓名、选修的课程名称及成绩
SELECT Sno,Sname,Cno,Grade
FROM Student,Course,SC
WHERE Student.Sno=SC.Sno And Course.Cno=SC.Cno;
3、嵌套查询
- 查询与“刘晨”在同一系学习的学生
SELECT Sno,Sname
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname='刘晨');
- 查询选修了课程名为信息系统(MIS)的学生学号和姓名
SELECT Sno,Sname
FROM Student
WHERE Sno IN(SELECT Sno
FROM SC
WHERE Cno IN(SELECT Cno
FROM Course
WHERE Cname='MIS'));
- 查询其它系中比信息系某个学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<Any
(SELECT Sage
FROM Student
WHERE Sdept='IS');
或者
SELECT Sname,Sage
FROM Student
WHERE Sage<(SELECT Max(Sage)
FROM Student
WHERE Sdept='IS')
AND Sdept<>'IS';
- 查询没有选修1号课程的学生姓名
SELECT Sname
FROM Student
WHERE Not Exists
(SELECT *
FROM SC
WHERE Sno=Student.Sno And Cno='1');
- 查询至少选修了95002选修表的全部课程的学生的学号
SELECT Distinct Sno
FROM SC SCX
WHERE Not Exists(SELECT *
FROM SC SCY
WHERE SCY.Sno='95002'
And Not Exists(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno And SCZ.Cno=SCY.Cno));
4、集合查询
- 查询计算机系的学生及年龄不大于19岁的学生
SELECT *
FROM Student
WHERE Sdept='CS'
UNION
SELECT *
FROM Student
WHERE Sage<19;