全连接
多表查询只需使用,隔开各个表格
查询结果是各表格的行相连得到新的行,总行数=表1行数*表2行数…*表n行数
缺点:数据较大的场景下多表相乘会得到一个很大的临时表格,效率比较低
mysql> select * from result;
+--------+--------+-------+
| name | subect | score |
+--------+--------+-------+
| 张三 | 数学 | 120 |
| 张三 | 语文 | 12 |
| 张三 | 地理 | 20 |
| 李四 | 数学 | 44 |
| 李四 | 语文 | 33 |
| 王五 | 数学 | 5 |
+--------+--------+-------+
6 rows in set (0.00 sec)
mysql> select * from test;
+----------+------------+----------+
| star | birthday | sign |
+----------+------------+----------+
| Jay zhou | 1979-01-18 | 00:00:00 |
| xiaosan | 1979-01-01 | 19:43:11 |
| xiaosi | 1979-00-01 | 19:43:11 |
+----------+------------+----------+
3 rows in set (0.00 sec)
mysql> select * from result,test;
+--------+--------+-------+----------+------------+----------+
| name | subect | score | star | birthday | sign |
+--------+--------+-------+----------+------------+----------+
| 张三 | 数学 | 120 | Jay zhou | 1979-01-18 | 00:00:00 |
| 张三 | 数学 | 120 | xiaosan | 1979-01-01 | 19:43:11 |
| 张三 | 数学 | 120 | xiaosi | 1979-00-01 | 19:43:11 |
| 张三 | 语文 | 12 | Jay zhou | 1979-01-18 | 00:00:00 |
| 张三 | 语文 | 12 | xiaosan | 1979-01-01 | 19:43:11 |
| 张三 | 语文 | 12 | xiaosi | 1979-00-01 | 19:43:11 |
| 张三 | 地理 | 20 | Jay zhou | 1979-01-18 | 00:00:00 |
| 张三 | 地理 | 20 | xiaosan | 1979-01-01 | 19:43:11 |
| 张三 | 地理 | 20 | xiaosi | 1979-00-01 | 19:43:11 |
| 李四 | 数学 | 44 | Jay zhou | 1979-01-18 | 00:00:00 |
| 李四 | 数学 | 44 | xiaosan | 1979-01-01 | 19:43:11 |
| 李四 | 数学 | 44 | xiaosi | 1979-00-01 | 19:43:11 |
| 李四 | 语文 | 33 | Jay zhou | 1979-01-18 | 00:00:00 |
| 李四 | 语文 | 33 | xiaosan | 1979-01-01 | 19:43:11 |
| 李四 | 语文 | 33 | xiaosi | 1979-00-01 | 19:43:11 |
| 王五 | 数学 | 5 | Jay zhou | 1979-01-18 | 00:00:00 |
| 王五 | 数学 | 5 | xiaosan | 1979-01-01 | 19:43:11 |
| 王五 | 数学 | 5 | xiaosi | 1979-00-01 | 19:43:11 |
+--------+--------+-------+----------+------------+----------+
18 rows in set (0.00 sec)
注意:这种查询当两个表中存在一样名称的列时需要注明所取的是哪个表格的列
mysql> select * from mt;
+--------+--------+
| cat_id | name |
+--------+--------+
| 1 | 张三 |
+--------+--------+
1 row in set (0.00 sec)
mysql> select * from result;
+--------+--------+-------+
| name | subect | score |
+--------+--------+-------+
| 张三 | 数学 | 120 |
| 张三 | 语文 | 12 |
| 张三 | 地理 | 20 |
| 李四 | 数学 | 44 |
| 李四 | 语文 | 33 |
| 王五 | 数学 | 5 |
+--------+--------+-------+
6 rows in set (0.00 sec)
mysql> select * from result,mt;
+--------+--------+-------+--------+--------+
| name | subect | score | cat_id | name |
+--------+--------+-------+--------+--------+
| 张三 | 数学 | 120 | 1 | 张三 |
| 张三 | 语文 | 12 | 1 | 张三 |
| 张三 | 地理 | 20 | 1 | 张三 |
| 李四 | 数学 | 44 | 1 | 张三 |
| 李四 | 语文 | 33 | 1 | 张三 |
| 王五 | 数学 | 5 | 1 | 张三 |
+--------+--------+-------+--------+--------+
6 rows in set (0.00 sec)
mysql> select name from result,mt;
ERROR 1052 (23000): Column 'name' in field list is ambiguous
mysql> select score from result,mt;
+-------+
| score |
+-------+
| 120 |
| 12 |
| 20 |
| 44 |
| 33 |
| 5 |
+-------+
6 rows in set (0.00 sec)
mysql> select result.name from result,mt;
+--------+
| name |
+--------+
| 张三 |
| 张三 |
| 张三 |
| 李四 |
| 李四 |
| 王五 |
+--------+
6 rows in set (0.00 sec)
#插入一个身高列
mysql> alter table mt add high_cm smallint(3) not null default 0;
Query OK, 1 row affected (0.04 sec)
mysql> update mt set high_cm=173;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
mysql> select * from mt;
+--------+--------+---------+
| cat_id | name | high_cm |
+--------+--------+---------+
| 1 | 张三 | 173 |
+--------+--------+---------+
1 row in set (0.00 sec)
mysql> select * from result,mt;
+--------+--------+-------+--------+--------+---------+
| name | subect | score | cat_id | name | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三 | 数学 | 120 | 1 | 张三 | 173 |
| 张三 | 语文 | 12 | 1 | 张三 | 173 |
| 张三 | 地理 | 20 | 1 | 张三 | 173 |
| 李四 | 数学 | 44 | 1 | 张三 | 173 |
| 李四 | 语文 | 33 | 1 | 张三 | 173 |
| 王五 | 数学 | 5 | 1 | 张三 | 173 |
+--------+--------+-------+--------+--------+---------+
6 rows in set (0.00 sec)
#可以看到上面表格中有很多行其实并不是我们需要的,比如李四后面加张三的身高信息没什么意义,在此我们只查询张三的信息
mysql> select * from result,mt where result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name | subect | score | cat_id | name | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三 | 数学 | 120 | 1 | 张三 | 173 |
| 张三 | 语文 | 12 | 1 | 张三 | 173 |
| 张三 | 地理 | 20 | 1 | 张三 | 173 |
+--------+--------+-------+--------+--------+---------+
3 rows in set (0.00 sec)
左连接
定义:假设A表不动,B表在A的右边滑动
A、B表通过一个关系来进行关联行,筛选出满足条件的B表的行
基本语法:A left join B on 条件
结果形成一个结果集,可以看成一张表
mysql> select * from result left join mt on result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name | subect | score | cat_id | name | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三 | 数学 | 120 | 1 | 张三 | 173 |
| 张三 | 语文 | 12 | 1 | 张三 | 173 |
| 张三 | 地理 | 20 | 1 | 张三 | 173 |
| 李四 | 数学 | 44 | NULL | NULL | NULL |
| 李四 | 语文 | 33 | NULL | NULL | NULL |
| 王五 | 数学 | 5 | NULL | NULL | NULL |
+--------+--------+-------+--------+--------+---------+
6 rows in set (0.01 sec)
mysql> select * from result left join mt on result.name=mt.name where result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name | subect | score | cat_id | name | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三 | 数学 | 120 | 1 | 张三 | 173 |
| 张三 | 语文 | 12 | 1 | 张三 | 173 |
| 张三 | 地理 | 20 | 1 | 张三 | 173 |
+--------+--------+-------+--------+--------+---------+
3 rows in set (0.00 sec)
mysql> select * from result left join mt on result.name=mt.name where result.name="李四";
+--------+--------+-------+--------+------+---------+
| name | subect | score | cat_id | name | high_cm |
+--------+--------+-------+--------+------+---------+
| 李四 | 数学 | 44 | NULL | NULL | NULL |
| 李四 | 语文 | 33 | NULL | NULL | NULL |
+--------+--------+-------+--------+------+---------+
2 rows in set (0.00 sec)
左连接和右链接的区别
左连接结果
mysql> insert into mt (name,high_cm) values ('张三',155);
mysql> select * from mt;
+--------+--------+---------+
| cat_id | name | high_cm |
+--------+--------+---------+
| 1 | 张三 | 173 |
| 2 | 张三 | 155 |
+--------+--------+---------+
2 rows in set (0.00 sec)
mysql> select result.*,mt.* from result left join mt on result.name=mt.name; +--------+--------+-------+--------+--------+---------+
| name | subect | score | cat_id | name | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三 | 数学 | 120 | 1 | 张三 | 173 |
| 张三 | 数学 | 120 | 2 | 张三 | 155 |
| 张三 | 语文 | 12 | 1 | 张三 | 173 |
| 张三 | 语文 | 12 | 2 | 张三 | 155 |
| 张三 | 地理 | 20 | 1 | 张三 | 173 |
| 张三 | 地理 | 20 | 2 | 张三 | 155 |
| 李四 | 数学 | 44 | NULL | NULL | NULL |
| 李四 | 语文 | 33 | NULL | NULL | NULL |
| 王五 | 数学 | 5 | NULL | NULL | NULL |
+--------+--------+-------+--------+--------+---------+
9 rows in set (0.00 sec)
右链接结果
mysql> select result.*,mt.* from mt left join result on result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name | subect | score | cat_id | name | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三 | 数学 | 120 | 1 | 张三 | 173 |
| 张三 | 语文 | 12 | 1 | 张三 | 173 |
| 张三 | 地理 | 20 | 1 | 张三 | 173 |
| 张三 | 数学 | 120 | 2 | 张三 | 155 |
| 张三 | 语文 | 12 | 2 | 张三 | 155 |
| 张三 | 地理 | 20 | 2 | 张三 | 155 |
+--------+--------+-------+--------+--------+---------+
6 rows in set (0.01 sec)
mysql> select result.*,mt.* from mt right join result on result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name | subect | score | cat_id | name | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三 | 数学 | 120 | 1 | 张三 | 173 |
| 张三 | 数学 | 120 | 2 | 张三 | 155 |
| 张三 | 语文 | 12 | 1 | 张三 | 173 |
| 张三 | 语文 | 12 | 2 | 张三 | 155 |
| 张三 | 地理 | 20 | 1 | 张三 | 173 |
| 张三 | 地理 | 20 | 2 | 张三 | 155 |
| 李四 | 数学 | 44 | NULL | NULL | NULL |
| 李四 | 语文 | 33 | NULL | NULL | NULL |
| 王五 | 数学 | 5 | NULL | NULL | NULL |
+--------+--------+-------+--------+--------+---------+
9 rows in set (0.00 sec)
左右链接是可以互换的,尽量用左链接
A left join B
B right join A
内连接
左右链接的交集
mysql> select result.*,mt.* from result inner join mt on result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name | subect | score | cat_id | name | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三 | 数学 | 120 | 1 | 张三 | 173 |
| 张三 | 数学 | 120 | 2 | 张三 | 155 |
| 张三 | 语文 | 12 | 1 | 张三 | 173 |
| 张三 | 语文 | 12 | 2 | 张三 | 155 |
| 张三 | 地理 | 20 | 1 | 张三 | 173 |
| 张三 | 地理 | 20 | 2 | 张三 | 155 |
+--------+--------+-------+--------+--------+---------+
6 rows in set (0.00 sec)