SELECT高级查询

==SELECT 查询结果仅做展示用,并不能改变数据库真实数据!==

示例表(成绩表)

学号

姓名

语文

数学

英语

1

王晓明

86

88

64

2

赵小丫

94

72

90

3

李小丫

86

77

89

4

王晓

98

96

91

创建成绩表

create table 成绩表(学号 int primary key,姓名 varchar(20),语文 int,数学 int,英语 int);

成绩表中添加数据

INSERT INTO 成绩表 SET 学号="1",姓名="王晓明",语文="86",数学="88",英语="64";
INSERT INTO 成绩表 SET 学号="2",姓名="赵小丫",语文="94",数学="72",英语="90";
INSERT INTO 成绩表 SET 学号="3",姓名="李小丫",语文="86",数学="77",英语="89";
INSERT INTO 成绩表 SET 学号="4",姓名="王晓",语文="98",数学="96",英语="91";

查询显示别名

一般用于便于查看临时建立别名

SELECT 姓名 as 真实姓名,语文 as 语文成绩
 FROM 成绩表;
+----------+
| 真实姓名 |
+----------+
| 王晓明   |
| 赵小丫   |
| 李小丫   |
| 王晓     |
+----------+

模糊匹配

匹配符

释义

*

表示查找所有信息

%

表示任意0个或多个字符

_

表示任意单个字符

WHERE 匹配

条件查询

SELECT * FROM 成绩表 WHERE 数学>90;
LIKE 匹配

匹配符示例

SELECT * FROM 成绩表;
#表所有内容显示

SELECT * FROM 成绩表 WHERE 姓名 LIKE '王晓%';
#查询到【王晓明】和【王晓】所在行

SELECT * FROM 成绩表 WHERE 姓名 LIKE '_小丫';
#查询到【赵小丫】和【李小丫】所在行
范围匹配

匹配方式

释义

between 10 and 20

值在10到20之间,区间范围匹配

in(20,80,90)

自括号内抽取固定数值匹配

limit(3)

选择特定显示行

limit(1,3)

选择行后内容

匹配示例

SELECT * FROM 成绩表 WHERE 语文 BETWEEN 90 AND 100;
#查询到语文成绩是【90到100区间】的人

SELECT * FROM 成绩表 WHERE 英语 IN (90,91);
#查询到英语成绩是【90】和【91】的人

SELECT * FROM 成绩表 LIMIT 3;
#置显示3行数据

SELECT * FROM 成绩表 LIMIT 1,3;
#显示【第1行后边的3行内容】
REGEXP 正则匹配符

==更多正则匹配符参考博文《正则表达式字符说明》==

匹配符

释义

^

开头匹配

$

结尾匹配

[]

括号内范围匹配

[^]

反义匹配

匹配示例

SELECT * FROM 成绩表 WHERE 姓名 REGEXP '^王';
#查询到所有是【王】开头的姓名

SELECT * FROM 成绩表 WHERE 姓名 REGEXP '丫$';
#查询到所有以【丫】结尾的姓名

SELECT * FROM 成绩表 WHERE 姓名 REGEXP '[赵李]小丫';
#查询到姓【赵】和【李】,名字叫小丫的人

SELECT * FROM 成绩表 WHERE 姓名 REGEXP '^[^王]';
#查询到所有不是【王】开头的姓名

SELECT 运算符

运算符

释义

+


-


*


/


%

取余

SELECT 学号+1,姓名,语文-1,数学*2,英语/2 FROM 成绩表 ;
+--------+--------+--------+--------+---------+
| 学号+1 | 姓名   | 语文-1 | 数学*2 | 英语/2  |
+--------+--------+--------+--------+---------+
|      2 | 王晓明 |     85 |    176 | 32.0000 |
|      3 | 赵小丫 |     93 |    144 | 45.0000 |
|      4 | 李小丫 |     85 |    154 | 44.5000 |
|      5 | 王晓   |     97 |    192 | 45.5000 |
+--------+--------+--------+--------+---------+

运算符

释义

>

大于

<

小于

=

等于

>=

大于等于

<=

小于等于

<>或!=

不等于

SELECT * FROM 成绩表 WHERE 语文=86;
#查询所有语文成绩【等于86】的人

SELECT * FROM 成绩表 WHERE 数学>80;
#查询所有数学成绩【大于80】的人

SELECT * FROM 成绩表 WHERE 英语<90;
#查询所有英语成绩【小于90】的人

利用别名进行运算查询总成绩

SELECT 学号,姓名,语文+数学+英语 as 总成绩 FROM 成绩表;
+------+--------+--------+
| 学号 | 姓名   | 总成绩 |
+------+--------+--------+
|    1 | 王晓明 |    238 |
|    2 | 赵小丫 |    256 |
|    3 | 李小丫 |    252 |
|    4 | 王晓   |    285 |
+------+--------+--------+

运算符

释义

and


or


not


SELECT * FROM 成绩表 WHERE 语文>90 and 数学> 90 and 英语>90;
#查询到【满足语数英都大于90的三个条件】的人

SELECT * FROM 成绩表 WHERE 英语>90 or 数学> 80;
#查询到【英语>90】【或】【数学大于80】的人

SELECT * FROM 成绩表 WHERE not 英语<90;
#查询到【英语不小于90】的人

OPDER BY 排序

次序

释义

ASC

升序

DESC

降序

SELECT * FROM 成绩表 ORDER BY 语文 ASC;
#语文成绩【从低到高】排列

SELECT * FROM 成绩表 ORDER BY 数学 DESC;
#数学成绩【从高到低】排列

GROUP BY 分组

一般分组配合函数使用,这里仅做分组示例

默认重复的内容归类到一组,但只显示分组中第一行数据

SELECT * FROM 成绩表 GROUP BY 语文;
#按照姓名分组

SELECT * FROM 成绩表 GROUP BY 3;
#按照第二个数列分组

SELECT 聚合函数

一般需要 having 配合使用

where 和 having 差异对比

参数

用途

效率

后跟函数

WHERE

条件查询



HAVING

筛选查询



函数示例

函数

释义

COUNT(列名)

统计行数

SUM(列名)

统计总和

AVG(列名)

求平均值

MAX(列名)

求最大值

MIN(列名)

最小值

SELECT COUNT(姓名) as 语文成绩优异人数 FROM 成绩表 WHERE 语文>90;
#查询统计【语文成绩90分以上的人数】

SELECT SUM(语文)/COUNT(姓名) as 语文成绩平均值 FROM 成绩表;
#查询语文成绩平均值【总和除以总人数】【SUM/COUNT】

SELECT AVG(语文) as 语文成绩平均值 FROM 成绩表;
#查询语文成绩平均值【AVG】

SELECT MAX(语文) as 语文最高分 FROM 成绩表;
#查询语文成绩最高分

SELECT MIN(语文) as 语文最低分 FROM 成绩表;
#语文成绩最低分

SELECT 特殊参数

参数

释义

and

复合查询

distinct

去重查询

is null

空行显示

ifnull(列名,0)

值为null归0处理

SELECT * FROM 成绩表 WHERE 语文>90 AND 数学>90;
#查询语文成绩和数学成绩都大于90分的人
SELECT DISTINCT 语文 FROM 成绩表;
#查询语文成绩【不显示重复的行】

SELECT * FROM 成绩表 WHERE 语文 is null;
#查询语文成绩【值为空】的行

SELECT sum(ifnull(语文,0)) as 语文总成绩 FROM 成绩表;
#查询语文总成绩【值为null的空值按0处理】