您好,登錄后才能下訂單哦!
這篇文章主要講解了“MySQL三種關聯(lián)查詢方式是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MySQL三種關聯(lián)查詢方式是什么”吧!
看看下面三個關聯(lián)查詢的 SQL 語句有何區(qū)別?
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 |
最大的不同更多是語法糖,但有一些有意思的東西值得關注。
為了方便區(qū)別,我們將前兩種寫法稱作是 ANSI 風格,第三種稱為 Theta 風格。
在 FROM 短語中列出了關聯(lián)的表名,而 WHERE 短語則指定如何關聯(lián)。
這種寫法被認為是古老的方式,有些時候比較難以理解,請看下面查詢:
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 表達式中包含三個條件,要看出哪個條件是關聯(lián),哪個條件是過濾還是稍費點事的。不過還是相對簡單的,但如果是 5 個表,20 多個條件呢?
使用 JOIN ... ON 可以將表關聯(lián)的條件和記錄過濾條件分開,將上面的語句重寫后的結果如下:
1 | SELECT * FROM film JOIN film_actor ON (film.film_id = film_actor.film_id) WHERE actor_id = 17 AND film.length > 120 |
看起來清晰許多。
注意: ON 語句中的括號不是必須的,我個人喜歡這樣寫而已。
有一種特殊情況,當兩個要關聯(lián)表的字段名是一樣的,我們可以使用 USING ,可減少 SQL 語句的長度:
1 | SELECT * 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 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 就沒那么智能,你必須指明要關聯(lián)的表和字段名。
上面兩個實際的結果是比較有趣的,當使用 USING 時,字段只在結果中出現(xiàn)一次:
01 | SELECT * FROM film JOIN film_actor USING (film_id) WHERE actor_id = 17 AND film.length > 120 LIMIT 1\G |
02 | *************************** 1. row *************************** |
03 |
film_id: 96 |
04 |
title: BREAKING HOME |
05 |
description: A Beautiful Display of a Secret Agent And a Monkey who must Battle a Sumo Wrestler in An Abandoned Mine Shaft |
06 |
release_year: 2006 |
07 |
language_id: 1 |
08 | original_language_id: NULL |
09 |
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 時,字段就會出現(xiàn)兩次:
01 | 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 |
02 | *************************** 1. row *************************** |
03 |
film_id: 96 |
04 |
title: BREAKING HOME |
05 |
description: A Beautiful Display of a Secret Agent And a Monkey who must Battle a Sumo Wrestler in An Abandoned Mine Shaft |
06 |
release_year: 2006 |
07 |
language_id: 1 |
08 | original_language_id: NULL |
09 |
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 我們可以看到:
01 | EXPLAIN EXTENDED SELECT film.title, film_id FROM film JOIN film_actor USING (film_id) WHERE actor_id = 17 AND film.length > 120\G |
02 | *************************** 1. row *************************** |
03 | ... |
04 | 2 rows in set , 1 warning (0.00 sec) |
05 |
06 | root@mysql-5.1.51> SHOW WARNINGS\G |
07 | *************************** 1. row *************************** |
08 |
Level : Note |
09 |
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) |
16 |
) |
最終所有的查詢都被轉成了 Theta 風格。
譯者:就是說這三種方式除了寫法不同外,沒什么區(qū)別。
感謝各位的閱讀,以上就是“MySQL三種關聯(lián)查詢方式是什么”的內容了,經(jīng)過本文的學習后,相信大家對MySQL三種關聯(lián)查詢方式是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。