MySQL必知必会——第四章检索数据

检索数据

本章将介绍如何使用SELECT语句从表中检索一个或多个数据列。

SELECT语句

SQL语句是由简单的英语单词关键字构成的,每个SQL语句都由一个或多个关键字构成。最常用的SQL语句就是SELECT语句,它的用途是从一个或多个表中检索信息。

使用SELECT检索表数据,必须有两个信息:

  1. 从什么地方选择。
  2. 要选择什么。

检索单个列

最简单的SQL 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) |
+----------------+
14 rows in set (0.03 sec)

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

如上的一条简单SELECT语句将返回表中所有行。数据没有过滤,也没有排序。

  • 未排序数据 如果读者自己尝试这个查询,可能会发现显示输出的数据顺序与上文不同。这种情况很正常。如果没有明确排序查询结果,则返回的数据的顺序没有特殊意义。只要返回相同数目的行就是正常的。
  • 结束SQL语句 多条SQL语句必须以分号(;)分隔。
  • SQL语句和大小写 SQL语句不区分大小写。为使代码易于阅读和调试,我们习惯将关键字全部大写,将所有列和表名全部小写。
  • 使用空格 处理SQL语句时,其中所有空格都被忽略。为了代码可读性,我们可以将语句分为多行。

检索多个列

检索多个列与检索单个列唯一不同的是,SELECT关键字后拥有多个列名,列名间用逗号分隔。

下面SELECT语句从products表中选择3列:

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 |
+---------+----------------+------------+
14 rows in set (0.00 sec)

与前一个例子一样,这条语句使用SELECT语句从表products中检索数据。但指定了三个列名,列名间用逗号分隔。

  • 数据表示 SQL语句一般返回原始的、无格式的数据。因此数据格式化显示(对齐、符号、分隔)一般在显示该数据的应用程序中规定。

检索所有列

除了指定列外,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                                    |
+---------+---------+----------------+------------+----------------------------------------------------------------+
14 rows in set (0.00 sec)

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

  • 使用通配符 通配符很方便,但检索不需要的列通常会降低检索和应用程序的性能。所有没有使用必要时,不使用。
  • 检索未知列 通配符有一大优点。能检索出名字未知的列。

检索不同的行

如果我们想要products表中所有供应商ID:

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

SELECT语句返回14行(即使表中只有4个供应商),因为products表中有14个产品记录。这与我们的预期结果不符。

为了解决重复的数据,我们使用DISTINCT关键字,此关键字指示MySQL只返回不同的值。

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

SELECT DISTINCT vend_id告诉MySQL只返回不同的vend_id行,因此只返回4行。如果使用DISTINCT关键字,它必须放在所有列名的前面。

  • 不能部分使用DISTINCT DISTINCT关键字应用于所有列而不仅是前置它的列。

限制结果

SELECT语句返回所有匹配的行。但我们可以使用LIMIT子句来返回第一行或前几行:

mysql> SELECT prod_name
    -> FROM products
    -> LIMIT 5;
+--------------+
| prod_name    |
+--------------+
| .5 ton anvil |
| 1 ton anvil  |
| 2 ton anvil  |
| Detonator    |
| Bird seed    |
+--------------+
5 rows in set (0.00 sec)

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

我们还可以指定要检索的开始行和行数,例如得出上个结果的下一个5行:

mysql> SELECT prod_name
    -> FROM products
    -> LIMIT 5, 5;
+--------------+
| prod_name    |
+--------------+
| Carrots      |
| Fuses        |
| JetPack 1000 |
| JetPack 2000 |
| Oil can      |
+--------------+
5 rows in set (0.00 sec)

LIMIT 5, 5指示MySQL返回从行5开始的5行。第一个数为开始位置,第二个数为要检索的行数。

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

  • 行0 第一行的行号为0而不是1。所以,LIMIT 1, 1将返回第二行。
  • 行数不够时 LIMIT中指定的行数为检索的最大行数。若行数不足最大行数,将只会检索出所有的行。即行数可能不等于最大行数。
  • MySQL 5的LIMIT语法 LIMIT中的开始行与最大行数容易弄混,所有MySQL 5支持LIMIT的另一个语法,将逗号改成关键字OFFSET。例如,LIMIT 5 OFFSET 5。

使用完全限定的表名

目前的SQL语句的例子只通过列名引用列。但为了区分不同表中可能存在相同的列名,我们可以使用完全限定的名字来引用列(同时使用表名和列名):

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) |
+----------------+
14 rows in set (0.01 sec)

这条语句在功能上等于本章最开始的那条语句,但这里指定了一个完全限定的列名。

表名也可以是完全限定的(同时使用数据库名和表名):

mysql> SELECT products.prod_name
    -> FROM crashcourse.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) |
+----------------+
14 rows in set (0.00 sec)

这条语句在功能上也等于上一个例子。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霖行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值