4.1 SELECT語句
SELECT:用途是從一個或多個表中檢索信息。爲了使用SELECT檢索表數據,必須至少給出兩條信息——想選擇什麼,以及從什麼地方選擇。
4.2 檢索單個列
mysql> SELECT prod_name FROM products;
+----------------+
| prod_name |
+----------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
| Detonator |
| Bird seed |
| Carrots |
| Fuses |
| JetPack 1000 |
| JetPack 2000 |
| Oil can |
| Safe |
| Sling |
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
- 分析:上述語句利用
SELECT
語句從products
表中檢索一個名爲prod_name
的列。所需的列名在SELECT
關鍵字之後給出,FROM
關鍵字指出從其中檢索數據的表名。
未排序數據:顯示輸出的數據順序與這裏的不同,出現這種情況很正常。如果沒有明確排序查詢結果,則返回的數據的順序沒有特殊意義。只要返回相同數目的行,就是正常的。
結束SQL語句:多條SQL語句必須以分號(;)分隔。如果你使用的是mysql命令行,必須加上分號來結束SQL語句。
SQL語句和大小寫:請注意, SQL語句不區分大小寫,因此SELECT與select是相同的。許多SQL開發人員喜歡對所有SQL關鍵字使用大寫,而對所有列和表名使用小寫,這樣做使代碼更易於閱讀和調試。
使用空格:在處理SQL語句時,其中所有空格都被忽略。 SQL語句可以在一行上給出,也可以分成許多行。
4.3 檢索多個列
要想從一個表中檢索多個列,使用相同的SELECT語句。唯一的不同是必須在SELECT關鍵字後給出多個列名,列名之間必須以逗號分隔。
當心逗號:在選擇多個列時,一定要在列名之間加上逗號,但
最後一個列名後不加。如果在最後一個列名後加了逗號,將出
現錯誤。
mysql> SELECT prod_id, prod_name, prod_price FROM products;
+---------+----------------+------------+
| prod_id | prod_name | prod_price |
+---------+----------------+------------+
| ANV01 | .5 ton anvil | 5.99 |
| ANV02 | 1 ton anvil | 9.99 |
| ANV03 | 2 ton anvil | 14.99 |
| DTNTR | Detonator | 13.00 |
| FB | Bird seed | 10.00 |
| FC | Carrots | 2.50 |
| FU1 | Fuses | 3.42 |
| JP1000 | JetPack 1000 | 35.00 |
| JP2000 | JetPack 2000 | 55.00 |
| OL1 | Oil can | 8.99 |
| SAFE | Safe | 50.00 |
| SLING | Sling | 4.49 |
| TNT1 | TNT (1 stick) | 2.50 |
| TNT2 | TNT (5 sticks) | 10.00 |
+---------+----------------+------------+
- 分析:這條語句使用
SELECT
語句從表products
中選擇數據。在這個例子中,指定了3個列名,列名之間用逗號分隔。
4.4 檢索所有列
SELECT
語句通過在實際列名的位置使用星號(*)通配符來檢索所有的列。
mysql> SELECT * FROM products;
+---------+---------+----------------+------------+----------------------------------------------------------------+
| prod_id | vend_id | prod_name | prod_price | prod_desc |
+---------+---------+----------------+------------+----------------------------------------------------------------+
| ANV01 | 1001 | .5 ton anvil | 5.99 | .5 ton anvil, black, complete with handy hook |
| ANV02 | 1001 | 1 ton anvil | 9.99 | 1 ton anvil, black, complete with handy hook and carrying case |
| ANV03 | 1001 | 2 ton anvil | 14.99 | 2 ton anvil, black, complete with handy hook and carrying case |
| DTNTR | 1003 | Detonator | 13.00 | Detonator (plunger powered), fuses not included |
| FB | 1003 | Bird seed | 10.00 | Large bag (suitable for road runners) |
| FC | 1003 | Carrots | 2.50 | Carrots (rabbit hunting season only) |
| FU1 | 1002 | Fuses | 3.42 | 1 dozen, extra long |
| JP1000 | 1005 | JetPack 1000 | 35.00 | JetPack 1000, intended for single use |
| JP2000 | 1005 | JetPack 2000 | 55.00 | JetPack 2000, multi-use |
| OL1 | 1002 | Oil can | 8.99 | Oil can, red |
| SAFE | 1003 | Safe | 50.00 | Safe with combination lock |
| SLING | 1003 | Sling | 4.49 | Sling, one size fits all |
| TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick |
| TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks |
+---------+---------+----------------+------------+----------------------------------------------------------------+
- 分析:如果給定一個通配符(*),則返回表中所有列。列的順序一般是列在表定義中出現的順序。但有時候並不是這樣的,表的模式的變化(如添加或刪除列)可能會導致順序的變化。
使用通配符:使用通配符可能會使你自己省事,不用明確列出所需列,但檢索不需要的列通常會降低檢索和應用程序的性能。
4.5 檢索不同的行
mysql> SELECT vend_id FROM products;
+---------+
| vend_id |
+---------+
| 1001 |
| 1001 |
| 1001 |
| 1002 |
| 1002 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1005 |
| 1005 |
+---------+
SELECT
語句返回14行(即使表中只有4個供應商),因爲products
表中列出了14個產品。那麼,如何檢索出有不同值的列表呢?
解決辦法是使用DISTINCT
關鍵字,顧名思義,此關鍵字指示MySQL只返回不同的值。
mysql> SELECT DISTINCT vend_id FROM products;
+---------+
| vend_id |
+---------+
| 1001 |
| 1002 |
| 1003 |
| 1005 |
+---------+
- 分析:
SELECT DISTINCT vend_id
告訴MySQL只返回不同(唯一)的
vend_id
行,因此只返回4行。如果使用DISTINCT
關鍵字,它必須直接放在列名的前面。
不能部分使用DISTINCT:DISTINCT關鍵字應用於所有列而不僅是前置它的列。如果給出
SELECT DISTINCT vend_id,prod_price
,除非指定的兩個列都不同,否則所有行都將被檢索出來。
4.6 限制結果
mysql> SELECT prod_name FROM products LIMIT 5;
+--------------+
| prod_name |
+--------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
| Detonator |
| Bird seed |
+--------------+
- 分析:此語句使用
SELECT
語句檢索單個列。LIMIT 5
指示MySQL返回
不多於5行。
爲得出下一個5行,可指定要檢索的開始行和行數,如下所示:
mysql> SELECT prod_name FROM products LIMIT 5,5;
+--------------+
| prod_name |
+--------------+
| Carrots |
| Fuses |
| JetPack 1000 |
| JetPack 2000 |
| Oil can |
+--------------+
- 分析:
LIMIT 5, 5
指示MySQL返回從行5開始的5行。第一個數爲開始
位置,第二個數爲要檢索的行數。
所以, 帶一個值的LIMIT總是從第一行開始,給出的數爲返回的行數。帶兩個值的LIMIT可以指定從行號爲第一個值的位置開始。
行0:檢索出來的第一行爲行0而不是行1。因此, LIMIT 1, 1將檢索出第二行而不是第一行。
在行數不夠時:如果沒有足夠的行, MySQL將只返回它能返回的那麼多行。
MySQL 5的LIMIT語法:LIMIT 4 OFFSET 3
意爲從行3開始取4行,就像LIMIT 3, 4
一樣。
4.7 使用完全限定的表名
mysql> SELECT products.prod_name FROM products;
- 分析:這裏指定了一個完全限定的列名。
表名也可以是完全限定的,如下所示:
mysql> SELECT products.prod_name FROM mysql_study.products;