检索单个列
比如:
SELECT prod_name FROM products;
输出如下:
此时数据没有过滤(过滤将得出结果集的一个子集),也没有排序。
检索多个列
比如:
SELECT prod_id, prod_name, prod_price FROM products;
输出如下:
从上述输出可以看到,SQL语句一般返回原始的、无格式的数据。数据的格式化是一个表示问题,而不是一个检索问题。因此,表示(对齐和显示上面的价格值,用货币符号和逗号表示其金额)一般在显示该数据的应用程序中规定。一般很少使用实际检索出的原始数据(没有应用程序提供的格式)。
注意
当心逗号!!!
在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。如果在最后一个列名后加了逗号,将出现错误。
检索所有列
比如:
SELECT * FROM products;
输出如下:
如果给定一个通配符(*),则返回表中所有列。列的顺序一般是列在表定义中出现的顺序。但有时候并不是这样的,表的模式的变化(如添加或删除列)可能会导致顺序的变化。
注意:
-
使用通配符: 一般,除非你确实需要表中的每个列,否则最
好别使用*通配符。虽然使用通配符可能会使你自己省事,不
用明确列出所需列,但检索不需要的列通常会降低检索和应
用程序的性能。 -
检索未知列: 使用通配符有一个大优点。由于不明确指定列
名(因为星号检索每个列),所以能检索出名字未知的列。
检索不同的行
使用DISTINCT关键字,此关键字指示MySQL只返回不同的值。
比如:
SELECT DISTINCT vend_id FROM products;
输出如下:
如果使用DISTINCT关键字,它必须直接放在列名的前面。
注意:
如果给出SELECT DISTINCT vend_id, prod_price
,结果会是怎么样呢?
select distinct vend_id, prod_price from products;
输出如下:
-
如果两行的 vend_id 和 prod_price 都相同,那么这些行被视为重复,数据库只会返回其中的一行。
-
如果两行的 vend_id 相同但 prod_price 不同,或 vend_id 不同但 prod_price 相同,这些行被视为不同,都会被返回。
限制结果
SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句。
-
比如:
select prod_name from products limit 5;
输出如下:
此语句使用SELECT语句检索单个列。
LIMIT 5
指示MySQL返回不多于5行。 -
为得出下一个5行,可指定要检索的开始行和行数,如下所示:
select prod_name from products limit 5, 5;
输出如下:
LIMIT 5, 5
指示MySQL返回从行5(行5其实是第6行,因为第一行为行0)开始的5行。第一个数为开始的位置,第二个数为要检索的行数。
所以,
-
带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。
-
带两个值的LIMIT可以指定从行号为第一个值的位置开始。
注意
-
行0: 检索出来的第一行为行0而不是行1。因此,
LIMIT 1, 1
将检索出第二行而不是第一行。 -
在行数不够时: LIMIT中指定要检索的行数为检索的最大行数。如果没有足够的行(例如,给出
LIMIT 10, 5
,但只有13行),MySQL将只返回它能返回的那么多行。 -
MySQL 5的LIMIT语法:
LIMIT 3, 4
的含义是从行4开始的3行还是从行3开始的4行?如前所述,它的意思是从行3开始的4行,这容易把人搞糊涂。 由于这个原因,MySQL 5支持LIMIT的另一种替代语法。LIMIT 4 OFFSET 3
意为从行3开始取4行,就像LIMIT 3, 4
一样。比如:
select prod_name from products limit 3 offset 4;
输出如下:
使用完全限定的表名
-
迄今为止使用的SQL例子只通过列名引用列。也可能会使用完全限定的名字来引用列(同时使用表名和列字)。
比如:
select products.prod_name from products;
输出如下:
这条SQL语句在功能上等于
select prod_name from products;
,但这里指定了一个完全限定的列名。 -
表名也可以是完全限定的,
比如:
select products.prod_name from crashcourse.products;
这条语句在功能上也等于刚使用的那条语句(当然,假定products表确实位于crashcourse数据库中)。