[笔试时]SQL练练手

时间:2022-09-21 03:13:20

笔试时,会经常考到SQL查询语句,特别是网易,很显然,有必要练练手。
关于数据库一些要点的总结可以参考这篇文章:找工作笔试面试那些事儿(9)—数据库知识总结(1)
[笔试时]SQL练练手
接下来废话不多说,介绍一下SQL查询语句。

基本格式

  SELECT [ALL|DISTINCT] <算术表达式列表> [,<算术表达式列表> ]...
  FROM <表名或视图名列表> [,<算术表达式列表> ]...
  [ WHERE <条件表达式 1> ]
  [ GROUP BY <属性列表 1> [ HAVING <条件表达式 2 > ] ]
  [ ORDER BY <属性列表 2> [ ASC|DESC ] ] ;

例子

学生-课程数据库中包括以下3个表:
·学生表: Student(Sno, Sname, Ssex, Sage, Sdept)
·课程表: Course(Cno, Cname, Cpno, Ccredit)
·学生表: SC(Sno, Cno, Grade)

SQL Fiddle 在线练习网站

//样例
//使用方法:登陆sqlfiddle.com,将下面代码粘贴至左框,Build 
//Scheme,在右框写SQL语句,Run SQL,即可在下方看到运行结果

CREATE TABLE Student (`Sno` long, `Sname` varchar(7), `Ssex` varchar(2), `Sage` int, `Sdept` varchar(4)) ;

INSERT INTO Student (`Sno`, `Sname`, `Ssex`, `Sage`, `Sdept`) VALUES (200215121, '令狐冲', '男', 20, 'CS'), (200215122, '张无忌', '男', 20, 'CS'), (200215123, '杨过', '男', 19, 'MA'), (200215124, '韦小宝', '男', 18, 'IS'), (200215125, '周芷若', '女', 17, 'CS'), (200215126, '张三丰', '男', 25, 'AR'), (200215127, '小龙女', '女', 21, 'MA') ;


CREATE TABLE Course (`Cno` int, `Cname` varchar(10), `Cpno` int, `Ccredit` int) ;

INSERT INTO Course (`Cno`, `Cname`, `Cpno`, `Ccredit`) VALUES (1, '数据库', 5, 4), (2, '数学', 0, 2), (3, '信息系统', 1, 4), (4, '操作系统', 6, 3), (5, '数据结构', 7, 4), (6, '数据处理', 0, 2), (7, 'PASCAL 语言', 6, 4) ;


CREATE TABLE SC (`Sno` long, `Cno` int, `Grade` int) ;

INSERT INTO SC (`Sno`, `Cno`, `Grade`) VALUES (200215121, 1, 92), (200215121, 2, 85), (200215121, 3, 88), (200215122, 2, 90), (200215122, 3, 80), (200215123, 1, 60), (200215124, 1, 79) ;




一、单表查询

1、选择表中的若干列

1、查询制定列

[例1]查询全体学生的学号与姓名

2、查询全部列

[例2]查询全体学生的详细记录

3、查询经过计算的值

[例3]查询全体学生的姓名及、出生年份和所在的院系,要求用小写字母表示所在系名

2、选择表中的若干元组

1、消除取值重复的行

[例3.5]查询选修了课程的学生学号

2、查询满足条件的元组

(1)比较大小
[例4]查询考试成绩不及格的学生的学号

(2)确定范围
[例5]查询年龄在20~23岁(包括20岁和23岁)之间的额学生的姓名、系别和年龄

(3)确定集合
[例6]查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别

(4)字符匹配
[例7]查询名字中第2个字为“阳”字的学生的姓名和学号
[例8]查询以“DB_”开头,且倒数第3个字符为i的课程的详细情况

(5)涉及空值的查询
[例9]查询所有有成绩的学生学号和课程号

(6)多重条件查询
[例10]查询计算机科学系年龄在20岁以下的学生姓名

[笔试时]SQL练练手

3、ORDER BY 子句

[例11]查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄的降序排列

4、聚集函数

[例12]查询选修了课程的学生名字

[例13]计算1号课程的学生平均成绩

[例14]查询学生200215122选修课程的总学分数

聚集函数 作用
COUNT([DISTINCT | ALL] *) 统计元组个数
COUNT([DISTINCT | ALL] <列名>) 统计一列中值的个数
SUM([DISTINCT | ALL] <列名>) 计算一列值的总和(此列必须是整数型)
AVG([DISTINCT | ALL] <列名>) 计算一列值的平均值(此列必须是数值型)
MAX([DISTINCT | ALL] <列名>) 求一列值中的最大值
MIN([DISTINCT | ALL] <列名>) 求一列值中的最小值

5、GROUP BY 子句

[例15]查询选修了3门以上课程的学生学号

二、链接查询

1、等值与非等值链接查询

[例16]查询每个学生及其选修课程的情况

2、自身链接

[例17]查询每一门课程的间接先修课程(即先修课的先修课)

3、外连接

[例18]查询每个学生及其选修课程的情况

4、复合条件连接

[例19]查询选修2号课程且成绩在90分以上的所有学生

三、嵌套查询

1、带有IN谓词的子查询

[例20]查询与“刘晨”在同一个系学习的学生

[例21]查询选修了课程名为“信息系统”的学生学号和姓名

2、带有比较运算符的子查询

[例22]查询与“刘晨”在同一个系学习的学生

[例23]找出每个学生超过他选修课程平均成绩的课程号

3、带有ANY(SOME)或ALL谓词的子查询

[例24]查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄

[笔试时]SQL练练手

4、带有EXISTS谓词的子查询

[例25]查询没有选修1号课程的学生姓名

四、集合查询

[例26]查询计算机科学系的学生及年龄不大于19岁的学生

[例27]查询计算机科学系的学生与年龄不大于19岁的学生的交集

//1.1 [例1]
SELECT Sno, Sname FROM Student;

//1.2 [例2]
SELECT * FROM Student;

//1.3 [例3]
SELECT Sname 姓名, 2015 - Sage 出生年份, LOWER(Sdept) 院系 FROM Student;

//2.1.1 [例3.5]
SELECT DISTINCT Sno FROM SC;

//查询计算机系的学生年龄 姓名
SELECT Sno, Sname FROM Student WHERE Sdept = 'CS';

//查询年龄小于20的学生姓名 年龄
SELECT Sname, Sage FROM Student WHERE Sage < 20;

//2.2.1 [例4]
SELECT Sno FROM SC WHERE Grade < 80;

//2.2.2 [例5]
SELECT Sname, Sage, Sdept FROM Student WHERE Sage BETWEEN 20 AND 23;

//2.2.3 [例6]
SELECT Sname, Ssex FROM Student WHERE Sdept IN('CS', 'MA');

//2.2.4 [例7]
SELECT Sname, Ssex FROM Student WHERE Sname LIKE '__女%';

//2.2.5 [例9]
SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL;

//查询选修课程号为3的学生学号
SELECT Sno FROM SC WHERE Cno = 3 //2.2.6 [例10]查询计算机系年龄小于20的学生姓名 SELECT Sname FROM Student WHERE Sage < 20 AND Sdept = 'CS';

//3.1 [例11]
SELECT * FROM Student ORDER BY Sdept ASC, Sage DESC;

//4.1 [例12]
SELECT COUNT(DISTINCT Sno) FROM SC;

//4.2 [例12]
SELECT AVG(Grade) FROM SC WHERE Cno = 1;

//4.3 [例13]
SELECT SUM(Grade) FROM SC WHERE Sno = 200215122 ORDER BY Grade ASC;

//查询每门课选修学生的人数
SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno;

//5.1 [例15]
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(Cno) > 2;

//1.1 [例16]
SELECT Student.*, SC.* FROM Student, SC WHERE Student.Sno = SC.Sno //2.1 [例17] SELECT F.Cno, S.Cpno FROM Course F, Course S WHERE F.Cpno = S.Cno //3.1 [例18] SELECT Student.*, SC.* FROM Student, SC WHERE Student.Sno = SC.Sno SELECT Student.* FROM Student LEFT OUTER JOIN SC ON (Student.Sno = SC.Sno);

SELECT Student.* FROM Student LEFT OUTER JOIN SC USING (Sno);

//4.1 [例20][例22]
SELECT Student.* FROM Student WHERE Sdept IN ( SELECT Sdept FROM Student WHERE Sname = '张三丰' ) SELECT Student.* FROM Student WHERE Sdept <> ( SELECT Sdept FROM Student WHERE Sname = '张三丰' ) //1.2 [例 21] SELECT Student.Sname, Student.Sno FROM Student LEFT OUTER JOIN SC ON (Student.Sno = SC.Sno) WHERE Cno IN ( SELECT Cno FROM Course WHERE Cname = '数据库' ) //2.2 [例23] SELECT Sno, Cno FROM SC X WHERE X.Grade >= ( SELECT AVG(Grade) FROM SC Y WHERE Y.Sno = X.Sno ) //3.1 [例24] SELECT Sname, Sage FROM Student WHERE Sdept NOT IN ('MA') AND Sage < ANY ( SELECT Sage FROM Student WHERE Sdept = 'MA' ) SELECT Sname, Sage FROM Student WHERE Sdept NOT IN ('MA') AND Sage < ( SELECT MIN(Sage) FROM Student WHERE Sdept = 'MA' ) //4.1 [例25] SELECT Sname FROM Student WHERE NOT EXISTS ( SELECT * FROM SC WHERE Sno = Student.Sno AND Cno = '1' ) //1.1 [例26] SELECT * FROM Student WHERE Sdept = 'CS' OR Sage < 19;

SELECT * FROM Student WHERE Sdept = 'CS' UNION SELECT * FROM Student WHERE Sage < 19;

//2.1 [例27]
SELECT * FROM Student WHERE Sdept = 'CS' AND Sage < 19;

SELECT * FROM Student WHERE Sdept = 'CS' INTERSECT SELECT * FROM Student WHERE Sage < 19;