sql 內連線和外連線
測試表
t1 表
mysql> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`m1` int(11) DEFAULT NULL,
`n1` char(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> select * from t1;
+------+------+
| m1 | n1 |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
3 rows in set (0.00 sec)
t2 表
mysql> show create table t2\G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`m2` int(11) DEFAULT NULL,
`n2` char(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> select * from t2;
+------+------+
| m2 | n2 |
+------+------+
| 2 | b |
| 3 | c |
| 4 | d |
+------+------+
3 rows in set (0.00 sec)
inner join
mysql> select * from t1 inner join t2 on t1.m1 = t2.m2;
+------+------+------+------+
| m1 | n1 | m2 | n2 |
+------+------+------+------+
| 2 | b | 2 | b |
| 3 | c | 3 | c |
+------+------+------+------+
2 rows in set (0.00 sec)
可以看到對於 t1 表來說,m1 = 1, n1 = 1 這條記錄並沒有出現在結果集裡。但是如果一定要出現在結果集裡,怎麼辦?用
外連線
。
left outer join
mysql> select * from t1 left join t2 on t1.m1 = t2.m2;
+------+------+------+------+
| m1 | n1 | m2 | n2 |
+------+------+------+------+
| 2 | b | 2 | b |
| 3 | c | 3 | c |
| 1 | a | NULL | NULL |
+------+------+------+------+
3 rows in set (0.00 sec)
外連線轉化為內連線
在外連線查詢中,指定的
WHERE
子句中包含被驅動表中的列不為 NULL 值的條件稱之為空值拒絕
(英文名:reject-NULL)。
被連線表中直接指定某一列不為NULL
mysql> select * from t1 left join t2 on t1.m1 = t2.m2 where t2.m2 is not null;
+------+------+------+------+
| m1 | n1 | m2 | n2 |
+------+------+------+------+
| 2 | b | 2 | b |
| 3 | c | 3 | c |
+------+------+------+------+
2 rows in set (0.00 sec)
指定 t2.m2 不是 null。此時的 left join 和 inner join 完全一樣。
mysql> select * from t1 left join t2 on t1.m1 = t2.m2 where t2.n2 is not null;
+------+------+------+------+
| m1 | n1 | m2 | n2 |
+------+------+------+------+
| 2 | b | 2 | b |
| 3 | c | 3 | c |
+------+------+------+------+
2 rows in set (0.00 sec)
被連線表中間接指定某一列不為 NULL
- left join + where 語句指定不為 NULL
mysql> select * from t1 left join t2 on t1.m1 = t2.m2 where t2.n2 = 'b';
+------+------+------+------+
| m1 | n1 | m2 | n2 |
+------+------+------+------+
| 2 | b | 2 | b |
+------+------+------+------+
1 row in set (0.00 sec)
- 此時可以轉化為 inner join
mysql> select * from t1 inner join t2 on t1.m1 = t2.m2 where t2.n2 = 'b';
+------+------+------+------+
| m1 | n1 | m2 | n2 |
+------+------+------+------+
| 2 | b | 2 | b |
+------+------+------+------+
1 row in set (0.00 sec)
Reference
相關文章
- 【SQL】Oracle的內連線、左外連線、右外連線及全外連線SQLOracle
- SQL的四種連線:內連線 左外連線 右外連線 全連線SQL
- sql內連結,外連線SQL
- SQL Server中內連線和外連線的區別SQLServer
- 內連線、外連線
- 深入理解SQL的四種連線-左外連線、右外連線、內連線、全連線SQL
- 你真的會玩SQL嗎?內連線、外連線SQL
- Oracle內連線、外連線、右外連線、全外連線小總結Oracle
- sql和hql中join語句區別,以及hibernate中內連線,迫切內連線,左外連線,迫切左外連線,右外連線的區別(合集)...SQL
- oracle sql內連線_左(右)連線_全外連線_幾種寫法OracleSQL
- 內連線、外連線總結
- SQL SERVER 自連線、外連線SQLServer
- 例項解析外連線 內連線 自連線 全連線
- MYSQL語法:左連線、右連線、內連線、全外連線MySql
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- T-SQL學習中–內聯接,外連線,交叉連線SQL
- Oracle 表連線方式詳解(外連結、內連線、自連線)Oracle
- 【SQL】一條外連線和內連線混合使用的SQL語句搞定同事一迷茫需求SQL
- 資料庫外連線,自然連線,內連線,條件連線,等值連線關係及詳解資料庫
- 內連線、左連線、右連線
- 外連線轉換為內連線的情況
- 轉載:內連線與外連線的區別
- 深入淺出SQL之左連線、右連線和全連線SQL
- SQL 改寫系列十:半連線轉內連線SQL
- SQL中的左連線和右連線SQL
- SQL的外連線對內部表的限制SQL
- 3.DQL資料查詢語言(內連線,外連線,自連線)
- Oracle左外連線、右外連線、完全外連線以及(+)號用法Oracle
- Oracle 左外連線、右外連線、全外連線小總結Oracle
- 行的儲存(塊內連線與塊外連線)
- Mysql——內外連線,事物,索引MySql索引
- Winodws同時連線內網和外網內網
- MYSQL學習筆記23: 多表查詢(自連線內連線+左右外連線)MySql筆記
- 【SQL】表連線 --半連線SQL
- 外連線與連線順序
- 內聯,左外聯,右外聯,全連線,交叉連線 的區別
- SQL改寫系列九:外連線轉內連線的常見場景與錯誤SQL
- Oracle 內外連線 join 總結Oracle