mysql基础(3)

多表联查

多表联查
投影查询 简写
加where

使用多表查询可以获取M x N行记录(M,N为两个表各自的行数)
多表查询的结果集可能非常巨大,要小心使用。

内连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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排序。

补充知识

假设查询语句是:

1
SELECT ... FROM tableA ??? JOIN tableB ON tableA.column1 = tableB.column2;

我们把tableA看作左表,把tableB看成右表,那么INNER JOIN是选出两张表都存在的记录:

inner-join

LEFT OUTER JOIN是选出左表存在的记录:

left-outer-join

RIGHT OUTER JOIN是选出右表存在的记录:

right-outer-join

FULL OUTER JOIN则是选出左右表都存在的记录:

full-outer-join