MySQL 高级(二)一条SQL语句的执行顺序 SQL中的七种JOIN图解
1. SQL的执行顺序
人的书写思路:
1 SELECT DISTINCT
<select_list>
2 FROM
<left_table> <join_type>
3 JOIN <right_table> ON <join_condition>
4 WHERE
<where_condition>
5 GROUP BY
<group_by_list>
6 HAVING
<having_condition>
7 ORDER BY
<order_by_condition>
8 LIMIT <limit_number>
MySQL的解析思路:
1 FROM <left_table>
2 ON <join_condition>
3 <join_type> JOIN <right_table>
4 WHERE <where_condition>
5 GROUP BY <group_by_list>
6 HAVING <having_condition>
7 SELECT
8 DISTINCT <select_list>
9 ORDER BY <order_by_condition>
10 LIMIT <limit_number>
总结:SQL的执行顺序
3.SQL中的七种JOIN
七种Join的维恩图帮助理解:
测试用例:
部门表tbl_dept
CREATE TABLE tbl_dept (
id INT4 NOT NULL auto_increment,
dept_name VARCHAR ( 255 ) DEFAULT NULL,
ioc_add VARCHAR ( 255 ) DEFAULT NULL,
PRIMARY KEY ( id )
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
员工表tbl_emp
CREATE TABLE tbl_emp (
id INT4 NOT NULL auto_increment,
`name` VARCHAR ( 255 ) DEFAULT NULL,
dept_id INT4 DEFAULT NULL,
PRIMARY KEY ( id ),
KEY fk_dept_id ( dept_id )
#CONSTRAINT fk_dept_id FOREIGN KEY(dept_id) REFERENCES tbl_dept(id)
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
测试数据
INSERT INTO tbl_dept ( dept_name, ioc_add ) VALUES ( 'RD', 11 );
INSERT INTO tbl_dept ( dept_name, ioc_add ) VALUES ( 'HR', 12 );
INSERT INTO tbl_dept ( dept_name, ioc_add ) VALUES ( 'MK', 13 );
INSERT INTO tbl_dept ( dept_name, ioc_add ) VALUES ( 'MIS', 14 );
INSERT INTO tbl_dept ( dept_name, ioc_add ) VALUES ( 'FD', 15 );
INSERT INTO tbl_emp ( name, dept_id ) VALUES ( 'e1', 1 );
INSERT INTO tbl_emp ( name, dept_id ) VALUES ( 'e2', 1 );
INSERT INTO tbl_emp ( name, dept_id ) VALUES ( 'e3', 1 );
INSERT INTO tbl_emp ( name, dept_id ) VALUES ( 'e4', 2 );
INSERT INTO tbl_emp ( name, dept_id ) VALUES ( 'e5', 2 );
INSERT INTO tbl_emp ( name, dept_id ) VALUES ( 'e6', 3 );
INSERT INTO tbl_emp ( name, dept_id ) VALUES ( 'e7', 4 );
INSERT INTO tbl_emp ( name, dept_id ) VALUES ( 'e8', 51 );
3.1 内连接 inner join
内连接 inner join 查询获取a和b表中满足on条件的记录
SELECT
*
FROM
tbl_emp a
INNER JOIN tbl_dept b ON a.dept_id = b.id
3.2 全连接 full jion
mysql 不支持全连接full jion 写法,会报sql语句错误
解决方法:可以通过unoin关键字,将左连接和右连接合并并去重实现
SELECT
*
FROM
tbl_emp a
LEFT JOIN tbl_dept b ON a.dept_id = b.id
UNION
SELECT
*
FROM
tbl_emp a
RIGHT JOIN tbl_dept b ON a.dept_id = b.id
3.3 全外连接
SELECT
*
FROM
tbl_emp a
LEFT JOIN tbl_dept b ON a.dept_id = b.id
WHERE
b.id IS NULL
UNION
SELECT
*
FROM
tbl_emp a
RIGHT JOIN tbl_dept b ON a.dept_id = b.id
WHERE
a.dept_id IS NULL