MySQL数据库高级操作-多表操作

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

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白菜程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值