4. 使用MySQL之检索数据

检索单个列

比如:

SELECT prod_name FROM products;

输出如下:

img

此时数据没有过滤(过滤将得出结果集的一个子集),也没有排序。

检索多个列

比如:

SELECT prod_id, prod_name, prod_price FROM products;

输出如下:

img

从上述输出可以看到,SQL语句一般返回原始的、无格式的数据。数据的格式化是一个表示问题,而不是一个检索问题。因此,表示(对齐和显示上面的价格值,用货币符号和逗号表示其金额)一般在显示该数据的应用程序中规定。一般很少使用实际检索出的原始数据(没有应用程序提供的格式)。

注意

当心逗号!!!

在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。如果在最后一个列名后加了逗号,将出现错误。
img

检索所有列

比如:

SELECT * FROM products;

输出如下:

img

如果给定一个通配符(*),则返回表中所有列。列的顺序一般是列在表定义中出现的顺序。但有时候并不是这样的,表的模式的变化(如添加或删除列)可能会导致顺序的变化。

注意:

  1. 使用通配符: 一般,除非你确实需要表中的每个列,否则最
    好别使用*通配符。虽然使用通配符可能会使你自己省事,不
    用明确列出所需列,但检索不需要的列通常会降低检索和应
    用程序的性能。

  2. 检索未知列: 使用通配符有一个大优点。由于不明确指定列
    名(因为星号检索每个列),所以能检索出名字未知的列。

检索不同的行

使用DISTINCT关键字,此关键字指示MySQL只返回不同的值。

比如:

SELECT DISTINCT vend_id FROM products;

输出如下:

img

如果使用DISTINCT关键字,它必须直接放在列名的前面。

注意:

如果给出SELECT DISTINCT vend_id, prod_price,结果会是怎么样呢?

select distinct vend_id, prod_price from products;

输出如下:

img

  • 如果两行的 vend_id 和 prod_price 都相同,那么这些行被视为重复,数据库只会返回其中的一行。

  • 如果两行的 vend_id 相同但 prod_price 不同,或 vend_id 不同但 prod_price 相同,这些行被视为不同,都会被返回。

限制结果

SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句。

  • 比如:

    select prod_name from products limit 5;
    

    输出如下:

    img

    此语句使用SELECT语句检索单个列。LIMIT 5指示MySQL返回不多于5行。

  • 为得出下一个5行,可指定要检索的开始行和行数,如下所示:

    select prod_name from products limit 5, 5;
    

    输出如下:

    img

    LIMIT 5, 5指示MySQL返回从行5(行5其实是第6行,因为第一行为行0)开始的5行。第一个数为开始的位置,第二个数为要检索的行数。

所以,

  • 带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。

  • 带两个值的LIMIT可以指定从行号为第一个值的位置开始。

注意

  1. 行0: 检索出来的第一行为行0而不是行1。因此,LIMIT 1, 1将检索出第二行而不是第一行。

  2. 在行数不够时: LIMIT中指定要检索的行数为检索的最大行数。如果没有足够的行(例如,给出LIMIT 10, 5,但只有13行),MySQL将只返回它能返回的那么多行。

  3. 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;
    

    输出如下:

    img

使用完全限定的表名

  • 迄今为止使用的SQL例子只通过列名引用列。也可能会使用完全限定的名字来引用列(同时使用表名和列字)。

    比如:

    select products.prod_name from products;
    

    输出如下:

    img

    这条SQL语句在功能上等于select prod_name from products;,但这里指定了一个完全限定的列名。

  • 表名也可以是完全限定的,

    比如:

    select products.prod_name from crashcourse.products;
    

    这条语句在功能上也等于刚使用的那条语句(当然,假定products表确实位于crashcourse数据库中)。

posted @ 2024-10-13 20:06  hisun9  阅读(4)  评论(0编辑  收藏  举报