真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL三種關(guān)聯(lián)查詢方式是什么

這篇文章主要講解了“MySQL三種關(guān)聯(lián)查詢方式是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“MySQL三種關(guān)聯(lián)查詢方式是什么”吧!

創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、鐘山網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站成都做商城網(wǎng)站、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為鐘山等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

看看下面三個關(guān)聯(lián)查詢的 SQL 語句有何區(qū)別?

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

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

Theta 風(fēng)格

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

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

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

ANSI 風(fēng)格: ON

使用 JOIN... ON可以將表關(guān)聯(lián)的條件和記錄過濾條件分開,將上面的語句重寫后的結(jié)果如下:

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

看起來清晰許多。
注意: ON 語句中的括號不是必須的,我個人喜歡這樣寫而已。

ANSI 風(fēng)格: USING

有一種特殊情況,當兩個要關(guān)聯(lián)表的字段名是一樣的,我們可以使用  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 字段在兩個表中都有,所以沒有指定確切的表都沒關(guān)系,兩個值必須一致就是。
ON 就沒那么智能,你必須指明要關(guān)聯(lián)的表和字段名。
上面兩個實際的結(jié)果是比較有趣的,當使用 USING 時,字段只在結(jié)果中出現(xiàn)一次:

01SELECT * 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
08original_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)兩次:

01SELECT * 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
08original_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 我們可以看到:

01EXPLAIN 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...
042 rows in set, 1 warning (0.00 sec)
05  
06root@mysql-5.1.51> SHOW WARNINGS\G
07*************************** 1. row ***************************
08   Level: Note
09    Code: 1003
10Message: 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                )

最終所有的查詢都被轉(zhuǎn)成了 Theta 風(fēng)格。
譯者:就是說這三種方式除了寫法不同外,沒什么區(qū)別。

感謝各位的閱讀,以上就是“MySQL三種關(guān)聯(lián)查詢方式是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對MySQL三種關(guān)聯(lián)查詢方式是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!


網(wǎng)站名稱:MySQL三種關(guān)聯(lián)查詢方式是什么
文章網(wǎng)址:http://weahome.cn/article/jopoih.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部