综合题目 一
案例表格 emp
案例表格 dept
题目1:
查出至少有一个员工的部门,显示部门编号、部门名称、部门位置、部门人数。
SELECT d.deptno,d.dname,d.loc,COUNT(*) AS '员工数量'
FROM emp e
LEFT JOIN dept d ON e.deptno=d.deptno
GROUP BY deptno HAVING COUNT(*)>=1
SELECT d.deptno,d.dname,d.loc,COUNT(*) AS '员工数量'
FROM emp e ,dept d
WHERE e.deptno=d.deptno
GROUP BY deptno HAVING COUNT(*)>=1
题目2:
列出受雇日期早于直接上级的所有员工,显示员工编号、员工姓名、员工职位,部门名称。
分析 :
- 显示的列: e1.empno, e1.ename,e1.job,d.dname
- 查询的表: emp e1,emp e2,dept d
- 连接条件: e1.mgr=e2.empno AND e1.deptno=d.deptno
- 筛选条件: e1.hiredate<e2.hiredate
SELECT e1.empno, e1.ename,e1.job,d.dname
FROM emp e1,emp e2,dept d
WHERE e1.mgr=e2.empno AND e1.deptno=d.deptno
AND e1.hiredate<e2.hiredate
题目3:
查询员工表中薪资最高的员工信息
select name, max(sal) from emp; – 错误写法 查询不全面,结果只有一个
select name,sal from emp order by sal desc limit 0,1; --
多行函数和是否分组有关,如果查询结果中的数据没有经过分组,默认整个查询结果是一个组,多行函数就会默认统计当前这一个组的数据。产生的结果只有一个。
正确解法 实际表中有两个最高工资
根据最高薪资到emp表中查询, 该薪资对应的员工信息
SELECT *
FROM emp
WHERE sal =(SELECT MAX(sal) FROM emp)
题目4:
查询人员的部门名称和人员名称
多表查询,dname部门名称在dept表,ename人员名称在emp表
万能连接:left join
错误写法: 因为返回结果 只有两边表都有的记录会返回
SELECT e.ename,d.dname
FROM emp e , dept d
WHERE e.deptno=d.deptno
一般写法:写法固定无法优化
SELECT e.ename,d.dname
FROM emp e LEFT JOIN dept d
ON e.deptno=d.deptno
优化写法 缩小中间查询范围,以后可以按业务需求灵活变通
SELECT e.ename, d.dname
FROM
( SELECT deptno,ename FROM emp ) e
LEFT JOIN
( SELECT deptno,dname FROM dept ) d
ON e.deptno=d.deptno
测试题目 二
四张表 students ,teachers, courses, scores
students
teachers
courses
scores
题目 1
查询 至少有两名男生的班号
- select class ,COUNT(*)
查询结果集当中 如果出现了,聚合函数以外的非聚和字段,一定要用分组
SELECT class,COUNT(*)
FROM students WHERE ssex='男'
GROUP BY class
HAVING COUNT(sname)>=2
题目 2
查询scores表中的最高分的学生学号和课程号
SELECT sno,cno,degree
FROM scores
WHERE degree =(SELECT MAX(degree) FROM scores)
题目 3
查询‘3-105’号课程的平均分
SELECT AVG(degree) FROM scores WHERE cno='3-105'
SELECT AVG(degree)
FROM scores
GROUP BY cno
HAVING cno='3-105'
题目 4
查询各科的平均分
SELECT cno,ROUND(AVG(degree),2)
FROM scores
GROUP BY cno
题目 5
查询最低分大于70,最高分小于90的sno列
SELECT sno
FROM scores
GROUP BY sno
HAVING MIN(degree)>70 AND MAX(degree)<90
题目 6
查询存在有85分以上成绩的课程cno
SELECT cno
FROM scores
GROUP BY cno
HAVING MAX(degree)>85
题目 7
查询所有教师和同学的name、sex和birthday
正确答案
SELECT tname AS NAME,tsex AS sex,tbirthday AS birthday FROM teachers
UNION
SELECT sname,ssex,sbirthday FROM students
错误写法 : 会排列组合 笛卡尔查询
笛卡尔积查询:所谓笛卡尔积查询就是指,查询两张表,其中一张表有m条记录,另一张表有n条记录,查询的结果是m*n条。
SELECT t.tname ,t.tsex,t.tbirthday ,s.sname,s.ssex,s.sbirthday
FROM teachers t,students s
题目 8
查询所有任课教师的tname和depart
任课老师 即是老师 且在 course表中 有 tno 讲课的老师
SELECT tname,depart
FROM teachers
WHERE tno IN (SELECT tno FROM courses)
SELECT tname ,depart
FROM teachers t INNER JOIN courses c
ON t.tno=c.tno
题目 9
查询同名的同学记录
怎么知道名字重复呢? count计数大于1
正确答案
SELECT * FROM students
WHERE sname IN (
SELECT sname
FROM students
GROUP BY sname
HAVING COUNT(*)>1
)
错误写法 :分组之后查询结果 一组只能显示一行,即分组字段或者聚合函数
SELECT *,COUNT(*)
FROM students
GROUP BY sname
HAVING COUNT(*)>1
题目 10
查询学生的姓名和年龄
年龄=当前年份-出生年份
SELECT sname,sbirthday,YEAR(NOW())-YEAR(sbirthday) AS age
FROM students
题目 11
查询男教师及其所上的课程
SELECT t.tname,c.cname
FROM teachers t LEFT JOIN courses c
ON t.tno=c.tno
WHERE t.tsex='男'
优化查法
SELECT t.tname,c.cname
FROM
(SELECT * FROM teachers WHERE tsex='男') t
LEFT JOIN
(SELECT * FROM courses) c
ON t.tno = c.tno
题目 12
查询各门课程的最高分同学的信息
错误写法
SELECT * FROM scores
GROUP BY cno
HAVING MAX(degree)
正确写法
SELECT
s.sno,s.cno,s.degree
FROM
(SELECT cno,MAX(degree) dmax FROM scores GROUP BY cno) d
left join
(SELECT sno,cno,degree FROM scores) s
ON s.cno=d.cno AND s.degree=d.dmax
题目 13
查询课程对应的老师姓名、职称、所属系
SELECT t.tname,t.prof,t.depart
FROM
(SELECT * FROM teachers) t
LEFT JOIN
(SELECT * FROM courses) c
ON t.tno = c.tno