久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL三種關聯查詢方式是什么

165次閱讀
沒有評論

共計 3431 個字符,預計需要花費 9 分鐘才能閱讀完成。

這篇文章主要講解了“MySQL 三種關聯查詢方式是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“MySQL 三種關聯查詢方式是什么”吧!

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

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

最大的不同更多是語法糖,但有一些有意思的東西值得關注。
為了方便區別,我們將前兩種寫法稱作是 ANSI 風格,第三種稱為 Theta 風格。

Theta 風格

在 FROM 短語中列出了關聯的表名,而  WHERE 短語則指定如何關聯。
這種寫法被認為是古老的方式,有些時候比較難以理解,請看下面查詢:

1SELECT * 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 可以將表關聯的條件和記錄過濾條件分開,將上面的語句重寫后的結果如下:

1SELECT * 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 語句的長度:

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

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

USING 和 ON

下面語句是可行的:

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

但下面這個就不行:

1SELECT 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  時,字段只在結果中出現一次:

01SELECT * FROM film JOIN film_actor USING (film_id) WHERE actor_id = 17 AND film.length 120 LIMIT 1\G02*************************** 1. row ***************************03
 film_id: 9604
 title: BREAKING HOME05
 description: A Beautiful Display of a Secret Agent And a Monkey who must Battle a Sumo Wrestler in An Abandoned Mine Shaft06
 release_year: 200607
 language_id: 108original_language_id: NULL09
 rental_duration: 410
 rental_rate: 2.9911
 length: 16912
 replacement_cost: 21.9913
 rating: PG-1314
 special_features: Trailers,Commentaries15
 last_update: 2006-02-15 05:03:4216
 actor_id: 1717
 last_update: 2006-02-15 05:05:03

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

01SELECT * FROM film JOIN film_actor ON film.film_id = film_actor.film_id WHERE actor_id = 17 AND film.length 120 LIMIT 1\G02*************************** 1. row ***************************03
 film_id: 9604
 title: BREAKING HOME05
 description: A Beautiful Display of a Secret Agent And a Monkey who must Battle a Sumo Wrestler in An Abandoned Mine Shaft06
 release_year: 200607
 language_id: 108original_language_id: NULL09
 rental_duration: 410
 rental_rate: 2.9911
 length: 16912
 replacement_cost: 21.9913
 rating: PG-1314
 special_features: Trailers,Commentaries15
 last_update: 2006-02-15 05:03:4216
 actor_id: 1717
 film_id: 9618
 last_update: 2006-02-15 05:05:03
幕后

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

01EXPLAIN EXTENDED SELECT film.title, film_id FROM film JOIN film_actor USING (film_id) WHERE actor_id = 17 AND film.length 120\G02*************************** 1. row ***************************03…042 rows in set, 1 warning (0.00 sec)05
 06root@mysql-5.1.51 SHOW WARNINGS\G07*************************** 1. row ***************************08
 Level: Note09
 Code: 100310Message: 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)16
 )

最終所有的查詢都被轉成了  Theta 風格。
譯者:就是說這三種方式除了寫法不同外,沒什么區別。

感謝各位的閱讀,以上就是“MySQL 三種關聯查詢方式是什么”的內容了,經過本文的學習后,相信大家對 MySQL 三種關聯查詢方式是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-15發表,共計3431字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 龙岩市| 基隆市| 固镇县| 汉中市| 阳春市| 济阳县| 通江县| 靖边县| 莲花县| 东明县| 南阳市| 资溪县| 泉州市| 青浦区| 吉水县| 东阳市| 竹溪县| 石狮市| 库伦旗| 西昌市| 陇川县| 永春县| 平塘县| 咸宁市| 廊坊市| 西安市| 常德市| 岚皋县| 永清县| 闸北区| 青川县| 广西| 沂水县| 独山县| 简阳市| 德格县| 礼泉县| 英德市| 宿松县| 康保县| 通道|