13.2.8.11.把子查詢作為用于早期MySQL版本的聯合進行改寫
13.2.8.11. 把子查詢作為用于早期MySQL版本的聯合進行改寫
在較早版本的MySQL中(早于MySQL 4.1),只支持INSERT...SELECT和REPLACE...SELECT...格式的帶嵌套的查詢。雖然在MySQL
5.1中沒有這種情況,但有時,仍然有其它的方法測試一組值的從屬關系。并且,在有些情況下,不僅可以在沒有子查詢時對查詢進行改寫,而且有時使用這些方法比使用子查詢效率更高。這些方法之一是IN()結構:
舉例說明,本查詢:
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2);
可以被改寫為:
SELECT DISTINCT t1.* FROM t1, t2 WHERE t1.id=t2.id;
以下查詢:
SELECT * FROM t1 WHERE id NOT IN (SELECT id FROM t2);
SELECT * FROM t1 WHERE NOT EXISTS (SELECT id FROM t2 WHERE t1.id=t2.id);
也可以使用IN()進行改寫:
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL;
LEFT [OUTER] JOIN可以比對應的子查詢更快,因為服務器可能對其進行更好的優化——這一點對于單獨的MySQL服務器并不明確。在SQL-92之前,不存在外部聯合,因此在做某些事情時,子查詢是唯一的方法。現在,MySQL服務器和其它許多先進的數據庫系統都能提供多種的外部聯合類型。
MySQL支持multiple-table DELETE語句,該語句可以被用于高效地刪除行。刪除時依據來自一個表或同時來自多個表的信息。同時也支持Multiple-table UPDATE語句。