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)