最简单的检索数据和排序。

1. 检索数据

检索数据主要依靠SELECT语句执行,使用时必须给出两条必要信息——想选择什么、从什么地方选。

1.1 检索单个列

展示一个示例,利用SELECT语句从products表中检索一个名为 prod_name的列。大小写都可以。

mysql> SELECT prod_name FROM products;
+----------------+
| prod_name      |
+----------------+
| .5 ton anvil   |
| 1 ton anvil    |
| 2 ton anvil    |
| ...      |
+----------------+
14 rows in set (0.24 sec)

1.2 检索多个列

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

mysql> SELECT prod_id,prod_name FROM products;
+---------+----------------+
| prod_id | prod_name      |
+---------+----------------+
| ANV01   | .5 ton anvil   |
| ANV02   | 1 ton anvil    |
| ANV03   | 2 ton anvil    |
| DTNTR   | Detonator      |
| ..      | .........      |
+---------+----------------+
14 rows in set (1.24 sec)

1.3 检索所有列

SELECT语句可以通过通配符 * 来检索所有列。

1.4 检索不同的行

如上所示,检索列时会列出所有结果,数量太多,我们就需要指定行。解决办法是使用DISTINCT关键字,顾名思义,此关键字指示MySQL 只返回不同的值

mysql> SELECT DISTINCT vend_id FROM products;
+---------+
| vend_id |
+---------+
|    1001 |
|    1002 |
|    1003 |
|    1005 |
+---------+
4 rows in set (1.19 sec)

当利用DISTINCT检索不同列时,只有不同列都相同的结果才会被过滤。

mysql> SELECT DISTINCT vend_id, prod_price FROM products;
+---------+------------+
| vend_id | prod_price |
+---------+------------+
|    1001 |       5.99 |
|    1001 |       9.99 |
|    1001 |      14.99 |
|    1003 |      13.00 |
|    1003 |      10.00 |
|    1003 |       2.50 |
|    1002 |       3.42 |
+---------+------------+
12 rows in set (0.24 sec)

1.5 限制结果

为 了返回第一行或前几行,可使用LIMIT子句。

mysql> SELECT prod_name FROM products
    -> LIMIT 3;
+--------------+
| prod_name    |
+--------------+
| .5 ton anvil |
| 1 ton anvil  |
| 2 ton anvil  |
+--------------+
3 rows in set (1.09 sec)

为得出下一个5行,可指定检索的开始行和行数

mysql> SELECT prod_name FROM products
    -> LIMIT 5,2;
+-----------+
| prod_name |
+-----------+
| Carrots   |
| Fuses     |
+-----------+
2 rows in set (0.24 sec)

注意:第一行是0,所以输入1,1得到的结果是第二行而不是第一行。

1.6 使用完全限定的表名

上面的例子都是通过表名和列名引用某列,我们也可以通过完全限定的名字来引用:

mysql> SELECT products.prod_name
    -> FROM products;
mysql> SELECT products.prod_name
    -> FROM test.products;

2. 排序检索数据

2.1 排序数据

我们之前利用SELECT得到的结果都没有特定的顺序,当然这并不意味着他们是随机出现的。实际上,如果不排序,数据一般将以它在底层表中出现的顺序显示,是最初添加的时候的顺序。

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

mysql> SELECT prod_name,prod_id,vend_id FROM products
    -> ORDER BY vend_id;
+----------------+---------+---------+
| prod_name      | prod_id | vend_id |
+----------------+---------+---------+
| .5 ton anvil   | ANV01   |    1001 |
| 1 ton anvil    | ANV02   |    1001 |
| 2 ton anvil    | ANV03   |    1001 |
| Fuses          | FU1     |    1002 |
| Oil can        | OL1     |    1002 |
| Detonator      | DTNTR   |    1003 |
| Bird seed      | FB      |    1003 |
| JetPack 2000   | JP2000  |    1005 |
+----------------+---------+---------+
14 rows in set (0.24 sec)

2.2 按多个列排序

我们有时候需要对多个列排序,必须显示雇员清单时,我们需要先按姓排序,再按名排序。

mysql> SELECT prod_id,prod_price,vend_id FROM products
    -> ORDER BY prod_price, vend_id;
+---------+------------+---------+
| prod_id | prod_price | vend_id |
+---------+------------+---------+
| FC      |       2.50 |    1003 |
| TNT1    |       2.50 |    1003 |
| FU1     |       3.42 |    1002 |
| SLING   |       4.49 |    1003 |
| ANV01   |       5.99 |    1001 |
| OL1     |       8.99 |    1002 |
| ANV02   |       9.99 |    1001 |
| FB      |      10.00 |    1003 |
| TNT2    |      10.00 |    1003 |
| DTNTR   |      13.00 |    1003 |
+---------+------------+---------+
14 rows in set (0.24 sec)

2.3 指定排序方向

数据的排序不仅局限于升序,从A-Z,还可以降序,使用DESC关键词。

mysql> SELECT prod_id,prod_price,vend_id FROM products
    -> ORDER BY prod_price DESC;
+---------+------------+---------+
| prod_id | prod_price | vend_id |
+---------+------------+---------+
| JP2000  |      55.00 |    1005 |
| OL1     |       8.99 |    1002 |
| ANV01   |       5.99 |    1001 |
| SLING   |       4.49 |    1003 |
| FU1     |       3.42 |    1002 |
| FC      |       2.50 |    1003 |
| TNT1    |       2.50 |    1003 |
+---------+------------+---------+
14 rows in set (0.24 sec)

对多个列降序排序,需要注意DESC的位置。DESC关键字只应用到直接位于其前面的列名。下面的例子中,只有price是降序排名,id还是升序。

mysql> SELECT prod_id,prod_price,vend_id FROM products
    -> ORDER BY prod_price DESC, vend_id;
+---------+------------+---------+
| prod_id | prod_price | vend_id |
+---------+------------+---------+
| JP2000  |      55.00 |    1005 |
| SLING   |       4.49 |    1003 |
| FU1     |       3.42 |    1002 |
| FC      |       2.50 |    1003 |
| TNT1    |       2.50 |    1003 |
+---------+------------+---------+
14 rows in set (0.88 sec)