MySQL Advanced(2)SQLステートメントの実行シーケンスSQLの7つのJOIN図

MySQL Advanced(2)SQLステートメントの実行シーケンスSQLの7つの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での7種類のJOIN

理解に役立つ7種類のJoinVenn図:

ここに写真の説明を挿入

テストケース:

部門テーブル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内部結合

オン条件を満たすテーブルaおよびbのレコードを取得するための内部結合内部結合クエリ

SELECT
	* 
FROM
	tbl_emp a
	INNER JOIN tbl_dept b ON a.dept_id = b.id

ここに写真の説明を挿入

3.2フルジオン

mysqlは、完全接続の完全な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

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44634197/article/details/108902537