单表查询
1、数据库管理系统的一个最重要的功能就是数据查询,数据查询不应只是简单的查询数据库中存储的数据,还应根据需要对数据进行筛选,以及确定数据以什么样的格式显示
2、MySQL从数据表中查询数据的基本语句为SELECT语句
3、单表查询是指从一张表中查询所需数据
4、查询方式主要有:查询所有字段、查询指定字段、查询指定记录、查询空值、多条件的查询、对查询结果进行排序等
注:本次查询的数据基于下图,可能会临时更改里面的某些值
查询所有字段
1、语法:在SELECT语句中使用星号(*)通配符查询所有字段
⑴SELECT * FROM 表名;
2、作用:使用星号通配符时,将返回所有列,列按照定义表的时候的顺序显示
例1:
mysql> SELECT * FROM polls_article;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 7 | wed | dwd | 123 | 32 | 2020-10-13 17:08:50.493488 |
| 8 | ds | dwd | 123 | 32 | 2020-10-13 17:19:18.121264 |
+----+-----------+----------------+-------+--------+----------------------------+
6 rows in set (0.00 sec)
查询指定字段
1、一个数据库表中会存在很多列,在查询数据时,可能有些列的数据是我们不需要的。因此就可以在查询语句中限制查询的列
查询单个字段
1、语法:SELECT 列名 FROM 表名;
2、作用:查询表中的某一个字段(列)
例2:
mysql> SELECT title FROM polls_article;
+-----------+
| title |
+-----------+
| 三国演义 |
| 三国演义1 |
| 红楼梦 |
| 水浒传 |
| wed |
| ds |
+-----------+
6 rows in set (0.00 sec)
查询多个字段
1、使用SELECT语句,可以获取多字段下的数据
⑴只需要在关键之SELECT之后指定要查找的字段的名称。不同字段名称之间使用英文逗号(,)分隔开,最后一个字段名后需要加逗号
2、语法:SELECT 字段名1,字段名2,...,字段名n FROM 表名
例2_1:
mysql> SELECT title,price,author FROM polls_article;
+-----------+-------+--------+
| title | price | author |
+-----------+-------+--------+
| 三国演义 | 132 | 吴承恩 |
| 三国演义1 | 154 | 罗贯中 |
| 红楼梦 | 154 | 曹雪芹 |
| 水浒传 | 140 | 施耐庵 |
| wed | 123 | 32 |
| ds | 123 | 32 |
+-----------+-------+--------+
6 rows in set (0.00 sec)
查询指定数据
1、数据库中包含了大量的数据。但是在实际中可能我们需要的并不是全部的数据,而是其中的一部分(满足某些条件的数据)
2、因此,更多的时候,我们在查询数据的时候,需要对数据进行一些过滤。只返回我们需要的那部分数据
3、在SELECT语句中,通过WHERE子句对数据进行过滤
4、语法为:SELECT 字段名1,字段名2,...,字段名n FROM 表名 WHERE 查询条件
where子句操作符
1、在根据条件过滤数据时,一般会有以下的一些过滤操作符
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
is null | 值为null |
is not null | 值不为null |
例3:
-- 查询价格大于140的图书
mysql> SELECT * FROM polls_article WHERE price > 140;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
+----+-----------+----------------+-------+--------+----------------------------+
2 rows in set (0.00 sec)
例3_1:
-- 查询作者为'曹雪芹'的图书部分信息
mysql> SELECT id,title,author,create_time FROM polls_article WHERE author = '曹雪芹';
+----+--------+--------+----------------------------+
| id | title | author | create_time |
+----+--------+--------+----------------------------+
| 3 | 红楼梦 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
+----+--------+--------+----------------------------+
1 row in set (0.00 sec)
例3_2:
--查询创建时间在某个时间之前的数据
mysql> SELECT * FROM polls_article WHERE create_time <= '2020-09-13 12:48:30.962070';
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
+----+-----------+----------------+-------+--------+----------------------------+
3 rows in set (0.00 sec)
注:
1、这里介绍部分过滤条件,其他几个比较特殊的后面单独介绍
2、这些SQL语句表示:从polls_article表中查询指定列,但不返回所有行,只返回对应符合条件的数据行
带IN关键字的查询
1、IN操作符用来查询满足指定范围内的条件的数据(IN操作完成与OR相同的功能)
2、使用IN操作符,将所有检索条件用圆括号括起来,检索条件之间使用逗号分隔。只要满足条件范围内的一个值即为匹配项
3、相反的,可以使用NOT来检索不再条件范围内的数据(表示与IN相反的意思,即不在这些列表项内选择)
4、IN列表项不仅支持数字,也支持字符甚至时间日期类型等,并且可以将这些不同类型的数据项混合排列
5、一个IN只能对一个字段进行范围比对,如果要指定更多字段,可以使用AND或OR逻辑运算符
例4:
-- 查询价格是130或154或140的图书信息
mysql> SELECT * FROM polls_article WHERE price IN (130,154,140);
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
+----+-----------+----------------+-------+--------+----------------------------+
3 rows in set (0.00 sec)
例4_1:
-- 查询价格不是160、123的图书信息
mysql> SELECT * FROM polls_article WHERE price NOT IN (160,123);
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
+----+-----------+----------------+-------+--------+----------------------------+
例4_2:
-- 查询id是1或2或3内且价格为132或123的图书信息
mysql> SELECT * FROM polls_article WHERE id IN (1,2,3) AND price IN (132,123);
+----+----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
+----+----------+----------------+-------+--------+----------------------------+
1 row in set (0.00 sec)
注:
1、IN操作符一般比OR操作符执行得更快
2、IN操作符最大的有优点是可以包含其他SELECT语句,使得能更动态的建立WHERE子句
3、更多情况下IN列表项的值是不明确的,而可能是通过一个子查询得到的,然后将查询结果作为IN的列表项以实现最终的查询结果,注意在子查询中返回的结果必须是一个字段列表项。
4、IN列表项不仅支持数字,也支持字符甚至时间日期类型等,并且可以将这些不同类型的数据项混合排列
带BETWEEN AND的范围查询
1、BETWEEN AND用来查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束值
⑴如果数据字段值满足指定的范围查询条件,那么这些数据将会被返回(包含两个边界值)
2、BETWEEN AND操作符前也可以加关键字NOT,表示指定范围之外的值。如果字段值不满足指定的范围内的值,那么这些数据将会被返回
例5:
-- 查询价格在130到140之间的数据
mysql> SELECT * FROM polls_article WHERE price BETWEEN 130 AND 140;
+----+----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
+----+----------+----------------+-------+--------+----------------------------+
例5_1:
-- 查询创建时间不在两个时间段之间的数据
mysql> SELECT * FROM polls_article WHERE create_time NOT BETWEEN '2020-10-13 17:08:50.493488' AND '2020-10-13 17:19:18.121264';
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
+----+-----------+----------------+-------+--------+----------------------------+
4 rows in set (0.00 sec)
带LIKE的字符匹配查询
LIKE操作符
1、前面介绍的所有操作符都是针对已知值进行过滤的,但是这种过滤方式并不是在任何时候都是好用的。
⑴例如,怎么搜索产品名称中包含文本anvil的所有产品?使用简单的比较操作符肯定是不行的,此时就必须使用通配符,利用通配符可创建比较特定数据的搜索模式
⑵在这个例子中,就可以构造一个通配符搜索模式,找出产品中任何位置出现anvil的产品
2、通配符:用来匹配值的一部分的特殊字符。其本身实际上就是SQL的WHERE子句中有特殊含义的字符
⑴可以和LIKE一起使用的通配符有'%'和'_'
3、搜索模式:由字面值,通配符或两者组合成的搜索条件
4、为在搜索子句中使用通配符,就必须使用LIKE操作符。LIKE指示MYSQL后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较
5、MySQL允许将NOT运算符与LIKE运算符组合,以找到不匹配特定模式的字符串
百分号(%)通配符
1、作用:匹配任意长度的字符,甚至是零字符
2、在搜索匹配时,通配符"%"可以放在不同位置(不同位置会表示不同的意思)
例6:
-- 查询所有title字段以"三"开头的数据
-- 表示将检索任意以"三"开头的词,%告诉MYSQL接受"三"之后有任意(个数)字符
mysql> SELECT * FROM polls_article WHERE title LIKE '三%';
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
+----+-----------+----------------+-------+--------+----------------------------+
2 rows in set (0.00 sec)
例6_1:
-- 查询所有title字段以"d"结尾的数据
mysql> SELECT * FROM polls_article WHERE title LIKE '%d';
+----+-------+---------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-------+---------+-------+--------+----------------------------+
| 7 | wed | dwd | 123 | 32 | 2020-10-13 17:08:50.493488 |
+----+-------+---------+-------+--------+----------------------------+
1 row in set (0.00 sec)
例6_2:
-- 查询所有title字段值中包含"ds"的数据,不管"ds"前后、后面有多少个字符
mysql> SELECT * FROM polls_article WHERE title LIKE '%ds%';
+----+-------+---------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-------+---------+-------+--------+----------------------------+
| 8 | ds | dwd | 123 | 32 | 2020-10-13 17:19:18.121264 |
+----+-------+---------+-------+--------+----------------------------+
1 row in set (0.00 sec)
例6_3:
-- 查询所有title字段值中以"w"开头,以"d"结尾的数据
mysql> SELECT * FROM polls_article WHERE title LIKE 'w%d';
+----+-------+---------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-------+---------+-------+--------+----------------------------+
| 7 | wed | dwd | 123 | 32 | 2020-10-13 17:08:50.493488 |
+----+-------+---------+-------+--------+----------------------------+
1 row in set (0.00 sec)
下划线(_)通配符
1、另一种通配符是下划线(_)。下划线的用途与%一样,但是下划线只匹配单个字符而不是多个字符(只能是下划线处不一致)
⑴%通配符:匹配任意多个字符
⑵_通配符:只能匹配任意单个字符
2、下划线通配符如果要匹配多个字符的话,则需要使用相同个数的"_"
例7:查找以T开头以m结尾的值
mysql> SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
firstname LIKE 'T_m';
+----------------+----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+----------+-----------+
| 1619 | King | Tom |
+----------------+----------+-----------+
例7_1:查找以b_n开头的值
mysql> SELECT platformName,channelName FROM roleinfo WHERE channelName LIKE "b_n%";
+---------------+---------------+
| platformName | channelName |
+---------------+---------------+
| cinjigame | binjigame |
| ainjigame_app | bonjigame_bpp |
+---------------+---------------+
注:
1、百分比(%)通配符允许匹配任何字符串的零个或多个字符
2、下划线(_)通配符允许匹配任何单个字符
3、在使用下划线(_)通配符时也需要使用%来指定位置
查询空值
1、在创建表时,表设计人员可以指定其中的列是否可以不包含值。一个列不包含值时,称其包含空值NULL
2、NULL:无值,它与字段包含0、空字符串不同。它是一种特殊的值
3、可以使用IS NULL子句来检查表中是否具有NULL值。或IS NOT NULL 来检查是否不为NULL
例8:
-- 查询author字段值为null的数据
mysql> SELECT * FROM polls_article WHERE author IS null;
+----+--------+----------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+--------+----------+-------+--------+----------------------------+
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
+----+--------+----------+-------+--------+----------------------------+
1 row in set (0.00 sec)
例8_1:
-- 查询author字段值不为null的数据
mysql> SELECT * FROM polls_article WHERE author IS NOT NULL;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 7 | wed | dwd | 123 | 44 | 2020-10-13 17:08:50.493488 |
| 8 | ds | dwd | 123 | 32 | 2020-10-13 17:19:18.121264 |
+----+-----------+----------------+-------+--------+----------------------------+
6 rows in set (0.00 sec)
逻辑查询条件
在SQL中可以使用逻辑操作符AND和OR:AND表示"且",OR表示"或"
带AND的多条件查询
1、使用SELECT语句查询时,可以增加查询的限制条件,这样可以使查询的结果更加精确
2、在WHERE子句中使用AND操作符限定只有满足所有查询条件的数据才会被返回(查询条件之间为"且"的关系)
3、可以使用AND连接两个甚至多个查询条件,多个条件表达式时间使用AND分隔
例9:
-- 查询价格大于130并且不等于154的图书信息
mysql> SELECT * FROM polls_article WHERE price > 130 AND price != 154;
+----+----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
+----+----------+----------------+-------+--------+----------------------------+
3 rows in set (0.00 sec)
例9_1:
-- 查询价格大于130并且作者是'曹雪芹'的图书信息
mysql> SELECT * FROM polls_article WHERE price > 130 AND author = '曹雪芹';
+----+--------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+--------+----------------+-------+--------+----------------------------+
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
+----+--------+----------------+-------+--------+----------------------------+
1 row in set (0.00 sec)
带OR的多条件查询
1、与AND相反,在WHERE子句中使用OR操作符,表示只需要满足其中一个条件的数据即可返回(查询条件之间为"或"的关系)
2、可以使用OR连接两个甚至多个查询条件,多个条件表达式时间使用OR分隔
例10:
-- 查询价格大于140或作者是'吴承恩'的图书信息
mysql> SELECT * FROM polls_article WHERE price > 140 OR author='吴承恩';
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
+----+-----------+----------------+-------+--------+----------------------------+
4 rows in set (0.00 sec)
例10_1:
-- 查询价格为154或140的图书信息
-- IN操作符与OR操作符有相同的作用
mysql> SELECT * FROM polls_article WHERE price =154 OR price = 140;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
+----+-----------+----------------+-------+--------+----------------------------+
3 rows in set (0.00 sec)
AND操作父与OR操作符的优先级
1、在过滤条件中同时存在and和or操作符时,会先计算AND"且"再计算OR"或"(先且后或)
2、需要规定计算优先级时,可以使用圆括号来标记
例11:
mysql> SELECT * FROM polls_article WHERE price=123 OR price=154 OR price=140 AND AUTHOR !='罗贯中';
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 7 | wed | dwd | 123 | 44 | 2020-10-13 17:08:50.493488 |
| 8 | ds | dwd | 123 | 32 | 2020-10-13 17:19:18.121264 |
+----+-----------+----------------+-------+--------+----------------------------+
5 rows in set (0.00 sec)
例11_1:
mysql> SELECT * FROM polls_article WHERE (price=123 OR price=154 OR price=140) AND AUTHOR !='罗贯中';
+----+--------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+--------+----------------+-------+--------+----------------------------+
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 7 | wed | dwd | 123 | 44 | 2020-10-13 17:08:50.493488 |
| 8 | ds | dwd | 123 | 32 | 2020-10-13 17:19:18.121264 |
+----+--------+----------------+-------+--------+----------------------------+
4 rows in set (0.00 sec)
注:
1、SQL(像多数语言一样),在处理OR操作符前会优先处理AND操作符,即AND操作符的优先级更高。所以上面两个例子的意思完全不一样
2、此问题的解决方法是使用圆括号明确地分组相应的操作符,DBMS会首先处理圆括号内的过滤条件
3、任何时候使用具有AND和OR操作符的WHERE子句时,都应该使用圆括号明确地分组操作符,不要过分的依赖默认计算次序
查询结果不重复
1、语法:SELECT DISTINCT
2、作用:返回某列中不用值的行(其实也是根据列来查询的,只是有一个过滤条件--同一列中的数据相互比较)
3、参数:
⑴DISTINCT:SQL关键字,表示只返回不同的值
⑵X:需要检索的列
⑶A:从哪个表中检索
例12:
-- 查询polls_article表中的price字段且price字段值不重复
mysql> SELECT DISTINCT price FROM polls_article;
+-------+
| price |
+-------+
| 132 |
| 154 |
| 140 |
| 123 |
| 345 |
+-------+
5 rows in set (0.00 sec)
例12_1:
mysql> SELECT DISTINCT price FROM polls_article WHERE price > 130;
+-------+
| price |
+-------+
| 132 |
| 154 |
| 140 |
| 345 |
+-------+
4 rows in set (0.00 sec)
例12_2:
mysql> SELECT DISTINCT s.`s_id`,s.`s_name`,s.`s_name`,s.`s_telephone` FROM suppliers s LEFT JOIN fruits f ON F.`s_id`=s.`s_id` WHERE F.`f_price` >= 120;
+------+----------------+----------------+-------------+
| s_id | s_name | s_name | s_telephone |
+------+----------------+----------------+-------------+
| 102 | 华东第一水果商 | 华东第一水果商 | 12345678911 |
| 103 | 西北第一水果商 | 西北第一水果商 | 98765432101 |
+------+----------------+----------------+-------------+
2 rows in set (0.00 sec)
注:
1、可以使用DISTINCT关键字对查询结果去重,在去重时可以根据一个字段,或多个字段
2、使用DISTINCT关键字对查询结果去重时,DISTINCT关键字只能用在所有查询列的最前面,表示后面所有字段组合起来去重(以一行为整体去重:肯定不能说第一个字段去重,第二个字段不去重)
对查询结果进行排序
1、语法:SELECT 列名 FROM 表名 ORDER BY
2、作用:排序数据,即将查询到的数据按照规定的条件来进行排序
⑴当使用SELECT FROM时,如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序或者其他
⑵数据排序时:只能指定根据哪些列来进行排序,不能指定排序规则(只能使用自带的排序规则:升序或降序)
3、ORDER BY:指示MySQL按照指定列以字母或数字顺序排序数据(以BY后面列名的列为基准)
⑴默认的排序方式是:以字母或数字的升序进行排序
单列排序
1、即,根据查询结果中的某列来进行排序
例13:
-- 根据price字段值进行排序(默认升序)
mysql> SELECT * FROM polls_article WHERE price > 130 ORDER BY price;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
+----+-----------+----------------+-------+--------+----------------------------+
5 rows in set (0.00 sec)
例13_1:
-- 根据title字段值进行排序(默认升序)
mysql> SELECT * FROM polls_article WHERE price > 130 ORDER BY title;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
+----+-----------+----------------+-------+--------+----------------------------+
5 rows in set (0.00 sec)
多列排序
1、作用:根据多个条件来进行排序
2、语法:SELECT 列名1,列名2,列名3 FROM 表名 ORDER BY 列名1,列名2;
例14:
mysql> SELECT * FROM polls_article ORDER BY price,id;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 7 | wed | dwd | 123 | 44 | 2020-10-13 17:08:50.493488 |
| 8 | ds | dwd | 123 | 32 | 2020-10-13 17:19:18.121264 |
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
+----+-----------+----------------+-------+--------+----------------------------+
7 rows in set (0.00 sec)
注:上面例子中BY后面有两个参数
1、意思为:如果第一个参数(price)多个行具有相同的值时才按第二个参数(id)排序
2、如果第一个参数的值都是唯一的,则就不会按第二个参数排序了
指定排序方向
1、作用:指定排序是升序还是降序
2、语法:SELECT 列名1,列名2 FROM 表名 ORDER BY 列名 DESC;
3、参数:
⑴DESC:SQL关键字,指示降序排序,ASCII升序排序是默认排序方向
⑵DESC关键字只应用到直接位于其前面的列名(也就是ORDER BY后面,DESC前面的列名才会起作用),如果要对多列都进行降序排序,必须要在每一列的列名后面加上DESC关键字
⑶与DESC相反的关键字是ASC,不过ASC没多大的用处,因为升序是默认的
例15:
mysql> SELECT * FROM polls_article WHERE price > 130 ORDER BY price DESC;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
+----+-----------+----------------+-------+--------+----------------------------+
5 rows in set (0.00 sec)
例15_1:
-- DESC关键字只应用到位于其前面的列名
mysql> SELECT * FROM polls_article ORDER BY price DESC,id;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 7 | wed | dwd | 123 | 44 | 2020-10-13 17:08:50.493488 |
| 8 | ds | dwd | 123 | 32 | 2020-10-13 17:19:18.121264 |
+----+-----------+----------------+-------+--------+----------------------------+
7 rows in set (0.00 sec)
mysql> SELECT * FROM polls_article ORDER BY price,id DESC;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 8 | ds | dwd | 123 | 32 | 2020-10-13 17:19:18.121264 |
| 7 | wed | dwd | 123 | 44 | 2020-10-13 17:08:50.493488 |
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
+----+-----------+----------------+-------+--------+----------------------------+
7 rows in set (0.00 sec)
限制查询结果条数
1、SELECT语法:SELECT X FROM A LIMIT
2、作用:限制查询返回的数据条数
⑴有时可能只需要返回符合条件的所有数据中最新的那条,那么就可以根据时间来排序,然后返回第一条数据就好了,就不用全部返回了
3、LIMIT关键字语法:LIMIT [位置偏移量],行数
⑴位置偏移量:表示MYSQL从哪一行开始计算,是一个可选参数,如果不指定,将会从表中的第一条数据开始(默认偏移量为0)
⑵行数:必填参数,指示返回的数据条数
注:
1、第一条数据的位置偏移量为0,第二条数据的位置偏移量为1...以此类推
2、LIMIT接受一个或两个数字参数
⑴参数必须是一个整数常量
⑵如果给定两个参数,第一个参数指定返回记录行的偏移量,也就是说从第几位开始取;第二个参数指定返回记录行的最大数目
⑶初始记录行的偏移量是0(而不是1)
3、带有一个参数的LIMIT总是从第一行开始的;指定要检索的行数大于最大行数时,则返回全部行
⑴即,LIMIT n 等价于LIMIT 0,n
例16:
mysql> SELECT * FROM polls_article;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 7 | wed | dwd | 123 | 44 | 2020-10-13 17:08:50.493488 |
| 8 | ds | dwd | 123 | 32 | 2020-10-13 17:19:18.121264 |
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
+----+-----------+----------------+-------+--------+----------------------------+
7 rows in set (0.00 sec)
-- 只有一个参数:表示返回"行数",此时默认位置偏移量为0,则从第一条数据开始取1行数据(也就是第一条数据)
mysql> SELECT * FROM polls_article LIMIT 1;
+----+----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
+----+----------+----------------+-------+--------+----------------------------+
1 row in set (0.00 sec)
例16_1:
mysql> SELECT * FROM polls_article;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 7 | wed | dwd | 123 | 44 | 2020-10-13 17:08:50.493488 |
| 8 | ds | dwd | 123 | 32 | 2020-10-13 17:19:18.121264 |
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
+----+-----------+----------------+-------+--------+----------------------------+
7 rows in set (0.00 sec)
-- 只有一个参数:表示返回"行数",此时默认位置偏移量为0,则从第一条数据开始取3行数据
mysql> SELECT * FROM polls_article LIMIT 3;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
+----+-----------+----------------+-------+--------+----------------------------+
3 rows in set (0.00 sec)
例16_2:
mysql> SELECT * FROM polls_article WHERE price > 130 ORDER BY price;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 1 | 三国演义 | 孙悟空大闹天宫 | 132 | 吴承恩 | 2020-09-13 14:48:30.000000 |
| 4 | 水浒传 | 逼上梁山 | 140 | 施耐庵 | 2020-09-13 12:48:30.962070 |
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
| 3 | 红楼梦 | 刘姥姥进大观园 | 154 | 曹雪芹 | 2020-09-13 12:48:30.962070 |
| 9 | 西游记 | 西天取经 | 345 | NULL | 2020-11-14 15:48:59.000000 |
+----+-----------+----------------+-------+--------+----------------------------+
5 rows in set (0.00 sec)
-- 有两个参数:位置偏移量为2,表示从第三行开始(包括第三行),"行数"为1,表示返回一行数据
mysql> SELECT * FROM polls_article WHERE price > 130 ORDER BY price LIMIT 2,1;
+----+-----------+----------------+-------+--------+----------------------------+
| id | title | content | price | author | create_time |
+----+-----------+----------------+-------+--------+----------------------------+
| 2 | 三国演义1 | 东汉末年分三国 | 154 | 罗贯中 | 2020-09-13 12:48:30.962070 |
+----+-----------+----------------+-------+--------+----------------------------+
1 row in set (0.00 sec)