MYSQL多表关联查询详解(内、外连接)

mysql> select * from emp;
+----+-----------+------+-----------+------------------+---------------------+--------+---------+
| id | name      | age  | tel       | email            | join_time           | salary | dept_id |
+----+-----------+------+-----------+------------------+---------------------+--------+---------+
|  1 | zs        |   18 | 1110      | 110@qq.com       | 2020-03-04 08:20:35 |   5000 |       1 |
|  2 | zs2       |   18 | 11130     | 1120@qq.com      | 2021-03-04 08:20:35 |  85000 |       2 |
|  3 | zss       |   18 | 11310     | 112340@qq.com    | 2018-03-04 08:20:35 |  15000 |       3 |
|  4 | zs        |   18 | 113456510 | 113456510@qq.com | 2020-03-04 08:20:35 |   5000 |       1 |
|  5 | zssdf     |   18 | 1123510   | 1123510@qq.com   | 2020-03-04 08:20:35 |   5000 |       2 |
|  6 | zsasdf    |   18 | 11111110  | 11111110@qq.com  | 2020-03-04 08:20:35 |   5000 |       4 |
|  7 | zssddf    |   18 | 111110    | 111110@qq.com    | 2020-03-04 08:20:35 |   5000 |       3 |
|  8 | z23s      |   18 | 112310    | 112310@qq.com    | 2020-03-04 08:20:35 |   5000 |       2 |
|  9 | zsfd32s   |   18 | 1123410   | 1123410@qq.com   | 2020-03-04 08:20:35 |   5000 |       1 |
| 10 | 刘建宏    |   18 | 120       | 120@qq.com       | 2024-01-04 08:20:35 |  10000 |    NULL |
+----+-----------+------+-----------+------------------+---------------------+--------+---------+
10 rows in set (0.00 sec)

mysql> select * from dept;
+----+-----------+-----------------------+
| id | name      | intro                 |
+----+-----------+-----------------------+
|  1 | 教学部    | 教授知识的部门        |
|  2 | 教研部    | 研究知识的部门        |
|  3 | 财务部    | 管钱的部门            |
|  4 | 校园部    | 管理学校部门          |
|  5 | 市场部    | 推广部门              |
+----+-----------+-----------------------+
5 rows in set (0.00 sec)

1.交叉连接(cross join)

select * from emp, dept;

交叉连接:因为没有描述两张或者多张表之间的关系,所以数据库只能做全部匹配出现了管卡尔积现象多表查询时,一定要避免出现笛卡尔积现象! ! !

开发过程中一定不要使用交叉连接!!!

2.SQL99标准:

select * from emp cross join dept;

3.内连接(inner join):

inner join:代表选择的是两个表的交差部分。
内连接就是表间的主键与外键相连,只取得键值一致的,可以获取双方表中的数据连接方式。
  • 语法如下:
SELECT 列名 1, 列名 2... FROM 1 INNER JOIN 2 ON 1. 外键 = 2. 主键 WhERE 条件语句 ;
select *from emp,dept where emp.dept id=dept.id

4.sql199标准:

select * from emp e inner join dept d on (e.dept_id=d.id) ;
select * frome join dept d on (e.dept_id=d.id);
select * from emp cross join dept on (emp.dept_id=dept.id);

5.外连接(outer join) :

左外连接 (left join) :将left join左侧的表中所有数据展示

左连接是以左表为标准,只查询在左边表中存在的数据,当然需要两个表中的键值一致。
  • 语法如下:
SELECT 列名 1 FROM 1 LEFT OUTER JOIN 2 ON 1. 外键 = 2. 主键 WhERE 条件语句 ;
mysql> select e.*, d.name from emp e left join dept d on (e.dept_id=d.id);
+----+-----------+------+-----------+------------------+---------------------+--------+---------+-----------+
| id | name      | age  | tel       | email            | join_time           | salary | dept_id | name      |
+----+-----------+------+-----------+------------------+---------------------+--------+---------+-----------+
|  1 | zs        |   18 | 1110      | 110@qq.com       | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
|  2 | zs2       |   18 | 11130     | 1120@qq.com      | 2021-03-04 08:20:35 |  85000 |       2 | 教研部    |
|  3 | zss       |   18 | 11310     | 112340@qq.com    | 2018-03-04 08:20:35 |  15000 |       3 | 财务部    |
|  4 | zs        |   18 | 113456510 | 113456510@qq.com | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
|  5 | zssdf     |   18 | 1123510   | 1123510@qq.com   | 2020-03-04 08:20:35 |   5000 |       2 | 教研部    |
|  6 | zsasdf    |   18 | 11111110  | 11111110@qq.com  | 2020-03-04 08:20:35 |   5000 |       4 | 校园部    |
|  7 | zssddf    |   18 | 111110    | 111110@qq.com    | 2020-03-04 08:20:35 |   5000 |       3 | 财务部    |
|  8 | z23s      |   18 | 112310    | 112310@qq.com    | 2020-03-04 08:20:35 |   5000 |       2 | 教研部    |
|  9 | zsfd32s   |   18 | 1123410   | 1123410@qq.com   | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
| 10 | 刘建宏    |   18 | 120       | 120@qq.com       | 2024-01-04 08:20:35 |  10000 |    NULL | NULL      |
+----+-----------+------+-----------+------------------+---------------------+--------+---------+-----------+
10 rows in set (0.00 sec)

右外连接 (right join) :将right join右侧侧的表中所有数据展示    

同理,右连接将会以右边作为基准,进行检索。
  • 语法如下:
SELECT 列名 1 FROM 1 RIGHT OUTER JOIN 2 ON 1. 外键 = 2. 主键 WhERE 条件语句 ;
mysql> select e.*, d.name from emp e right join dept d on (e.dept_id=d.id);
+------+---------+------+-----------+------------------+---------------------+--------+---------+-----------+
| id   | name    | age  | tel       | email            | join_time           | salary | dept_id | name      |
+------+---------+------+-----------+------------------+---------------------+--------+---------+-----------+
| NULL | NULL    | NULL | NULL      | NULL             | NULL                |   NULL |    NULL | 市场部    |
|    1 | zs      |   18 | 1110      | 110@qq.com       | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
|    4 | zs      |   18 | 113456510 | 113456510@qq.com | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
|    9 | zsfd32s |   18 | 1123410   | 1123410@qq.com   | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
|    2 | zs2     |   18 | 11130     | 1120@qq.com      | 2021-03-04 08:20:35 |  85000 |       2 | 教研部    |
|    5 | zssdf   |   18 | 1123510   | 1123510@qq.com   | 2020-03-04 08:20:35 |   5000 |       2 | 教研部    |
|    8 | z23s    |   18 | 112310    | 112310@qq.com    | 2020-03-04 08:20:35 |   5000 |       2 | 教研部    |
|    6 | zsasdf  |   18 | 11111110  | 11111110@qq.com  | 2020-03-04 08:20:35 |   5000 |       4 | 校园部    |
|    3 | zss     |   18 | 11310     | 112340@qq.com    | 2018-03-04 08:20:35 |  15000 |       3 | 财务部    |
|    7 | zssddf  |   18 | 111110    | 111110@qq.com    | 2020-03-04 08:20:35 |   5000 |       3 | 财务部    |
+------+---------+------+-----------+------------------+---------------------+--------+---------+-----------+
10 rows in set (0.00 sec)

全外连接(full join): MySQL自前不支持。

自连接(self join):自连接顾名思义就是自己跟自己连接,参与连接的表都是同一张表。(通过给表取别名虚拟出)

自然连接(nature join):通过表的字段,自动关联外键,不建议使用!!!

相关推荐

  1. MYSQL关联查询详解(内、外连接

    2024-01-19 07:06:01       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-19 07:06:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-19 07:06:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-19 07:06:01       82 阅读
  4. Python语言-面向对象

    2024-01-19 07:06:01       91 阅读

热门阅读

  1. C++写csv文件

    2024-01-19 07:06:01       53 阅读
  2. Unity文字游戏开发日志(1)—— 打字机效果

    2024-01-19 07:06:01       52 阅读
  3. Mysql核心知识命令汇总

    2024-01-19 07:06:01       61 阅读
  4. bevy the book 20140118翻译(全)

    2024-01-19 07:06:01       40 阅读
  5. 【中断之GPT问答】

    2024-01-19 07:06:01       49 阅读
  6. Oracle中的索引

    2024-01-19 07:06:01       45 阅读
  7. Django笔记(四):视图views

    2024-01-19 07:06:01       52 阅读
  8. Linux 使用PS命令掌握进程管理

    2024-01-19 07:06:01       57 阅读
  9. jmeter的使用教程

    2024-01-19 07:06:01       54 阅读