检索数据
Posted 霖行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检索数据相关的知识,希望对你有一定的参考价值。
检索数据
本章将介绍如何使用SELECT语句从表中检索一个或多个数据列。
SELECT语句
SQL语句是由简单的英语单词关键字构成的,每个SQL语句都由一个或多个关键字构成。最常用的SQL语句就是SELECT语句,它的用途是从一个或多个表中检索信息。
使用SELECT检索表数据,必须有两个信息:
- 从什么地方选择。
- 要选择什么。
检索单个列
最简单的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)
这条语句在功能上也等于上一个例子。
以上是关于检索数据的主要内容,如果未能解决你的问题,请参考以下文章