1.多表联查
1.两个表等值和非等值查询
- 多表查询的时候必须要加条件
- 等值
- 非等值
# 直接使用表名查询
select * from emp,dept where emp.deptno = dept.deptno;
# 起个别名查询
select * from emp a,dept b where a.deptno = b.deptno;
- 等值查询结果
mysql> select * from emp,dept where emp.deptno = dept.deptno;
+-------+--------+-----------+------+------------+------+------+--------+--------+------------+----------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno | deptno | dname | loc |
+-------+--------+-----------+------+------------+------+------+--------+--------+------------+----------+
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | NULL | 10 | 10 | ACCOUNTING | NEW YORK |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 | 10 | ACCOUNTING | NEW YORK |
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 | 20 | RESEARCH | DALLAS |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | 20 | 20 | RESEARCH | DALLAS |
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | 20 | 20 | RESEARCH | DALLAS |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100 | NULL | 20 | 20 | RESEARCH | DALLAS |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 | 20 | RESEARCH | DALLAS |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | 30 | SALES | CHICAGO |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | 30 | SALES | CHICAGO |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | 30 | SALES | CHICAGO |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | 30 | 30 | SALES | CHICAGO |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 | 30 | SALES | CHICAGO |
| 7900 | JAM%ES | CLERK | 7698 | 1981-12-03 | 950 | NULL | 30 | 30 | SALES | CHICAGO |
+-------+--------+-----------+------+------------+------+------+--------+--------+------------+----------+
13 rows in set
mysql> select * from emp a,dept b where a.deptno = b.deptno;
+-------+--------+-----------+------+------------+------+------+--------+--------+------------+----------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno | deptno | dname | loc |
+-------+--------+-----------+------+------------+------+------+--------+--------+------------+----------+
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | NULL | 10 | 10 | ACCOUNTING | NEW YORK |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 | 10 | ACCOUNTING | NEW YORK |
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 | 20 | RESEARCH | DALLAS |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | 20 | 20 | RESEARCH | DALLAS |
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | 20 | 20 | RESEARCH | DALLAS |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100 | NULL | 20 | 20 | RESEARCH | DALLAS |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 | 20 | RESEARCH | DALLAS |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | 30 | SALES | CHICAGO |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | 30 | SALES | CHICAGO |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | 30 | SALES | CHICAGO |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | 30 | 30 | SALES | CHICAGO |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 | 30 | SALES | CHICAGO |
| 7900 | JAM%ES | CLERK | 7698 | 1981-12-03 | 950 | NULL | 30 | 30 | SALES | CHICAGO |
+-------+--------+-----------+------+------------+------+------+--------+--------+------------+----------+
13 rows in set
- 非等值查询
select * from emp e, salgrade s where e.sal between s.losal and s.hisal;
mysql> select * from emp e, salgrade s where e.sal between s.losal and s.hisal;
+-------+--------+-----------+------+------------+------+------+--------+-------+-------+-------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno | grade | losal | hisal |
+-------+--------+-----------+------+------------+------+------+--------+-------+-------+-------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 | 1 | 700 | 1200 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | 3 | 1401 | 2000 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | 2 | 1201 | 1400 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | 20 | 4 | 2001 | 3000 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | 2 | 1201 | 1400 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | 30 | 4 | 2001 | 3000 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | NULL | 10 | 4 | 2001 | 3000 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | 20 | 4 | 2001 | 3000 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 | 5 | 3001 | 9999 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 | 3 | 1401 | 2000 |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100 | NULL | 20 | 1 | 700 | 1200 |
| 7900 | JAM%ES | CLERK | 7698 | 1981-12-03 | 950 | NULL | 30 | 1 | 700 | 1200 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 | 4 | 2001 | 3000 |
+-------+--------+-----------+------+------------+------+------+--------+-------+-------+-------+
13 rows in set
mysql> select * from emp e, salgrade s ;
2.查询应用
- 查询薪资大于2000的员工的办公地点
select e.ename,d.loc from emp e, dept d where e.deptno=d.deptno and sal>=2000;
mysql> select e.ename,d.loc from emp e, dept d where e.deptno=d.deptno and sal>=2000;
+-------+----------+
| ename | loc |
+-------+----------+
| JONES | DALLAS |
| BLAKE | CHICAGO |
| CLARK | NEW YORK |
| SCOTT | DALLAS |
| KING | NEW YORK |
| FORD | DALLAS |
+-------+----------+
6 rows in set
3.表与表的关联方式(99语法)
- 自然链接
natural join
- 会自动选择列明相同并且类型相同的列
select * from emp natural join dept;
- using
- 默认做等值链接
select * from emp join dept using(deptno) where sal>2000;
mysql> select * from emp join dept using(deptno) where sal>2000;
+--------+-------+-------+-----------+------+------------+------+------+------------+----------+
| deptno | empno | ename | job | mgr | hiredate | sal | comm | dname | loc |
+--------+-------+-------+-----------+------+------------+------+------+------------+----------+
| 20 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | RESEARCH | DALLAS |
| 30 | 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | SALES | CHICAGO |
| 10 | 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | NULL | ACCOUNTING | NEW YORK |
| 20 | 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | RESEARCH | DALLAS |
| 10 | 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | ACCOUNTING | NEW YORK |
| 20 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | RESEARCH | DALLAS |
+--------+-------+-------+-----------+------+------------+------+------+------------+----------+
6 rows in set
- on
- 主要做非等值查询 也可以做等值查询
- 非等值查询
select * from emp e join salgrade s on(e.sal between s.losal and s.hisal);
- 等值查询
select * from emp e join dept d on(e.deptno=d.deptno) where sal >2000
mysql> select * from emp e join salgrade s on(e.sal between s.losal and s.hisal);
+-------+--------+-----------+------+------------+------+------+--------+-------+-------+-------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno | grade | losal | hisal |
+-------+--------+-----------+------+------------+------+------+--------+-------+-------+-------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 | 1 | 700 | 1200 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | 3 | 1401 | 2000 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | 2 | 1201 | 1400 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | 20 | 4 | 2001 | 3000 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | 2 | 1201 | 1400 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | 30 | 4 | 2001 | 3000 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | NULL | 10 | 4 | 2001 | 3000 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | 20 | 4 | 2001 | 3000 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 | 5 | 3001 | 9999 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 | 3 | 1401 | 2000 |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100 | NULL | 20 | 1 | 700 | 1200 |
| 7900 | JAM%ES | CLERK | 7698 | 1981-12-03 | 950 | NULL | 30 | 1 | 700 | 1200 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 | 4 | 2001 | 3000 |
+-------+--------+-----------+------+------------+------+------+--------+-------+-------+-------+
13 rows in set
4.多表查询
- 查询员工的部门名称和薪资等级
select * from emp e join dept d using(deptno) join salgrade s on(e.sal between s.losal and s.hisal);
mysql> select e.ename,d.dname,s.grade from emp e join dept d using(deptno) join salgrade s on(e.sal between s.losal and s.hisal);
+--------+------------+-------+
| ename | dname | grade |
+--------+------------+-------+
| SMITH | RESEARCH | 1 |
| ALLEN | SALES | 3 |
| WARD | SALES | 2 |
| JONES | RESEARCH | 4 |
| MARTIN | SALES | 2 |
| BLAKE | SALES | 4 |
| CLARK | ACCOUNTING | 4 |
| SCOTT | RESEARCH | 4 |
| KING | ACCOUNTING | 5 |
| TURNER | SALES | 3 |
| ADAMS | RESEARCH | 1 |
| JAM%ES | SALES | 1 |
| FORD | RESEARCH | 4 |
+--------+------------+-------+
13 rows in set
5.多表联查左右外连接
- 查询每个员工所属的部门
select e.ename, d.deptno from emp e left join dept d using(deptno);
mysql> select e.ename, d.deptno from emp e left join dept d using(deptno);
+--------+--------+
| ename | deptno |
+--------+--------+
| SMITH | 20 |
| ALLEN | 30 |
| WARD | 30 |
| JONES | 20 |
| MARTIN | 30 |
| BLAKE | 30 |
| CLARK | 10 |
| SCOTT | 20 |
| KING | 10 |
| TURNER | 30 |
| ADAMS | 20 |
| JAM%ES | 30 |
| FORD | 20 |
| MILLER | NULL |
+--------+--------+
14 rows in set
- 查询每个部门分别有多少个员工
select d.deptno,d.dname,count(e.empno) from emp e right join dept d using(deptno) group by d.deptno ,d.dname;
mysql> select d.deptno,d.dname,count(e.empno) from emp e right join dept d using(deptno) group by d.deptno ,d.dname;
+--------+------------+----------------+
| deptno | dname | count(e.empno) |
+--------+------------+----------------+
| 10 | ACCOUNTING | 2 |
| 20 | RESEARCH | 5 |
| 30 | SALES | 6 |
| 40 | OPERATIONS | 0 |
+--------+------------+----------------+
4 rows in set
6.union 链接(拼接)
- 查询 员工姓名和员工薪资 在部门1并且名字中含有A的员工,和在部门2薪资>1000的员工,和在部门三薪资<2000的员工
- sql语句三条查询
select ename,sal from emp where deptno = 10 and ename like '%A%';
select ename,sal from emp where deptno = 20 and sal>1000;
select ename,sal from emp where deptno=30 and sal<2000;
# 使用union的语法
select ename,sal,deptno from emp where deptno = 10 and ename like '%A%' union select ename,sal,deptno from emp where deptno = 20 and sal>1000 union select ename,sal,deptno from emp where deptno=30 and sal<2000;
- 使用union把查询的和累计起来结果,会自动去重复
- union all 进行直接链接
mysql> select ename,sal,deptno from emp where deptno = 10 and ename like '%A%' union select ename,sal,deptno from emp where deptno = 20 and sal>1000 union select name,sal,deptno from emp where deptno=30 and sal<2000;
+--------+------+--------+
| ename | sal | deptno |
+--------+------+--------+
| CLARK | 2450 | 10 |
| JONES | 2975 | 20 |
| SCOTT | 3000 | 20 |
| ADAMS | 1100 | 20 |
| FORD | 3000 | 20 |
| ALLEN | 1600 | 30 |
| WARD | 1250 | 30 |
| MARTIN | 1250 | 30 |
| TURNER | 1500 | 30 |
| JAM%ES | 950 | 30 |
+--------+------+--------+
10 rows in set
- 查询所有不符合连接条件的 员工和部门的名称
select e.ename,d.dname from emp e left join dept d using(deptno) union select e.ename ,d.dname from emp e right join dept d using(deptno);
mysql> select e.ename,d.dname from emp e left join dept d using(deptno) union select e.ename ,d.dname from emp e right join dept d using(deptno);
+--------+------------+
| ename | dname |
+--------+------------+
| SMITH | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| JONES | RESEARCH |
| MARTIN | SALES |
| BLAKE | SALES |
| CLARK | ACCOUNTING |
| SCOTT | RESEARCH |
| KING | ACCOUNTING |
| TURNER | SALES |
| ADAMS | RESEARCH |
| JAM%ES | SALES |
| FORD | RESEARCH |
| MILLER | NULL |
| NULL | OPERATIONS |
+--------+------------+
15 rows in set
7.表与表的自连接
- 给表起两个不同的小名用on链接,当做两个不同意义的表来处理
- 查询出员工员工id所对应的 领导和领导id
select e.empno,e.ename,m.empno '领导ID',m.ename from emp e join emp m on(e.mgr = m.empno);
mysql> select e.empno,e.ename,m.empno '领导ID',m.ename from emp e join emp m on(e.mgr = m.empno);
+-------+--------+--------+-------+
| empno | ename | 领导ID | ename |
+-------+--------+--------+-------+
| 7369 | SMITH | 7902 | FORD |
| 7499 | ALLEN | 7698 | BLAKE |
| 7521 | WARD | 7698 | BLAKE |
| 7566 | JONES | 7839 | KING |
| 7654 | MARTIN | 7698 | BLAKE |
| 7698 | BLAKE | 7839 | KING |
| 7782 | CLARK | 7839 | KING |
| 7788 | SCOTT | 7566 | JONES |
| 7844 | TURNER | 7698 | BLAKE |
| 7876 | ADAMS | 7788 | SCOTT |
| 7900 | JAM%ES | 7698 | BLAKE |
| 7902 | FORD | 7566 | JONES |
| 7934 | MILLER | 7782 | CLARK |
+-------+--------+--------+-------+
13 rows in set
8.表与表的子链接
- 把一个sql的查询结果当做另一个sql的查询条件
- 查询谁的工资比公司的平均工资高
select * from emp where sal >(select avg(sal) from emp);
mysql> select * from emp where sal >(select avg(sal) from emp);
+-------+-------+-----------+------+------------+------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+-------+-----------+------+------------+------+------+--------+
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | 20 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 |
+-------+-------+-----------+------+------------+------+------+--------+
6 rows in set
- 查询谁的薪资低于30部门所有人的薪资
- all返回多行结果
select * from emp where sal < (select min(sal) from emp where deptno= 30);
等于select * from emp where sal < all(select sal from emp where deptno= 30);
mysql> select * from emp where sal < (select min(sal) from emp where deptno= 30);
+-------+-------+-------+------+------------+-----+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+-------+-------+------+------------+-----+------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 |
+-------+-------+-------+------+------------+-----+------+--------+
1 row in set
mysql> select * from emp where sal < all(select sal from emp where deptno= 30);
+-------+-------+-------+------+------------+-----+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+-------+-------+------+------------+-----+------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 |
+-------+-------+-------+------+------------+-----+------+--------+
1 row in set
- 查询谁的薪资低于30部门部分人的薪资
- any返回多行结果
select * from emp where sal < any(select sal from emp where deptno= 30);
mysql> select * from emp where sal < any(select sal from emp where deptno= 30);
+-------+--------+----------+------+------------+------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+--------+----------+------+------------+------+------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100 | NULL | 20 |
| 7900 | JAM%ES | CLERK | 7698 | 1981-12-03 | 950 | NULL | 30 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300 | NULL | NULL |
+-------+--------+----------+------+------------+------+------+--------+
9 rows in set
9.表与表的伪表查询
-
如果我们所需要的查询条件需要别的SQL语句提供;
-
如果只需要一个条件那么可以使用子查询来完成;
-
如果需要多个查询条件,这是就要将所有的查询结果当做伪表进行管理;
-
我们需要把一些含有特殊符号的列名设置别名,然后给伪表设置一个别名(见名知意);
-
查询员工信息 高于自己部门的平均薪资的员工
-
select * from emp e join (select deptno ,avg(sal) avgsal from emp group by deptno) da on(e.deptno =da.deptno and e.sal>da.avgsal) order by e.deptno;
mysql> select * from emp e join (select deptno ,avg(sal) avgsal from emp group by deptno) da on(e.deptno =da.deptno and e.sal>da.avgsal) order by e.deptno;
+-------+-------+-----------+------+------------+------+------+--------+--------+-------------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno | deptno | avgsal |
+-------+-------+-----------+------+------------+------+------+--------+--------+-------------+
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 | 10 | 3725 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | 20 | 20 | 2175 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | 20 | 20 | 2175 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 | 20 | 2175 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | 30 | 1566.666667 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | 30 | 30 | 1566.666667 |
+-------+-------+-----------+------+------------+------+------+--------+--------+-------------+
6 rows in set
2.增删改操作
1.增操作
insert into 表名 values(10,'测试','测试');
2.改操作
- update表名set列名=value ,列名=value
- update salgrade set losal = 888 , hisal = 999;
- update表名set列名=value ,列名=value where条件
- update salgrade set losal = 666 ,hisal = 1888 where grade = 3;
3.删操作
- delete from表名
- delete from dept;
- delete from表名where条件
- delete from emp where comm is null;·这属于一种物理删除,删完之后理论上不能再找回
4.事务
- 开始事务:
BEGIN
或者和start TRANSACTION
- 结束事务:
ROLLBACK;
- 事务的特性:ACID原则
原子性
,一致性
,隔离性
,持久性
- 事务的隔离级别:
读未提交
,读已提交
,可重复度
,序列化
- 脏读:读取别人为提交的数据可能是不安全的
- 虚读:第一次读取的数据,第二次在读取的时候可能被修改了
- 幻读:第一次读取的数据,第二次读取多了一条或者多了一条
3.作业练习
1.列出至少又三个员工的所有部门
select d.deptno,d.dname from emp e join dept d using(deptno) group by d.dname having count(e.ename)>=3;
mysql> select d.deptno,d.dname from emp e join dept d using(deptno) group by d.dname having count(e.ename)>=3;
+--------+----------+
| deptno | dname |
+--------+----------+
| 20 | RESEARCH |
| 30 | SALES |
+--------+----------+
2 rows in set
1.1列出至少又三个员工的所有部门中的所有员工信息
select * from emp e right join (select e.deptno,count(e.empno) ce from emp e group by e.deptno) cep on(e.deptno= cep.deptno) where cep.ce>3;
mysql> select * from emp e right join (select e.deptno,count(e.empno) ce from emp e group by e.deptno) cep on(e.deptno= cep.deptno) where cep.ce>3;
+-------+--------+----------+------+------------+------+------+--------+--------+----+
| empno | ename | job | mgr | hiredate | sal | comm | deptno | deptno | ce |
+-------+--------+----------+------+------------+------+------+--------+--------+----+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 | 20 | 5 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | 20 | 20 | 5 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | 20 | 20 | 5 |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100 | NULL | 20 | 20 | 5 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 | 20 | 5 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | 30 | 6 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | 30 | 6 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | 30 | 6 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | 30 | 30 | 6 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 | 30 | 6 |
| 7900 | JAM%ES | CLERK | 7698 | 1981-12-03 | 950 | NULL | 30 | 30 | 6 |
+-------+--------+----------+------+------------+------+------+--------+--------+----+
11 rows in set
2.列出薪资比“SMITH”多的所有员工
select * from emp where sal > (select sal from emp where ename='SMITH');
mysql> select * from emp where sal > (select sal from emp where ename='SMITH');
+-------+--------+-----------+------+------------+------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+--------+-----------+------+------------+------+------+--------+
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100 | NULL | 20 |
| 7900 | JAM%ES | CLERK | 7698 | 1981-12-03 | 950 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300 | NULL | NULL |
+-------+--------+-----------+------+------------+------+------+--------+
13 rows in set
3.列出所有员工的姓名及其直接上级的姓名
- 自连接
select e.empno,e.ename,m.empno,m.ename from emp e,emp m where e.mgr=m.empno;
mysql> select e.empno,e.ename,m.empno,m.ename from emp e,emp m where e.mgr=m.empno;
+-------+--------+-------+-------+
| empno | ename | empno | ename |
+-------+--------+-------+-------+
| 7369 | SMITH | 7902 | FORD |
| 7499 | ALLEN | 7698 | BLAKE |
| 7521 | WARD | 7698 | BLAKE |
| 7566 | JONES | 7839 | KING |
| 7654 | MARTIN | 7698 | BLAKE |
| 7698 | BLAKE | 7839 | KING |
| 7782 | CLARK | 7839 | KING |
| 7788 | SCOTT | 7566 | JONES |
| 7844 | TURNER | 7698 | BLAKE |
| 7876 | ADAMS | 7788 | SCOTT |
| 7900 | JAM%ES | 7698 | BLAKE |
| 7902 | FORD | 7566 | JONES |
| 7934 | MILLER | 7782 | CLARK |
+-------+--------+-------+-------+
13 rows in set
4.列出受雇日期早于其直接上级的所有员工
select e.ename en,m.ename mn ,e.hiredate eh ,m.hiredate mh from emp e,emp m where e.mgr=m.empno and e.hiredate<m.hiredate;
mysql> select e.ename en,m.ename mn ,e.hiredate eh ,m.hiredate mh from emp e,emp m where e.mgr=m.empno and e.hiredate<m.hiredate;
+-------+-------+------------+------------+
| en | mn | eh | mh |
+-------+-------+------------+------------+
| SMITH | FORD | 1980-12-17 | 1981-12-03 |
| ALLEN | BLAKE | 1981-02-20 | 1981-05-01 |
| WARD | BLAKE | 1981-02-22 | 1981-05-01 |
| JONES | KING | 1981-04-02 | 1981-11-17 |
| BLAKE | KING | 1981-05-01 | 1981-11-17 |
| CLARK | KING | 1981-06-09 | 1981-11-17 |
+-------+-------+------------+------------+
6 rows in set
5.列出部门名称和这些部门的 员工信息,包括哪些没有员工的部门
select d.dname ,e.ename from emp e right join dept d using(deptno);
mysql> select d.dname ,e.ename from emp e right join dept d using(deptno);
+------------+--------+
| dname | ename |
+------------+--------+
| ACCOUNTING | CLARK |
| ACCOUNTING | KING |
| RESEARCH | SMITH |
| RESEARCH | JONES |
| RESEARCH | SCOTT |
| RESEARCH | ADAMS |
| RESEARCH | FORD |
| SALES | ALLEN |
| SALES | WARD |
| SALES | MARTIN |
| SALES | BLAKE |
| SALES | TURNER |
| SALES | JAM%ES |
| OPERATIONS | NULL |
| 测试 | NULL |
+------------+--------+
15 rows in set
6.列出所有job为“CLERK”(办事员)的姓名及其部门的名称
select d.dname,e.ename from emp e join dept d using(deptno) where e.job='CLERK';
mysql> select d.dname,e.ename from emp e join dept d using(deptno) where e.job='CLERK';
+----------+--------+
| dname | ename |
+----------+--------+
| RESEARCH | SMITH |
| RESEARCH | ADAMS |
| SALES | JAM%ES |
+----------+--------+
3 rows in set