嵌套SELECT語句也叫子查詢,形如: |
02 |
|
03 |
SELECT name FROM bbc WHERE region = (SELECT region FROM bbc WHERE name =
'Brazil' )
|
04 |
|
05 |
一個 SELECT 語句的查詢結果可以作爲另一個語句的輸入值。
|
06 |
|
07 |
上面的SQL語句作用爲獲得和 'Brazil' (巴西)同屬一個地區的所有國家。
|
08 |
|
09 |
子查詢不但可以出現在Where子句中,也可以出現在from子句中,作爲一個臨時表使用,也可以出現在select list中,作爲一個字段值來返回。本節我們僅介紹的Where子句中的子查詢。
|
10 |
|
11 |
在Where子句中使用子查詢,有一個在實際使用中容易犯的錯在這裏說明一下。
|
12 |
|
13 |
通常,就像上面的例子一樣,嵌套的語句總是和一個值進行比較。
|
14 |
|
15 |
語句 (SELECT region FROM bbc WHERE name =
'Brazil' ) 應該僅返回一個地區,即
'Americas' . 但如果我們在表中再插入一條地區爲歐洲,國家名稱爲Brazil的記錄,那會發生什麼情況?
|
16 |
|
17 |
這將會導致語句的運行時錯誤.因爲這個SQL語句的語法是正確的,所以數據庫引擎就開始執行,但當執行到外部的語句時就出錯了。
|
18 |
|
19 |
因爲這時的外部語句就像好像是 SELECT name FROM bbc WHERE region = ( 'Americas' ,
'Europe' ),這個語句當然報錯了。
|
20 |
|
21 |
那麼有沒有辦法解決這個問題呢,當然有。有一些SQL查詢條件允許對列表值(即多個值)進行操作。
|
22 |
|
23 |
例如 "IN"
操作符,可以測試某個值是否在一個列表中。 |
24 |
|
25 |
下面的語句就可以安全的執行而不出錯,不管表中有多少條包含Brazils的記錄
|
26 |
|
27 |
以下爲引用的內容: |
28 |
SELECT name FROM bbc WHERE region IN
|
29 |
(SELECT region FROM bbc WHERE name =
'Brazil' )
|
30 |
|
31 |
|
32 |
讓我們再看看一些具體的實例 |
33 |
|
34 |
一、給出人口多於Russia(俄國)的國家名稱 |
35 |
|
36 |
以下爲引用的內容: |
37 |
SELECT name FROM bbc |
38 |
WHERE population> |
39 |
(SELECT population FROM bbc
|
40 |
WHERE name= 'Russia' )
|
41 |
|
42 |
|
43 |
二、給出 'India' (印度),
'Iran' (伊朗)所在地區的所有國家的所有信息
|
44 |
|
45 |
以下爲引用的內容: |
46 |
SELECT * FROM bbc |
47 |
WHERE region IN |
48 |
(SELECT region FROM bbc |
49 |
WHERE name IN ( 'India' , 'Iran' ))
|
50 |
|
51 |
|
52 |
三、給出人均GDP超過 'United Kingdom' (英國)的歐洲國家。
|
53 |
|
54 |
以下爲引用的內容: |
55 |
|
56 |
SELECT name FROM bbc |
57 |
WHERE region= 'Europe'
AND gdp/population > |
58 |
(SELECT gdp/population FROM bbc
|
59 |
WHERE name= 'United Kingdom' )
|