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
相關文章
- MYSQL語法:左連線、右連線、內連線、全外連線MySql
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- SQL 改寫系列十:半連線轉內連線SQL
- 內連線、左連線、右連線
- 3.DQL資料查詢語言(內連線,外連線,自連線)
- Oracle左外連線、右外連線、完全外連線以及(+)號用法Oracle
- Winodws同時連線內網和外網內網
- Mysql——內外連線,事物,索引MySql索引
- SQL改寫系列九:外連線轉內連線的常見場景與錯誤SQL
- MYSQL學習筆記23: 多表查詢(自連線內連線+左右外連線)MySql筆記
- 內聯,左外聯,右外聯,全連線,交叉連線 的區別
- SQL改寫系列九:外連線轉內連線的常見場景與錯誤-2SQL
- 長連線和短連線
- Socket連線和Http連線HTTP
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- 內外網同時連線解決
- python 怎麼連線 sql server,不是連線 mysqlPythonServerMySql
- SQL連線查詢SQL
- http的長連線和短連線HTTP
- 長連線和短連線的使用
- 連線池和連線數詳解
- 關於外連線和where條件
- Golang SQL連線池梳理GolangSQL
- SQL的連線型別SQL型別
- SQL Server如何判斷哪些會話/連線是長連線?SQLServer會話
- JAVA之長連線、短連線和心跳包Java
- scrapy軟連線失效和pip軟連線失效
- HTTP非持續連線和持續連線HTTP
- sql 連線查詢例項(left join)三表連線查詢SQL
- NavicatPremium 連線SQL Server 、MySQL等REMServerMySql
- 使用SSMS連線和查詢 SQL Server 例項SSMSQLServer
- 12、Swoole 中 TCP、UDP 和長連線、短連線TCPUDP
- 1.6.3.3. 本地連線和安全的遠端連線
- LAN連線和WAN連線有什麼區別?
- PostgreSQL優化案例之 反連線與外連線等價改寫SQL優化
- 菜鳥學網路之 —— 長連線和短連線
- Windows 下 Laravel 7.0 連線 sql serverWindowsLaravelSQLServer
- SQL中的四種連線方式SQL