建立一张表t1有两个字段
建立一张表t21有两个字段
将t1和t2进行自由组合,就和我们基因的自由组合一样就是AaBb那一套
像这样的结果集就可以称之为笛卡尔积
select * from t1 on t1.a = t2.a where t1.a > t2.a
其中t1是驱动表,t2是被驱动表
CREATE TABLE student (
number INT NOT NULL AUTO_INCREMENT COMMENT '学号',
name VARCHAR(5) COMMENT '姓名',
major VARCHAR(30) COMMENT '专业',
PRIMARY KEY (number)
) Engine=InnoDB CHARSET=utf8 COMMENT '学生信息表';
CREATE TABLE score (
number INT COMMENT '学号',
subject VARCHAR(30) COMMENT '科目',
score TINYINT COMMENT '成绩',
PRIMARY KEY (number, score)
) Engine=InnoDB CHARSET=utf8 COMMENT '学生成绩表';
插入如下数据
mysql> SELECT * FROM student;
+----------+-----------+--------------------------+
| number | name | major |
+----------+-----------+--------------------------+
| 20180101 | 杜子腾 | 软件学院 |
| 20180102 | 范统 | 计算机科学与工程 |
| 20180103 | 史珍香 | 计算机科学与工程 |
+----------+-----------+--------------------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM score;
+----------+-----------------------------+-------+
| number | subject | score |
+----------+-----------------------------+-------+
| 20180101 | 母猪的产后护理 | 78 |
| 20180101 | 论萨达姆的战争准备 | 88 |
| 20180102 | 论萨达姆的战争准备 | 98 |
| 20180102 | 母猪的产后护理 | 100 |
+----------+-----------------------------+-------+
4 rows in set (0.00 sec)
需要个根据学号查询分数信息,就对表进行连查询
mysql> SELECT * FROM student, score WHERE student.number = score.number;
+----------+-----------+--------------------------+----------+-----------------------------+-------+
| number | name | major | number | subject | score |
+----------+-----------+--------------------------+----------+-----------------------------+-------+
| 20180101 | 杜子腾 | 软件学院 | 20180101 | 母猪的产后护理 | 78 |
| 20180101 | 杜子腾 | 软件学院 | 20180101 | 论萨达姆的战争准备 | 88 |
| 20180102 | 范统 | 计算机科学与工程 | 20180102 | 论萨达姆的战争准备 | 98 |
| 20180102 | 范统 | 计算机科学与工程 | 20180102 | 母猪的产后护理 | 100 |
+----------+-----------+--------------------------+----------+-----------------------------+-------+
4 rows in set (0.00 sec)
但是由于史珍香没有进行考试,所以没有考试分数信息。因此这时候就需要进行外连接查询,及时没有匹配到的数据也要将它加到结果集中。所以我们就有了外连接。
- 内连接两个表,驱动表在被驱动表中找不到匹配的记录,该记录不会加到最后的结果集中,这就是内连接。
- 外连接的两个表,及时驱动表在被驱动表中无法找到匹配的记录,驱动表中的记录也会保留,而被驱动表中的记录将以null代替。
-
- 左连接是选择左表作为驱动表
- 右连接是将右表作为驱动表
有时候想在连表的基础上进行过滤操作,所以就有了where条件,在外连接中凡是在where条件内的都将在结果集中展示。对于内连接来说on和where是等价的都会过滤掉结果集中不符合条件的数据。
mysql> SELECT s1.number, s1.name, s2.subject, s2.score FROM student AS s1 LEFT JOIN score AS s2 ON s1.number = s2.number;
+----------+-----------+-----------------------------+-------+
| number | name | subject | score |
+----------+-----------+-----------------------------+-------+
| 20180101 | 杜子腾 | 母猪的产后护理 | 78 |
| 20180101 | 杜子腾 | 论萨达姆的战争准备 | 88 |
| 20180102 | 范统 | 论萨达姆的战争准备 | 98 |
| 20180102 | 范统 | 母猪的产后护理 | 100 |
| 20180103 | 史珍香 | NULL | NULL |
+----------+-----------+-----------------------------+-------+
5 rows in set (0.04 sec)
这个过程就像是一个嵌套的循环,所以这种驱动表只访问一次,但被驱动表却可能被多次访问,访问次数取决于对驱动表执行单表查询后的结果集中的记录条数的连接执行方式称之为嵌套循环连接(Nested-Loop Join),这是最简单,也是最笨拙的一种连接查询算法。