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处理】