4. 使用MySQL之检索数据
检索单个列
比如:
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数据库中)。

浙公网安备 33010602011771号