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]>