之前用子查詢第二層,竟然抓不到外層的欄位
已經找到 終於知道為什麼子查詢沒辦法抓取外面的表 | 程式狂想筆記
有時候跟本不知道為什麼?後來問公司的前軰,他說第二層就抓不到最外一層
但這種強制記這種觀念感覺不是很好,今天 Google 查一下原因
在這邊整理一下 XD
今天多層次子查詢的 sql 執行順序的問題-wj_zizi-ITPUB 博客和你真的会玩 SQL 吗?无处不在的子查询 - 文章 - 伯乐在线
看到子查詢有分兩類
- 相關子查詢
- 非相關子查詢
這兩個其實不難分,不要被兩個專有名詞嚇到
先講非相關子查詢,簡單講就是子查詢跟外面 SQL 查詢內容沒有相關
非相關子查詢只會跑一次,所以效能上會非常快
執行順序也比外層先,所以這也是為什麼非相關子查詢沒法取得外層欄位的原因
範例如下,以下子查詢只會查一次
1 | SELECT * |
相關子查詢就反知,比較吃效能,每一行都會執行 loop
先不談slides/SQL_reporting.pdf at master · TritonHo/slides裡面有介紹有些 DB 會自動做 join 動作
這個我們比較常用到
1 | SELECT* |
1 | SELECT * |
第二层子查询居然不认最外层表中的列 - Oracle 开发 - ITPUB 论坛-中国最专业的 IT 技术社区看到有不能跑的 example
目前猜測 form 是非相關子查詢,我猜因為 from 會先執行,所以抓不到外層
sql 语法相关子查询与非相关子查询-流浪的野狼-ITPUB 博客看到一個標量子查詢(相對於多值子查詢)名稱
1 | select OrderId From Orders where EmployeeId IN |
將’Davolio’改為’D%’時,這個時候子查詢中返回結果為 2 行,等號右邊此時為多值,查詢失敗.將’=’改為 in 謂詞.查詢才能通過.
employees 表中無 lastname=’jason’,外部查詢將返回 null.
結論
SQL 有太多東西要學了 XD
這些離清楚之後比較不容易採到雷
要學的東西太多了 orz
###20171226 無聊寫的 SQL
1 | SELECT a.id, a.rev, a.content |
http://sqlfiddle.com/#!9/a6c585/30596
原本以為只會有一筆
是 From a table 先執行 而 a 有四筆
子查詢關連 a.id
所以結果是 4 筆沒錯
做 max 也會沒有意義
參考來源
你真的会玩 SQL 吗?无处不在的子查询 - 文章 - 伯乐在线
对象-关系数据库管理系统原理与实现 - 李战怀, 李红燕, 徐秋元 - Google 圖書
你真的会玩 SQL 吗?无处不在的子查询 - 文章 - 伯乐在线
多層次子查詢的 sql 執行順序的問題-wj_zizi-ITPUB 博客
第二层子查询居然不认最外层表中的列 - Oracle 开发 - ITPUB 论坛-中国最专业的 IT 技术社区
[SQL ] 兩層以上子查詢辨認 Table 別名 - 看板 Database - 批踢踢實業坊
MySql 學習(三) —— 子查詢(where、from、exists) 及 連線查詢(left join、right join、inner join、union join) - 掃文資訊