表1 t_class
这里准备了四个字段有7条数据
表2 p_class
也准备了四个字段添加了5条数据 专门设计了几个字段的名字和t_class的相同
左外连接查询和右外连接查询
试一下下边的查询语句,发现错误
SELECT * FROM t_class AS t RIGHT JOIN p_class AS p
错误结果如下提示
错误代码: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0, 1000' at line 2
说明左连接和右连接查询必须要加上on后边的约束条件
等值连击
下边执行一下等值约束条件观察一下结果,sql语句如下
SELECT * FROM t_class AS t LEFT JOIN p_class AS p
ON t.`name` = p.`name`;
结果如下图:
注意到是7条记录,和左边的表的记录相同,在设计表的时候专门在t_class中添加了两个重复的名字,发现查询出来的结果会和右边表的每个tom都连接上,
那么把左连接改成右连接试一下:
SELECT * FROM t_class AS t RIGHT JOIN p_class AS p
ON t.`name` = p.`name`;
发现表的记录是6条,比原来p_class的记录多了一条,说明tom会和左边的每个表都进行连接 。
由此可以发现左外连接或者右外连接的等值查询,都是以一个基础表进行连接,查询的结果大于等于基础表的数据行数,没有连接上的行记录,另一个表的字段信息会用null填充。(行记录大于原表的数据行 ,上边那个右连接查询很好展现了这个问题,左表中有相同的字段可以和右表中的一个字段进行连接,所以会出现多的情况。)
不等值连接
接下来试一下不等值连接
SELECT * FROM t_class AS t LEFT OUTER JOIN p_class AS p
ON t.`age` > p.`age`;
结果如下:
从结果可以看出,就是先拿出左边表的每一条记录,然后和右表的每一条记录进行比较,复合约束条件就会显示出来,如果右边表一个约束记录都没有的话,那么右边表的字段信息用null填充,这样的查询出来的记录也是大于等于左边表的行数。
当然右连接范围查询也是一样,只是以右边的表为基准,sql语句如下
SELECT * FROM t_class AS t RIGHT OUTER JOIN p_class AS p
ON t.`age` > p.`age`;
结果如下:
内连接查询
不加约束条件
当我使用内连接查询并且不加on约束条件时,是可以通过查询的,不会报错
SELECT * FROM t_class AS t INNER JOIN p_class AS p ;
SELECT * FROM t_class AS t CROSS JOIN p_class AS p ;
查询出来共有35条记录,也就是和cross join一样是笛卡尔乘积,也就是每一个左边表的数据与右边表的每一条数据进行连接 7*5 = 35
等值约束查询
SELECT * FROM t_class AS t INNER JOIN p_class AS p
ON t.`name` = p.`name`;
查询出的结果如下:
这也就是把上边35条数据中复合约束条件的字段进行了筛选,不论如何调换两张表的位置,查询的都是这些字段,对于有多个名字相同并且进行了匹配了的字段,那么就以这个名字进行笛卡尔乘积进行匹配。这里是左边的表两个tom右边的表1个tom, 假如右边表有2个Tom的话 就会再多出一条记录。
范围约束查询
我们执行一下下边的语句
SELECT * FROM t_class AS t INNER JOIN p_class AS p on t.`age` > p.`age`;
查询结果如下:
并且交叉连接查询的结果也是上边的结果
SELECT * FROM t_class AS t CROSS JOIN p_class AS p
ON t.`age` > p.`age`;
这里就是把左外连接和右外连接的没有满足约束条件为null的记录删除了,少了两个为null的记录。说明内连接不会出现为null的约束字段。
关于笛卡尔乘积 cross join 前边也穿插进行了介绍,其实和inner相似
当不加约束条件时和inner的作用一样 ,加了也一样,没有特别的区别。
索引
直接看这个链接
添加链接描述