数据库创建
-- 创建员工信息表
CREATE TABLE `emp` (
`empno` varchar(10) NOT NULL,
`ename` varchar(10) DEFAULT NULL,
`job` varchar(10) DEFAULT NULL,
`mgr` varchar(10) DEFAULT NULL,
`sal` varchar(10) DEFAULT NULL,
`deptno` varchar(10) DEFAULT NULL,
PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 创建部门信息表
CREATE TABLE `dept` (
`deptno` varchar(10) NOT NULL,
`dname` varchar(10) DEFAULT NULL,
PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
实际练习
-- 1.查询各部门中薪资最低和最高的数据,包括的子段有部门编号、部门名词、员工名称、最高薪资、最第薪资.
select b.deptno as '部门编号',dname as '部门名词',max(sal) as '最高薪资',min(sal) as '最低薪资' from emp a inner join dept b on a.deptno=b.deptno group by a.deptno;
+--------------+--------------+--------------+--------------+
| 部门编号 | 部门名词 | 最高薪资 | 最低薪资 |
+--------------+--------------+--------------+--------------+
| 1 | 销售部 | 2000 | 1000 |
| 2 | 事业部 | 800 | 600 |
| 3 | 技术部 | 1500 | 1000 |
+--------------+--------------+--------------+--------------+
3 rows in set (0.01 sec)
-- 2.查询出各部门中job为CLERK的最高薪资和最低薪资.
select deptno as '部门编号', max(sal) as '最高薪资', min(sal) as '最低薪资' from emp where job='CLERK' group by deptno;
+--------------+--------------+--------------+
| 部门编号 | 最高薪资 | 最低薪资 |
+--------------+--------------+--------------+
| 1 | 2000 | 1000 |
+--------------+--------------+--------------+
1 row in set (0.00 sec)
-- 3.查询出emp表中最低薪资小于2000的部门且job为clerk的部门编号、最低薪资和最高薪资.
select b.deptno as '部门号',max(sal) as '最高工资',min(sal) as '最低工资' from emp as b where job='derk' and (select min(sal) from emp as a where a.deptno=b.deptno)<2000 group by b.deptno;
Empty set (0.03 sec)
-- 4.查询出emp表中薪资小于2000的且job为clerk的部门编号、最低薪资和最高薪资.
select deptno as '部门编号', max(sal) as '最高薪资', min(sal) as '最低薪资' from emp where job='CLERK' and emp.sal< 2000 group by deptno;
+--------------+--------------+--------------+
| 部门编号 | 最高薪资 | 最低薪资 |
+--------------+--------------+--------------+
| 1 | 1000 | 1000 |
+--------------+--------------+--------------+
1 row in set (0.02 sec)
-- 5.查询出emp表中员工编号、员工名称、员工薪资并按照薪资由低到高、编号有高到低的顺序进行排序.
select deptno as '部门编号',ename as '员工名词',sal as '薪资' from emp order by deptno desc,sal asc;
+--------------+--------------+--------+
| 部门编号 | 员工名词 | 薪资 |
+--------------+--------------+--------+
| 3 | buddy | 1000 |
| 3 | canndy | 1500 |
| 2 | jenny | 600 |
| 2 | pretty | 800 |
| 1 | jacky | 1000 |
| 1 | tom | 2000 |
| 1 | biddy | 2000 |
+--------------+--------------+--------+
7 rows in set (0.00 sec)
-- 6.查询出emp中名字为buddy的所在部门编号以及该部门所在的员工,只查询部门编号与员工名词.
select a.deptno as '部门编号',a.ename as '员工名称' from emp as a where deptno=(select b.deptno as deptno from emp as b where b.ename = 'buddy');
* 需要注意的是在子查询中给表取别名的时候不能和前面的主查询的别名一致
+--------------+--------------+
| 部门编号 | 员工名称 |
+--------------+--------------+
| 3 | buddy |
| 3 | canndy |
+--------------+--------------+
2 rows in set (0.03 sec)
-- 7.查询emp中job为clerk的员工信息.
select a.deptno as '部门编号',a.dname as '部门名词', b.ename as '员工姓名', b.job as '员工内容' , b.sal as '员工薪资' from dept as a inner join emp b on b.job = 'CLERK' and a.deptno=b.deptno;
+--------------+--------------+--------------+--------------+--------------+
| 部门编号 | 部门名词 | 员工姓名 | 员工内容 | 员工薪资 |
+--------------+--------------+--------------+--------------+--------------+
| 1 | 销售部 | jacky | clerk | 1000 |
| 1 | 销售部 | tom | clerk | 2000 |
| 1 | 销售部 | biddy | clerk | 2000 |
+--------------+--------------+--------------+--------------+--------------+
3 rows in set (0.02 sec)