SQL基础-SELECT高级查询

SELECT高级查询

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

示例表(成绩表)

学号姓名语文数学英语
1王晓明868864
2赵小丫947290
3李小丫867789
4王晓989691

创建成绩表

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

转载于:https://my.oschina.net/zhaojunhui/blog/1925759

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值