MySQL检索数据和排序检索.md

来源:互联网 发布:淘宝宝贝图片怎么上传 编辑:程序博客网 时间:2024/05/16 23:47

  • 第四章 检索数据
    • 1 SELECT语句
    • 2 检索单个列
    • 3 检索多列
    • 4 检索所有列
    • 5 检索不同的行
    • 6 限制条件
    • 7 使用完全限定的表名
  • 第五章 排序检索
    • 1 排序数据
    • 2 多列排序
    • 3 指定排序方向

第四章 检索数据

    介绍使用SELECT语句检索数据。

4.1 SELECT语句

使用SELECT需要表明想要检索的信息,以及要检索的地方。

4.2 检索单个列

使用SELECT进行单列检索,

mysql> 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) |+----------------+

分析,从上述语句中可以看出,
1. SELECT语句从products表中检索prod_name列;
2. 同时,此检索是未排序数列;
3. 多条SQL语句以(;)结束;
4. SQL语句不区分大小写,但通常将SQL关键字使用大写,而对所有列和表名使用小写。

4.3 检索多列

使用SELECT语句,其后跟随多个列名,并且以逗号分隔,最后一个列名后不添加逗号。
例如从products表中选择三列,

mysql> 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 |+---------+----------------+------------+

4.4 检索所有列

除指定列外,SELECT语句可以检索所有的列而不必逐一列出,使用通配符(*)。

mysql> 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                                    |+---------+---------+----------------+------------+----------------------------------------------------------------+
  • 注意,除非特殊要求,尽量避免使用通配符,因为会降低检索和应用程序的性能。

4.5 检索不同的行

SELECT返回所有匹配的行,但是,如果不想每个值重复出现,需要使用DISTINCT语句。对比如下

mysql> SELECT vend_id FROM products;+---------+| vend_id |+---------+|    1001 ||    1001 ||    1001 ||    1002 ||    1002 ||    1003 ||    1003 ||    1003 ||    1003 ||    1003 ||    1003 ||    1003 ||    1005 ||    1005 |+---------+
mysql> SELECT DISTINCT vend_id FROM products;+---------+| vend_id |+---------+|    1001 ||    1002 ||    1003 ||    1005 |+---------+

使用DISTINCT会应用于所有列,而非是与它相邻的列。

4.6 限制条件

使用LIMIT子句,来限制结果。例如,返回前5行

mysql> SELECT prod_name FROM products LIMIT 5;+--------------+| prod_name    |+--------------+| .5 ton anvil || 1 ton anvil  || 2 ton anvil  || Detonator    || Bird seed    |+--------------+

而,LIMIT 5, 5为,从第5行开始的5行。

mysql> SELECT prod_name FROM products LIMIT 5,5;+--------------+| prod_name    |+--------------+| Carrots      || Fuses        || JetPack 1000 || JetPack 2000 || Oil can      |+--------------+
  • 注意,行0. 检索出的第一行为行0,而不是行1.因此LIMIT 1, 1,检索出第二行。
  • 注意,在行数不够是,使用空值,即最多可返回的行。

4.7 使用完全限定的表名

可以使用完全限定的表名,来引用列(同时使用表名和列名)。如下,限定列名和限定表名

mysql> SELECT products.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) |+----------------+
mysql> SELECT products.prod_name FROM superMakert.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) |+----------------+

第五章 排序检索

    使用ORDER BY子句

5.1 排序数据

直接SELECT检索出的数据没有进行排序。关系型数据库设计认为,不明确规定排序顺序,不应该假定检索出的数据顺序有意义。为明确排序,可以使用ORDER BY子句。ORDER BY子句可以同时取一个或多个列的名字,据此排序。如下,

mysql> SELECT prod_name FROM products ORDER BY prod_name;+----------------+| prod_name      |+----------------+| .5 ton anvil   || 1 ton anvil    || 2 ton anvil    || Bird seed      || Carrots        || Detonator      || Fuses          || JetPack 1000   || JetPack 2000   || Oil can        || Safe           || Sling          || TNT (1 stick)  || TNT (5 sticks) |+----------------+

分析,通常ORDER BY子句使用的列为将要显示的列,但完全可以使用未检索的列作为排序。

5.2 多列排序

为了按照多列排序,只要指定列名,列名之间用逗号隔开即可。例如,

mysql> SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;+---------+------------+----------------+| prod_id | prod_price | prod_name      |+---------+------------+----------------+| FC      |       2.50 | Carrots        || TNT1    |       2.50 | TNT (1 stick)  || FU1     |       3.42 | Fuses          || SLING   |       4.49 | Sling          || ANV01   |       5.99 | .5 ton anvil   || OL1     |       8.99 | Oil can        || ANV02   |       9.99 | 1 ton anvil    || FB      |      10.00 | Bird seed      || TNT2    |      10.00 | TNT (5 sticks) || DTNTR   |      13.00 | Detonator      || ANV03   |      14.99 | 2 ton anvil    || JP1000  |      35.00 | JetPack 1000   || SAFE    |      50.00 | Safe           || JP2000  |      55.00 | JetPack 2000   |+---------+------------+----------------+

分析,仅在多行具有相同的prod_price值时,才会按照prod_name排序。

5.3 指定排序方向

指定排序方向,是用DESC关键字。

mysql> SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;+---------+------------+----------------+| prod_id | prod_price | prod_name      |+---------+------------+----------------+| JP2000  |      55.00 | JetPack 2000   || SAFE    |      50.00 | Safe           || JP1000  |      35.00 | JetPack 1000   || ANV03   |      14.99 | 2 ton anvil    || DTNTR   |      13.00 | Detonator      || TNT2    |      10.00 | TNT (5 sticks) || FB      |      10.00 | Bird seed      || ANV02   |       9.99 | 1 ton anvil    || OL1     |       8.99 | Oil can        || ANV01   |       5.99 | .5 ton anvil   || SLING   |       4.49 | Sling          || FU1     |       3.42 | Fuses          || FC      |       2.50 | Carrots        || TNT1    |       2.50 | TNT (1 stick)  |+---------+------------+----------------+
  • 注意,如果在多个列是用降序排序,必须在每个列上都使用DESC关键字。