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):通过表的字段,自动关联外键,不建议使用!!!