MySQL 的並集、交集和差集
MySQL的聯結(Join)以及MySQL求交集和差集
在SQL標準中規劃的(Join)聯結大致分爲下面四種:
1. 內聯結:將兩個表中存在聯結關係的字段符合聯結關係的那些記錄形成記錄集的聯結。
2. 外聯結:分爲外左聯結和外右聯結。
左聯結A、B表的意思就是將表A中的全部記錄和表B中聯結的字段與表A的聯結字段符合聯結條件的那些記錄形成的記錄集的聯結,這裏注意的是最後出來的記錄集會包括表A的全部記錄。
右聯結A、B表的結果和左聯結B、A的結果是一樣的,也就是說:
Select A.name B.name From A Left Join B On A.id=B.id
和Select A.name B.name From B Right Join A on B.id=A.id執行後的結果是一樣的。
3.全聯結:將兩個表中存在聯結關係的字段的所有記錄取出形成記錄集的聯結(這個不需要記憶,只要是查詢中提到了的表的字段都會取出,無論是否符合聯結條件,因此意義不大)。
4.無聯結:不用解釋了吧,就是沒有使用聯結功能唄,也有自聯結的說法。
1.USING (column_list):其作用是爲了方便書寫聯結的多對應關係,大部分情況下USING語句可以用ON語句來代替,如下面例子:
a LEFT JOIN b USING (c1,c2,c3),其作用相當於下面語句
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
只是用ON來代替會書寫比較麻煩而已。
mysql> desc A;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | MUL | NULL | |
| addr | varchar(5) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
mysql> desc B;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | MUL | NULL | |
| addr | varchar(5) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> select * from A;
+------+------------+------+------+
| id | name | addr | age |
+------+------------+------+------+
| 1 | kenthy | wh | 25 |
| 2 | jimmy | wh | 26 |
| 3 | kenthyzhan | sz | 26 |
| 4 | jiemzhang | sh | 24 |
+------+------------+------+------+
4 rows in set (0.00 sec)
mysql> select * from B;
+------+------------+------+------+
| id | name | addr | age |
+------+------------+------+------+
| 1 | kenthy | wh | 25 |
| 2 | jimmy | wh | 28 |
| 3 | kenthyzhan | sz | 26 |
+------+------------+------+------+
3 rows in set (0.00 sec)
交集:
mysql> select A.* from A inner join B using(name,addr,age);
+------+------------+------+------+
| id | name | addr | age |
+------+------------+------+------+
| 1 | kenthy | wh | 25 |
| 3 | kenthyzhan | sz | 26 |
+------+------------+------+------+
2 rows in set (0.00 sec)
差集:(在A中出現沒有在B中出現的,這裏的left join你可以對應的換成right join的)
mysql> select A.* from A left join B using(name,addr,age) where B.name is NULL;
+------+-----------+------+------+
| id | name | addr | age |
+------+-----------+------+------+
| 2 | jimmy | wh | 26 |
| 4 | jiemzhang | sh | 24 |
+------+-----------+------+------+
2 rows in set (0.00 sec)
差集:(在B中出現沒有在A中出現的)
mysql> select B.* from B left join A using(name,addr,age) where A.id is NULL;
+------+-------+------+------+
| id | name | addr | age |
+------+-------+------+------+
| 2 | jimmy | wh | 28 |
+------+-------+------+------+
1 row in set (0.00 sec)
部分差集:(A中的數據沒有在B中特定部分中存在的)
select A.name,A.addr,A.age from A left join (select * from B where name='kenthy') as C using(name, addr, age) where C.id is NULL;
+------------+------+------+
| name | addr | age |
+------------+------+------+
| jiemzhang | sh | 24 |
| jimmy | wh | 26 |
| kenthyzhan | sz | 26 |
+------------+------+------+
3 rows in set (0.00 sec)
通俗的講:
A left join B 的連接的記錄數與A表的記錄數同
A right join B 的連接的記錄數與B表的記錄數同
A left join B 等價B right join A
在SQL標準中規劃的(Join)聯結大致分爲下面四種:
1. 內聯結:將兩個表中存在聯結關係的字段符合聯結關係的那些記錄形成記錄集的聯結。
2. 外聯結:分爲外左聯結和外右聯結。
左聯結A、B表的意思就是將表A中的全部記錄和表B中聯結的字段與表A的聯結字段符合聯結條件的那些記錄形成的記錄集的聯結,這裏注意的是最後出來的記錄集會包括表A的全部記錄。
右聯結A、B表的結果和左聯結B、A的結果是一樣的,也就是說:
Select A.name B.name From A Left Join B On A.id=B.id
和Select A.name B.name From B Right Join A on B.id=A.id執行後的結果是一樣的。
3.全聯結:將兩個表中存在聯結關係的字段的所有記錄取出形成記錄集的聯結(這個不需要記憶,只要是查詢中提到了的表的字段都會取出,無論是否符合聯結條件,因此意義不大)。
4.無聯結:不用解釋了吧,就是沒有使用聯結功能唄,也有自聯結的說法。
1.USING (column_list):其作用是爲了方便書寫聯結的多對應關係,大部分情況下USING語句可以用ON語句來代替,如下面例子:
a LEFT JOIN b USING (c1,c2,c3),其作用相當於下面語句
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
只是用ON來代替會書寫比較麻煩而已。
mysql> desc A;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | MUL | NULL | |
| addr | varchar(5) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
mysql> desc B;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | MUL | NULL | |
| addr | varchar(5) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> select * from A;
+------+------------+------+------+
| id | name | addr | age |
+------+------------+------+------+
| 1 | kenthy | wh | 25 |
| 2 | jimmy | wh | 26 |
| 3 | kenthyzhan | sz | 26 |
| 4 | jiemzhang | sh | 24 |
+------+------------+------+------+
4 rows in set (0.00 sec)
mysql> select * from B;
+------+------------+------+------+
| id | name | addr | age |
+------+------------+------+------+
| 1 | kenthy | wh | 25 |
| 2 | jimmy | wh | 28 |
| 3 | kenthyzhan | sz | 26 |
+------+------------+------+------+
3 rows in set (0.00 sec)
交集:
mysql> select A.* from A inner join B using(name,addr,age);
+------+------------+------+------+
| id | name | addr | age |
+------+------------+------+------+
| 1 | kenthy | wh | 25 |
| 3 | kenthyzhan | sz | 26 |
+------+------------+------+------+
2 rows in set (0.00 sec)
差集:(在A中出現沒有在B中出現的,這裏的left join你可以對應的換成right join的)
mysql> select A.* from A left join B using(name,addr,age) where B.name is NULL;
+------+-----------+------+------+
| id | name | addr | age |
+------+-----------+------+------+
| 2 | jimmy | wh | 26 |
| 4 | jiemzhang | sh | 24 |
+------+-----------+------+------+
2 rows in set (0.00 sec)
差集:(在B中出現沒有在A中出現的)
mysql> select B.* from B left join A using(name,addr,age) where A.id is NULL;
+------+-------+------+------+
| id | name | addr | age |
+------+-------+------+------+
| 2 | jimmy | wh | 28 |
+------+-------+------+------+
1 row in set (0.00 sec)
部分差集:(A中的數據沒有在B中特定部分中存在的)
select A.name,A.addr,A.age from A left join (select * from B where name='kenthy') as C using(name, addr, age) where C.id is NULL;
+------------+------+------+
| name | addr | age |
+------------+------+------+
| jiemzhang | sh | 24 |
| jimmy | wh | 26 |
| kenthyzhan | sz | 26 |
+------------+------+------+
3 rows in set (0.00 sec)
通俗的講:
A left join B 的連接的記錄數與A表的記錄數同
A right join B 的連接的記錄數與B表的記錄數同
A left join B 等價B right join A
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.