Chapter 3 ~ 4 (排序检索出的数据 及 过滤数据)

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, 不能简单地检查是否= NULLSELECT语句有一个特殊的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子句过滤返回的数据。

你可能感兴趣的:(Chapter 3 ~ 4 (排序检索出的数据 及 过滤数据))