激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

香港云服务器
服務器之家 - 數據庫 - Mysql - MySQL中三種關聯查詢方式的簡單比較

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

2020-05-12 17:21MYSQL教程網 Mysql

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

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

?
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

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

為了方便區別,我們將前兩種寫法稱作是 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
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 時,字段就會出現兩次:
 

?
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)
 
root@mysql-5.1.51> 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)
        )

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

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

延伸 · 閱讀

精彩推薦
514
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 午夜精品成人 | 日本精品婷婷久久爽一下 | 欧美性videofree精品 | 黄色片在线播放 | 伊久在线 | 一区二区三区日韩电影 | 99seav| 久草视频2 | 国产亚洲精品久久久久久网站 | 欧美国产免费 | 国产乱淫a∨片免费视频 | 性生大片免费观看一片黄动漫 | 午夜精品福利视频 | 在线观看国产免费视频 | 久久久久久久久久久av | 国产69精品久久久久9999不卡免费 | 国产亚洲高清视频 | 久久精品久 | 成人羞羞国产免费游戏 | 看个毛片| 性色av一区二区三区在线观看 | 日本a在线观看 | 欧美成人免费一区二区三区 | 在线成人亚洲 | 久久久精品视频国产 | 538在线精品 | 日本在线播放一区二区三区 | 久久国产精品久久久久久久久久 | 暴力强行进如hdxxx | 羞羞视频在线免费 | 欧美日韩国产综合网 | 国产v综合v亚洲欧美久久 | 色片免费在线观看 | 亚洲一级片在线观看 | 国产视频在线观看一区二区三区 | 中日无线码1区 | 大胆在线日本aⅴ免费视频 美国黄色毛片女人性生活片 | 国产超碰人人做人人爱ⅴa 色天天综合网 | 日韩av成人 | 亚洲午夜网站 | 久久99国产综合精品 |