单表查询

1、数据库管理系统的一个最重要的功能就是数据查询,数据查询不应只是简单的查询数据库中存储的数据,还应根据需要对数据进行筛选,以及确定数据以什么样的格式显示

2、MySQL从数据表中查询数据的基本语句为SELECT语句

3、单表查询是指从一张表中查询所需数据

4、查询方式主要有:查询所有字段、查询指定字段、查询指定记录、查询空值、多条件的查询、对查询结果进行排序等

注:本次查询的数据基于下图,可能会临时更改里面的某些值

MYSQL 单表10亿 查询性能 mysql数据库单表查询_mysql

 

查询所有字段

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)