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

mysql> select * from emp;
+----+-----------+------+-----------+------------------+---------------------+--------+---------+
| id | name      | age  | tel       | email            | join_time           | salary | dept_id |
+----+-----------+------+-----------+------------------+---------------------+--------+---------+
|  1 | zs        |   18 | 1110      | [email protected]       | 2020-03-04 08:20:35 |   5000 |       1 |
|  2 | zs2       |   18 | 11130     | [email protected]      | 2021-03-04 08:20:35 |  85000 |       2 |
|  3 | zss       |   18 | 11310     | [email protected]    | 2018-03-04 08:20:35 |  15000 |       3 |
|  4 | zs        |   18 | 113456510 | [email protected] | 2020-03-04 08:20:35 |   5000 |       1 |
|  5 | zssdf     |   18 | 1123510   | [email protected]   | 2020-03-04 08:20:35 |   5000 |       2 |
|  6 | zsasdf    |   18 | 11111110  | [email protected]  | 2020-03-04 08:20:35 |   5000 |       4 |
|  7 | zssddf    |   18 | 111110    | [email protected]    | 2020-03-04 08:20:35 |   5000 |       3 |
|  8 | z23s      |   18 | 112310    | [email protected]    | 2020-03-04 08:20:35 |   5000 |       2 |
|  9 | zsfd32s   |   18 | 1123410   | [email protected]   | 2020-03-04 08:20:35 |   5000 |       1 |
| 10 | 刘建宏    |   18 | 120       | [email protected]       | 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      | [email protected]       | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
|  2 | zs2       |   18 | 11130     | [email protected]      | 2021-03-04 08:20:35 |  85000 |       2 | 教研部    |
|  3 | zss       |   18 | 11310     | [email protected]    | 2018-03-04 08:20:35 |  15000 |       3 | 财务部    |
|  4 | zs        |   18 | 113456510 | [email protected] | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
|  5 | zssdf     |   18 | 1123510   | [email protected]   | 2020-03-04 08:20:35 |   5000 |       2 | 教研部    |
|  6 | zsasdf    |   18 | 11111110  | [email protected]  | 2020-03-04 08:20:35 |   5000 |       4 | 校园部    |
|  7 | zssddf    |   18 | 111110    | [email protected]    | 2020-03-04 08:20:35 |   5000 |       3 | 财务部    |
|  8 | z23s      |   18 | 112310    | [email protected]    | 2020-03-04 08:20:35 |   5000 |       2 | 教研部    |
|  9 | zsfd32s   |   18 | 1123410   | [email protected]   | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
| 10 | 刘建宏    |   18 | 120       | [email protected]       | 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      | [email protected]       | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
|    4 | zs      |   18 | 113456510 | [email protected] | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
|    9 | zsfd32s |   18 | 1123410   | [email protected]   | 2020-03-04 08:20:35 |   5000 |       1 | 教学部    |
|    2 | zs2     |   18 | 11130     | [email protected]      | 2021-03-04 08:20:35 |  85000 |       2 | 教研部    |
|    5 | zssdf   |   18 | 1123510   | [email protected]   | 2020-03-04 08:20:35 |   5000 |       2 | 教研部    |
|    8 | z23s    |   18 | 112310    | [email protected]    | 2020-03-04 08:20:35 |   5000 |       2 | 教研部    |
|    6 | zsasdf  |   18 | 11111110  | [email protected]  | 2020-03-04 08:20:35 |   5000 |       4 | 校园部    |
|    3 | zss     |   18 | 11310     | [email protected]    | 2018-03-04 08:20:35 |  15000 |       3 | 财务部    |
|    7 | zssddf  |   18 | 111110    | [email protected]    | 2020-03-04 08:20:35 |   5000 |       3 | 财务部    |
+------+---------+------+-----------+------------------+---------------------+--------+---------+-----------+
10 rows in set (0.00 sec)

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

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

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

你可能感兴趣的:(MYSQL,mysql,数据库)