經典 SQL 聯表查詢 70 題
阿新 • • 發佈:2020-10-25
題目1,學生成績管理系統
建表
# 學生表 Student -- SId 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別 create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10)); # 科目表 Course -- CId 課程編號,Cname 課程名稱,TId 教師編號 create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10)); # 教師表 Teacher -- TId 教師編號,Tname 教師姓名 create table Teacher(TId varchar(10),Tname varchar(10)); # 成績表 SC -- SId 學生編號,CId 課程編號,score 分數 create table SC(SId varchar(10),CId varchar(10),score decimal(18,1)); insert into Student values('01' , '趙雷' , '1990-01-01' , '男'); insert into Student values('02' , '錢電' , '1990-12-21' , '男'); insert into Student values('03' , '孫風' , '1990-05-20' , '男'); insert into Student values('04' , '李雲' , '1990-08-06' , '男'); insert into Student values('05' , '周梅' , '1991-12-01' , '女'); insert into Student values('06' , '吳蘭' , '1992-03-01' , '女'); insert into Student values('07' , '鄭竹' , '1989-07-01' , '女'); insert into Student values('09' , '張三' , '2017-12-20' , '女'); insert into Student values('10' , '李四' , '2017-12-25' , '女'); insert into Student values('11' , '李四' , '2017-12-30' , '女'); insert into Student values('12' , '趙六' , '2017-01-01' , '女'); insert into Student values('13' , '孫七' , '2018-01-01' , '女'); insert into Course values('01' , '語文' , '02'); insert into Course values('02' , '數學' , '01'); insert into Course values('03' , '英語' , '03'); insert into Teacher values('01' , '張三'); insert into Teacher values('02' , '李四'); insert into Teacher values('03' , '王五'); insert into SC values('01' , '01' , 80); insert into SC values('01' , '02' , 90); insert into SC values('01' , '03' , 99); insert into SC values('02' , '01' , 70); insert into SC values('02' , '02' , 60); insert into SC values('02' , '03' , 80); insert into SC values('03' , '01' , 80); insert into SC values('03' , '02' , 80); insert into SC values('03' , '03' , 80); insert into SC values('04' , '01' , 50); insert into SC values('04' , '02' , 30); insert into SC values('04' , '03' , 20); insert into SC values('05' , '01' , 76); insert into SC values('05' , '02' , 87); insert into SC values('06' , '01' , 31); insert into SC values('06' , '03' , 34); insert into SC values('07' , '02' , 89); insert into SC values('07' , '03' , 98);
題目
# 1. 查詢" 01 "課程比" 02 "課程成績高的學生的資訊及課程分數 SELECT student.*, s1.* FROM student, ( SELECT * FROM sc WHERE cid = 1 ) s1, ( SELECT * FROM sc WHERE cid = 2 ) s2 WHERE s1.score > s2.score AND s1.sid = s2.sid AND student.sid = s1.sid; # 1.1 查詢同時存在" 01 "課程和" 02 "課程的情況 SELECT * FROM ( SELECT * FROM sc WHERE cid = 1 ) s1, ( SELECT * FROM sc WHERE cid = 2 ) s2 WHERE s1.sid = s2.sid; # SELECT sc.* FROM sc, ( SELECT sid, count(sid) AS num FROM sc WHERE cid IN (1, 2) GROUP BY sid HAVING num > 1 ) sc2 WHERE sc.sid = sc2.sid AND sc.cid IN (1, 2); #查詢存在" 01 "課程但,不存在" 02 "課程的情況(不存在時顯示為 null ) SELECT * FROM sc WHERE sc.SId NOT IN ( SELECT SId FROM sc WHERE sc.CId = '02' ) AND sc.CId = '01'; # 2. 查詢平均成績大於等於 60 分的同學的 學生編號 和 學生姓名 和 平均成績 SELECT student.SId, student.Sname, s.avg FROM student, ( SELECT sid, AVG(score) AS avg FROM sc GROUP BY sid HAVING avg >= 60 ) s WHERE student.SId = s.SId; # 3. 查詢在 SC 表存在成績的學生資訊 SELECT * FROM student WHERE sid IN ( SELECT sid FROM sc GROUP BY sid ); # 4. 查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績(沒成績的顯示為 null ) # 課程總數 SELECT sname, t.class_count, t.score_count FROM student, ( SELECT sid, count(CId) AS class_count, SUM(score) AS score_count FROM sc GROUP BY sid ) t WHERE student.sid = t.sid; # 查有成績的學生資訊 SELECT * FROM student WHERE student.sid IN ( SELECT sid FROM sc GROUP BY sid ); # 查詢「李」姓老師的數量 SELECT COUNT(tid) FROM teacher WHERE Tname LIKE '李%'; # 6. 查詢學過「張三」老師授課的同學的資訊 SELECT * FROM student WHERE SId IN ( SELECT sid FROM sc WHERE cid = ( SELECT CId FROM course WHERE tid IN ( SELECT tid FROM teacher WHERE Tname = '張三' ) ) ); # 7. 查詢沒有學全所有課程的同學的資訊 SELECT * FROM student WHERE sid IN ( SELECT sid FROM sc GROUP BY sid HAVING COUNT(sid) < ( SELECT count(cid) FROM course ) ); # 8. 查詢至少有一門課與學號為" 01 "的同學所學相同的同學的資訊 SELECT * FROM student WHERE sid IN ( SELECT sid FROM sc WHERE cid IN ( SELECT CId FROM sc WHERE sid = 1 ) AND sid != 1 GROUP BY SId ); # 9. 查詢和" 01 "號的同學學習的課程 完全相同的其他同學的資訊 SELECT * FROM student WHERE SId IN ( SELECT sc.sid FROM sc WHERE cid IN ( SELECT cid FROM sc WHERE SId = 1 ) AND sid != 1 GROUP BY sid HAVING # 課程數為 01 同學的課程數量一樣 count(sid) = ( SELECT COUNT(sid) FROM sc WHERE sid = 1 GROUP BY sid ) ); # 10. 查詢沒學過"張三"老師講授的任一門課程的學生姓名 SELECT * FROM student WHERE sid NOT IN ( SELECT sid FROM sc WHERE cid IN ( SELECT CId FROM course WHERE TId IN ( SELECT tid FROM teacher WHERE Tname = '張三' ) ) ); # 11. 查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績 SELECT student.sid, student.sname, avg(score) FROM student, sc WHERE student.sid IN ( SELECT sid FROM sc WHERE score < 60 GROUP BY sid HAVING count(*) >= 2 ) AND student.sid = sc.sid GROUP BY sid; # SELECT student.sid, student.sname, avg(score) FROM student, sc WHERE student.sid = sc.sid AND score < 60 GROUP BY sid HAVING count(*) >= 2; # 12. 檢索" 01 "課程分數小於 60,按分數降序排列的學生資訊 SELECT * FROM student WHERE sid IN ( SELECT sid FROM sc WHERE CId = 1 AND score < 60 ORDER BY score DESC ); # SELECT student.* FROM student, sc WHERE sc.CId = 1 AND sc.score < 60 AND student.sid = sc.sid ORDER BY score DESC; # 13. 按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績 SELECT sc.*, t.score_avg FROM sc, ( SELECT sid, avg(score) AS score_avg FROM sc GROUP BY SId ) t WHERE sc.sid = t.sid ORDER BY t.score_avg DESC; # 解法2 SELECT sc.SId, sc.CId, sc.score, t1.avgscore FROM sc LEFT JOIN ( SELECT sc.SId, avg(sc.score) AS avgscore FROM sc GROUP BY sc.SId ) t1 ON sc.SId = t1.SId ORDER BY t1.avgscore DESC; # 14. 查詢各科成績最高分、最低分和平均分: #以如下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率 #及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90 #要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列 SELECT course.cid AS "課程ID", course.cname AS "課程name", max_score AS "最高分", min_score AS "最低分", avg_score AS "平均分" , count_stu AS "選修人數", t.pass AS "及格率", t.middle AS "中等率", t.high AS "優秀率" FROM course, sc, ( SELECT CId, max(score) AS max_score, AVG(score) AS avg_score , min(score) AS min_score, count(sid) AS count_stu , sum(CASE WHEN sc.score >= 60 THEN 1 ELSE 0 END) / count(*) AS pass , sum(CASE WHEN sc.score >= 70 AND sc.score < 80 THEN 1 ELSE 0 END) / count(*) AS middle , sum(CASE WHEN sc.score >= 90 THEN 1 ELSE 0 END) / count(*) AS high FROM sc GROUP BY CId ) t WHERE course.CId = t.CId GROUP BY t.CId ORDER BY t.count_stu DESC, t.CId ASC; -- # 15. 按各科成績進行排序,並顯示排名, Score 重複時保留名次空缺 -- select -- sc.SId, -- sc.CId, -- CASE -- when @pre_parent_code = sc.CId then ( -- case -- when @prefontscore = sc.score then @curRank -- when @prefontscore: = sc.score then @curRank: = @curRank + 1 -- end -- ) -- when @prefontscore: = sc.score then @curRank: = 1 -- end as rank, -- sc.score, -- @pre_parent_code: = sc.CId -- from -- ( -- select -- @curRank: = 0, -- @pre_parent_code: = '', -- @prefontscore: = null -- ) as t, -- sc -- ORDER by -- sc.CId, -- sc.score desc; -- # 16. 查詢學生的總成績,並進行排名,總分重複時保留名次空缺 -- select -- t1.*, -- @currank: = @currank + 1 as rank -- from -- ( -- select -- sc.SId, -- sum(score) -- from -- sc -- GROUP BY -- sc.SId -- ORDER BY -- sum(score) desc -- ) as t1,( -- select -- @currank: = 0 -- ) as t; #17. 統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[60-0] 及所佔百分比 SELECT c.CId, c.cname , concat(t.r1 / t.num * 100, '%') AS "100_85" , concat(t.r2 / t.num * 100, '%') AS "85_70" , concat(t.r3 / t.num * 100, '%') AS "70_60" , concat(t.r4 / t.num * 100, '%') AS "60_0" FROM course c, ( SELECT cid, count(*) AS num , count(CASE WHEN score <= 100 AND score >= 85 THEN score END) AS r1 , count(CASE WHEN score < 85 AND score >= 70 THEN score END) AS r2 , count(CASE WHEN score < 70 AND score >= 60 THEN score END) AS r3 , count(CASE WHEN score < 60 AND score >= 0 THEN score END) AS r4 FROM sc GROUP BY cid ) t; # 18. 查詢各科成績前三名的記錄 (難點) # 思路:若大於此成績的數量少於3 即為前三名。 SELECT * FROM sc WHERE ( SELECT count(*) FROM sc a WHERE sc.CId = a.CId AND sc.score < a.score ) < 3 ORDER BY CId ASC, sc.score DESC; # 19. 查詢每門課程被選修的學生數 SELECT course.*, t.num FROM course LEFT JOIN ( SELECT CId, count(*) AS num FROM sc GROUP BY CId ) t ON course.CId = t.CId; # 20. 查詢出只選修兩門課程的學生學號和姓名 SELECT SId, sname FROM student WHERE sid IN ( SELECT sid FROM sc GROUP BY SId HAVING COUNT(*) = 2 ); # 21. 查詢男生、女生人數 SELECT ssex, count(ssex) FROM student GROUP BY ssex; # 22. 查詢名字中含有「風」字的學生資訊 SELECT * FROM student WHERE sname LIKE '%風%'; # 23. 查詢同名同性學生名單,並統計同名人數 # SELECT student.*, s.num FROM student, ( SELECT sname, ssex, count(sname) AS num FROM student WHERE sname IN ( SELECT sname FROM student GROUP BY sname HAVING count(sname) > 1 ) GROUP BY ssex HAVING count(ssex) > 1 ) s WHERE student.sname = s.sname AND student.ssex = s.ssex; # SELECT * FROM student LEFT JOIN ( SELECT sname, ssex, count(*) AS num FROM student GROUP BY sname, ssex ) s ON student.sname = s.sname AND student.ssex = s.ssex WHERE s.num > 1; # 24. 查詢 1990 年出生的學生名單 SELECT * FROM student WHERE Year(sage) = '1990'; # 25. 查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列 SELECT cid, avg(score) FROM sc GROUP BY cid ORDER BY cid ASC; # 26. 查詢平均成績大於等於 85 的所有學生的學號、姓名和平均成績 SELECT student.sid, sname, t.avg_score FROM student RIGHT JOIN ( SELECT sid, avg(score) AS avg_score FROM sc GROUP BY sid HAVING avg_score >= 85 ) t ON student.sid = t.sid; # 27. 查詢課程名稱為「數學」,且分數低於 60 的學生姓名和分數 SELECT student.Sname, t.score FROM student, ( SELECT sid, score FROM sc WHERE CId = ( SELECT cid FROM course WHERE Cname = '數學' ) AND score < 60 ) t WHERE student.sid = t.sid; # 28. 查詢所有學生的課程及分數情況(存在學生沒成績,沒選課的情況) SELECT student.sid, student.Sname, sc.cid, sc.score FROM student LEFT JOIN sc ON student.sid = sc.SId ORDER BY student.sid; # 29. 查詢任何一門課程成績在 70 分以上的姓名、課程名稱和分數 SELECT sname, cname, score FROM student, course, ( SELECT * FROM sc WHERE score > 70 ) t WHERE student.sid = t.sid AND course.CId = t.CId; # 30. 查詢不及格的課程 SELECT cname FROM course WHERE cid IN ( SELECT cid FROM sc WHERE score < 60 GROUP BY CId ); # 31. 查詢課程編號為 01 且課程成績在 80 分以上的學生的學號和姓名 SELECT sid, sname FROM student WHERE sid IN ( SELECT SId FROM sc WHERE cid = 1 AND score > 80 ); # 32. 求每門課程的學生人數 SELECT c.cid, c.cname, t.num FROM course c, ( SELECT cid, count(*) AS num FROM sc GROUP BY cid ) t WHERE c.cid = t.cid; # 33. 成績不重複,查詢選修「張三」老師所授課程的學生中,成績最高的學生資訊及其成績 SELECT student.*, t.score FROM student, ( SELECT * FROM sc WHERE CId = ( SELECT cid FROM course WHERE course.CId = ( SELECT tid FROM teacher WHERE Tname = '張三' ) ) ORDER BY score DESC LIMIT 0, 1 ) t WHERE student.sid = t.SId; # 34. 成績有重複的情況下,查詢選修「張三」老師所授課程的學生中,成績最高的學生資訊及其成績 SELECT student.*, t.score FROM student, sc, ( SELECT cid, score, count(*) AS num FROM sc WHERE CId = ( SELECT cid FROM course WHERE course.CId = ( SELECT tid FROM teacher WHERE Tname = '張三' ) ) GROUP BY score ORDER BY score DESC LIMIT 0, 1 ) t WHERE sc.CId = t.cid AND sc.score = t.score AND student.sid = sc.sid; # 35. 查詢不同課程成績相同的學生的學生編號、課程編號、學生成績 (重點) SELECT sc.sid, sc.CId, sc.score FROM sc, ( SELECT SId, score FROM sc GROUP BY score, sid HAVING count(*) > 1 ) t WHERE sc.sid = t.sid AND sc.score = t.score; # SELECT t1.* FROM sc t1 WHERE EXISTS ( SELECT * FROM sc t2 WHERE t1.SId = t2.SId AND t1.CId != t2.CId AND t1.score = t2.score ); # SELECT t1.* FROM sc t1, sc t2 WHERE t1.sid = t2.sid AND t1.CId != t2.CId AND t1.score = t2.score GROUP BY sid, cid, score; # 36. 查詢每門功成績最好的前兩名 (難點) SELECT * FROM sc s1 WHERE ( SELECT count(*) FROM sc s2 WHERE s1.cid = s2.cid AND s1.score < s2.score ) < 3 ORDER BY CId DESC, score DESC; # 37. 統計每門課程的學生選修人數(超過 5 人的課程才統計) SELECT cid, count(*) AS num FROM sc GROUP BY cid HAVING num > 5; # 38. 檢索至少選修兩門課程的學生學號 SELECT sid, count(*) AS num FROM sc GROUP BY SId HAVING num >= 2; # 39. 查詢選修了全部課程的學生資訊 SELECT * FROM student WHERE sid IN ( SELECT sid FROM sc GROUP BY SId HAVING count(*) = ( SELECT count(*) FROM course ) ); # 40. 查詢各學生的年齡,只按年份來算 SELECT sid, sname , Year(Now()) - Year(sage) FROM student; # 41. 按照出生日期來算,當前月日 < 出生年月的月日則,年齡減一 SELECT student.SId AS "學生編號", student.Sname AS "學生編號" , TIMESTAMPDIFF(YEAR, student.Sage, CURDATE()) AS "學生年齡" FROM student; # 42. 查詢本週過生日的學生 SELECT * FROM student WHERE YEARWEEK(student.Sage) = YEARWEEK(CURDATE()); # 43. 查詢下週過生日的學生 SELECT * FROM student WHERE YEARWEEK(student.Sage) = YEARWEEK(CURDATE()) + 1; # 44. 查詢本月過生日的學生 SELECT * FROM student WHERE MONTH(student.Sage) = MONTH(CURDATE()); # SELECT * FROM student WHERE EXTRACT(YEAR_MONTH FROM student.Sage) = EXTRACT(YEAR_MONTH FROM CURDATE()); # 45. 查詢下月過生日的學生 SELECT * FROM student WHERE MONTH(sage) = Month(DATE_ADD(CURDATE(), INTERVAL 1 MONTH));
題目 2, 公司員工管理系統
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for department -- ---------------------------- DROP TABLE IF EXISTS `department`; CREATE TABLE `department` ( `deptno` int(11) NOT NULL COMMENT '部門編號', `dname` varchar(255) DEFAULT NULL COMMENT '部門名稱', `loc` varchar(255) DEFAULT NULL COMMENT '部門地址', PRIMARY KEY (`deptno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='部門表'; -- ---------------------------- -- Records of department -- ---------------------------- INSERT INTO `department` VALUES ('10', '教研部', '北京'); INSERT INTO `department` VALUES ('20', '學工部', '上海'); INSERT INTO `department` VALUES ('30', '銷售部', '廣州'); INSERT INTO `department` VALUES ('40', '財務部', '武漢'); -- ---------------------------- -- Table structure for employee -- ---------------------------- DROP TABLE IF EXISTS `employee`; CREATE TABLE `employee` ( `empno` int(11) NOT NULL COMMENT '員工編號', `ename` varchar(255) DEFAULT NULL COMMENT '員工姓名', `job` varchar(255) DEFAULT NULL COMMENT '職位名稱', `mgr` varchar(255) DEFAULT NULL COMMENT '上司ID', `hiredate` date DEFAULT NULL COMMENT '入職事件', `sal` double(255,2) DEFAULT NULL COMMENT '薪水', `comm` double(255,2) DEFAULT NULL COMMENT '獎金', `deptno` int(255) DEFAULT NULL COMMENT '部門編號', PRIMARY KEY (`empno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='員工表'; -- ---------------------------- -- Records of employee -- ---------------------------- INSERT INTO `employee` VALUES ('1001', '小明', '文員', '1013', '2020-10-24', '8000.00', '0.00', '20'); INSERT INTO `employee` VALUES ('1002', '張三', '銷售員', '1006', '2020-10-24', '16000.00', '3000.00', '30'); INSERT INTO `employee` VALUES ('1003', '李四', '銷售員', '1006', '2020-10-24', '12500.00', '5000.00', '30'); INSERT INTO `employee` VALUES ('1004', '王五', '經理', '1009', '2020-10-24', '29750.00', '0.00', '20'); INSERT INTO `employee` VALUES ('1005', '張飛', '銷售員', '1006', '2020-10-24', '12500.00', '1400.00', '20'); INSERT INTO `employee` VALUES ('1006', '智障', '經理', '1009', '2020-10-24', '28500.00', '0.00', '30'); INSERT INTO `employee` VALUES ('1007', '特朗', '經理', '1009', '2020-10-24', '24500.00', '0.00', '30'); INSERT INTO `employee` VALUES ('1008', '阿三', '分析師', '1004', '2020-10-24', '30000.00', '0.00', '20'); INSERT INTO `employee` VALUES ('1009', '阿四', '董事長', 'NULL', '2020-10-24', '50000.00', '0.00', '30'); INSERT INTO `employee` VALUES ('1010', '阿五', '銷售員', '1006', '2020-10-24', '15000.00', '0.00', '10'); INSERT INTO `employee` VALUES ('1011', '阿六', '文員', '1008', '2020-10-24', '11000.00', '0.00', '20'); INSERT INTO `employee` VALUES ('1012', '傻瓜', '文員', '1006', '2020-10-24', '9500.00', '0.00', '30'); INSERT INTO `employee` VALUES ('1013', '二蛋', '分析師', '1004', '2020-10-24', '30000.00', '0.00', '20'); INSERT INTO `employee` VALUES ('1014', '麻子', '文員', '1007', '2020-10-24', '13000.00', '0.00', '10'); INSERT INTO `employee` VALUES ('1015', '阿巴', '保潔員', '1001', '2020-10-24', '8000.00', '100.00', '50'); -- ---------------------------- -- Table structure for salgrade -- ---------------------------- DROP TABLE IF EXISTS `salgrade`; CREATE TABLE `salgrade` ( `grade` int(11) NOT NULL COMMENT '薪水等級', `losal` int(11) DEFAULT NULL COMMENT '最低薪水', `hisal` int(11) DEFAULT NULL COMMENT '最高薪水' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='薪水登記表'; -- ---------------------------- -- Records of salgrade -- ----------------------------
練習
# 1 列出受僱日期早於直接上級的所有員工的編號、姓名、部門名稱。
select
e1.empno,
e1.ename,
dep.dname
from
employee as e1,
department as dep
where
e1.hiredate < (
SELECT
hiredate
from
employee
where
e1.mgr = employee.empno
)
and e1.deptno = dep.deptno;
----------------------------------------------------------------
# 2 列出部門名稱和這些部門的員工資訊,同時列出那些沒有員工的部門。
select
department.dname,
employee.*
from
employee
right join department on employee.deptno = department.deptno;
----------------------------------------------------------------
#3 列出在銷售部工作的員工的姓名,假定不知道銷售部的部門編號
select
ename
from
employee
where
deptno = (
select
deptno
from
department
where
dname = '銷售部'
);
----------------------------------------------------------------
#4 列出與張飛從事相同工作的所有員工及部門名稱。
select
employee.*,
department.dname
from
employee,
department
where
employee.job = (
select
job
FROM
employee
where
ename = '張飛'
)
and department.deptno = employee.deptno;
-----------------------------------------------------------------
#5 列出薪金高於在部門 30 工作的所有員工的薪金 的員工姓名和薪金、部門名稱
select
ename,
dname
from
employee,
department
where
sal > (
select
MAX(sal)
from
employee
where
deptno = 30
)
and employee.deptno = department.deptno;
----------------------------------------------------------------
#6 列出薪金高於公司平均薪金的所有員工資訊. 所在部門名稱,上級領導,工資等級。
select
e1.empno,
e1.ename,
e2.ename AS '上級名稱'
from
employee AS e1,
employee AS e2
where
e1.sal > (
select
AVG(sal)
from
employee
)
and e1.mgr = e2.empno;
----------------------------------------------------------------
#7 查詢出部門編號為30的所有員工
select
*
from
employee
where
deptno = 30;
----------------------------------------------------------------
#8 所有銷售員的姓名、編號和部門編號。
select
ename,
empno,
deptno
from
employee
where
job = '銷售員';
----------------------------------------------------------------
#9 找出獎金高於工資的員工。
select
*
from
employee
where
comm > sal;
----------------------------------------------------------------
#10 找出獎金高於工資60%的員工。
select
*
from
employee
where
comm > sal * 0.6;
----------------------------------------------------------------
#11 找出部門編號為10中所有經理,和部門編號為20中所有銷售員的詳細資料。
select
*
from
employee
where
(
deptno = 10
and job = '經理'
)
OR(
deptno = 20
and job = '銷售員'
);
----------------------------------------------------------------
#12 找出部門編號為10中所有經理,部門編號為20中所有銷售員,還有即不是經理又不是銷售員但其工資大或等於20000的所有員工詳細資料。
select
*
from
employee
where
(
deptno = 10
and job = '經理'
)
OR (
deptno = 20
and job = '銷售員'
)
OR (
job != '經理'
and job != '銷售員'
and sal > 20000
);
----------------------------------------------------------------
#13 無獎金或獎金低於1000的員工。
select
*
from
employee
where
comm < 1000
OR comm = 0;
----------------------------------------------------------------
#14 查詢名字由三個字組成的員工。
select
*
from
employee
where
ename like ' ___ ';
----------------------------------------------------------------
#15 查詢2000年入職的員工。
select
*
from
employee
where
hiredate = ' 2000 ';
----------------------------------------------------------------
#16 查詢所有員工詳細資訊,用編號升序排序
select
*
from
employee
ORDER BY
empno ASC;
----------------------------------------------------------------
#17 查詢所有員工詳細資訊,用工資降序排序,如果工資相同使用入職日期升序排序
select
*
from
employee
ORDER BY
sal DESC,
hiredate ASC;
----------------------------------------------------------------
#18 查詢每個部門的平均工資
select
t.deptno,
t.avg_sal,
dname
from
department,
(
select
deptno,
AVG(sal) As avg_sal
from
employee
group by
deptno
) AS t
where
t.deptno = department.deptno;
-----------------------------------------------------------------
#19 查詢每個部門的僱員數量。
select
job,
count(*)
from
employee
GROUP BY
job;
----------------------------------------------------------------
#20 查詢每種工作的最高工資、最低工資、人數
select
job ' 工 種 ',
MAX(sal) ' 最 高 工 資 ',
MIN(sal) ' 最 低 工 資 ',
count(*)
from
employee
group by
job;
----------------------------------------------------------------
#21 列出所有員工的姓名及其直接上級的姓名
select
e1.ename,
e2.ename
from
employee e1,
employee e2
where
e1.mgr = e2.empno;
----------------------------------------------------------------
#22 查出至少有 2 個員工的部門。顯示部門編號、部門名稱、部門位置、部門人數
create VIEW dept_emp_num AS
select
deptno,
COUNT(deptno) AS num
from
employee
GROUP BY
deptno;
# 使用檢視查詢
select
d.deptno,
d.dname,
d.loc,
num
from
department d,
dept_emp_num
where
d.deptno = dept_emp_num.deptno
And dept_emp_num.num >= 1;
--------------------------------------------------------
# 解法2
select
d.deptno,
d.dname,
d.loc,
z.num
from
department d,
(
select
deptno,
count(*) AS num
from
employee
GROUP by
deptno
) AS z
WHERE
z.deptno IN (d.deptno)
HAVING
d.deptno in (
select
deptno
from
employee
GROUP by
deptno
HAVING
count(deptno) >= 1
)