-- ---------------------------- -- mysql練習sql腳本 -- ---------------------------- create database db10; -- 建立db10數據庫 use db10; -- 切換到db10數據庫 create table dept( -- 建立部門表 deptno int primary key, -- 部門編號 deptname varchar(50), -- 部門名稱 loc varchar(50) -- 部門位置 ); create table emp( -- 建立員工表 empno int primary key, -- 員工編號 primary key設置主鍵:值必須惟一且不能爲空 empname varchar(50), -- 員工姓名 job varchar(50), -- 職位 mgr int, -- 直屬上級 hiredate date, -- 受僱日期 sal int, -- 薪資 comm int, -- 獎金 deptno int, -- 所在部門編號 foreign key(deptno) references dept(deptno) ); -- ---------------------------- -- Records of dept 部門表數據 -- ---------------------------- INSERT INTO `dept` VALUES ('10', '會計部', '北京'); INSERT INTO `dept` VALUES ('20', '調查部', '杭州'); INSERT INTO `dept` VALUES ('30', '銷售部', '上海'); INSERT INTO `dept` VALUES ('40', '營銷部', '深圳'); -- ---------------------------- -- Records of emp 員工表數據 -- ---------------------------- INSERT INTO `emp` VALUES ('7369', '張無忌', '辦事員', '7902', '1980-12-17', '800', null, '20'); INSERT INTO `emp` VALUES ('7499', '曹操', '推銷員', '7698', '1981-02-20', '1600', '300', '30'); INSERT INTO `emp` VALUES ('7521', '楊志', '推銷員', '7698', '1981-02-22', '1250', '500', '30'); INSERT INTO `emp` VALUES ('7566', '朱元璋', '經理', '7839', '1981-04-02', '2975', null, '20'); INSERT INTO `emp` VALUES ('7654', '殷天正', '推銷員', '7698', '1981-09-28', '1250', '1400', '30'); INSERT INTO `emp` VALUES ('7698', '張三丰', '經理', '7839', '1981-05-01', '2850', null, '30'); INSERT INTO `emp` VALUES ('7782', '關羽', '經理', '7839', '1981-06-09', '2450', null, '10'); INSERT INTO `emp` VALUES ('7788', '宋江', '分析員', '7566', '1987-04-19', '3000', null, '20'); INSERT INTO `emp` VALUES ('7839', '韓少雲', '董事長', null, '1981-11-17', '5000', null, '10'); INSERT INTO `emp` VALUES ('7844', '孫二孃', '推銷員', '7698', '1981-09-08', '1500', '0', '30'); INSERT INTO `emp` VALUES ('7876', '張飛', '辦事員', '7788', '1987-05-23', '1100', null, '20'); INSERT INTO `emp` VALUES ('7900', '趙雲', '辦事員', '7698', '1981-12-03', '950', null, '30'); INSERT INTO `emp` VALUES ('7902', '諸葛亮', '分析員', '7566', '1981-12-03', '3000', null, '20'); INSERT INTO `emp` VALUES ('7934', '夏侯惇', '辦事員', '7782', '1982-01-23', '1300', null, '10');
要求:mysql
-- 1.列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。 -- 2.列出薪資比關羽高的全部員工。 -- 3.列出全部員工的姓名及其直接上級的姓名。 -- 4.列出最低薪資大於1500的各類職位及從事此職位的員工人數。 -- 5.列出在銷售部職位的員工的姓名,假定不知道銷售部的部門編號。 -- 6.列出與曹操從事相同職位的全部員工及部門名稱。 -- 7.列出薪資高於在銷售部(已知部門編號爲30)就任的全部員工的薪資的員工姓名和薪資、部門名稱。 -- 8.列出在每一個部門職位的員工數量、平均工資。 -- 9.查出至少有一個員工的部門。顯示部門人數、部門編號、部門名稱、部門位置。 -- 10.列出受僱日期早於直接上級的全部員工的編號、姓名、部門名稱。 -- 11.列出全部職員的姓名及其部門名稱,部門的人數。
答案:sql
+----------+-------+---------+--------+------+------------+------+------+--------+ | deptname | empno | empname | job | mgr | hiredate | sal | comm | deptno | +----------+-------+---------+--------+------+------------+------+------+--------+ | 會計部 | 7782 | 關羽 | 經理 | 7839 | 1981-06-09 | 2450 | NULL | 10 | | 會計部 | 7839 | 韓少雲 | 董事長 | NULL | 1981-11-17 | 5000 | NULL | 10 | | 會計部 | 7934 | 夏侯惇 | 辦事員 | 7782 | 1982-01-23 | 1300 | NULL | 10 | | 調查部 | 7369 | 張無忌 | 辦事員 | 7902 | 1980-12-17 | 800 | NULL | 20 | | 調查部 | 7566 | 朱元璋 | 經理 | 7839 | 1981-04-02 | 2975 | NULL | 20 | | 調查部 | 7788 | 宋江 | 分析員 | 7566 | 1987-04-19 | 3000 | NULL | 20 | | 調查部 | 7876 | 張飛 | 辦事員 | 7788 | 1987-05-23 | 1100 | NULL | 20 | | 調查部 | 7902 | 諸葛亮 | 分析員 | 7566 | 1981-12-03 | 3000 | NULL | 20 | | 銷售部 | 7499 | 曹操 | 推銷員 | 7698 | 1981-02-20 | 1600 | 300 | 30 | | 銷售部 | 7521 | 楊志 | 推銷員 | 7698 | 1981-02-22 | 1250 | 500 | 30 | | 銷售部 | 7654 | 殷天正 | 推銷員 | 7698 | 1981-09-28 | 1250 | 1400 | 30 | | 銷售部 | 7698 | 張三丰 | 經理 | 7839 | 1981-05-01 | 2850 | NULL | 30 | | 銷售部 | 7844 | 孫二孃 | 推銷員 | 7698 | 1981-09-08 | 1500 | 0 | 30 | | 銷售部 | 7900 | 趙雲 | 辦事員 | 7698 | 1981-12-03 | 950 | NULL | 30 | +----------+-------+---------+--------+------+------------+------+------+--------+ -- 1.列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。 /* 列: deptname, emp.* 條件: emp.deptno=dept.deptno */ select d.deptname, e.* from dept d left join emp e on e.deptno=d.deptno; -- 2.列出薪資比關羽高的全部員工。 /* 列: emp.* 表: emp 條件: sal>(關羽的薪資) */ -- 求出關羽的薪資: select * from emp where sal> (select sal from emp where empname='關羽'); -- 3.列出全部員工的姓名及其直接上級的姓名。 /* 列: e1.empname, (直接上級)e2.empname 表: emp e1, emp e2 條件: e1.mgr=e2.empno */ select e1.empname, e2.empname from emp e1, emp e2 where e1.mgr=e2.empno; -- 4.列出最低薪資大於1500的各類職位及從事此職位的員工人數。 /* 列: job 員工人數 表: emp 條件: 最低薪資(分組)>1500 分組條件: job */ select job, min(sal) 最低工資, count(*) 員工人數 from emp group by job having min(sal)>1500; -- 5.列出在銷售部的員工的姓名,假定不知道銷售部的部門編號。 /* 列: empname 表: dept d, emp e 條件: d.deptname='銷售部' d.deptno=e.deptno */ select e.empname, d.deptname from dept d, emp e where d.deptname='銷售部' and d.deptno=e.deptno; -- 6.列出與曹操從事相同職位的全部員工及部門名稱。 /* 列: e.empname d.deptname 表: emp e, dept d 條件: job='曹操的職位' e.deptno=d.deptno */ select e.empname, d.deptname, e.job from emp e, dept d where e.deptno=d.deptno and job=(select job from emp where empname='曹操'); -- 7.列出薪資高於在銷售部(已知部門編號爲30)就任的全部員工的薪資的員工姓名和薪資、部門名稱。 /* 列: e.empname, e.sal, d.deptname 表: emp e, dept d 條件: e.deptno=d.deptno sal> (30號部門的最高薪資) */ select d.deptname, e.* /*select d.deptname, e.sal, e.empname*/ from emp e, dept d where e.deptno=d.deptno and e.sal > (select max(sal) from emp where deptno=30); -- 8.列出在每一個部門職位的員工數量、平均工資。 /* 列: 員工數量, 平均工資 表: emp 分組條件: deptno 聚合函數: count(*), avg(sal) */ select deptno, count(*) 員工數量, avg(sal) 平均工資 from emp group by deptno; -- 9.查出至少有一個員工的部門。顯示部門人數、部門編號、部門名稱、部門位置。 /* 列: 部門人數(count(*)) d.deptno, d.deptname, d.loc 表: emp e, dept d 條件: e.deptno=d.deptno 分組條件: e.deptno */ select d.*, count(*) 部門人數 from emp e, dept d where e.deptno=d.deptno group by e.deptno; -- 10.列出受僱日期早於直接上級的全部員工的編號、姓名、部門名稱。 /* 列: e.empno, e.empname, d.deptname 表: emp e1, emp e2, dept d 條件: e1.hiredate<e2.hiredate and e1.mgr=e2.empno and e1.deptno=d.deptno */ select e1.empno, e1.empname, d.deptname from emp e1, emp e2, dept d where e1.hiredate<e2.hiredate and e1.mgr=e2.empno and e1.deptno=d.deptno; -- 11.列出全部職員的姓名及其部門名稱,部門的人數。 /* 張三丰 調查部 6 列: e.empname, count(*)(分組e.deptno), d.deptname 表: emp e, dept d 條件: e.deptno=d.deptno 分組條件: e.deptno */ --查詢員工及對應的部門 select e.empname, d.deptname, d.deptno from emp e, dept d where e.deptno=d.deptno; --查詢部門的人數 select deptno, count(*) cnt from emp group by deptno --關聯查詢 select e.empname, d.deptname, e.deptno, e2.cnt 部門人數 from emp e, dept d, ( select deptno, count(*) cnt from emp group by deptno ) e2 where e.deptno=d.deptno and e.deptno=e2.deptno;