前面的笔记已经记录了select单表查询与子查询,此笔记记录SQL99标准的多表连接查询。
一、SQL92与SQL99的连接查询
SQL99标准连接查询语法:
SELECT col1,col2[,...] FROM table1,table2 [,table3,...] [WHERE condition]
如:
SELECT t1.*,t2.id FROM table1 t1,table2 t2 WHERE t1.id=t2.id;//可以有多个条件,条件可以是非等值的,如">"
比SQL92标准更具可读性,同时使用专门的条件子句(ON子句)指定连接条件,而非使用WHERE
1、交叉连接(CROSS JOIN)
SELECT col1,col2 [,...] FROM table1 CROSS JOIN table2;
说明:即广义笛卡尔积。
2、自然连接(NATURAL JOIN)
SELECT col1,col2 [,...] FROM table1 NATURAL JOIN table2;
说明:会以同名列作为连接条件,没同名列时效果同CROSS JOIN。
3、JOIN+USING 子句连接
SELECT col1,col2 [,...] FROM table1 JOIN table2 USING(sharedCol1,sharedCol2[,...]);
说明:在NATURAL JOIN 上的改进,指定哪些列作为连接条件。
4、JOIN+ON 子句
SELECT col1,col2 [,...] FROM table1 JOIN table2 ON table1.id=table2.id;
说明:SQL99中ON子句指定连接条件,且每个ON子句只能指定一个连接条件,则如需进行N表连接,就需要N-1个JOIN...ON对。
5、左、右、全(FULL)外(OUTER)连接
SELECT col1,col2 [,...] FROM table1 LEFT/RIGHT/FULL [OUTER] JOIN table2 [ON 子句];//OUTER有无结果无区别,LEFT时产生table1的完全结果,table2中为数据或null
6、INNER JOIN
SELECT col1,col2 [,...] FROM table1 INNER JOIN table2 [ON 子句];//产生多个表的交集
1、实践用表:对应序号列的类型相同
2、SQL92连接
说明:SQL使用WHERE指定连接条件。and 与union的速度比较?
3、SQL99连接
CROSS JOIN:
说明:即笛卡尔积。
NATURAL JOIN:
说明:因为有两列名相同(id与name),所以自动以此两列作为连接条件。
USING 子句指定连接列:
说明:只指定同名列(id与name)中的id作为连接条件,所以不考虑name列值是否相同。
ON 子句指定连接条件:
说明:只是JOIN 而没有使用ON指定连接条件时,也是笛卡尔积,即同CROSS JOIN。
LEFT/RIGHT/FULL [OUTER] JOIN:
说明:从结果可见,LEFT JOIN首先查出左边表的所有记录,总条数为左边表记录数,对应右边表不存在的记录值为空,RIGHT JOIN 相反,总条数为右边表的记录数。MySQL不支持FULL JOIN。此外,左、右、全连接必须指定ON 条件,否则提示错误。