MySQL基礎之MySQL必知必會(四)檢索資料
SELECT語句
每個SQL語句都是由一個或多個關鍵字構成的。最常使用的SQL語句是SELECT語句。它的用途是從一個或多個表中檢索資訊。
為了使用SELECT檢索表中的資料, 必須至少給出兩條資訊--想要選擇什麼, 以及從什麼地方選擇
檢索單個列
MariaDB [crashcourse]> 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) | +----------------+ 14 rows in set (0.000 sec) MariaDB [crashcourse]>
利用SELECT語句從products表中檢索一個名為prod_name的列。所需的列名在SELECT關鍵字之後給出, FROM關鍵字指出從其中檢索資料的表名。
如上一條簡單的SELECT語句將返回表中所有的行。資料是沒有過濾(過濾將得到一個結果集的子集), 也沒有排序
結束SQL語句
多條SQL語句必須以分號(;)分隔。
SQL語句和大小寫
SQL語句不區分大小寫, 因此寫SELECT和select是相同的。
使用空格
在處理SQL語句時, 其中所有空格都被忽略。SQL語句可以在一行上給出, 也可以分為多行。
檢索多個列
要想從一個表中檢索多個列, 使用相同的SELECT語句。唯一不同的是必須在SELECT關鍵字後面給出多個列名, 列名之間必須以逗號分隔。
注意:
在選擇多個列時, 一定要在列名之間使用逗號分隔, 但是最後一個列名後不加, 如果在最後一個列名後加了逗號, 會報錯
例如: 從products表中選擇3列
MariaDB [crashcourse]> 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 | +---------+----------------+------------+ 14 rows in set (0.000 sec) MariaDB [crashcourse]>
檢索所有列
SELECT可以檢索所有列而不必逐個列出他們。通過在實際列名的位置使用星號(*)萬用字元來達到。如下所示:
MariaDB [crashcourse]> 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 | +---------+---------+----------------+------------+----------------------------------------------------------------+ 14 rows in set (0.000 sec) MariaDB [crashcourse]>
萬用字元的使用
一般, 除非確定需要表中的每個列, 否則最好別使用*萬用字元。因為使用*萬用字元檢索不需要列的時候通常會降低檢索和應用程式的效能
檢索不同的行
使用DISTINCT關鍵字可以指示MySQL只返回不同的值。
MariaDB [crashcourse]> select distinct vend_id from products; +---------+ | vend_id | +---------+ | 1001 | | 1002 | | 1003 | | 1005 | +---------+ 4 rows in set (0.001 sec) MariaDB [crashcourse]>
SELECT DISTINCT vend_id告訴MySQL只返回不同(唯一)的vend_id行。如果使用DISTINCT關鍵字, 它必須直接放在列名的前面
不能部分使用DISTINCT
DISTINCT關鍵字應用於所有列而不僅是前置它的列, 如果給出SELECT DISTINCT vend_id, prod_price, 除非指定的兩個列都不相同, 否則所有行都將被檢索出來。
限制結果
SELECT語句返回匹配的行, 為了返回第一行或者前幾行, 可以使用LIMIT語句。
MariaDB [crashcourse]> SELECT prod_name from products LIMIT 5; +--------------+ | prod_name | +--------------+ | .5 ton anvil | | 1 ton anvil | | 2 ton anvil | | Detonator | | Bird seed | +--------------+ 5 rows in set (0.000 sec) MariaDB [crashcourse]>
此語句使用SELECT語句檢索單個列, LIMIT 5指示MySQL返回不多於5行。
為得出下一個5行, 可指定要檢索的開始行和行數。如下所示:
MariaDB [crashcourse]> SELECT prod_name from products LIMIT 5, 5; +--------------+ | prod_name | +--------------+ | Carrots | | Fuses | | JetPack 1000 | | JetPack 2000 | | Oil can | +--------------+ 5 rows in set (0.000 sec) MariaDB [crashcourse]>
LIMIT 5, 5指示MySQL返回行5開始的5行。第一個數為開始位置, 第二個數為要檢索的行數。
所以帶一個值的LIMIT總是從第一行開始, 給出的數為返回的行數。帶兩個值的LIMIT可以指定從行號為第一個值的位置開始
行0
檢索出來的第一行為行0而不是行1, 因此, LIMIT 1, 1將檢索出第二行而不是第一行
在行數不夠時
LIMIT中指定要檢索的行數為檢索的最大行數。如果沒有足夠多的行, MySQL只返回它能返回的那麼多行
MySQL5的LIMIT語法
LIMIT容易讓人混淆, 因此MySQL5支援LIMIT的另一種代替語法。LIMIT 4 OFFSET 3 意為從第3行開始取4行, 就像LIMIT3, 4一樣。
使用完全限定的表名
SQL語句也可以使用完全限定的名字來引用列(同時使用表名和列名)。
例如:
MariaDB [crashcourse]> SELECT products.prod_name FROM crashcourse.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) | +----------------+ 14 rows in set (0.000 sec) MariaDB [crashcourse]>