一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Mysql - MySQL中三種關(guān)聯(lián)查詢方式的簡單比較

MySQL中三種關(guān)聯(lián)查詢方式的簡單比較

2020-05-12 17:21MYSQL教程網(wǎng) Mysql

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

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

?
1
2
3
SELECT * FROM film JOIN film_actor ON (film.film_id = film_actor.film_id)
SELECT * FROM film JOIN film_actor USING (film_id)
SELECT * 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)。

這種寫法被認(rè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 的條件。別在意查詢結(jié)果,查詢本身如何呢?WHERE 表達(dá)式中包含三個條件,要看出哪個條件是關(guān)聯(lián),哪個條件是過濾還是稍費點事的。不過還是相對簡單的,但如果是 5 個表,20 多個條件呢?
ANSI 風(fēng)格: ON

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

?
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 風(fēng)格: USING

有一種特殊情況,當(dāng)兩個要關(guān)聯(lián)表的字段名是一樣的,我們可以使用  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 字段在兩個表中都有,所以沒有指定確切的表都沒關(guān)系,兩個值必須一致就是。

ON 就沒那么智能,你必須指明要關(guān)聯(lián)的表和字段名。

上面兩個實際的結(jié)果是比較有趣的,當(dāng)使用 USING 時,字段只在結(jié)果中出現(xiàn)一次:
 

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

而使用 ON 時,字段就會出現(xiàn)兩次:
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
*************************** 1. row ***************************
       film_id: 96
        title: BREAKING HOME
     description: A Beautiful Display of a Secret Agent And a Monkey who must Battle a Sumo Wrestler in An Abandoned Mine Shaft
    release_year: 2006
     language_id: 1
original_language_id: NULL
   rental_duration: 4
     rental_rate: 2.99
       length: 169
  replacement_cost: 21.99
       rating: PG-13
  special_features: Trailers,Commentaries
     last_update: 2006-02-15 05:03:42
      actor_id: 17
       film_id: 96
     last_update: 2006-02-15 05:05:03

幕后

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

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

最終所有的查詢都被轉(zhuǎn)成了 Theta 風(fēng)格。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九免费精品视频 | 九九久久国产 | 日本www午夜色在线视频 | 国产传媒在线播放 | 男女男在线精品网站免费观看 | 欧美骚熟| 91在线亚洲精品一区 | 精品久久久久久久久免费影院 | 清纯漂亮女友初尝性过程 | 青青草精品 | 亚洲AV精品无码喷水直播间 | 欧美亚洲一区二区三区在线 | 免费在线影院 | 草草免费观看视频在线 | 欧美成人精品福利在线视频 | 欧美疯狂做爰xx | 日本人黄色| 国产午夜精品久久久久小说 | 日本久久热 | 男人懂得网站 | 欧美z0z0人禽交 | 国产精品毛片va一区二区三区 | 免费观看二十女人一摸是水 | 欧美国产精品久久 | 火影忍者小南裸羞羞漫画 | 亚洲上最大成网人站4438 | 成人精品一级毛片 | www.色呦呦.com| 男人的天堂在线 | 国产精品午夜剧场 | 美女逼逼喷水 | 国产品精人成福利视频 | 日日骑夜夜骑 | 精品一区二区三区免费毛片 | 91精品乱码一区二区三区 | 国产91精选学生在线观看 | 精品视频在线播放 | 五月天色网站 | 国产美女亚洲精品久久久综合 | 免费高清在线观看 | 国产播放器一区 |