连接简介
准备两张表 t1 t2
1 2 3
| CREATE TABLE t1 (a1 int , b1 char(2));
CREATE TABLE t2 (a2 int , b2 char(2));
|
插入演示数据
1 2
| INSERT INTO t1 VALUES (1,'aa'),(2,'bb'),(3,'cc'); INSERT INTO t2 VALUES (11,'aa'),(22,'bb'),(23,'cc');
|
执行以上步骤我们已经创建表t1 t2, 并且已经插入数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| mysql> SELECT * FROM t1; + | a1 | b1 | + | 1 | aa | | 2 | bb | | 3 | cc | + 3 rows in set (0.02 sec)
mysql> SELECT * FROM t2; + | a2 | b2 | + | 11 | aa | | 22 | bb | | 23 | cc | + 3 rows in set (0.03 sec)
mysql>
|
连结就是将每个表中的数据取出来一次组合匹配的结果返回给用户。
连结之后的结果就是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| mysql> SELECT * FROM t1, t2; + | a1 | b1 | a2 | b2 | + | 1 | aa | 11 | aa | | 2 | bb | 11 | aa | | 3 | cc | 11 | aa | | 1 | aa | 22 | bb | | 2 | bb | 22 | bb | | 3 | cc | 22 | bb | | 1 | aa | 23 | cc | | 2 | bb | 23 | cc | | 3 | cc | 23 | cc | + 9 rows in set (0.04 sec)
|
笛卡尔积
如果我们连结多张表操作,没有限制条件的话,产生的笛卡尔积可能会非常巨大(t1_data_line * t2_data_line * …)
连接过程
- 第一步:第一个需要查询的表称为
驱动表,在 SELECT * FROM t1, t2; 中t1 是驱动表
- 第二步:对于上一步从
驱动表中产生的结果集,分别需要到t2表中查询记录,因为是根据t1表中的结果去查询t2,所以t2也称为被驱动表。
被驱动表可能会被访问多次,应避免大量数据带来io性能差,以及避免全表扫描。