数据查询WHERE
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)
- 点赞
- 收藏
- 关注作者
评论(0)