但需要注意的是,不同联接类型执行的步骤不同,对于CROSS JOIN,只应用第一个阶段的笛卡尔积(单纯进行笛卡尔积),INNER JOIN应用第一和第二个步骤(进行笛卡尔积之后进行去重,去重的是ON过滤器进行过滤),OUTER JOIN应用所有的前三个步骤(进行笛卡尔积然后进行去重,去重的是ON过滤器进行过滤,然后进行保留表数据的插入)。
新旧查询语法
MySQL数据库支持两种不同的内联接操作语法。
//新,称为(ANSI 89语法)
SELECT … FROM a,b WHERE a.x = b.x;
//旧 ANSI 92
SELECT … FROM a INNER JOIN b ON a.x = b.x
CROSS JOIN
CROSS JOIN是对两个表执行笛卡尔积,返回两个表中所有列的组合,若左表有m行数据,右表有n行数据,则CROSS JOIN将返回m*n行的表(笛卡尔积)
交叉联接也有两种不同的SQL语法,结果也是一样的
SELECT … FROM t1 CROSS JOIN t2;
SELECT … FROM t1,t2; //不进行过滤的内联接
注意
如果是同一张表进行交叉联接,是要使用别名的,否则会报错
举个栗子
//会报错
SELECT * FROM t3,t3;
SELECT * FROM t3 CROSS JOIN t3;
//正确写法
SELECT * FROM t3 as a,t3 as b;
SELECT * FROM t3 as a CROSS JOIN t3 as b;
INNER JOIN
通过INNER JOIN用户可以根据一些过滤条件来匹配表之间的数据,在逻辑查询的三个步骤中前两个(形成笛卡尔积表,ON过滤器过滤数据),INNER JOIN没有第三步操作,也就是不会添加保留表的外部行,这是和OUTER JOIN最大的区别之一,也正因为不会添加外部行,所以过滤条件用在ON或者WHERE子句中产生的结果是没有区别的。
//找出部门为d001的经理的用户编号、姓名
//INNER是可以省略的
SELECT a.emp_no,first_name.last_name FROM employees a
[INNER] JOIN dept_manager b ON a.emp_no = b.emp_no
WHERE dept_no = ‘d001’;
//将WHERE的过滤交给ON实现也可以
SELECT a.emp_no,first_name,last_name FROM employees a
[INNER] JOIN dept_manager b ON a.emp_no = b.emp_no
AND dept_no = ‘d001’;
//另一种版本(ANSI 89)
//使用ANSI 89的话,只能使用WHERE进行过滤,如果忘记给条件的话,是很危险的,可能会返回大面积的笛卡尔积
SELECT a.emp_no,first_name,last_name FROM employees a,dept_manager b
WHERE a.emp_no = b.emp_no AND dept_no = ‘d001’;
需要注意的是,在MySQL中使用INNER JOIN是可以没有ON的,所以同样没有给过滤条件的话,也是会返回大面积的笛卡尔积,在MySQL数据库中,CROSS JOI