《Mysql應用MySQL中三種關聯查詢方式的簡單比較》要點:
本文介紹了Mysql應用MySQL中三種關聯查詢方式的簡單比較,希望對您有用。如果有疑問,可以聯系我們。
MYSQL教程看看下面三個關聯查詢的 SQL 語句有何區別?
?
MYSQL教程
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
MYSQL教程最大的不同更多是語法糖,但有一些有意思的東西值得關注.
MYSQL教程為了便利區別,我們將前兩種寫法稱作是 ANSI 風格,第三種稱為 Theta 風格.
Theta 風格
MYSQL教程在 FROM 短語中列出了關聯的表名,而 WHERE 短語則指定如何關聯.
MYSQL教程這種寫法被認為是古老的方式,有些時候比擬難以理解,請看下面查詢:
?
MYSQL教程
SELECT * FROM film, film_actor WHERE film.film_id = film_actor.film_id AND actor_id = 17 AND film.length > 120
MYSQL教程上述查詢列出片長超過 120 分鐘的電影,其中包括演員編號是 17 的條件.別在意查詢結果,查詢本身如何呢?WHERE 表達式中包括三個條件,要看出哪個條件是關聯,哪個條件是過濾還是稍費點事的.不過還是相對簡單的,但如果是 5 個表,20 多個條件呢?
ANSI 風格: ON
MYSQL教程使用 JOIN ... ON 可以將表關聯的條件和記錄過濾條件分開,將上面的語句重寫后的結果如下:
?
MYSQL教程
SELECT * FROM film JOIN film_actor ON (film.film_id = film_actor.film_id) WHERE actor_id = 17 AND film.length > 120
MYSQL教程看起來清晰許多.
MYSQL教程注意: ON 語句中的括號不是必須的,我個人喜歡這樣寫罷了.
MYSQL教程ANSI 風格: USING
MYSQL教程有一種特殊情況,當兩個要關聯表的字段名是一樣的,我們可以使用? USING ,可減少 SQL 語句的長度:
?
MYSQL教程
SELECT * FROM film JOIN film_actor USING (film_id) WHERE actor_id = 17 AND film.length > 120
MYSQL教程這個時候括號就是必需的了.這種寫法很好,輸入更少的單詞,查詢的性能也非常棒,但還需要注意一些差異.
MYSQL教程USING 和 ON
MYSQL教程下面語句是可行的:
?
MYSQL教程
SELECT film.title, film_id FROM film JOIN film_actor USING (film_id) WHERE actor_id = 17 AND film.length > 120;
MYSQL教程但下面這個就不行:
?
MYSQL教程
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
MYSQL教程因為 USING "知道" film_id 字段在兩個表中都有,所以沒有指定確切的表都沒關系,兩個值必需一致就是.
MYSQL教程ON 就沒那么智能,你必需指明要關聯的表和字段名.
MYSQL教程上面兩個實際的結果是比擬有趣的,當使用 USING 時,字段只在結果中出現一次:
?
MYSQL教程
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
MYSQL教程而使用 ON 時,字段就會出現兩次:
?
MYSQL教程
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教程幕后
MYSQL教程MySQL 對兩者的處理方式是相同的,使用 EXPLAIN EXTENDED 我們可以看到:
?
MYSQL教程
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)
)
MYSQL教程最終所有的查詢都被轉成了 Theta 風格.
MYSQL教程譯者:便是說這三種方式除了寫法不同外,沒什么區別.
《Mysql應用MySQL中三種關聯查詢方式的簡單比較》是否對您有啟發,歡迎查看更多與《Mysql應用MySQL中三種關聯查詢方式的簡單比較》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/9501.html