1. 程式人生 > 實用技巧 >經典 SQL 聯表查詢 70 題

經典 SQL 聯表查詢 70 題

題目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
  )