介绍
如题!记录一些sql面试题,加深理解记忆。
**个人理解:**关于复杂的sql查询,你首先需要明确返回字段,提炼条件(where),拆分查询语句、复杂查询逐步简单化。
具体问题。
1.查询出下面表每门课都大于80分的学生。
表名为tb_score
+----+------+---------+-------+
| id | name | subject | score |
+----+------+---------+-------+
| 1 | 张三 | 语文 | 81 |
| 2 | 张三 | 数学 | 75 |
| 3 | 李四 | 语文 | 76 |
| 4 | 李四 | 数学 | 90 |
| 5 | 王五 | 语文 | 81 |
| 6 | 王五 | 数学 | 100 |
| 7 | 王五 | 英语 | 90 |
+----+------+---------+-------+
思路:(把小变成大做,把大变成小)
先查询出有低于80分的学生:
select distinct name from tb_score where score<=80;
在要求没门课都高于80分的学生姓名不属于上面查询到的名字里面,即为:
select distinct name from tb_score where not in (select name from tb_score where score<=80);
# 第二种
select name from tb_score group by name having min(score)>80
2.如下表,显示文章标题、发帖人、最后回复时间。
+----+--------------+----------+---------------------+----------+
| id | title | postuser | postdate | parentid |
+----+--------------+----------+---------------------+----------+
| 1 | 第一条 | 张三 | 1998-10-10 12:32:32 | NULL |
| 2 | 第二条 | 张三 | 1998-10-10 12:34:32 | NULL |
| 3 | 第一条回复 1 | 李四 | 1998-10-10 12:35:32 | 1 |
| 4 | 第二条回复 1 | 李四 | 1998-10-10 12:36:32 | 2 |
| 5 | 第一条回复 2 | 王五 | 1998-10-10 12:37:32 | 1 |
| 6 | 第一条回复 3 | 李四 | 1998-10-10 12:38:32 | 1 |
| 7 | 第二条回复 2 | 李四 | 1998-10-10 12:39:32 | 2 |
| 8 | 第一条回复 4 | 王五 | 1998-10-10 12:39:40 | 1 |
+----+--------------+----------+---------------------+----------+
思路:设置外键约束parentid有值,就必须是id的值(父)
要查发帖人即为parentid为null,查询出最大回复时间max(postdate)就必须要parentid=a.id
create table articles(
id int(6) primary key auto_increment,
title varchar(50),
postuser varchar(10),
postdate datetime,
parentid int(6),
constraint parent_id foreign key(parentid)
references articles(id)
);
select a.title,a.postuser,
(select max(postdate) from articles where parentid=a.id) reply
from articles a
where a.parentid is null;
问题描述:
已知关系模式:S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名
C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师
SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩
- 找出没有选修过“李明”老师讲授课程的所有学生姓名(找出所有上李明老师课的人)
- 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩
//1.
Select SNAME FROM S Where NOT
EXISTS( Select * FROM SC,C Where SC.CNO=C.CNO AND CNAME='李明' AND SC.SNO=S.SNO)
//2.
Select S.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩]
FROM S,(
Select SC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADE
FROM SC SC1,C C1,SC SC2,C C2 Where SC1.CNO=C1.CNO
AND C1.NAME='1'
AND SC2.CNO=C2.CNO AND C2.NAME='2'
AND SC1.SCGRADE>SC2.SCGRADE) SC Where S.SNO=SC.SNO