Contents

SQL子查詢筆記(相關子查詢/非相關子查詢)

Contents

之前用子查詢第二層,竟然抓不到外層的欄位
已經找到 終於知道為什麼子查詢沒辦法抓取外面的表 | 程式狂想筆記
有時候跟本不知道為什麼?後來問公司的前軰,他說第二層就抓不到最外一層
但這種強制記這種觀念感覺不是很好,今天 Google 查一下原因
在這邊整理一下 XD

今天多層次子查詢的 sql 執行順序的問題-wj_zizi-ITPUB 博客你真的会玩 SQL 吗?无处不在的子查询 - 文章 - 伯乐在线
看到子查詢有分兩類

  1. 相關子查詢
  2. 非相關子查詢

這兩個其實不難分,不要被兩個專有名詞嚇到
先講非相關子查詢,簡單講就是子查詢跟外面 SQL 查詢內容沒有相關
非相關子查詢只會跑一次,所以效能上會非常快
執行順序也比外層先,所以這也是為什麼非相關子查詢沒法取得外層欄位的原因
範例如下,以下子查詢只會查一次

1
2
3
4
5
SELECT *
FROM xxxx
WHERE class = (SELECT max(cost)
FROM bbbb
)

相關子查詢就反知,比較吃效能,每一行都會執行 loop
先不談slides/SQL_reporting.pdf at master · TritonHo/slides裡面有介紹有些 DB 會自動做 join 動作
這個我們比較常用到

1
2
3
4
5
6
SELECT
FROM xxxx a
WHERE cost > (SELECT avg(cost)
FROM bbbb
where class = a.class
)
1
2
3
4
5
6
SELECT *
  FROM a1
WHERE EXISTS
(SELECT 'X'
          FROM (SELECT w2.corp_id FROM a1 w2 WHERE w2.period_id <= a1.period_id) u
         WHERE u.corp_id = a1.corp_id);

第二层子查询居然不认最外层表中的列 - Oracle 开发 - ITPUB 论坛-中国最专业的 IT 技术社区看到有不能跑的 example
目前猜測 form 是非相關子查詢,我猜因為 from 會先執行,所以抓不到外層

sql 语法相关子查询与非相关子查询-流浪的野狼-ITPUB 博客看到一個標量子查詢(相對於多值子查詢)名稱

1
2
select OrderId From Orders where EmployeeId IN
(select EmployeeId From employees where lastName like 'Da%')

將’Davolio’改為’D%‘時,這個時候子查詢中返回結果為 2 行,等號右邊此時為多值,查詢失敗.將’=‘改為 in 謂詞.查詢才能通過.
employees 表中無 lastname=‘jason’,外部查詢將返回 null.

結論

SQL 有太多東西要學了 XD
這些離清楚之後比較不容易採到雷
要學的東西太多了 orz

###20171226 無聊寫的 SQL

1
2
3
4
5
6
7
8
9
SELECT a.id, a.rev, a.content
FROM `docs` a
WHERE a.id  IN  (
    SELECT max(id)
    FROM `docs` b
    WHERE  b.id IN (SELECT id
                    FROM `docs` c
                    WHERE c.id=a.id)
) ;

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) - 掃文資訊

MySql 学习(三) —— 子查询(where、from、exists) 及 连接查询(left join、right join、inner join、union join) - bojiangzhou - 博客园

sql 语法相关子查询与非相关子查询-流浪的野狼-ITPUB 博客