-- IN:匹配列表中任一值
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);
-- NOT IN:排除列表中所有值
SELECT column_name(s)
FROM table_name
WHERE column_name NOT IN (value1, value2, ...);
建立 Topic 表並插入 16 筆測試資料(含 Category 欄位)。
-- 查詢 Category 為 'Blues' 或 'Jazz' 的商品
SELECT Name, Category, InStock
FROM Topic
WHERE Category IN ('Blues', 'Jazz')
ORDER BY Name;
-- 結果
+---------+----------+---------+
| Name | Category | InStock |
+---------+----------+---------+
| C Sharp | Jazz | 17 |
| Php | Jazz | 32 |
| Python | Blues | 2 |
+---------+----------+---------+
場景:找出「沒有被姓 'MySQL' 的作者撰寫過的書」對應的版權年份。
CREATE TABLE Books (
BookID SMALLINT PRIMARY KEY,
BookTitle VARCHAR(60),
Copyright YEAR
) ENGINE=InnoDB;
CREATE TABLE Authors (
AuthID SMALLINT PRIMARY KEY,
AuthFN VARCHAR(20), AuthMN VARCHAR(20), AuthLN VARCHAR(20)
) ENGINE=InnoDB;
CREATE TABLE AuthorBook (
AuthID SMALLINT, BookID SMALLINT,
PRIMARY KEY (AuthID, BookID),
FOREIGN KEY (AuthID) REFERENCES Authors(AuthID),
FOREIGN KEY (BookID) REFERENCES Books(BookID)
) ENGINE=InnoDB;
SELECT BookTitle, Copyright
FROM Books
WHERE Copyright NOT IN (
SELECT b.Copyright
FROM Books AS b
JOIN AuthorBook AS ab ON b.BookID = ab.BookID
JOIN Authors AS a ON ab.AuthID = a.AuthID
WHERE a.AuthLN = 'MySQL'
)
ORDER BY BookTitle;
子查詢先找出姓 'MySQL' 作者關聯的所有版權年份,外層查詢排除這些年份。最終返回 8 筆資料,包含 Java、JavaScript、MySQL、Oracle 等書籍。
JOIN。NOT EXISTS 或加上 IS NOT NULL 條件。IN (subquery) 自動優化為 SEMI JOIN,效能大幅提升。IN 可走 range 掃描,速度極快。IN 替代多個 OR,可讀性與效能皆優。IN (SELECT DISTINCT ...) 避免重複值干擾優化器。INSERT ... VALUES (...) ... 寫入臨時表再 JOIN。