SQL語句之檢索數據

4.1 SELECT語句

SQL語句是由簡單的英語單詞構成的。這些單詞稱為關鍵字,每個SQL語句都是由一個或多個關鍵字構成的。大概,最經常使用的SQL語句就是SELECT語句了。它的用途是從一個或多個表中檢索信息。

為了使用SELECT檢索表數據,必須至少給出兩條信息——想選擇什麼,以及從什麼地方選擇。

4.2 檢索單個列

我們將從簡單的SQL SELECT語句開始介紹,此語句如下所示:

輸入 SELECT prod_name FROM products;
分析 上述語句利用SELECT語句從products表中檢索一個名為prod_name的列。所需的列名在SELECT
關鍵字之後給出,FROM關鍵字指出從其中檢索數據的表名。此語句的輸入如下所示:
輸出  prod_name
.5 ton anvil

未排序數據 如果沒有明確排序查詢結果,則返回的數據的順序沒有特殊意義。返回數據的順序可能是數據被添加到表中的順序,也可能不是。只要返回相同數目的行,就是正常的。

如上的一條簡單SELECT語句將返回表中所有行。數據沒有過濾(過濾將得出結果集的一個子集),也沒有排序。

結束SQL語句 多條SQL語句以分號(;)分隔。MySQL如同多數DBMS一樣,不需要找單條SQL語句後面加分號。但特定的DBMS可能必須在單條SQL語句後加上分號。當然,如果願意可以總是加上分號。事實上,即使不一定需要,但加上分號肯定沒有壞處。如果你使用的是mysql命令行。必須加上分號來結束SQL語句。

SQL語句和大小寫
請注意,SQL語句不區分大小寫,因此SELECT與select是相同的。同樣,寫成Select也沒有關係。許多SQL開發人員喜歡對所有對sQL關鍵字使用大寫,而對所有列和表名使用小寫,這樣做使代碼更易於閱讀和調試。不過,一定要認識到雖然SQL是不區分大小寫的,但有些標識符(如資料庫名、表名、列名)可能不同:在MySQL4.1及之前的版本中,這些標識符默認是區分大小寫的;在MySQL4.1.1版本中,這些標識符默認是不區分大小寫的。

使用空格 在處理SQL語句時,其中所有空格都被忽略。SQL語句可以在一行上給出,也可以分為許多行。多數SQL開發人員認為SQL語句分成多行更容易閱讀和調試。

4.3 檢索多個列

要想從一個表中檢索多個列,使用相同的SELECT語句。唯一的不同是必須在SELECT語句。唯一的不同是必須在SELECT關鍵字後給出多個列名,列名之間必須以逗號分隔。

當心逗號 在選擇多個列時,一定要在列名之間加上逗號,但最後一個列名後不加。如果在最後一個列名加了逗號,將出現錯誤。

下面的SELECT語句從products表中選擇3列:

輸入 SELECT prod_id,prod_name,prod_price FROM products;
分析 與前一個例子一樣,這條語句使用SELECT語句從表products中選擇數據。在這個例子中,
指定了3個列名,,列名之間用逗號分隔。此語句的輸出如下:
輸出 proid_id      prod_name     prod_price
ANV01        .5 ton anvil      5.99

數據表示 從上述輸出可以看到,SQL語句一般返回原始的、無格式的數據。數據的格式化是一個表示問題,而不是一個檢索問題。因此,表示(對齊和顯示上面的價格值,用貨幣符號和逗號表示其金額)一般在顯示該數據的應用程式中規定。一般很少使用實際檢索出的原始數據(沒有應用程式提供的格式)。

4.4 檢索所有列

除了指定所需的列外(如上所述,一個或多個列),SELECT語句還可以檢索所有的列而不必逐個列出它們。這可以通過在實際列名的位置使用星號(*)通配符來達到,如下所示:

輸入 SELECT * FROM products
分析 如果給定一個通配符(*),則返回表中所有列。列的順序一般是列在表定義中出現的順序。
但有些時候並不是這樣的,表的模式的變化(如添加或刪除列)可能會導致順序的變化。

使用通配符 一般,除非你確實需要表中的每個列,否則最好別使用*通配符。雖然使用通配符可能會使你自己省事,不用明確列出所需列,但檢索不需要的列通常會降低檢索和應用程式的性能。

檢索未知列 使用通配符有一個大優點。由於不明確指定列(因為星號檢索每個列),所以能檢索出名字未知的列。

4.5 檢索不同的行

正如所見,SELECT返回所有匹配的行。但是,如果你不想要每個值每次出現,怎麼辦?例如,假如你想得出products表中產品的所有供應商ID:

輸入 SELECT vend_id FROM products;
輸出 vend_id
1001
1001
1002
1002
1003
1003
......

SELECT語句返回14行(即使表中只有4個供應商),因為products表中列出了14個產品。那麼,如何檢索出有不同值的列表呢?

解決方法是使用DISITINCT關鍵字,顧名思義,次關鍵字,此關鍵字指示MySQL只返回不同的值。

輸入 SELECT DISITINCT vend_id FROM products;
分析 SELECT DISITINCT vend_id告訴MySQL只返回不同(唯一)的vend_id行,因此值返回4行,
如下面的輸出所示。如果使用DISITINCT關鍵字,它必須放在列名的前面。
輸出 vend_id
1001
1002
1003
1005

不能部分使用DISTINCT DISTINCT關鍵字應用於所有列而不僅是前置它的列。如果給出SELECT DISTINCT vend_id,prod_price,除非指定的兩個列都不同,否則所有行都將被檢索出來。

4.6 限制結果

SELECT語句返回所有匹配的行,它們可能是指定表中的每個行。為了返回第一行或前幾行,可使用LIMIT字句。下面舉一個例子:

輸入 SELECT prod_name FROM products LIMIT 5;
分析 此語句使用SELECT語句檢索單個列。LIMIT 5指示MySQL返回不多於5行。此語句的輸入如下
所示:
輸出 prod_name
.5 ton anvil
1 ton anvil
2 ton anvil
oil can
Fuses

為得出下一個5行,可指定要檢索的開始行和行數,如下所示:

輸入 SELECT prod_name FROM products LIMIT 5,5;
分析 LIMIT5,5指示MySQL返回從行5開始的5行。第一個數為開始位置,第二個數為要檢索的行數。
此語句的輸出如下所示:
輸出 prod_name
Sling
TNT(1 stick)
TNT(5 sticks)
Bird seed
Carrots
所以,帶一個值的LIMIT總是從第一行開始,給出的數為返回的行數。帶兩個值的LIMIT可以指定
從行號為第一個值的位置開始。

行0 檢索出來的第一行為行0而不是行1。因此,LIMIT 1,1將檢索出第二行而不是第一行。

在行數不夠時 LIMIT中指定要檢索的行數為檢索的最大行數。如果沒有足夠的行(例如,給出LIMIT 10,5但只有13行),MySQL將只返回它能返回的那麼多行。

MySQL 5的LIMIT語法 LIMIT3,4的含義是從行4開始的3行還是從行3開始的4行?如前所述,它的意思是從行3開始的4行,這容易把人搞糊塗。

由於這個原因,MySQL5支持LIMIT的另一種替代語法。LIMIT 4 OFFSET 3意為從行3開始取4行,就像LIMIT3,4一樣。

4.7 使用完全限定的表名

迄今為止使用的SQL例子只通過列名引用列。也可能會使用完全限定的名字來引用列(同時使用表名和列字)。請看以下例子:

輸入 SELECT products.prod_name FROM products;

這里指定了一個完全限定的列名。

表名也可以是完全限定的,如下所示:

輸入 SELECT products.prod_name FROM crashcourse.products;

這條語句在功能上也等於剛使用的那條語句(當然,假定products表確實位於crashcourse資料庫中)。

SQL語句之檢索數據來源:kknewsSQL語句之檢索數據