[數據庫原理] SQL練習(MySQL版)

DROP DATABASE exam;
CREATE DATABASE exam;

USE exam;

/*創建部門表*/
/*部門編號,部門名稱,部門位置*/
CREATE TABLE dept(
	deptno		INT 	PRIMARY KEY,
	dname		VARCHAR(50),
	loc 		VARCHAR(50)
);

/*創建僱員表*/
/*員工編號,員工名稱,職位,領導的員工編號,入職時間,工資,獎金,部門編號*/
CREATE TABLE emp(
	empno		INT 	PRIMARY KEY,
	ename		VARCHAR(50),
	job		VARCHAR(50),
	mgr		INT,
	hiredate	DATE,
	sal		DECIMAL(7,2),
	COMM 		DECIMAL(7,2),
	deptno		INT,
	CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)
);

/*創建工資等級表*/
/*工資等級,工資下限,工資上限*/
CREATE TABLE salgrade(
	grade		INT 	PRIMARY KEY,
	losal		INT,
	hisal		INT
);

/*創建學生表*/
/*學生id,學生姓名,學生年齡,學生性別,所在省份*/
CREATE TABLE stu(
	sid		INT 	PRIMARY KEY,
	sname		VARCHAR(50),
	age		INT,
	gander		VARCHAR(10),
	province	VARCHAR(50),
	tuition		INT
);







/*插入dept表數據*/
INSERT INTO dept VALUES (10, '教研部', '北京');
INSERT INTO dept VALUES (20, '學工部', '上海');
INSERT INTO dept VALUES (30, '銷售部', '廣州');
INSERT INTO dept VALUES (40, '財務部', '武漢');

/*插入emp表數據*/
INSERT INTO emp VALUES (1009, '曾阿牛', '董事長', NULL, '2001-11-17', 50000, NULL, 10);
INSERT INTO emp VALUES (1004, '劉備', '經理', 1009, '2001-04-02', 29750, NULL, 20);
INSERT INTO emp VALUES (1006, '關羽', '經理', 1009, '2001-05-01', 28500, NULL, 30);
INSERT INTO emp VALUES (1007, '張飛', '經理', 1009, '2001-09-01', 24500, NULL, 10);
INSERT INTO emp VALUES (1008, '諸葛亮', '分析師', 1004, '2007-04-19', 30000, NULL, 20);
INSERT INTO emp VALUES (1013, '龐統', '分析師', 1004, '2001-12-03', 30000, NULL, 20);
INSERT INTO emp VALUES (1002, '黛綺絲', '銷售員', 1006, '2001-02-20', 16000, 3000, 30);
INSERT INTO emp VALUES (1003, '殷天正', '銷售員', 1006, '2001-02-22', 12500, 5000, 30);
INSERT INTO emp VALUES (1005, '謝遜', '銷售員', 1006, '2001-09-28', 12500, 14000, 30);
INSERT INTO emp VALUES (1010, '韋一笑', '銷售員', 1006, '2001-09-08', 15000, 0, 30);
INSERT INTO emp VALUES (1012, '程普', '文員', 1006, '2001-12-03', 9500, NULL, 30);
INSERT INTO emp VALUES (1014, '黃蓋', '文員', 1007, '2002-01-23', 13000, NULL, 10);
INSERT INTO emp VALUES (1011, '周泰', '文員', 1008, '2007-05-23', 11000, NULL, 20);


INSERT INTO emp VALUES (1001, '甘寧', '文員', 1013, '2000-12-17', 8000, NULL, 20);


/*插入salgrade表數據*/
INSERT INTO salgrade VALUES (1, 7000, 12000);
INSERT INTO salgrade VALUES (2, 12010, 14000);
INSERT INTO salgrade VALUES (3, 14010, 20000);
INSERT INTO salgrade VALUES (4, 20010, 30000);
INSERT INTO salgrade VALUES (5, 30010, 99990);

/*插入stu表數據*/
INSERT INTO `stu` VALUES ('1', '王永', '23', '男', '北京', '1500');
INSERT INTO `stu` VALUES ('2', '張雷', '25', '男', '遼寧', '2500');
INSERT INTO `stu` VALUES ('3', '李強', '22', '男', '北京', '3500');
INSERT INTO `stu` VALUES ('4', '宋永合', '25', '男', '北京', '1500');
INSERT INTO `stu` VALUES ('5', '敘美麗', '23', '女', '北京', '1000');
INSERT INTO `stu` VALUES ('6', '陳寧', '22', '女', '山東', '2500');
INSERT INTO `stu` VALUES ('7', '王麗', '21', '女', '北京', '1600');
INSERT INTO `stu` VALUES ('8', '李永', '23', '男', '北京', '3500');
INSERT INTO `stu` VALUES ('9', '張玲', '23', '女', '廣州', '2500');
INSERT INTO `stu` VALUES ('10', '啊歷', '18', '男', '山西', '3500');
INSERT INTO `stu` VALUES ('11', '王剛', '23', '男', '湖北', '4500');
INSERT INTO `stu` VALUES ('12', '陳永', '24', '男', '北京', '1500');
INSERT INTO `stu` VALUES ('13', '李雷', '24', '男', '遼寧', '2500');
INSERT INTO `stu` VALUES ('14', '李沿', '22', '男', '北京', '3500');
INSERT INTO `stu` VALUES ('15', '王小明', '25', '男', '北京', '1500');
INSERT INTO `stu` VALUES ('16', '王小麗', '23', '女', '北京', '1000');
INSERT INTO `stu` VALUES ('17', '唐寧', '22', '女', '山東', '2500');
INSERT INTO `stu` VALUES ('18', '唐麗', '21', '女', '北京', '1600');
INSERT INTO `stu` VALUES ('19', '啊永', '23', '男', '北京', '3500');
INSERT INTO `stu` VALUES ('20', '唐玲', '23', '女', '廣州', '2500');
INSERT INTO `stu` VALUES ('21', '敘剛', '18', '男', '山西', '3500');
INSERT INTO `stu` VALUES ('22', '王累', '23', '男', '湖北', '4500');
INSERT INTO `stu` VALUES ('23', '趙安', '23', '男', '北京', '1500');
INSERT INTO `stu` VALUES ('24', '關雷', '25', '男', '遼寧', '2500');
INSERT INTO `stu` VALUES ('25', '李字', '22', '男', '北京', '3500');
INSERT INTO `stu` VALUES ('26', '敘安國', '25', '男', '北京', '1500');
INSERT INTO `stu` VALUES ('27', '陳浩難', '23', '女', '北京', '1000');
INSERT INTO `stu` VALUES ('28', '陳明', '22', '女', '山東', '2500');
INSERT INTO `stu` VALUES ('29', '孫麗', '21', '女', '北京', '1600');
INSERT INTO `stu` VALUES ('30', '李治國', '23', '男', '北京', '3500');
INSERT INTO `stu` VALUES ('31', '張娜', '23', '女', '廣州', '2500');
INSERT INTO `stu` VALUES ('32', '安強', '18', '男', '山西', '3500');
INSERT INTO `stu` VALUES ('33', '王歡', '23', '男', '湖北', '4500');
INSERT INTO `stu` VALUES ('34', '周天樂', '23', '男', '北京', '1500');
INSERT INTO `stu` VALUES ('35', '關雷', '25', '男', '遼寧', '2500');
INSERT INTO `stu` VALUES ('36', '吳強', '22', '男', '北京', '3500');
INSERT INTO `stu` VALUES ('37', '吳合國', '25', '男', '北京', '1500');
INSERT INTO `stu` VALUES ('38', '正小和', '23', '女', '北京', '1000');
INSERT INTO `stu` VALUES ('39', '吳麗', '22', '女', '山東', '2500');
INSERT INTO `stu` VALUES ('40', '馮含', '21', '女', '北京', '1600');
INSERT INTO `stu` VALUES ('41', '陳冬', '23', '男', '北京', '3500');
INSERT INTO `stu` VALUES ('42', '關玲', '23', '女', '廣州', '2500');
INSERT INTO `stu` VALUES ('43', '包利', '18', '男', '山西', '3500');
INSERT INTO `stu` VALUES ('44', '威剛', '23', '男', '湖北', '4500');
INSERT INTO `stu` VALUES ('45', '李永', '23', '男', '北京', '1500');
INSERT INTO `stu` VALUES ('46', '張關雷', '25', '男', '遼寧', '2500');
INSERT INTO `stu` VALUES ('47', '送小強', '22', '男', '北京', '3500');
INSERT INTO `stu` VALUES ('48', '關動林', '25', '男', '北京', '1500');
INSERT INTO `stu` VALUES ('49', '蘇小啞', '23', '女', '北京', '1000');
INSERT INTO `stu` VALUES ('50', '趙寧', '22', '女', '山東', '2500');
INSERT INTO `stu` VALUES ('51', '陳麗', '21', '女', '北京', '1600');
INSERT INTO `stu` VALUES ('52', '錢小剛', '23', '男', '北京', '3500');
INSERT INTO `stu` VALUES ('53', '艾林', '23', '女', '廣州', '2500');
INSERT INTO `stu` VALUES ('54', '郭林', '18', '男', '山西', '3500');
INSERT INTO `stu` VALUES ('55', '周制強', '23', '男', '湖北', '4500');


/*
select * from emp;
select * from dept;
select * from salgrade;
*/

1、查詢出部門編號爲30的所有員工

SELECT * FROM emp WHERE emp.deptno = 30;

2、查詢所有銷售員的姓名、編號和部門編號

SELECT ename,empno,deptno FROM emp WHERE job = '銷售員';

3、 找出獎金高於工資的員工

SELECT * FROM emp WHERE COMM>sal;

4、找出獎金高於工資60%的員工

SELECT * FROM emp WHERE comm > sal * 0.6;

5、找出部門編號爲10中所有經理,和部門編號爲20中所有銷售員的詳細資料

SELECT * FROM emp WHERE (deptno=10 AND job='經理') OR (deptno=20 AND job='銷售員');

6、找出部門編號爲10中所有經理,部門編號爲20中所有銷售員,還有即不是經理又不是銷售員但其工資大或等於20000的所有員工詳細資料。

SELECT * FROM emp 
WHERE 
  (deptno=10 AND job='經理') 
  OR (deptno=20 AND job='銷售員') 
  OR job NOT IN ('經理','銷售員') AND sal>=20000;

7、有獎金的工種

SELECT DISTINCT job FROM emp WHERE comm IS NOT NULL;

8、無獎金或獎金低於1000的員工

SELECT * FROM emp WHERE comm IS NULL OR comm < 1000;

9、查詢名字由三個字組成的員工

SELECT * FROM emp WHERE ename LIKE '___';

10、查詢2000年入職的員工

SELECT * FROM emp WHERE hiredate LIKE '2000%';

11、查詢所有員工詳細信息,用編號升序排序

SELECT * FROM emp ORDER BY empno ASC;

12、查詢所有員工詳細信息,用工資降序排序,如果工資相同使用入職日期升序排序

SELECT * FROM emp ORDER BY sal DESC, hiredate ASC;

13、查詢每個部門的平均工資

SELECT deptno as '部門編號', AVG(sal) as '平均工資' FROM emp GROUP BY deptno;

14、求出每個部門的僱員數量

SELECT deptno as '部門編號', COUNT(1) as '人員數量' FROM emp GROUP BY deptno;

15、 查詢每種工作的最高工資、最低工資、人數

SELECT job '工作',max(sal) '最高工資',min(sal) '最低工資',count(1) '人數' FROM emp GROUP BY job;

16、顯示非銷售人員工作名稱以及從事同一工作僱員的月工資的總和,並且要滿足從事同一工作的僱員的月工資合計大於50000,輸出結果按月工資的合計升序排列

SELECT job,SUM(sal) FROM emp WHERE job <> '銷售員' GROUP BY job HAVING SUM(sal)>50000 ORDER BY SUM(sal) ASC;

17、查出至少有一個員工的部門。顯示部門編號、部門名稱、部門位置、部門人數。

SELECT d.*, z1.cnt 
FROM dept d, (SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno) z1
WHERE d.deptno = z1.deptno;

18、列出所有員工的姓名及其直接上級的姓名。

SELECT e.ename, IFNULL(m.ename, 'BOSS') 領導
FROM emp e LEFT OUTER JOIN emp m
ON e.mgr=m.empno;

19、列出受僱日期早於直接上級的所有員工的編號、姓名、部門名稱

SELECT e.empno, e.ename, d.dname
FROM emp e,emp m, dept d
WHERE e.mgr = m.empno and e.hiredate < m.hiredate and e.deptno = d.deptno;

20、列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。

SELECT *
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno;

21、列出最低薪金大於15000的各種工作及從事此工作的員工人數

SELECT job,count(*)
FROM emp
GROUP BY job
HAVING min(sal) > 15000;

22、列出在銷售部工作的員工的姓名,假定不知道銷售部的部門編號

SELECT ename
FROM emp, dept
WHERE emp.deptno = dept.deptno AND dept.dname = '銷售部';
SELECT ename
FROM emp
INNER JOIN dept ON emp.deptno = dept.deptno
WHERE dept.dname = '銷售部';
SELECT e.ename
FROM emp e
WHERE e.deptno=(SELECT deptno FROM dept WHERE dname='銷售部');

23、列出薪金高於公司平均薪金的所有員工信息,所在部門名稱,上級領導,工資等級

SELECT e.*, d.dname, m.ename, s.grade
FROM emp e, dept d, emp m, salgrade s
WHERE e.sal>(SELECT AVG(sal) FROM emp) AND e.deptno=d.deptno AND e.mgr=m.empno AND e.sal BETWEEN s.losal AND s.hisal;

24、列出與龐統從事相同工作的所有員工及部門名稱

SELECT e.*,d.dname
FROM emp e,dept d
WHERE e.job in (SELECT job FROM emp WHERE ename = '龐統') AND e.deptno = d.deptno;
SELECT e.*, d.dname
FROM emp e, dept d
WHERE e.deptno=d.deptno AND job=(SELECT job FROM emp WHERE ename='龐統');

25、列出薪金高於在部門30工作的所有員工的薪金 的員工姓名和薪金、部門名稱

SELECT e.ename, e.sal, d.dname
FROM emp e, dept d
WHERE sal > ALL((SELECT sal FROM emp WHERE deptno = 30)) AND e.deptno = d.deptno;

26、列出在每個部門工作的員工數量、平均工資

SELECT d.dname, e.cnt, e.avgsal
FROM (SELECT deptno, COUNT(*) cnt, AVG(sal) avgsal FROM emp GROUP BY deptno) e, dept d
WHERE e.deptno=d.deptno;

總結:

--select 子句                  要查詢的數據(oracle函數,別名,連接符,去除重複,邏輯運算)
--from語句                     決定要查詢的表(表名)             
--where子句                    篩選數據(篩選條件,關鍵字)
--group by子句                 分組     (分組字段)
--having子句                   分組篩選   (多行函數篩選條件)
--order by子句                 排序       (排序)
--from-->where--->group by-->select--->having--->order by
在分組語句中,使用where進行字段級別的篩選,使用having進行聚合函數的篩選。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章