常见的sql⾯试题本章是SQL⾯试题的汇总,之后还会不断更新,⽂章的思维导图如下:
1.SQL初级查询
单表查询
-- 查询学⽣表中有⼏名学⽣的信息.显⽰学号
select distinct学号from student;
查询条件
-- 查询学⽣表中性别为⼥的学⽣所有信息
SELECT*FROM student WHERE性别='⼥';
结果排序
-- 查询成绩表中学⽣所有成绩,按照课程号升序,成绩降序排列
SELECT*FROM score
ORDER BY课程号ASC,成绩DESC;
限定数量
-- 查询成绩表中学⽣所有成绩,按照课程号升序,成绩降序排列,显⽰前5条数据SELECT*FROM score
ORDER BY课程号ASC,成绩DESC
LIMIT5;
-- 查询成绩表中学⽣所有成绩,返回成绩第⼆学⽣成绩信息
SELECT*FROM score
ORDER BY成绩DESC
sql查询面试题及答案LIMIT1OFFSET1;
case表达式
-- 对各课程的成绩按照[100-85(含)]、[85-70(含)]、[70-60(含)]、[60以下]分段,并统计各分段数⼈数和课程名
/*
定义条件:成绩在100-85(含)为[100-85(含)]段,在85-70(含)为[85-70(含)]段,在70-60(含)为[70-60(含)]段,⼩于60就是[60以下]分段;把成绩表score和课程表course交叉联结(右联结),显⽰课程号、课程名、和分数段;
按课程号、课程名进⾏分组,对分组结果的⼈数按照上上述的逻辑条件计数;
*/
SELECT a.课程号,b.课程名称,
SUM(CASE WHEN成绩BETWEEN85AND100THEN1ELSE0END)AS'100-80(含)',
SUM(CASE WHEN成绩BETWEEN70AND85THEN1ELSE0END)AS'85-70(含)',
SUM(CASE WHEN成绩BETWEEN60AND70THEN1ELSE0END)AS'70-60(含)',
SUM(CASE WHEN成绩<60THEN1ELSE0END)AS'60以下'
FROM score AS a RIGHT JOIN course AS b
ON a.课程号=b.课程号
GROUP BY a.课程号,b.课程名称;
分组汇总
-- 对每门课程进⾏分组,计算每门课程有⼏名学⽣
SELECT课程号,COUNT(学号)FROM score GROUP BY课程号
SQL⾼级查询
多表联结
# 查询出每门课程的及格⼈数和不及格⼈数
/*
定义条件:成绩>=60分及格,成绩<60分不及格;
按课程号进⾏分组,对分组结果的⼈数按照上⼀步的逻辑条件计数;*/
SELECT课程号,
SUM(CASE WHEN成绩>=60THEN1
ELSE0
END)AS及格⼈数,
SUM(CASE WHEN成绩<60THEN1
ELSE0
END)AS不及格⼈数
FROM score
GROUP BY课程号;
集合运算
-- 把学⽣表student和成绩表score交叉联结,显⽰所有成绩和学⽣
/
*①使⽤左联结 left join取绿⾊部分⾯积;
②使⽤右联结right union 条件为左列名为null的部分⾯积;
③使⽤union all 相加*/
SELECT a.学号,a.姓名,b.课程号,b.成绩
FROM student as a LEFT JOIN score as b
ON a.学号=b.学号
UNION ALL
SELECT a.学号,a.姓名,b.课程号,b.成绩
FROM student as a RIGHT JOIN score as b
ON a.学号=b.学号
WHERE a.学号IS NULL;
⼦查询
-- 每⼀科成绩都⼤于该科平均成绩学⽣的学号和成绩
/*
⼤⽩话:对每⼀科课程分组,对分组结果计算平均成绩;对每⼀科对应的学⽣的成绩⽐较,⼤于该科平均成绩的便符合条件SELECT 课程号,AVG(成绩) FROM score GROUP BY 课程号;
SELECT 学号,课程号,成绩 FROM score WHERE 成绩> <;关联⼦查询>;
*/
SELECT学号,课程号,成绩FROM score as s1 WHERE成绩>
(SELECT AVG(成绩)FROM score as s2 WHERE s1.课程号=s2.课程号GROUP BY课程号);