补补数据库基础
上图中,表A的记录是123,表B的记录是ABC,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用null填充。
注意:多表连接查询会比直接使用自带的API查询表中的一个属性,再根据属性查询另一个表,一个一个查询来得快。所以,我们要善用多表连接查询。
举个例子:
学生表:
s_id:学生学号
s_name:学生名称
s_class:学生班级
老师表:
t_id:老师id
t_class:老师管理的班级
t_name:老师名称
内连接(INNER JOIN)
内连接:,,JOIN,INNER JOIN
如果输入JOIN,那么默认就是INNER JOIN内连接
/* 内连接 */
SELECT * FROM student INNER JOIN teacher ON s_class=t_class
/* 我比较喜欢这种,但是上面那种效率会更高,因为 JOIN 的优先级高于 逗号,,所以如果可以的话,尽量使用上面的 */
SELECT * FROM student,teacher WHERE s_class=t_class
补充:
在使用 join 时,on 和 where 条件的区别如下:
1、on 条件是在生成临时表时使用的条件,它不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边或者右边表的记录)了,条件不为真的就全部过滤掉。而 inner jion 没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。
外连接(OUTERJOIN)
左外连接(LEFT JOIN)
左外连接:LEFT JOIN,LEFT OUTER JOIN
/* 左连接 */
SELECT * FROM student LEFT JOIN teacher ON s_class=t_class
右外连接(RIGHT JOIN)
右外连接:RIGHT JOIN,RIGHT OUTER JOIN
/* 右连接 */
SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class
全外连接(FULL JOIN)
全外连接:FULL JOIN,FULL OUTER JOIN
注意:Oracle数据库支持full join,mysql是不支持full join的,但仍然可以同过左外连接+union+右外连接实现。
/* 全连接(不适用于MYSQL) */
SELECT * FROM student FULL JOIN teacher ON s_class=t_class
/* 全连接 */
SELECT * FROM student LEFT JOIN teacher ON s_class=t_class
UNION
SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class
交叉连接(笛卡尔积)(CROSS JOIN)
笛卡尔积:对所有元素一一映射,排列组合
/* 交叉连接 */
SELECT * FROM student CROSS JOIN teacher
自链接
自连接作为一种特例,可以将一个表与它自身进行连接,称为自连接。
若要在一个表中查找具有相同列值的行,则可以使用自连接。
使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。
SELECT a.学号, a.课程号, b.课程号, a.成绩
FROM student a JOIN student b
ON a.成绩=b.成绩 AND a.学号=b.学号 AND a.课程号!=b.课程号
REFERENCE:
【SQL】JOIN 连接:内连接、外连接、交叉连接、自连接、等值连接、自然连接 - Nemo& - 博客园