数据查询WHERE

举报
xcc-2022 发表于 2022/07/26 10:41:17 2022/07/26
【摘要】 13.3 WHERE条件语句在实际的业务场景中,数据表中会含有大量的业务数据,因此往往不会查询数据表中的全部数据。此时就需要根据具体的业务需求,利用某种条件限制,查询数据表中符合条件限制的数据记录。13.3.1 WHERE语句语法格式WHERE语句指定查询语句的条件限制,通过WHERE语句能够查询出数据表中特定的数据记录。语法格式如下:SELECT * FROM table_nameWHER...

13.3 WHERE条件语句

在实际的业务场景中,数据表中会含有大量的业务数据,因此往往不会查询数据表中的全部数据。此时就需要根据具体的业务需求,利用某种条件限制,查询数据表中符合条件限制的数据记录。


13.3.1 WHERE语句语法格式

WHERE语句指定查询语句的条件限制,通过WHERE语句能够查询出数据表中特定的数据记录。

语法格式如下:


SELECT * 
FROM table_name
WHERE condition

或者


SELECT column1 [, column2, … , columnn] 
FROM table_name
WHERE condition

其中,condition表示WHERE子句的查询条件,包含MySQL支持的各种条件限制。


13.3.2 查询单一的特定数据

查询单一数据往往是根据数据表中的主键id或其他字段查询数据表中的单一数据记录,一般使用“=”运算符来实现查询单一的数据记录。

例如,查询t_goods数据表中id为1的数据记录。


mysql> SELECT * FROM t_goods WHERE id = 1;
+----+---------------+-----------------+-------------+---------+---------+---------------------+
| id | t_category_id | t_category      | t_name      | t_price | t_stock | t_upper_time        |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
|  1 |             1 | 女装/女士精品   | T恤         |   39.90 |   1000  | 2020-11-10 00:00:00 |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
1 row in set (0.00 sec)

首先通过指定t_goods数据表的id字段的值为1,查询出t_goods数据表中唯一的一条数据记录。

然后查询t_goods数据表中t_name字段为“连衣裙”的数据记录。


mysql> SELECT * FROM t_goods WHERE t_name = '连衣裙';
+----+---------------+-----------------+-------------+---------+---------+---------------------+
| id | t_category_id | t_category      | t_name      | t_price | t_stock | t_upper_time        |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
|  2 |             1 | 女装/女士精品   | 连衣裙      |   79.90 |   2500  | 2020-11-10 00:00:00 |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
1 row in set (0.00 sec)

通过指定t_goods数据表中的t_name字段值,同样能够查询出特定的数据记录。


13.3.3 查询某个范围内的数据

查询数据表中某个范围内的数据可以使用“>”“>=”“<”“<=”“<>”“!=”等比较运算符来实现。

例如,查询t_goods数据表中id大于3的数据记录。


mysql> SELECT * FROM t_goods WHERE id > 3;
+----+---------------+-----------------+-------------+---------+---------+---------------------+
| id | t_category_id | t_category      | t_name      | t_price | t_stock | t_upper_time        |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
|  4 |             1 | 女装/女士精品   | 牛仔裤      |   89.90 |   3500  | 2020-11-10 00:00:00 |
|  5 |             1 | 女装/女士精品   | 百褶裙      |   29.90 |    500  | 2020-11-10 00:00:00 |
|  6 |             1 | 女装/女士精品   | 呢绒外套    |  399.90 |   1200  | 2020-11-10 00:00:00 |
|  7 |             2 | 户外运动        | 自行车      |  399.90 |   1000  | 2020-11-10 00:00:00 |
|  8 |             2 | 户外运动        | 山地自行车  | 1399.90 |   2500  | 2020-11-10 00:00:00 |
|  9 |             2 | 户外运动        | 登山杖      |   59.90 |   1500  | 2020-11-10 00:00:00 |
| 10 |             2 | 户外运动        | 骑行装备    |  399.90 |   3500  | 2020-11-10 00:00:00 |
| 11 |             2 | 户外运动        | 户外运动外套 |  799.90 |    500  | 2020-11-10 00:00:00 |
| 12 |             2 | 户外运动        | 滑板        |  499.90 |   1200  | 2020-11-10 00:00:00 |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
9 rows in set (0.00 sec)

其他运算符的使用方式与“>”运算符相同,不再赘述。


13.3.4 IN和NOT IN条件语句

IN条件语句可以查询数据表中某个字段的值在IN指定的数据列表中的数据记录,并返回相应的数据。

例如,查询t_goods数据表中id为1、3、6、7、10、12的数据。


mysql> SELECT * FROM t_goods WHERE id IN (1, 3, 6, 7, 10, 12);

+----+---------------+-----------------+-------------+---------+---------+---------------------+
| id | t_category_id | t_category      | t_name      | t_price | t_stock | t_upper_time        |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
|  1 |             1 | 女装/女士精品   | T恤         |   39.90 |   1000  | 2020-11-10 00:00:00 |
|  3 |             1 | 女装/女士精品   | 卫衣        |   79.90 |   1500  | 2020-11-10 00:00:00 |
|  6 |             1 | 女装/女士精品   | 呢绒外套    |  399.90 |   1200  | 2020-11-10 00:00:00 |
|  7 |             2 | 户外运动        | 自行车      |  399.90 |   1000  | 2020-11-10 00:00:00 |
| 10 |             2 | 户外运动        | 骑行装备    |  399.90 |   3500  | 2020-11-10 00:00:00 |
| 12 |             2 | 户外运动        | 滑板        |  499.90 |   1200  | 2020-11-10 00:00:00 |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
6 rows in set (0.00 sec)

NOT IN条件语句可以查询数据不在某个条件范围内的记录。

例如,查询t_goods数据表中id不是1、3、6、7、10、12的数据。


mysql> SELECT * FROM t_goods WHERE id NOT IN (1, 3, 6, 7, 10, 12);
+----+---------------+-----------------+-------------+---------+---------+---------------------+
| id | t_category_id | t_category      | t_name      | t_price | t_stock | t_upper_time        |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
|  2 |             1 | 女装/女士精品   | 连衣裙      |   79.90 |   2500  | 2020-11-10 00:00:00 |
|  4 |             1 | 女装/女士精品   | 牛仔裤      |   89.90 |   3500  | 2020-11-10 00:00:00 |
|  5 |             1 | 女装/女士精品   | 百褶裙      |   29.90 |    500  | 2020-11-10 00:00:00 |
|  8 |             2 | 户外运动        | 山地自行车  | 1399.90 |   2500  | 2020-11-10 00:00:00 |
|  9 |             2 | 户外运动        | 登山杖      |   59.90 |   1500  | 2020-11-10 00:00:00 |
| 11 |             2 | 户外运动        | 户外运动外套 |  799.90 |    500  | 2020-11-10 00:00:00 |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
6 rows in set (0.00 sec)

对比两次查询结果可以看出,IN条件语句和NOT IN条件语句正好相反,IN条件语句查询符合某个条件的记录,而NOT IN条件语句查询不符合某个条件的数据记录。


13.3.5 BETWEEN AND条件语句

BETWEEN AND语句可以用来查询符合某个范围条件的数据,BETWEEN关键字后面紧跟范围的开始值,AND关键字后面紧跟范围的结束值。使用BETWEEN AND语句查询出来的数据包含范围的开始数据和结束数据。

例如,查询t_goods数据表中id范围在6~8的数据记录。


mysql> SELECT * FROM t_goods WHERE id BETWEEN 6 AND 8;
+----+---------------+-----------------+-------------+---------+---------+---------------------+
| id | t_category_id | t_category      | t_name      | t_price | t_stock | t_upper_time        |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
|  6 |             1 | 女装/女士精品   | 呢绒外套    |  399.90 |   1200  | 2020-11-10 00:00:00 |
|  7 |             2 | 户外运动        | 自行车      |  399.90 |   1000  | 2020-11-10 00:00:00 |
|  8 |             2 | 户外运动        | 山地自行车  | 1399.90 |   2500  | 2020-11-10 00:00:00 |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
3 rows in set (0.00 sec)

成功查询出id值为6~8的数据记录,说明使用BETWEEN AND条件语句查询出来的数据包含范围的开始数据和范围的结束数据。


13.3.6 LIKE条件语句

MySQL中支持使用LIKE条件语句进行模糊匹配,通常LIKE语句会和通配符“%”与“_”一起使用。其中,对通配符的说明如下:

·%:通常称为百分号通配符,能够匹配任意长度的字符,甚至是零字符。

·_:通常称为下划线通配符,只能匹配任意单个字符,如果要匹配多个字符,则需要使用多个“_”进行匹配。

1.使用%查询数据

例如,查询t_goods商品数据表中名称以“裙”结尾的数据记录。


mysql> SELECT id, t_name, t_price FROM t_goods WHERE t_name LIKE '%裙';
+----+-------------+---------+
| id | t_name      | t_price |
+----+-------------+---------+
|  2 | 连衣裙      |   79.90 |
|  5 | 百褶裙      |   29.90 |
+----+-------------+---------+
2 rows in set (0.00 sec)

符合条件的有名称为“连衣裙”和“百褶裙”的数据记录,不管“裙”字前面有多少个字符,都能被查询出来。

在条件查询语句中,“%”通配符可以放在查询条件的不同位置。例如,查询t_goods数据表中名称包含“山”的数据记录。


mysql> SELECT id, t_name, t_price FROM t_goods WHERE t_name LIKE '%山%';
+----+-------------+---------+
| id | t_name      | t_price |
+----+-------------+---------+
|  8 | 山地自行车  | 1399.90 |
|  9 | 登山杖      |   59.90 |
+----+-------------+---------+
2 rows in set (0.00 sec)

符合条件的有名称为“山地自行车”和“山杖”的数据记录,不管“山”字前后有多少个字符,都能被SQL语句查询出来。

“%”通配符还能查询以某个字符开头并以某个字符结尾的数据。例如,查询t_goods数据表中类别名称以“女装”开头,并以“精品”结尾的数据记录。


mysql> SELECT id, t_category, t_name, t_price 
    -> FROM t_goods
    -> WHERE t_category LIKE '女装%精品';
+----+-----------------+-------------+---------+
| id | t_category      | t_name      | t_price |
+----+-----------------+-------------+---------+
|  1 | 女装/女士精品   | T恤         |   39.90 |
|  2 | 女装/女士精品   | 连衣裙      |   79.90 |
|  3 | 女装/女士精品   | 卫衣        |   79.90 |
|  4 | 女装/女士精品   | 牛仔裤      |   89.90 |
|  5 | 女装/女士精品   | 百褶裙      |   29.90 |
|  6 | 女装/女士精品   | 呢绒外套    |  399.90 |
+----+-----------------+-------------+---------+
6 rows in set (0.00 sec)

可以看出,百分号通配符“%”能够匹配指定位置任意长度的字符。

2.使用_查询数据

例如,查询t_goods数据表中以名称“车”结尾,前面只有2个字的数据记录。


mysql> SELECT id, t_category, t_name, t_price 
    -> FROM t_goods
    -> WHERE t_name LIKE '__车';
+----+-----------------+-------------+---------+
| id | t_category      | t_name      | t_price |
+----+-----------------+-------------+---------+
|  7 | 户外运动        | 自行车      |  399.90 |
+----+-----------------+-------------+---------+
1 row in set (0.00 sec)

符合条件的只有名称为“自行车”的一行数据记录。

注意:当LIKE条件语句没有配合使用“%”或“_”通配符时,查询条件限制与“=”相同。

例如,查询t_goods数据表中名称为“T恤”的数据记录。


mysql> SELECT id, t_category, t_name, t_price 
    -> FROM t_goods
    -> WHERE t_name LIKE 'T';
Empty set (0.00 sec)

当LIKE条件语句没有使用“%”或“_”通配符时,直接输入T无法查询出名称为“T恤”的数据记录。修改SQL语句,再次查询名称为“T恤”的数据记录。


mysql> SELECT id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE t_name LIKE 'T恤';
+----+-----------------+-------------+---------+
| id | t_category      | t_name      | t_price |
+----+-----------------+-------------+---------+
|  1 | 女装/女士精品   | T恤         |   39.90 |
+----+-----------------+-------------+---------+
1 row in set (0.00 sec)

查询完整的“T恤”名称时,显示正确查询出了结果数据,说明LIKE条件语句没有配合使用“%”或“_”通配符时,查询条件限制与“=”相同。


13.3.7 空值条件限制语句

MySQL中的空值包含NULL和空字符串。当匹配NULL值条件时,使用IS NULL和IS NOT NULL,当匹配空字符串时,使用“=”“<>”“!=”。

向t_goods数据表中插入两条名称为空字符串,上架时间为NULL的数据记录。


mysql> INSERT INTO t_goods 
    -> (t_category_id, t_category, t_name, t_price, t_stock, t_upper_time)
    -> VALUES 
    -> (1, '女装/女士精品', '', 399.90, 1200, NULL),
    -> (2, '户外运动', '', 499.90, 1200, NULL);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

SQL语句执行成功。

1.匹配NULL值

例如,查询t_goods数据表中上架时间为NULL的数据。


mysql> SELECT id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE t_upper_time IS NULL;
+----+-----------------+-------------+---------+
| id | t_category      | t_name      | t_price |
+----+-----------------+-------------+---------+
| 13 | 女装/女士精品   |              |  399.90 |
| 14 | 户外运动        |              |  499.90 |
+----+-----------------+-------------+---------+
2 rows in set (0.00 sec)

IS NOT NULL与IS NULL相反,用于查询数据表中某个字段的值不是NULL的数据记录。

例如,查询t_goods数据表中上架时间不为NULL的数据。


mysql> SELECT id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE t_upper_time IS NOT NULL;
+----+----------------+-------------+---------+
| id | t_category     | t_name       | t_price |
+----+----------------+-------------+---------+
|  1 | 女装/女士精品  | T恤         |   39.90 |
|  2 | 女装/女士精品  | 连衣裙       |   79.90 |
|  3 | 女装/女士精品  | 卫衣         |   79.90 |
|  4 | 女装/女士精品  | 牛仔裤       |   89.90 |
|  5 | 女装/女士精品  | 百褶裙       |   29.90 |
|  6 | 女装/女士精品  | 呢绒外套     |  399.90 |
|  7 | 户外运动        | 自行车       |  399.90 |
|  8 | 户外运动        | 山地自行车   | 1399.90 |
|  9 | 户外运动        | 登山杖       |   59.90 |
| 10 | 户外运动        | 骑行装备     |  399.90 |
| 11 | 户外运动        | 户外运动外套 |  799.90 |
| 12 | 户外运动        | 滑板         |  499.90 |
+----+----------------+-------------+---------+
12 rows in set (0.00 sec)

2.匹配空字符串

例如,查询t_goods数据表中名称为空字符串的数据。


mysql> SELECT id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE t_name = '';
+----+-----------------+-------------+---------+
| id | t_category      | t_name      | t_price |
+----+-----------------+-------------+---------+
| 13 | 女装/女士精品   |              |  399.90 |
| 14 | 户外运动        |              |  499.90 |
+----+-----------------+-------------+---------+
2 rows in set (0.00 sec)

使用“<>”或“!=”运算符能够查询数据表中某个字段的值不是空字符串的数据。例如,查询t_goods数据表中名称不是空字符串的数据。


mysql> SELECT id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE t_name <> '';
+----+----------------+-------------+---------+
| id | t_category     | t_name       | t_price |
+----+----------------+-------------+---------+
|  1 | 女装/女士精品  | T恤         |   39.90 |
|  2 | 女装/女士精品  | 连衣裙       |   79.90 |
|  3 | 女装/女士精品  | 卫衣         |   79.90 |
|  4 | 女装/女士精品  | 牛仔裤       |   89.90 |
|  5 | 女装/女士精品  | 百褶裙       |   29.90 |
|  6 | 女装/女士精品  | 呢绒外套     |  399.90 |
|  7 | 户外运动        | 自行车       |  399.90 |
|  8 | 户外运动        | 山地自行车   | 1399.90 |
|  9 | 户外运动        | 登山杖       |   59.90 |
| 10 | 户外运动        | 骑行装备     |  399.90 |
| 11 | 户外运动        | 户外运动外套 |  799.90 |
| 12 | 户外运动        | 滑板         |  499.90 |
+----+----------------+-------------+---------+
12 rows in set (0.00 sec)


13.3.8 AND语句

AND语句可以连接多个查询条件,只有当同时满足AND连接的多个查询条件时,记录才会被返回。

例如,查询t_goods数据表中名称包含“车”,并且id范围在3~7的数据记录。


mysql> SELECT id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE t_name LIKE '%车%'
    -> AND id BETWEEN 3 AND 7;
+----+----------------+-------------+---------+
| id | t_category     | t_name       | t_price |
+----+----------------+-------------+---------+
|  7 | 户外运动        | 自行车       |  399.90 |
+----+----------------+-------------+---------+
1 row in set (0.00 sec)

在t_goods数据表中,同时满足名称中包含“车”,并且id范围在3~7的数据记录只有名称为“自行车”的一行数据记录。


13.3.9 OR语句

OR语句可以连接多个查询条件,只要满足OR语句连接的多个条件中的一个条件,数据记录即可被返回。

例如,查询t_goods数据表中名称包含“车”,或者id范围在3~7的数据记录。


mysql> SELECT id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE t_name LIKE '%车%'
    -> OR id BETWEEN 3 AND 7;
+----+----------------+-------------+---------+
| id | t_category     | t_name       | t_price |
+----+----------------+-------------+---------+
|  3 | 女装/女士精品  | 卫衣         |   79.90 |
|  4 | 女装/女士精品  | 牛仔裤       |   89.00 |
|  5 | 女装/女士精品  | 百褶裙       |   29.90 |
|  6 | 女装/女士精品  | 呢绒外套     |  399.90 |
|  7 | 户外运动        | 自行车       |  399.90 |
|  8 | 户外运动        | 山地自行车   | 1399.90 |
+----+----------------+-------------+---------+
6 rows in set (0.00 sec)


13.3.10 DISTINCT语句

DISTINCT关键字可以对查询出的结果数据进行去重处理,语法格式如下:


SELECT DISTINCT column FROM table_name

例如,不使用DISTINCT关键字查询t_goods数据表中的商品类别信息。


mysql> SELECT t_category_id, t_category FROM t_goods;
+---------------+----------------+
| t_category_id | t_category     |
+---------------+----------------+
|              1 | 女装/女士精品  |
|              1 | 女装/女士精品  |
|              1 | 女装/女士精品  |
|              1 | 女装/女士精品  |
|              1 | 女装/女士精品  |
|              1 | 女装/女士精品  |
|              2 | 户外运动        |
|              2 | 户外运动        |
|              2 | 户外运动        |
|              2 | 户外运动        |
|              2 | 户外运动        |
|              2 | 户外运动        |
|              1 | 女装/女士精品  |
|              2 | 户外运动        |
+---------------+----------------+
14 rows in set (0.00 sec)

商品类别信息数据有很多重复的数据行。

使用DISTINCT关键字进行去重处理。


mysql> SELECT DISTINCT t_category_id, t_category FROM t_goods;
+---------------+----------------+
| t_category_id | t_category     |
+---------------+----------------+
|              1 | 女装/女士精品  |
|              2 | 户外运动        |
+---------------+----------------+
2 rows in set (0.00 sec)

使用DISTINCT关键字查询数据,可以去掉结果数据中重复的记录行。


13.3.11 ORDER BY语句

MySQL支持使用ORDER BY语句对查询结果集进行排序处理,使用ORDER BY语句不仅支持对单列数据的排序,还支持对数据表中多列数据的排序。

语法格式如下:


SELECT * | column1 [,column2, … ,columnn] FROM table_name
[WHERE condition] ORDER BY column1 [ASC | DESC, column2 [ASC | DESC], … , 
columnn [ASC | DESC]]

1.对单列数据进行排序

例如,查询t_goods数据表中的数据,并按照t_stock字段进行升序排序。


mysql> SELECT id, t_category, t_name, t_price, t_stock
    -> FROM t_goods
    -> ORDER BY t_stock;
+----+----------------+-------------+---------+---------+
| id | t_category     | t_name       | t_price | t_stock |
+----+----------------+-------------+---------+---------+
|  5 | 女装/女士精品  | 百褶裙       |   29.90 |    500  |
| 11 | 户外运动        | 户外运动外套 |  799.90 |    500  |
|  1 | 女装/女士精品  | T恤         |   39.90 |   1000  |
|  7 | 户外运动        | 自行车       |  399.90 |   1000  |
|  6 | 女装/女士精品  | 呢绒外套     |  399.90 |   1200  |
| 12 | 户外运动        | 滑板         |  499.90 |   1200  |
|  3 | 女装/女士精品  | 卫衣         |   79.90 |   1500  |
|  9 | 户外运动        | 登山杖       |   59.90 |   1500  |
|  2 | 女装/女士精品  | 连衣裙       |   79.90 |   2500  |
|  8 | 户外运动        | 山地自行车   | 1399.90 |   2500  |
|  4 | 女装/女士精品  | 牛仔裤       |   89.90 |   3500  |
| 10 | 户外运动        | 骑行装备     |  399.90 |   3500  |
+----+----------------+-------------+---------+---------+
12 rows in set (0.00 sec)

由结果可知,结果数据按照t_stock字段进行了升序排序。

2.对多列数据进行排序

例如,查询t_goods数据表中的数据,先按照t_stock字段排序,再按照id字段排序。


mysql> SELECT id, t_category, t_name, t_price, t_stock
    -> FROM t_goods
    -> ORDER BY t_stock, id;
+----+----------------+-------------+---------+---------+
| id | t_category     | t_name       | t_price | t_stock |
+----+----------------+-------------+---------+---------+
|  5 | 女装/女士精品  | 百褶裙       |   29.90 |    500  |
| 11 | 户外运动        | 户外运动外套 |  799.90 |    500  |
|  1 | 女装/女士精品  | T恤         |   39.90 |   1000  |
|  7 | 户外运动        | 自行车       |  399.90 |   1000  |
|  6 | 女装/女士精品  | 呢绒外套     |  399.90 |   1200  |
| 12 | 户外运动        | 滑板         |  499.90 |   1200  |
|  3 | 女装/女士精品  | 卫衣         |   79.90 |   1500  |
|  9 | 户外运动        | 登山杖       |   59.90 |   1500  |
|  2 | 女装/女士精品  | 连衣裙       |   79.90 |   2500  |
|  8 | 户外运动        | 山地自行车   | 1399.90 |   2500  |
|  4 | 女装/女士精品  | 牛仔裤       |   89.90 |   3500  |
| 10 | 户外运动        | 骑行装备     |  399.90 |   3500  |
+----+----------------+-------------+---------+---------+

注意:当在MySQL中使用ORDER BY对多列数据进行排序时,只有当第一列的数据相同时才会对第二列的数据进行排序。如果第一列的数据不同,则只会对第一列的数据进行排序,而不会对第二列的数据进行排序。如果ORDER BY后面有更多的表字段,依然遵循当前面字段相同时才会对后面的字段数据排序,否则不会对后面的字段数据排序的规则。

3.排序时指定方向

ORDER BY语句使用ASC按照字段的数据进行升序排列,使用DESC按照字段的数据进行降序排列。

例如,查询t_goods数据表中的数据,并按照id字段进行降序排列。


mysql> SELECT id, t_category, t_name, t_price, t_stock
    -> FROM t_goods
    -> ORDER BY id DESC;
+----+----------------+-------------+---------+---------+
| id | t_category     | t_name       | t_price | t_stock |
+----+----------------+-------------+---------+---------+
| 12 | 户外运动        | 滑板         |  499.90 |   1200  |
| 11 | 户外运动        | 户外运动外套 |  799.90 |    500  |
| 10 | 户外运动        | 骑行装备     |  399.90 |   3500  |
|  9 | 户外运动        | 登山杖       |   59.90 |   1500  |
|  8 | 户外运动        | 山地自行车   | 1399.90 |   2500  |
|  7 | 户外运动        | 自行车       |  399.90 |   1000  |
|  6 | 女装/女士精品  | 呢绒外套     |  399.90 |   1200  |
|  5 | 女装/女士精品  | 百褶裙       |   29.90 |    500  |
|  4 | 女装/女士精品  | 牛仔裤       |   89.90 |   3500  |
|  3 | 女装/女士精品  | 卫衣         |   79.90 |   1500  |
|  2 | 女装/女士精品  | 连衣裙       |   79.90 |   2500  |
|  1 | 女装/女士精品  | T恤         |   39.90 |   1000  |
+----+----------------+-------------+---------+---------+
12 rows in set (0.00 sec)

可以看到,查询的结果数据按照id字段进行了降序排列。

ORDER BY语句支持对一个字段进行升序排列,同时对另一个字段进行降序排列。例如,查询t_goods数据表中的数据,按照t_stock字段进行升序排列,并且按照id字段进行降序排列。


mysql> SELECT id, t_category, t_name, t_price, t_stock
    -> FROM t_goods
    -> ORDER BY t_stock ASC, id DESC;
+----+----------------+-------------+---------+---------+
| id | t_category     | t_name       | t_price | t_stock |
+----+----------------+-------------+---------+---------+
| 11 | 户外运动        | 户外运动外套 |  799.90 |    500  |
|  5 | 女装/女士精品  | 百褶裙       |   29.90 |    500  |
|  7 | 户外运动        | 自行车       |  399.90 |   1000  |
|  1 | 女装/女士精品  | T恤         |   39.90 |   1000  |
| 12 | 户外运动        | 滑板         |  499.90 |   1200  |
|  6 | 女装/女士精品  | 呢绒外套     |  399.90 |   1200  |
|  9 | 户外运动        | 登山杖       |   59.90 |   1500  |
|  3 | 女装/女士精品  | 卫衣         |   79.90 |   1500  |
|  8 | 户外运动        | 山地自行车   | 1399.90 |   2500  |
|  2 | 女装/女士精品  | 连衣裙       |   79.90 |   2500  |
| 10 | 户外运动        | 骑行装备     |  399.90 |   3500  |
|  4 | 女装/女士精品  | 牛仔裤       |   89.90 |   3500  |
+----+----------------+-------------+---------+---------+
12 rows in set (0.00 sec)

结果数据先按照t_stock字段进行升序排列,当t_stock字段相同时,按照id字段进行降序排列。

注意:直接使用ORDER BY语句后面跟上字段名称时,默认按照字段的数据进行升序排列。


13.3.12 GROUP BY语句

MySQL支持按照某个字段或者多个字段进行分组,并使用GROUP BY语句实现对结果数据的分组处理,语法格式如下:


SELECT * | column1 [,column2, … ,columnn] FROM table_name
[WHERE condition] GROUP BY column

GROUP BY语句通常和COUNT()、MAX()、MIN()、SUM()及AVG()函数一起使用。例如,对t_goods数据表中的数据按照商品类别进行分组,并查询每组类别中的商品数量。


mysql> SELECT t_category_id, COUNT(*) 
    -> FROM t_goods
    -> GROUP BY t_category_id;
+---------------+----------+
| t_category_id | COUNT(*) |
+---------------+----------+
|             1 |        6 |
|             2 |        6 |
+---------------+----------+
2 rows in set (0.00 sec)

每个商品类别中包含6个商品。

可以使用GROUP_CONCAT()函数结合GROUP BY分组,将每个商品分类中的商品名称显示出来。


mysql> SELECT t_category_id, GROUP_CONCAT(t_name)
    -> FROM t_goods
    -> GROUP BY t_category_id;
+---------------+-------------------------------------------------------+
| t_category_id | GROUP_CONCAT(t_name)                                  |
+---------------+-------------------------------------------------------+
|       1       | T恤,连衣裙,卫衣,牛仔裤,百褶裙,呢绒外套               |
|       2       | 自行车,山地自行车,登山杖,骑行装备,户外运动外套,滑板   |
+---------------+-------------------------------------------------------+
2 rows in set (0.00 sec)

由结果数据可以看出,使用GROUP_CONCAT()函数结合GROUP BY分组能够将每个商品类别中的商品名称拼接到一起显示出来。

GROUP BY语句还支持对多个字段进行分组。例如,查询t_goods数据表中的数据,并按照t_category_id字段和t_name字段进行分组。


mysql> SELECT t_category_id, t_name
    -> FROM t_goods
    -> GROUP BY t_category_id, t_name;
+---------------+-------------+
| t_category_id | t_name       |
+---------------+-------------+
|              1 | T恤         |
|              1 | 连衣裙       |
|              1 | 卫衣         |
|              1 | 牛仔裤       |
|              1 | 百褶裙       |
|              1 | 呢绒外套     |
|              2 | 自行车       |
|              2 | 山地自行车   |
|              2 | 登山杖       |
|              2 | 骑行装备     |
|              2 | 户外运动外套 |
|              2 | 滑板         |
+---------------+-------------+
12 rows in set (0.00 sec)


13.3.13 HAVING语句

HAVING语句主要对GROUP BY语句进行条件限制,在使用GROUP BY语句对查询数据进行分组时,只有满足HAVING条件的分组数据才会被显示。

例如,按照商品类别对t_goods数据表中的数据进行分组,并且显示总价格大于1000的分组数据。


mysql> SELECT t_category_id, GROUP_CONCAT(t_name)
    -> FROM t_goods
    -> GROUP BY t_category_id
    -> HAVING SUM(t_price) > 1000;
+---------------+----------------------------------------------------+
| t_category_id | GROUP_CONCAT(t_name)                               |
+---------------+----------------------------------------------------+
|             2 | 自行车,山地自行车,登山杖,骑行装备,户外运动外套,滑板|
+---------------+----------------------------------------------------+
1 row in set (0.00 sec)

结果显示,满足HAVING条件的分组只有一个。


13.3.14 WITH ROLLUP语句

WITH ROLLUP语句通常在GROUP BY语句中使用,在GROUP BY语句中添加WITH ROLLUP语句后会在查询出的分组记录的最后显示一条记录,显示本次查询出的所有记录的总和信息。

例如,查询t_goods数据表中的数据,并按照t_category_id字段分组,同时显示查询出的结果记录的总和信息。


mysql> SELECT t_category_id, COUNT(*)
    -> FROM t_goods
    -> GROUP BY t_category_id
    -> WITH ROLLUP;
+---------------+----------+
| t_category_id | COUNT(*) |
+---------------+----------+
|             1 |        6 |
|             2 |        6 |
|          NULL |       12 |
+---------------+----------+
3 rows in set (0.00 sec)

由结果显示可以看出,最后一行COUNT(*)列的值是上面所有记录数值的总和。


13.3.15 对数据同时进行分组与排序

MySQL支持对数据进行分组的同时对数据进行排序操作,可以通过GROUP BY语句与ORDER BY语句一起使用来实现这个效果。

例如,查询t_goods数据表中的数据,按照t_category_id字段分组,并按照t_category_id字段进行降序排列。


mysql> SELECT t_category_id, GROUP_CONCAT(t_name)
    -> FROM t_goods
    -> GROUP BY t_category_id
    -> ORDER BY t_category_id DESC;
+---------------+----------------------------------------------------+
| t_category_id | GROUP_CONCAT(t_name)                               |
+---------------+----------------------------------------------------+
|             2 | 滑板,户外运动外套,骑行装备,登山杖,山地自行车,自行车|
|             1 | 呢绒外套,百褶裙,牛仔裤,卫衣,连衣裙,T恤             |
+---------------+----------------------------------------------------+
2 rows in set (0.00 sec)

注意:在GROUP BY语句中,不能同时使用WITH ROLLUP语句和ORDER BY语句。

例如,分组查询t_goods数据表中的数据,并同时使用WITH ROLLUP语句和ORDER BY语句。


mysql> SELECT t_category_id, GROUP_CONCAT(t_name)
    -> FROM t_goods
    -> GROUP BY t_category_id
    -> ORDER BY t_category_id DESC
    -> WITH ROLLUP;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL 
server version for the right syntax to use near 'WITH ROLLUP' at line 5

可以看到,在GROUP BY语句中同时使用ORDER BY语句和WITH ROLLUP语句,MySQL会抛出错误信息。


13.3.16 LIMIT语句

LIMIT语句可以限制返回结果的记录行数,也可以实现分页查询。语法格式如下:


LIMIT [m], n

语法格式说明如下:

·m:表示从哪一行开始显示,可以省略。如果省略,则表示从数据表的第一行开始显示。

·n:表示返回结果数据的行数。

例如,查询t_goods数据表中的前3行数据。


mysql> SELECT id, t_category, t_name, t_price, t_stock
    -> FROM t_goods
    -> LIMIT 3;
+----+----------------+------------+---------+---------+
| id | t_category     | t_name      | t_price | t_stock |
+----+----------------+------------+---------+---------+
|  1 | 女装/女士精品  | T恤        |   39.90 |   1000  |
|  2 | 女装/女士精品  | 连衣裙      |   79.90 |   2500  |
|  3 | 女装/女士精品  | 卫衣        |   79.90 |   1500  |
+----+----------------+------------+---------+---------+
3 rows in set (0.00 sec)

查询t_goods数据表中从第6条数据开始,行数为4的记录。


mysql> SELECT id, t_category, t_name, t_price, t_stock
    -> FROM t_goods
    -> LIMIT 6, 4;
+----+----------------+------------+---------+---------+
| id | t_category     | t_name      | t_price | t_stock |
+----+----------------+------------+---------+---------+
|  7 | 户外运动        | 自行车      |  399.90 |   1000  |
|  8 | 户外运动        | 山地自行车  | 1399.90 |   2500  |
|  9 | 户外运动        | 登山杖      |   59.90 |   1500  |
| 10 | 户外运动        | 骑行装备    |  399.90 |   3500  |
+----+----------------+------------+---------+---------+
4 rows in set (0.00 sec)

注意:如果明确指定开始记录,查询表中的第一行数据时使用LIMIT 0,1,而不是LIMIT 1,1。另外,LIMIT m,n执行的效果与LIMIT n OFFSET m执行的效果相同。

查询t_goods数据表中从第6条数据开始,且行数为4的记录,也可以使用如下SQL语句执行:


mysql> SELECT id, t_category, t_name, t_price, t_stock
    -> FROM t_goods
    -> LIMIT 4 OFFSET 6;
+----+----------------+------------+---------+---------+
| id | t_category     | t_name      | t_price | t_stock |
+----+----------------+------------+---------+---------+
|  7 | 户外运动        | 自行车      |  399.90 |   1000  |
|  8 | 户外运动        | 山地自行车  | 1399.90 |   2500  |
|  9 | 户外运动        | 登山杖      |   59.90 |   1500  |
| 10 | 户外运动        | 骑行装备    |  399.90 |   3500  |
+----+----------------+------------+---------+---------+
4 rows in set (0.00 sec)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。