补补数据库基础

上图中,表A的记录是123,表B的记录是ABC,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用null填充。
注意:多表连接查询会比直接使用自带的API查询表中的一个属性,再根据属性查询另一个表,一个一个查询来得快。所以,我们要善用多表连接查询。
学生表:

s_id:学生学号
s_name:学生名称
s_class:学生班级
老师表:

t_id:老师id
t_class:老师管理的班级
t_name:老师名称
内连接:,,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 中,返回的结果集是相同的。
左外连接:LEFT JOIN,LEFT OUTER JOIN
- /* 左连接 */
- SELECT * FROM student LEFT JOIN teacher ON s_class=t_class

右外连接:RIGHT JOIN,RIGHT OUTER JOIN
- /* 右连接 */
- SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class

全外连接: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

笛卡尔积:对所有元素一一映射,排列组合
- /* 交叉连接 */
- 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.课程号
