0%

mysql检索数据

  • MySQL检索数据操作

第4章 检索数据

4.1 ★SELECT 语句

  • SELECT语句:从一个或多个表中检索信息。

  • 为了使用SELECT检索表数据,必须至少给出两条信息——想选择什么,以及从什么地方选择。

    1
    2
    SELECT [DISTINCT] *|{column1, column2, column3 ...}
    FROM table_name;
    • SELECT:指定查询哪些列的数据。
    • column:指定列名。* 代表查询所有列。
    • FROM:指定查询哪张表。
    • DISTINCT:当显示结果时,去掉重复数据。

4.2 检索单个列

  • 我们将从简单的SQL SELECT语句开始介绍,此语句如下所示:SELECT prod_name FROM products;

    上述语句利用SELECT语句从products表中检索一个名为prod_name的列。所需的列名在SELECT关键字之后给出,FROM关键字指出从其中检索数据的表名。

  • 如上的一条简单SELECT语句将返回表中所有行。数据没有过滤(过滤将得出结果集的一个子集),也没有排序。以后几章将讨论这些内容。

  • 良好的代码习惯:

    • ★提示:结束SQL语句:多条SQL语句必须以分号(;)分隔。MySQL如同多数DBMS一样,不需要在单条SQL语句后加分号。但特定的DBMS可能必须在单条SQL语句后加上分号。当然,如果愿意可以总是加上分号。事实上,即使不一定需要,但加上分号肯定没有坏处。如果你使用的是mysql命令行,必须加上分号来结束SQL语句。

    • ★提示:SQL语句和大小写:请注意,SQL语句不区分大小写,因此SELECT与select是相同的。同样,写成Select也没有关系。许多SQL开发人员喜欢对所有SQL关键字使用大写,而对所有列和表名使用小写,这样做使代码更易于阅读和调试。

    • 提示:使用空格:在处理SQL语句时,其中所有空格都被忽略。SQL语句可以在一行上给出,也可以分成许多行。多数SQL开发人员认为将SQL语句分成多行更容易阅读和调试。

4.3 检索多个列

  • 要想从一个表中检索多个列,使用相同的SELECT语句。唯一的不同是必须在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。SELECT prod_id, prod_name, prod_price FROM products;

    与前一个例子一样,这条语句使用SELECT语句从表products中选择数据。在这个例子中,指定了3个列名,列名之间用逗号分隔。

4.4 检索所有列

  • 除了指定所需的列外(如上所述,一个或多个列),SELECT语句还可以检索所有的列而不必逐个列出它们。这可以通过在实际列名的位置使用星号(*)通配符来达到。SELECT * FROM products;

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

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

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

4.5 检索不同的行DISTINCT

  • 正如所见,SELECT返回所有匹配的行。但是,如果你不想要每个值每次都出现,怎么办?例如,假如你想得出products表中产品的所有供应商ID:SELECT vend_id FROM products;SELECT语句返回14行(即使表中只有4个供应商),因为products表中列出了14个产品。那么,如何检索出有不同值的列表呢?

  • 解决办法是使用DISTINCT关键字,顾名思义,此关键字指示MySQL只返回不同的值。SELECT DISTINCT vend_id FROM products; SELECT DISTINCT vend_id告诉MySQL只返回不同(唯一)的vend_id行,因此只返回4行。如果使用DISTINCT关键字,它必须直接放在列名的前面。

  • 注意:不能部分使用DISTINCT:DISTINCT关键字应用于所有列而不仅是前置它的列。如果给出SELECT DISTINCT vend_id, prod_price,除非指定的这两个列的其中几行的数据都相同,否则所有行都将被检索出来。比如 vend_id 中有几行数据相同,但 prod_price 中每行数据都不同,那么所有行都将被检索出来

4.6 限制结果LIMIT

  • SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句。SELECT prod_name FROM products LIMIT 5;此语句使用SELECT语句检索单个列prod_name,LIMIT 5指示MySQL返回不多于5行。

    为得出下一个5行,可指定要检索的开始行和行数,如下所示:SELECT prod_name FROM products LIMIT 5,5; LIMIT 5, 5指示MySQL返回从第5行开始(不包括第5行)的5行。第一个数为开始位置,第二个数为要检索的行数。

    所以,带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。带两个值的LIMIT可以指定从行号为第一个值的位置开始。

  • ★注意:检索出来的第一行为行0而不是行1。因此,LIMIT 1, 1将检索出第二行而不是第一行。(类似于数组的下标从0开始的概念)

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

  • 另:LIMIT 4 OFFSET 3意为从行3(即第4行)开始取4行,就像LIMIT 3, 4一样。

  • 如果要对表数据进行分页显示,可以按照下面的语句来填写:

    1
    SELECT ... LIMIT 每页显示的记录数*(第 i 页 - 1), 每页显示的记录数

4.7 ★使用完全限定的表名

  • 迄今为止使用的SQL例子只通过列名引用列。也可能会使用完全限定的名字来引用列(同时使用表名和列名)。SELECT products.prod_name FROM products;
  • 表名也可以是完全限定的:SELECT products.prod_name FROM crashcourse.products;

第5章 排序检索数据ORDER BY

5.1 排序数据

  • 子句(clause):SQL语句由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。

    子句的例子有SELECT语句的FROM子句

  • 为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。SELECT prod_name FROM products ORDER BY prod_name;

  • 通过非选择列进行排序:通常,ORDER BY子句中使用的列将是为显示所选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。例如:SELECT prod_name FROM products ORDER BY prod_price;

5.2 按多个列排序

  • 经常需要按不止一个列进行数据排序。例如,如果要显示雇员清单,可能希望按姓和名排序(首先按姓排序,然后在每个姓中再按名排序)。如果多个雇员具有相同的姓,这样做很有用。

  • 为了按多个列排序,只要指定列名,列名之间用逗号分开即可(就像选择多个列时所做的那样)。

  • 下面的代码检索3个列,并按其中两个列对结果进行排序——首先按价格,然后再按名称排序。

    SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;

    注意:在按多个列排序时,排序完全按所规定的顺序进行。换句话说,对于上述例子中的输出,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。

5.3 指定排序方向

  • 数据排序不限于升序排序(从A到Z)。这只是默认的排序顺序,还可以使用ORDER BY子句以降序(从Z到A)顺序排序。为了进行降序排序,必须指定DESC关键字

    下面的例子按价格以降序排序产品(最贵的排在最前面):

    SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;

  • 但是,如果打算用多个列排序怎么办?下面的例子以降序排序产品的价格(最贵的在最前面),然后再对产品名排序(默认升序):

    SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;

    注意:DESC关键字只应用到直接位于其前面的列名。在上例中,只对prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的升序排序。如果想在多个列上进行降序排序,必须对每个列指定DESC关键字。

    下面的代码是对产品的价格和产品名都以降序排序:

    SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name DESC;

  • 与DESC相反的关键字是ASC(ASCENDING),在升序排序时可以指定它。但实际上,ASC没有多大用处,因为升序是默认的(如果既不指定ASC也不指定DESC,则假定为ASC)。

  • 使用ORDER BY和LIMIT的组合,能够找出一个列中最高或最低的值。

    下面的例子演示如何找出最昂贵物品的值:SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;

  • ORDER BY子句的位置:在给出ORDER BY子句时,应该保证它位于FROM子句之后。如果使用LIMIT,它必须位于ORDER BY之后。使用子句的次序不对将产生错误消息。

---------------The End---------------