多表联查
使用多表查询可以获取M x N行记录(M,N为两个表各自的行数)
多表查询的结果集可能非常巨大,要小心使用。
内连接
mysql> SELECT s.id, s.name,`s`.`class id`, s.nickname,s.sex,c.name,s.in_time,s.is_vaild FROM students s INNER JOIN class c ON `s`.`class id` = c.id;
+----+---------+----------+-----------+------+--------------+---------------------+----------+
| id | name | class id | nickname | sex | name | in_time | is_vaild |
+----+---------+----------+-----------+------+--------------+---------------------+----------+
| 7 | weilai | 202 | imwl | 男 | 二年二班 | 2018-12-27 22:05:41 | 1 |
| 8 | weilai | 202 | imwl | 男 | 二年二班 | 2018-12-27 22:05:41 | 2 |
| 9 | weilai | 202 | imwl | 男 | 二年二班 | 2018-12-27 22:05:41 | NULL |
| 10 | weilai2 | 201 | imwl | 男 | 二年一班 | 2018-12-27 22:05:41 | NULL |
| 12 | name1 | 201 | nickname1 | 女 | 二年一班 | NULL | NULL |
| 13 | name2 | 201 | nickname2 | 男 | 二年一班 | NULL | NULL |
| 19 | 2 | 301 | i | 男 | 三年一班 | 2019-02-27 12:02:04 | NULL |
| 20 | 3 | 301 | m | 女 | 三年一班 | 2019-02-27 12:02:04 | NULL |
| 21 | 4 | 302 | w | 男 | 三年二班 | 2019-02-27 12:02:04 | NULL |
| 22 | 5 | 302 | l | 男 | 三年二班 | 2019-02-27 12:02:04 | NULL |
+----+---------+----------+-----------+------+--------------+---------------------+----------+
INNER JOIN查询的写法是:
先确定主表,仍然使用FROM <表1>
的语法;
再确定需要连接的表,使用INNER JOIN <表2>
的语法;
然后确定连接条件,使用ON <条件...>
,这里的条件是s.class id = c.id
,表示students
表的class id
列与class
表的id
列相同的行需要连接;
可选:加上WHERE
子句、ORDER BY
等子句。
小结
JOIN
查询需要先确定主表,然后把另一个表的数据“附加”到结果集上;
INNER JOIN
是最常用的一种JOIN
查询,它的语法是SELECT ... FROM <表1> INNER JOIN <表2> ON <条件...>;
JOIN
查询仍然可以使用WHERE
条件和ORDER BY
排序。
补充知识
假设查询语句是:
SELECT ... FROM tableA ??? JOIN tableB ON tableA.column1 = tableB.column2;
我们把tableA看作左表,把tableB看成右表,那么INNER JOIN是选出两张表都存在的记录:
LEFT OUTER JOIN是选出左表存在的记录:
RIGHT OUTER JOIN是选出右表存在的记录:
FULL OUTER JOIN则是选出左右表都存在的记录: