SELECT语句的 ORDER BY 子句
排序数据:
使用SELECT语句的 ORDER BY 子句, 根据需要排序检索出的数据。ORDER BY子句其后紧跟一个或多个列的名字, 据此它将对输出进行排序。OREDER BY 作用于其后紧跟的所有列名
mysql> SELECT prod_name -> FROM products -> ORDER BY prod_name; +---------------------+ | prod_name | +---------------------+ | 12 inch teddy bear | | 18 inch teddy bear | | 8 inch teddy bear | | Bird bean bag toy | | Fish bean bag toy | | King doll | | Queen doll | | Rabbit bean bag toy | | Raggedy Ann | +---------------------+ 9 rows in set (0.00 sec)
注意: 在指定一条ORDER BY子句时, 应该保证它是SELECT语句中最后一条子句。 如果它不是最后的子句, 将会出现错误消息。
排序多列:
如下第一个程序所示,如果ORDER BY 其后很有多个列名的话,首先会按照第一个列名先排好序,第一个排好后才对紧跟其后的prod_name进行排序。如果prod_price里面有相同的,则会进行prod_name排序,如果prod_price列中所有的值都是唯一的,则不会按prod_name排序
mysql> SELECT prod_id, prod_price, prod_name -> FROM products -> ORDER BY prod_price, prod_name; +---------+------------+---------------------+ | prod_id | prod_price | prod_name | +---------+------------+---------------------+ | BNBG02 | 3.49 | Bird bean bag toy | | BNBG01 | 3.49 | Fish bean bag toy | | BNBG03 | 3.49 | Rabbit bean bag toy | | RGAN01 | 4.99 | Raggedy Ann | | BR01 | 5.99 | 8 inch teddy bear | | BR02 | 8.99 | 12 inch teddy bear | | RYL01 | 9.49 | King doll | | RYL02 | 9.49 | Queen doll | | BR03 | 11.99 | 18 inch teddy bear | +---------+------------+---------------------+ 9 rows in set (0.00 sec)
mysql> SELECT prod_id, prod_price, prod_name -> FROM products -> ORDER BY 2, 3; +---------+------------+---------------------+ | prod_id | prod_price | prod_name | +---------+------------+---------------------+ | BNBG02 | 3.49 | Bird bean bag toy | | BNBG01 | 3.49 | Fish bean bag toy | | BNBG03 | 3.49 | Rabbit bean bag toy | | RGAN01 | 4.99 | Raggedy Ann | | BR01 | 5.99 | 8 inch teddy bear | | BR02 | 8.99 | 12 inch teddy bear | | RYL01 | 9.49 | King doll | | RYL02 | 9.49 | Queen doll | | BR03 | 11.99 | 18 inch teddy bear | +---------+------------+---------------------+ 9 rows in set (0.00 sec)
上述最后一个例子,ORDER BY 除了能用列名指出排序顺序外, ORDER BY还支持按相对列位置进行排序。
指定排序方向(升序或降序):
数据排序不限于升序排序( 从A到Z) , 这只是默认的排序顺序。
还可以使用ORDER BY子句进行降序( 从Z到A) 排序。 为了进行降序排序, 必须指定 DESC关键字。
mysql> SELECT prod_id, prod_price, prod_name -> FROM products -> ORDER BY prod_price DESC; +---------+------------+---------------------+ | prod_id | prod_price | prod_name | +---------+------------+---------------------+ | BR03 | 11.99 | 18 inch teddy bear | | RYL01 | 9.49 | King doll | | RYL02 | 9.49 | Queen doll | | BR02 | 8.99 | 12 inch teddy bear | | BR01 | 5.99 | 8 inch teddy bear | | RGAN01 | 4.99 | Raggedy Ann | | BNBG01 | 3.49 | Fish bean bag toy | | BNBG02 | 3.49 | Bird bean bag toy | | BNBG03 | 3.49 | Rabbit bean bag toy | +---------+------------+---------------------+ 9 rows in set (0.00 sec)
如果打算用多个列进行降序排列呢?检测只用一个 DESC 的时候是否可以作用于所有的列名
mysql> SELECT prod_id,prod_price, prod_name -> FROM products -> ORDER BY prod_price DESC, prod_name; +---------+------------+---------------------+ | prod_id | prod_price | prod_name | +---------+------------+---------------------+ | BR03 | 11.99 | 18 inch teddy bear | | RYL01 | 9.49 | King doll | | RYL02 | 9.49 | Queen doll | | BR02 | 8.99 | 12 inch teddy bear | | BR01 | 5.99 | 8 inch teddy bear | | RGAN01 | 4.99 | Raggedy Ann | | BNBG02 | 3.49 | Bird bean bag toy | | BNBG01 | 3.49 | Fish bean bag toy | | BNBG03 | 3.49 | Rabbit bean bag toy | +---------+------------+---------------------+ 9 rows in set (0.00 sec)
结果显示是不行的,因为后面的prod_name依然是按照升序进行排列的。
因此,DESC只能作用于其前面的一个列名,而不能作用于所以,如果想要每个列都要进行降序排序,则需要在每个列名的后面加上 DESC 关键字。
因为升序是默认的,所以不需要指定ASC来进行升序排序
(DESC:descending 降序。 ASC:ascending 升序)
上述总结:
1)学习如何使用SELECT语句的ORDER BY 子句对检索出的数据进行排序。而且这个子句必须是SELECT语句中的最后一句子句,这一点必须要注意
SELECT语句的 WHERE 子句:
过滤数据:
数据库表一般包含大量的数据, 很少需要检索表中的所有行。 通常只会根据特定操作或报告的需要提取表数据的子集。 只检索所需数据需要指定搜索条件,搜索条件也称为过滤条件。
mysql> SELECT prod_name, prod_price -> FROM products -> WHERE prod_price = 3.49; +---------------------+------------+ | prod_name | prod_price | +---------------------+------------+ | Fish bean bag toy | 3.49 | | Bird bean bag toy | 3.49 | | Rabbit bean bag toy | 3.49 | +---------------------+------------+ 3 rows in set (0.14 sec)
如上所示,只显示了prod_price = 3.49 的商品名,过滤数据成功
我们知道,ORDER BY子句是用来进行排序的,最顶上也讲清楚了,ORDER BY子句必须作为最后一句子句,因此它应该放在WHERE子句的后面,否则将会产生错误:
mysql> SELECT prod_id, prod_name, prod_price -> FROM products -> WHERE prod_price <= 10 -> ORDER BY prod_price; +---------+---------------------+------------+ | prod_id | prod_name | prod_price | +---------+---------------------+------------+ | BNBG01 | Fish bean bag toy | 3.49 | | BNBG02 | Bird bean bag toy | 3.49 | | BNBG03 | Rabbit bean bag toy | 3.49 | | RGAN01 | Raggedy Ann | 4.99 | | BR01 | 8 inch teddy bear | 5.99 | | BR02 | 12 inch teddy bear | 8.99 | | RYL01 | King doll | 9.49 | | RYL02 | Queen doll | 9.49 | +---------+---------------------+------------+ 8 rows in set (0.00 sec)
上述是排序的,看一下下面,是未使用ORDER BY子句的,也就是未排序的
mysql> SELECT prod_id, prod_name, prod_price -> FROM products -> WHERE prod_price <= 10; +---------+---------------------+------------+ | prod_id | prod_name | prod_price | +---------+---------------------+------------+ | BNBG01 | Fish bean bag toy | 3.49 | | BNBG02 | Bird bean bag toy | 3.49 | | BNBG03 | Rabbit bean bag toy | 3.49 | | BR01 | 8 inch teddy bear | 5.99 | | BR02 | 12 inch teddy bear | 8.99 | | RGAN01 | Raggedy Ann | 4.99 | | RYL01 | King doll | 9.49 | | RYL02 | Queen doll | 9.49 | +---------+---------------------+------------+ 8 rows in set (0.00 sec)
WHERE 子句操作符:
操作符 说 明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
!< 不小于
> 大于
>= 大于等于
!> 不大于
BETWEEN 在指定的两个值之间
IS NULL 为NULL值
上述列出的某些操作符是冗余的( 比如 <> 与 != 相同, !< 相当于 >= )。
不匹配检查:
mysql> SELECT vend_id, prod_name -> FROM products -> WHERE vend_id <> 'DLL01'; -- 这里 <> 与 != 相等,单引号双引号都可以 +---------+--------------------+ | vend_id | prod_name | +---------+--------------------+ | BRS01 | 8 inch teddy bear | | BRS01 | 12 inch teddy bear | | BRS01 | 18 inch teddy bear | | FNG01 | King doll | | FNG01 | Queen doll | +---------+--------------------+ 5 rows in set (0.10 sec)
如果仔细观察上述WHERE子句中的条件, 会看到有的值括在单引号内,而有的值未括起来。 单引号(双引号也可以)用来限定字符串。 如果将值与字符串类型的列进行比较, 就需要限定引号。 用来与数值列进行比较的值不用引号。
范围值检查:BETWEEN AND
mysql> SELECT prod_name, prod_price -> FROM products -> WHERE prod_price BETWEEN 5 AND 10; +--------------------+------------+ | prod_name | prod_price | +--------------------+------------+ | 8 inch teddy bear | 5.99 | | 12 inch teddy bear | 8.99 | | King doll | 9.49 | | Queen doll | 9.49 | +--------------------+------------+ 4 rows in set (0.04 sec)
在使用BETWEEN时, 必须指定两个值——所需范围的低端值和高端值。 这两个值必须用AND关键字分隔。 BETWEEN匹配范围中所有的值, 包括指定的开始值和结束值。
空值检查:
在创建表时, 表设计人员可以指定其中的列能否不包含值。 在一个列不包含值时, 称其包含空值NULL。NULL:无值( no value) , 它与字段包含0、 空字符串或仅仅包含空格不同。
确定值是否为NULL, 不能简单地检查是否= NULL。 SELECT语句有一个特殊的WHERE子句, 可用来检查具有NULL值的列。 这个WHERE子句就是IS NULL子句。
mysql> SELECT cust_name -> FROM customers -> WHERE cust_email IS NULL; +---------------+ | cust_name | +---------------+ | Kids Place | | The Toy Store | +---------------+ 2 rows in set (0.03 sec)
上述语句返回没有cust_email电子邮件地址的行,至于等于0的,也不返回,因为NULL表示无值(即空的)。
mysql> SELECT cust_email -> FROM customers; +-----------------------+ | cust_email | +-----------------------+ | [email protected] | | NULL | | [email protected] | | [email protected] | | NULL | +-----------------------+ 5 rows in set (0.00 sec)
检测是否电子邮件地址是真的NULL。
上述总结:
1) 如何使用SELECT语句的WHERE子句过滤返回的数据。