当前位置: 首页 > news >正文

MySQL | DQL语句-连接查询

MySQL | DQL语句-连接查询

请添加图片描述
🪄个人博客:https://vite.xingji.fun

什么是连接查询

  1. 从一张表中查询数据称为单表查询。
  2. 从两张或更多张表中联合查询数据称为多表查询,又叫做连接查询。
  3. 什么时候需要使用连接查询?
    1. 比如这样的需求:员工表中有员工姓名,部门表中有部门名字,要求查询每个员工所在的部门名字,这个时候就需要连接查询

连接查询的分类

  1. 根据语法出现的年代进行分类:
    1. SQL92(这种语法很少用,可以不用学。)
    2. SQL99(我们主要学习这种语法。)
  2. 根据连接方式的不同进行分类:
    1. 内连接
      1. 等值连接
      2. 非等值连接
      3. 自连接
    2. 外连接
      1. 左外连接(左连接)
      2. 右外连接(右连接)
    3. 全连接

笛卡尔积现象

  1. 当两张表进行连接查询时,如果 没有任何条件进行过滤,最终的**查询结果条数两张表条数的乘积**。为了避免笛卡尔积现象的发生,需要添加条件进行筛选过滤。
  2. 需要注意:添加条件之后,虽然避免了笛卡尔积现象,但是匹配的次数没有减少
  3. 为了SQL语句的可读性,为了执行效率,建议给表起别名

例子

mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)mysql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.03 sec)mysql> select e.ename,d.dname from emp e,dept d;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | OPERATIONS |
| SMITH  | SALES      |
| SMITH  | RESEARCH   |
| SMITH  | ACCOUNTING |
| ALLEN  | OPERATIONS |
| ALLEN  | SALES      |
| ALLEN  | RESEARCH   |
| ALLEN  | ACCOUNTING |
| WARD   | OPERATIONS |
| WARD   | SALES      |
| WARD   | RESEARCH   |
| WARD   | ACCOUNTING |
| JONES  | OPERATIONS |
| JONES  | SALES      |
| JONES  | RESEARCH   |
| JONES  | ACCOUNTING |
| MARTIN | OPERATIONS |
| MARTIN | SALES      |
| MARTIN | RESEARCH   |
| MARTIN | ACCOUNTING |
| BLAKE  | OPERATIONS |
| BLAKE  | SALES      |
| BLAKE  | RESEARCH   |
| BLAKE  | ACCOUNTING |
| CLARK  | OPERATIONS |
| CLARK  | SALES      |
| CLARK  | RESEARCH   |
| CLARK  | ACCOUNTING |
| SCOTT  | OPERATIONS |
| SCOTT  | SALES      |
| SCOTT  | RESEARCH   |
| SCOTT  | ACCOUNTING |
| KING   | OPERATIONS |
| KING   | SALES      |
| KING   | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | OPERATIONS |
| TURNER | SALES      |
| TURNER | RESEARCH   |
| TURNER | ACCOUNTING |
| ADAMS  | OPERATIONS |
| ADAMS  | SALES      |
| ADAMS  | RESEARCH   |
| ADAMS  | ACCOUNTING |
| JAMES  | OPERATIONS |
| JAMES  | SALES      |
| JAMES  | RESEARCH   |
| JAMES  | ACCOUNTING |
| FORD   | OPERATIONS |
| FORD   | SALES      |
| FORD   | RESEARCH   |
| FORD   | ACCOUNTING |
| MILLER | OPERATIONS |
| MILLER | SALES      |
| MILLER | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
56 rows in set (0.01 sec)

说明:

  1. 笛卡尔积现象:查询结果为14*4=56条记录。
  2. 给表起别名:为了避免表名重复,给表起别名。

内连接

什么叫内连接

请添加图片描述

内连接:查询的结果是两张表的交集。
满足条件的记录才会出现在结果集中。

内连接之等值连接

连接时,条件为等量关系。

案例:查询每个员工所在的部门名称,要求显示员工名、部门名

selecte.ename,d.dname
fromemp e
inner joindept d
one.deptno = d.deptno;SELECT e.ename, d.dname FROM emp e (inner) JOIN dept d ON e.deptno = d.deptno;

员工表(emp)

mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.01 sec)

部门表(dept)

mysql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

::: tip 提示
通过上述员工表和部门表可知,每个员工所在的部门名称是通过deptno字段进行连接的。
:::

内连接之等值连接查询结果:

mysql> SELECT e.ename, d.dname FROM emp e JOIN dept d ON e.deptno = d.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   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.01 sec)

::: tip 提示

  1. 底层也是进行56次匹配,但是由于deptno是主键,所以只匹配一次。

  2. inner可以省略。
    :::

内连接之非等值连接

连接时,条件是非等量关系。

案例:查询每个员工的工资等级,要求显示员工名、工资、工资等级

selecte.ename,e.sal,s.grade
fromemp e
joinsalgrade s
one.sal between s.losal and s.hisal;SELECT e.ename, e.sal, s.grade FROM emp e INNER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;

员工表(emp)

mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)

工资等级表(salgrade)

mysql> select * from salgrade;
+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)

::: tip 提示
通过上述员工表和工资等级表可知,每个员工的工资等级是通过sal字段进行连接的。

利用between关键字连接losal和hisal进行非等值连接。
:::

内连接之非等值连接查询结果:

mysql> SELECT e.ename, e.sal, s.grade FROM emp e INNER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;
+--------+---------+-------+
| ename  | sal     | grade |
+--------+---------+-------+
| SMITH  |  800.00 |     1 |
| ALLEN  | 1600.00 |     3 |
| WARD   | 1250.00 |     2 |
| JONES  | 2975.00 |     4 |
| MARTIN | 1250.00 |     2 |
| BLAKE  | 2850.00 |     4 |
| CLARK  | 2450.00 |     4 |
| SCOTT  | 3000.00 |     4 |
| KING   | 5000.00 |     5 |
| TURNER | 1500.00 |     3 |
| ADAMS  | 1100.00 |     1 |
| JAMES  |  950.00 |     1 |
| FORD   | 3000.00 |     4 |
| MILLER | 1300.00 |     2 |
+--------+---------+-------+
14 rows in set (0.01 sec)

内连接之自连接

连接时,一张表看做两张表,自己和自己进行连接

案例:找出每个员工的直属领导,要求显示员工名、领导名

selecte.ename 员工名, l.ename 领导名
fromemp e
joinemp l
one.mgr = l.empno;

内连接之自连接查询结果:

mysql> select e.ename 员工, l.ename 领导 from emp e join emp l on e.mgr = l.empno;+--------+-------+
| 员工   | 领导  |
+--------+-------+
| SMITH  | FORD  |
| ALLEN  | BLAKE |
| WARD   | BLAKE |
| JONES  | KING  |
| MARTIN | BLAKE |
| BLAKE  | KING  |
| CLARK  | KING  |
| SCOTT  | JONES |
| TURNER | BLAKE |
| ADAMS  | SCOTT |
| JAMES  | BLAKE |
| FORD   | JONES |
| MILLER | CLARK |
+--------+-------+
13 rows in set (0.01 sec)

请添加图片描述
::: 提示
可以发现连接条件是:e.mgr = l.empno(员工的领导编号=领导的员工编号)

注意:KING这个员工没有查询出来。如果想将KING也查询出来,需要使用外连接
:::

外连接

什么叫外连接

内连接满足条件的记录查询出来。也就是两张表的交集

外连接除了满足条件的记录查询出来,再将其中一张表的记录全部查询出来,另一张表如果没有与之匹配的记录自动模拟出NULL与其匹配

左外连接:

请添加图片描述

右外连接:

请添加图片描述

外连接之左外连接(左连接)

案例:查询所有部门信息,并且找出每个部门下的员工

selectd.*,e.*
fromdept d
left outer joinemp e
ond.deptno = e.deptno;

左连接查询结果:

mysql> select e.*, d.* from dept d left outer join emp e on e.deptno = d.deptno;+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO | DEPTNO | DNAME      | LOC      |
+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |     30 | SALES      | CHICAGO  |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |     30 | SALES      | CHICAGO  |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |     30 | SALES      | CHICAGO  |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |     30 | SALES      | CHICAGO  |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |     30 | SALES      | CHICAGO  |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |     30 | SALES      | CHICAGO  |
|  NULL | NULL   | NULL      | NULL | NULL       |    NULL |    NULL |   NULL |     40 | OPERATIONS | BOSTON   |
+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+
15 rows in set (0.00 sec)

::: 提示
注意:outer可以省略

任何一个左连接都可以写作右连接
:::

外连接之右外连接(右连接)

还是上面的案例,可以写作右连接。

selectd.*,e.*
fromemp e
right outer joindept d
ond.deptno = e.deptno;

右连接查询结果:

mysql> select e.*, d.* from emp e right outer join dept d on e.deptno = d.deptno;+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO | DEPTNO | DNAME      | LOC      |
+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |     30 | SALES      | CHICAGO  |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |     30 | SALES      | CHICAGO  |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |     30 | SALES      | CHICAGO  |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |     30 | SALES      | CHICAGO  |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |     30 | SALES      | CHICAGO  |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |     30 | SALES      | CHICAGO  |
|  NULL | NULL   | NULL      | NULL | NULL       |    NULL |    NULL |   NULL |     40 | OPERATIONS | BOSTON   |
+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+
15 rows in set (0.00 sec)

案例:找出所有员工的上级领导,要求显示员工名和领导名

select e.ename 员工名,l.ename 领导名 
from emp e 
left join emp l 
one.mgr = l.empno;
select e.ename 员工名,l.ename 领导名 
from emp l 
right join emp e 
one.mgr = l.empno;

左,右连接查询结果:

mysql> select e.ename 员工 ,l.ename 领导 from emp e left join emp l on e.mgr = l.empno; -- 左连接+--------+-------+
| 员工   | 领导  |
+--------+-------+
| SMITH  | FORD  |
| ALLEN  | BLAKE |
| WARD   | BLAKE |
| JONES  | KING  |
| MARTIN | BLAKE |
| BLAKE  | KING  |
| CLARK  | KING  |
| SCOTT  | JONES |
| KING   | NULL  |
| TURNER | BLAKE |
| ADAMS  | SCOTT |
| JAMES  | BLAKE |
| FORD   | JONES |
| MILLER | CLARK |
+--------+-------+
14 rows in set (0.00 sec)mysql> select e.ename 员工 ,l.ename 领导 from emp l right join emp e on e.mgr = l.empno; -- 右连接+--------+-------+
| 员工   | 领导  |
+--------+-------+
| SMITH  | FORD  |
| ALLEN  | BLAKE |
| WARD   | BLAKE |
| JONES  | KING  |
| MARTIN | BLAKE |
| BLAKE  | KING  |
| CLARK  | KING  |
| SCOTT  | JONES |
| KING   | NULL  |
| TURNER | BLAKE |
| ADAMS  | SCOTT |
| JAMES  | BLAKE |
| FORD   | JONES |
| MILLER | CLARK |
+--------+-------+
14 rows in set (0.00 sec)

全连接

::: tip 提示

什么是全连接

全连接是指将两张或多张表中的所有记录都查询出来,即两张表的并集

请添加图片描述

MySQL不支持full joinoracle数据库支持
:::

两张表数据全部查询出来,没有匹配的记录,各自为对方模拟出NULL进行匹配。

客户表:t_customer
请添加图片描述

订单表:t_order
请添加图片描述

案例:查询所有的客户和订单

select c.*,o.* 
from t_customer c 
full join t_order o 
on c.cid = o.cid;

全连接查询结果:

mysql> select c.*,o.* from t_customer c full join t_order o on c.cid = o.cid; -- 全连接+--------+-------+-------+-------+
cid | cname   | old  | price | cid  
+--------+-------+-------+-------+
1  | zhangsan| 100  | 3400  | 1    |
2  | lisi    | 200  | 6600  | 2    |
3  | wangwu  | NULL | NULL  | NULL |
NULL| NULL    | 300  | 9900 | NULL |
+--------+-------+-------+-------+
4 rows in set (0.00 sec)解释:
1. 客户 `zhangsan`(cid=1)匹配到订单 `old=100`2. 客户 `lisi`(cid=2)匹配到订单 `old=200`3. 客户 `wangwu`(cid=3)无订单,订单字段为 `NULL`4. 订单 `old=300`(cid=NULL)无客户,客户字段为 `NULL`

多张表连接

::: tip 提示

什么是多张表连接

多张表连接是指将多张表按照一定的规则进行连接,从而得到一张新的表。
:::

案例:找出每个员工的部门,并且要求显示每个员工的薪资等级

select e.ename,d.dname,s.grade 
from emp e 
join dept d 
on e.deptno = d.deptno 
join salgrade s 
on e.sal between s.losal and s.hisal;

请添加图片描述

多张表连接查询结果:

mysql> select * from emp;+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)mysql> select * from dept;+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)mysql> select * from salgrade;+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)mysql> select->    e.ename,d.dname,s.grade-> from->    emp e-> join->    dept d-> on->    e.deptno = d.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 |
| JAMES  | SALES      |     1 |
| FORD   | RESEARCH   |     4 |
| MILLER | ACCOUNTING |     2 |
+--------+------------+-------+
14 rows in set (0.00 sec)

相关文章:

MySQL | DQL语句-连接查询

MySQL | DQL语句-连接查询 🪄个人博客:https://vite.xingji.fun 什么是连接查询 从一张表中查询数据称为单表查询。从两张或更多张表中联合查询数据称为多表查询,又叫做连接查询。什么时候需要使用连接查询? 比如这样的需求&…...

JVM——Java 虚拟机是如何加载 Java 类的?

引入 在 Java 世界的底层运作中,类加载机制扮演着一个既神秘又关键的角色。它就像是一个精心设计的舞台幕后 machinery,确保了 Java 程序能够顺利运行。今天,我们就深入探索 Java 虚拟机(JVM)是如何加载 Java 类的。 …...

Sigmoid函数导数推导详解

Sigmoid函数导数推导详解 在逻辑回归中,Sigmoid函数的导数推导是一个关键步骤,它使得梯度下降算法能够高效地计算。 1. Sigmoid函数定义 首先回顾Sigmoid函数的定义: g ( z ) 1 1 e − z g(z) \frac{1}{1 e^{-z}} g(z)1e−z1​ 2. 导…...

运维工作中,Ansible常用模块有哪些?

Ansible是一个强大的自动化运维工具,他通过模块来执行各种任务。Ansible的模块库非常丰富,涵盖了系统管理、文件操作、软件包管理、网络配置、云服务等多个领域。以下是Ansible中常见的模块分类及具体模块详细介绍: 系统管理模块 主要用于管…...

内存安全的攻防战:工具链与语言特性的协同突围

一、内存安全:C 开发者永恒的达摩克利斯之剑 在操作系统内核、游戏引擎、金融交易系统等对稳定性要求苛刻的领域,内存安全问题始终是 C 开发者的核心挑战。缓冲区溢出、悬空指针、双重释放等经典漏洞,每年在全球范围内造成数千亿美元的损失。…...

Linux-04-搜索查找类命令

一、find查找文件或目录: 1.基本语法: find指令将从指定目录向下递归地遍历其各个子目录1&#xff0c;将满足条件的文件显示在终端 find[搜索范围] [选项] 2.选项说明: 选项功能-name <查询方式>按照指定的文件名查找模式查找文件-user <用户名>查找属于指定用…...

移动光猫 UNG853H 获取超级管理员账号密码

注&#xff1a;电脑连接光猫&#xff0c;网线不要接2口&#xff08;2口一般是IPTV网口&#xff09; 首先浏览器打开 192.168.1.1&#xff0c;使用光猫背面的用户名密码登录。&#xff08;user用户名&#xff09; 然后在浏览器中另开一个窗口打开以下地址&#xff1a; http://…...

健康生活新主张:全方位养生指南

在追求高品质生活的今天&#xff0c;健康养生早已不是老年人的专属话题&#xff0c;而是每个人都该掌握的生活技能。科学养生不需要复杂的程序&#xff0c;而是通过日常习惯的优化&#xff0c;为身体注入源源不断的活力。 饮食管理是健康的根基。选择天然、少加工的食材&#x…...

py使用uniad原生sdk 3, 放弃Buildozer,使用BeeWare

目前&#xff0c;Buildozer 支持打包&#xff1a; Android&#xff1a;通过 Python for Android。您必须有 Linux 或 OSX computer 才能为 Android 进行编译。 iOS&#xff1a;通过 Kivy iOS。您必须拥有 OSX computer 才能为 iOS 进行编译。 支持其他平台在路线图中&#xf…...

【数据分享】2020年中国高精度森林覆盖数据集(免费获取)

森林作为全球陆地生态系统的主体&#xff0c;分布面积广、结构复杂&#xff0c;承担着调节气候、维护生态安全、改善环境等方面的重要作用。我国的森林资源丰富&#xff0c;据《中国森林资源报告&#xff1a;2014—2018》统计&#xff0c;我国森林覆盖率已经达到23.04%。森林覆…...

(007)Excel 公式的使用

文章目录 逻辑运算公式的参数常用函数引用方式引用工作表和工作簿表格的引用修改公式的计算时机区域交叉引用 逻辑运算 公式的参数 单元格引用&#xff1a;SUM(A1:A24)。字面值&#xff1a;SQRT(121)。字面文本字符串&#xff1a;PROPER(“john.f.smith”)。表达式&#xff1a…...

Vue之脚手架与组件化开发

一、基础知识 1、准备工作 node版本在12以上&#xff08;看情况而变&#xff09; 全局安装vue/cli脚手架&#xff08;不理解的可以去看一下node安装环境配置教程&#xff09; npm i vue/cli -g 2、项目初始化 在终端输入 vue create my-vue-project(这里是名字&#xff0…...

第四章 Maven

01 01. maven-课程介绍 02 02. maven-概述-maven介绍 私服&#xff1a;提高下载效率&#xff0c;让中央仓库不必被反复访问。我们一般用阿里云的私服。 03 03. maven-概述-maven安装 04 04. maven-idea集成-配置及创建maven项目 05 05. maven-idea集成-导入maven项目 06 06. …...

哈希表笔记(四)Redis对比Java总结

文章目录 一、基础结构对比数据结构定义Java HashMapRedis字典 主要区别与设计思路 二、关键操作API对比初始化Java HashMapRedis字典 添加元素Java HashMapRedis字典 查找元素Java HashMapRedis字典 删除元素Java HashMapRedis字典 扩容/重哈希操作Java HashMapRedis字典 三、…...

【精选】基于数据挖掘的广州招聘可视化分析系统(大数据组件+Spark+Hive+MySQL+AI智能云+DeepSeek人工智能+深度学习之LSTM算法)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

WPF使用依赖注入框架AutoMapper

WPF应用中使用AutoMapper和依赖注入框架实现对象映射与依赖管理 1. 准备工作 首先,通过NuGet安装必要的包: Install-Package AutoMapper Install-Package Autofac Install-Package Autofac.Extensions.DependencyInjection Install-Package Microsoft.Extensions.Dependen…...

WPF封装常用的TCP、串口、Modbus、MQTT、Webapi、PLC通讯工具类

WPF封装常用通讯工具类 下面我将为您封装常用的TCP、串口、Modbus、MQTT、WebAPI和PLC通讯工具类,适用于WPF应用程序开发。 一、TCP通讯工具类 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;public class TcpClientHelper : …...

游戏引擎学习第253天:重新启用更多调试界面

运行游戏&#xff0c;尝试调试系统&#xff0c;并为今天的工作设定方向。 今天我们将继续完成调试编辑代码的收尾工作。虽然昨天已经让它运行起来了&#xff0c;但目前还在使用旧的GUID系统&#xff0c;以及调试系统里早期用于探索阶段的一些旧式实现。因此&#xff0c;我们需…...

C# | 基于C#实现的BDS NMEA-0183数据解析上位机

以下是一个基于C#实现的BDS NMEA-0183数据解析上位机的示例代码,包含基础功能和界面: using System; using System.Collections.Generic; using System.IO.Ports; using System.Windows.Forms; using System.Drawing; using System.Globalization;namespace BDS_NMEA_Viewer…...

【AI提示词】成本效益分析师

提示说明 专注于通过数据驱动的方式提供成本效益分析&#xff0c;帮助客户优化资源投入与预期回报。 提示词 # Role: 成本效益分析师## Profile - language: 中文 - description: 专注于通过数据驱动的方式提供成本效益分析&#xff0c;帮助客户优化资源投入与预期回报 - ba…...

Kotlin革新数据分析

摘要 在数据分析领域&#xff0c;Python长期占据主导地位。然而&#xff0c;随着技术的不断发展&#xff0c;Kotlin凭借其独特优势逐渐崭露头角。本文深入探讨Kotlin在数据分析中的应用&#xff0c;详细阐述其与Python在数据分析生态系统中的差异&#xff0c;通过具体案例展示…...

今日行情明日机会——20250430

指数目前仍然在震荡区间&#xff0c;等后续的方向选择以及放量后的主线~ 2025年4月30日涨停主要行业方向分析 一、核心主线方向 机器人概念&#xff08;政策催化技术突破&#xff09; • 涨停家数&#xff1a;18家。 • 代表标的&#xff1a; ◦ 全筑股份&#xff08;工业机器…...

【Docker】Dockerfile 使用

文章目录 1. 什么是 Dockerfile?2. Dockerfile 核心指令详解2.1 基础指令2.2 构建过程指令2.3 运行时指令2.4 容器启动指令3. Dockerfile 最佳实践3.1 优化镜像构建3.2 安全性增强3.3 多阶段构建4. 完整 Dockerfile 示例5. 构建与验证6. 总结Docker 作为容器化技术的代表,已经…...

【Hive入门】Hive性能调优之资源配置:深入解析执行引擎参数调优

目录 前言 1 Hive执行引擎概述 2 MapReduce引擎调优 2.1 Map阶段资源配置 2.2 Reduce阶段资源配置 2.3 并发控制参数 3 Tez引擎调优 3.1 Tez架构概述 3.2 内存配置 3.3 并发与并行度 4 Spark引擎调优 4.1 Spark执行模型 4.2 内存管理 4.3 并行度配置 5 资源隔离…...

初学python的我开始Leetcode题8-3

提示&#xff1a;100道LeetCode热题-8-3主要是二叉树相关&#xff0c;包括三题&#xff1a;将有序数组转换为二叉搜索树、验证二叉搜索树、二叉搜索树中第K小的元素。由于初学&#xff0c;所以我的代码部分仅供参考。 目录 前言 题目1&#xff1a;将有序数组转换为二叉搜索树…...

【音频】Qt6实现MP3播放器

1、简介 解码MP3有很多种方法,比如:FFmpeg、GStreamer、Qt、libmpg123 库等,下面介绍使用,只使用Qt的接口方法解码、播放MP3。 开发配置: 1)操作系统:Windows11 2)Qt版本:Qt6.5.1 3)编译器:MinGW_64 2、获取音频输出设备 QMediaDevices 用于获取媒体设备,包括音…...

【Linux】VSCode用法

描述 部分图片和经验来源于网络&#xff0c;若有侵权麻烦联系我删除&#xff0c;主要是做笔记的时候忘记写来源了&#xff0c;做完笔记很久才写博客。 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 1 安装环境及运行C/C 1.1 安装及配置步骤 请参考这位大佬的…...

普通 html 项目也可以支持 scss_sass

项目结构示例 下载vscode的插件Live Sass Compiler 自动监听编译scss 下载插件Live Server 用于 web 服务器&#xff0c;打开 html 文件到浏览器&#xff0c;也可以不用这个&#xff0c;自己用 nginx 或者宝塔其他 web 工具 新建一个 index.scss打开&#xff0c;点击 vscode 底…...

C#实现主流PLC读写工具类封装

以下是针对三菱、欧姆龙、西门子S7系列、汇川、台达PLC的完整封装工具类实现,基于Modbus TCP/RTU、MC协议、QJ71等主流通信协议: 基础接口定义 /// <summary> /// PLC操作基础接口 /// </summary> public interface IPLC {/// <summary>/// 连接PLC/// &…...

C++之特殊类设计及类型转换

目录 一、设计一个不能被拷贝的类 二、设计一个只能在堆上创建对象的类 三、设计一个只能在栈上创建对象的类 四、设计一个不能被继承的类 五、设计一个只能创建一个对象的类(单例模式) 六、C语言中的类型转换 七、C中的三类类型转换 八、C强制类型转换 8.1、为什么C需…...

【Linux】C语言补充知识

有一些Linux常见的C语言用法需要哈好复习一下。 部分图片和经验来源于网络&#xff0c;若有侵权麻烦联系我删除&#xff0c;主要是做笔记的时候忘记写来源了&#xff0c;做完笔记很久才写博客。 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 1 结构体 1.1 结…...

怎么查看数据库容量

要查看数据库容量&#xff0c;你需要登录数据库管理系统&#xff0c;然后执行相应的 SQL 查询语句。不同的数据库管理系统有不同的语法&#xff0c;以下是一些常见的数据库管理系统中查看数据库容量的 SQL 查询语句示例&#xff1a; MySQL/MariaDB: SELECT table_schema &quo…...

深度学习中卷积的计算复杂度与内存访问复杂度

深度学习中卷积的计算复杂度与内存访问复杂度 在深度学习中&#xff0c;普通卷积&#xff08;Standard Convolution&#xff09;、深度可分离卷积&#xff08;Depthwise Separable Convolution, DWConv&#xff09;和部分卷积&#xff08;Partial Convolution, PConv&#xff…...

神经网络—损失函数

文章目录 前言一、损失函数概念二、损失函数原理1、分类问题中常见的损失函数&#xff08;1&#xff09;0-1损失函数原理优缺点 &#xff08;2&#xff09;交叉熵损失&#xff08;Cross-Entropy Loss&#xff09;原理优缺点 &#xff08;3&#xff09; 合页损失&#xff08;Hin…...

Rust中避免过度使用锁导致性能问题的策略

一、引言 在 Rust 多线程编程中&#xff0c;锁是实现线程同步的重要工具&#xff0c;它可以防止多个线程同时访问和修改共享数据&#xff0c;从而避免数据竞争和不一致的问题。然而&#xff0c;过度使用锁会带来严重的性能问题&#xff0c;如锁竞争导致的线程阻塞、上下文切换…...

Qt connect第五个参数

在 Qt 中&#xff0c;QObject::connect 函数的第五个参数用于指定 连接类型&#xff08;Qt::ConnectionType&#xff09;&#xff0c;它决定了信号与槽之间的通信方式。以下是各枚举值的详解及使用场景&#xff1a; 1. Qt::AutoConnection&#xff08;默认值&#xff09; 行为…...

QT —— 信号和槽(带参数的信号和槽函数)

QT —— 信号和槽&#xff08;带参数的信号和槽函数&#xff09; 带参的信号和槽函数信号参数个数和槽函数参数个数1. 参数匹配规则2. 实际代码示例✅ 合法连接&#xff08;槽参数 ≤ 信号参数&#xff09;❌ 非法连接&#xff08;槽参数 > 信号参数&#xff09; 3. 特殊处理…...

极简GIT使用

只为极简使用。 创建本地仓库 初始化git仓库 1.创建一个新文件夹 2.在文件夹内打开git bash 之后进入如下界面&#xff0c;输入git init&#xff0c;这样此文件就可以使用git了。 在此文件夹中&#xff0c;除了.git文件外&#xff0c;其他全部都是工作文件。 接下来将以一个…...

【嵌入式———通用定时器基本操作——实验需求2:案列:测量PWM的频率/周期】

通用定时器输入捕获 需求&#xff1a;把测到的结果通过串口发送到电脑&#xff0c;检查测试结果。 在溢出之前&#xff0c;两次上升/下降沿记录时间。 345部分 滤波器&#xff1a;用来滤掉一些毛刺信息&#xff0c;信号质量好可以不滤波 边沿检测器&#xff1a;确定要捕获的是…...

兰亭妙微:数据驱动的 B 端设计:如何用 UI 提升企业级产品体验?

​ 在数字化转型的浪潮中&#xff0c;企业级产品的用户体验成为了决定产品竞争力的关键因素。对于 B 端产品而言&#xff0c;其使用场景复杂、用户需求多元&#xff0c;如何通过 UI 设计提升产品体验&#xff0c;成为了摆在设计者面前的重要课题。而数据驱动的设计方法&#x…...

Spring AOP---面向切面编程由认识到使用

1. AOP AOP(Aspect-Oriented Programming), 是一种思想, 面向切面编程。 在前文统一异常处理&#xff0c;统一结果返回就是使用了这一思想&#xff08;都是在集中处理某一类事情, 但又不影响原有代码的正常运行&#xff09;&#xff0c;但他们不是AOP&#xff0c;只是应用了这…...

深入解析 Python 应用日志监控:ELK、Graylog 的实战指南

深入解析 Python 应用日志监控:ELK、Graylog 的实战指南 引言 在现代应用开发中,日志不仅仅是用于记录错误和调试信息,它更是系统运行状况的窗口,帮助开发者和运维人员监控、优化应用性能。Python 作为广泛应用的开发语言,其应用日志管理的重要性不言而喻。而 ELK(Elas…...

贝叶斯算法实战:从原理到鸢尾花数据集分类

贝叶斯算法实战&#xff1a;从原理到鸢尾花数据集分类 在机器学习的广阔领域中&#xff0c;贝叶斯算法以其基于概率推理的独特优势&#xff0c;成为数据分类和预测的重要工具。今天&#xff0c;我们将通过一段Python代码&#xff0c;深入探讨贝叶斯算法在鸢尾花数据集分类任务…...

CSS学习笔记14——移动端相关知识(rem,媒体查询,less)

移动端 rem适配布局 rem单位 rem基准是相对于html元素的字体大小 父元素设定font-size&#xff0c;子元素根据rem缩放对应字体大小 媒体查询&#xff08;Media Query&#xff09; media可以针对不同屏幕尺寸设置不同样式当你重置浏览器大小过程中&#xff0c;页面也会根据…...

使用Node编写轻量级后端快速入门

使用Node编写轻量级后端快速入门 node 要作为轻量级后端需要下载一些对应模块可以参考下面命令。你可以借助 npm&#xff08;Node Package Manager&#xff09;来下载它们。 模块下载 express&#xff1a;这是一个广受欢迎的 Node.js Web 应用框架&#xff0c;能用于构建 Web…...

海量数据存储与分析:HBase vs ClickHouse vs Doris 三大数据库优劣对比指南

1.引言 在当今大数据时代&#xff0c;数据正以前所未有的速度持续增长。来自各个领域的数据&#xff0c;如互联网行业用户的每一次点击、浏览记录&#xff0c;金融机构的海量交易数据&#xff0c;以及物联网设备源源不断上传的实时监测数据等&#xff0c;其规模呈指数级攀升。…...

Redis 挂掉后高并发系统的应对策略:使用 Sentinel 实现限流降级与 SkyWalking 监控优化

前言 在现代分布式系统中&#xff0c;Redis 被广泛用作缓存中间件以提升性能和减轻数据库压力。然而&#xff0c;在高并发场景下&#xff0c;一旦 Redis 出现故障&#xff08;如宕机、网络中断等&#xff09;&#xff0c;如果没有有效的容错机制&#xff0c;可能会导致大量请求…...

C++11新特性_自动类型推导_decltype

decltype 是 C11 引入的一个关键字&#xff0c;用于在编译时推导表达式的类型。它提供了一种方式&#xff0c;让编译器根据表达式的类型来确定变量的类型&#xff0c;而不需要显式地指定类型。下面为你详细介绍 decltype 的使用方法和应用场景。 基本语法 decltype 的基本语法…...

Scrapy爬虫实战总结:动态与登录爬取的精炼经验

引言 在AI时代,信息和数据往往成就你的速度和高度。。。 这篇文章基于前两篇的实践基础之上的一次小结,通过“爬取动态网页”和“登录网站”两场实战,我用Scrapy+Splash破译JavaScript,用FormRequest敲开权限大门。这篇总结凝练两场冒险的体验,淬炼Scrapy爬虫的通用经验…...

windows系统搭建自己的ftp服务器,保姆级教程(用户验证+无验证)

前言 最近在搭建环境时&#xff0c;我发现每次都需要在网上下载依赖包和软件&#xff0c;这不仅耗时&#xff0c;而且有时还会遇到网络不稳定的问题&#xff0c;导致下载速度慢或者中断&#xff0c;实在不太方便。于是&#xff0c;我产生了搭建一个FTP服务器的想法。通过搭建FT…...