国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL中三種關聯查詢方式的簡單比較

2024-07-24 13:07:33
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了MySQL中三種關聯查詢方式的簡單比較,即ON和USING還有傳統的FROM...WHERE...,需要的朋友可以參考下

看看下面三個關聯查詢的 SQL 語句有何區別?

 

 
  1. SELECT * FROM film JOIN film_actor ON (film.film_id = film_actor.film_id) 
  2. SELECT * FROM film JOIN film_actor USING (film_id) 
  3. SELECT * FROM film, film_actor WHERE film.film_id = film_actor.film_id 

最大的不同更多是語法糖,但有一些有意思的東西值得關注。

為了方便區別,我們將前兩種寫法稱作是 ANSI 風格,第三種稱為 Theta 風格。

Theta 風格

在 FROM 短語中列出了關聯的表名,而 WHERE 短語則指定如何關聯。

這種寫法被認為是古老的方式,有些時候比較難以理解,請看下面查詢:

 

 
  1. SELECT * FROM film, film_actor WHERE film.film_id = film_actor.film_id AND actor_id = 17 AND film.length > 120 

上述查詢列出片長超過 120 分鐘的電影,其中包括演員編號是 17 的條件。別在意查詢結果,查詢本身如何呢?WHERE 表達式中包含三個條件,要看出哪個條件是關聯,哪個條件是過濾還是稍費點事的。不過還是相對簡單的,但如果是 5 個表,20 多個條件呢?

ANSI 風格: ON

使用 JOIN ... ON 可以將表關聯的條件和記錄過濾條件分開,將上面的語句重寫后的結果如下:

 

 
  1. SELECT * FROM film JOIN film_actor ON (film.film_id = film_actor.film_id) WHERE actor_id = 17 AND film.length > 120 

看起來清晰許多。

注意: ON 語句中的括號不是必須的,我個人喜歡這樣寫而已。

ANSI 風格: USING

有一種特殊情況,當兩個要關聯表的字段名是一樣的,我們可以使用 USING ,可減少 SQL 語句的長度:

 

 
  1. SELECT * FROM film JOIN film_actor USING (film_id) WHERE actor_id = 17 AND film.length > 120 

這個時候括號就是必須的了。這種寫法很好,輸入更少的單詞,查詢的性能也非常棒,但還需要注意一些差異。

USING 和 ON

下面語句是可行的:

 

 
  1. SELECT film.title, film_id FROM film JOIN film_actor USING (film_id) WHERE actor_id = 17 AND film.length > 120; 

但下面這個就不行:

 

 
  1. SELECT film.title, film_id FROM film JOIN film_actor ON (film.film_id = film_actor.film_id) WHERE actor_id = 17 AND film.length > 120;ERROR 1052 (23000): Column 'film_id' in field list is ambiguous 

因為 USING "知道" film_id 字段在兩個表中都有,所以沒有指定確切的表都沒關系,兩個值必須一致就是。

ON 就沒那么智能,你必須指明要關聯的表和字段名。

上面兩個實際的結果是比較有趣的,當使用 USING 時,字段只在結果中出現一次:

 

 
  1. SELECT * FROM film JOIN film_actor USING (film_id) WHERE actor_id = 17 AND film.length > 120 LIMIT 1/G 
  2. *************************** 1. row *************************** 
  3. film_id: 96 
  4. title: BREAKING HOME 
  5. description: A Beautiful Display of a Secret Agent And a Monkey who must Battle a Sumo Wrestler in An Abandoned Mine Shaft 
  6. release_year: 2006 
  7. language_id: 1 
  8. original_language_id: NULL 
  9. rental_duration: 4 
  10. rental_rate: 2.99 
  11. length: 169 
  12. replacement_cost: 21.99 
  13. rating: PG-13 
  14. special_features: Trailers,Commentaries 
  15. last_update: 2006-02-15 05:03:42 
  16. actor_id: 17 
  17. last_update: 2006-02-15 05:05:03 

而使用 ON 時,字段就會出現兩次:

 

 
  1. SELECT * FROM film JOIN film_actor ON film.film_id = film_actor.film_id WHERE actor_id = 17 AND film.length > 120 LIMIT 1/G 
  2. *************************** 1. row *************************** 
  3. film_id: 96 
  4. title: BREAKING HOME 
  5. description: A Beautiful Display of a Secret Agent And a Monkey who must Battle a Sumo Wrestler in An Abandoned Mine Shaft 
  6. release_year: 2006 
  7. language_id: 1 
  8. original_language_id: NULL 
  9. rental_duration: 4 
  10. rental_rate: 2.99 
  11. length: 169 
  12. replacement_cost: 21.99 
  13. rating: PG-13 
  14. special_features: Trailers,Commentaries 
  15. last_update: 2006-02-15 05:03:42 
  16. actor_id: 17 
  17. film_id: 96 
  18. last_update: 2006-02-15 05:05:03 

幕后

MySQL 對兩者的處理方式是相同的,使用 EXPLAIN EXTENDED 我們可以看到:

 

 
  1. EXPLAIN EXTENDED SELECT film.title, film_id FROM film JOIN film_actor USING (film_id) WHERE actor_id = 17 AND film.length > 120/G 
  2. *************************** 1. row *************************** 
  3. ... 
  4. 2 rows in set, 1 warning (0.00 sec) 
  5.  
  6. root@mysql-5.1.51> SHOW WARNINGS/G 
  7. *************************** 1. row *************************** 
  8. Level: Note 
  9. Code: 1003 
  10. Message: select `sakila`.`film`.`title` AS `title`,`sakila`.`film`.`film_id` AS `film_id` 
  11. from `sakila`.`film` join `sakila`.`film_actor` 
  12. where ( 
  13. (`sakila`.`film`.`film_id` = `sakila`.`film_actor`.`film_id`) 
  14. and (`sakila`.`film_actor`.`actor_id` = 17) 
  15. and (`sakila`.`film`.`length` > 120) 

最終所有的查詢都被轉成了 Theta 風格。

譯者:就是說這三種方式除了寫法不同外,沒什么區別。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 酉阳| 望都县| 敦煌市| 洛扎县| 博客| 台中县| 甘泉县| 庆阳市| 那坡县| 永善县| 甘泉县| 赣州市| 宿松县| 盈江县| 台南县| 兴国县| 蓝山县| 股票| 怀化市| 澎湖县| 晋州市| 吉安市| 土默特左旗| 梅州市| 彭水| 萨迦县| 东莞市| 麻栗坡县| 广宗县| 莱州市| 乳山市| 武鸣县| 华安县| 康平县| 泽州县| 黔江区| 博客| 青铜峡市| 酒泉市| 陆良县| 通江县|