Mysql-DQL条件查询
文章目录
- 条件查询
- 比较运算符
- 逻辑运算符
- 范围
- like 关键字
- 排序
- 单列顺序
- 组合排序
- 聚合函数
- 分组
- 基本的分组流程
- 参数的区别
- limit 语句
- limit 语法格式
- limit 的使用场景
🏡作者主页:点击!
🤖Mysql专栏:点击!
⏰️创作时间:2024年11月16日13点30分
条件查询
前面我们查询的是将所有的数据查询出来,更多的时候我们需要查询指定条件的数据,因此我们需要用到 条件查询
语法格式:select 字段名 from 表名 where 条件;
流程:取出表中的数据,满足条件的记录就返回,不满足条件的记录不返回
比较运算符
“>” 大于
“<” 小于
“>=” 大于等于
“<=” 小于等于
“=” 等于
“<>、!=” 不等于(这里面有两种选择:1、<>表示不等于 2、! 表示不等于)
具体操作:
查询攻击力大于 260 的英雄
mysql> select * from number where damage>260;
查询防御值小于 230 的英雄
mysql> select * from number where defence<230;
至于大于等于或者小于等于,感觉没有必要再去进行实验了
查看射手类的所有英雄
mysql> select * from number where type=‘射手’;
查看所有英雄中不是女性的英雄
mysql> select * from number where sex<>‘女’; // <> 直接相当于不等于
mysql> select * from number where sex!=‘女’; // 此处的 ! 就相当于是一个 “不” 的意思,后面需要加等于号
逻辑运算符
and 多个条件同时满足
or 多个条件其中一个满足
not 不满足
具体操作:
查询性别为男,且是战士的英雄
mysql> select * from number where sex=‘男’ and type=‘战士’; // 显示性别为 男,类型为 战士的所有英雄
查询年龄小于 25 或者攻击力大于 250 的英雄
mysql> select * from number where age<25 or damage>250; // 显示的是年龄小于 25 攻击力大于 250 的英雄
查询 id 是 1 或 3 或 5 的英雄
mysql> select * from number where id=1 or id=3 or id=5 ;
In 关键字
语法格式:select 字段名 from 表名 where 字段 in(数据1、数据2…)
in 里面的每个数据都会作为一次条件,只要满足条件就会显示
not in 可以在一组数据里面排除数据内容,使用 not in 进行筛选
查询 id 是 1 或 3 或 5 的英雄、
mysql> select * from number where id in(1,3,5); // 查询较为方便点,in 里面使用逗号将其隔开
mysql> select * from number where id not in(1,3,5); // 查询结果为 1、3、5 以外的所有数据,not in
范围
between 值1 and 值2 // 表示从值1到值2范围,包头又包尾
比如:age between 35 and 70
相当于:age>=35 && age <=70
具体操作:
查询英雄的攻击力 大于等于 240 小于等于 310 之间的英雄
mysql> select * from number where damage between 240 and 310; // 这种方式比较简便一点
mysql> select * from number where damage>= 240 and damage<=310; // 和上面结果一样,就是比较繁琐一点
like 关键字
此处的 like 和 之前的表名那边使用的 like 是不一样的
这里的 like 表示模糊查询
标准语法: select * from where [字段名] like ‘通配符字符串’
满足通配符字符串规则的数据就会全部显示
Mysql 通配符有两个:
- %:表示 0 个或多个字符(任意个字符)
- _:表示一个字符
%笔记本 可以匹配:苹果笔记本,外星人笔记本,笔记本 这些都可以进行匹配的
但是如果是 苹果笔记本电脑或者说是华硕笔记本电脑,就会发现匹配不了了,那么就需要使用 %笔记本%
接下来就可以直接进行匹配了
% 表示匹配 0 个或者多个字符,并且还是任意字符
**然而使用 _ 就比较简便好理解了,一个 _ 表示一个字符,前面后面都可以添加,两个字符就用两个 _ **
具体操作:
查看姓氏为 ‘ 孙 ’ 的所有英雄;
mysql> select * from number where name like ‘孙%’; // 查询姓氏为 孙 的英雄
查询名字中包含 ‘ 姬 ’ 的所有英雄;
mysql> select * from number where name like ‘%姬%’; // 使用两个 %% 号表示任何名字中包含姬的英雄
查询姓氏为 孙 ,且姓名是三个字的英雄
mysql> select * from number where name like ‘孙__’; // 此处孙的后面是两个 _ 下横线
排序
通过 order by 子句,可以查询出的结果进行排序,只是显示方式,不会影响数据库中的数据
标准语法: select 字段名 from 表名 where 字段=值 order by 字段名 [asc | desc];
asc:表示升序,默认就是升序,从小到大,写了也行,不写也是升序
desc:表示降序,从大到小
里面的标准语句,不一定必须按照规定进行执行搜索
mysql> select * from number where damage order by damage desc; // 比如我现在就需要按照攻击力进行降序排序,直接输入字段名就可以,没有必要必须加上比较运算符
单列顺序
简单来说就是使用一个字段排序
具体操作:
查询年龄小于 30 的英雄,按照年龄升序
mysql> select * from number where age<30 order by age asc; // 表示从小到大的对年龄小于 30 的英雄进行排列
mysql> select * from number where age<30 order by age desc; // 表示从大到小的对年龄小于 30 的英雄进行排列,与上述相反
组合排序
组合排序是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推
上面例子中,年龄是有相同的,当年龄相同再使用其他字段进行排序
**标准语法:**select 字段名 from 表名 where 字段=值 order by 字段名1 [asc | desc ] , 字段名2 [asc | desc];
具体操作:
查询年龄小于等于 35 的英雄,按照年龄升序排列,如果年龄相同按照防御力进行降序
mysql> select * from number where age<=35 order by age asc , defence desc ; // 年龄升序,如相同使用防御力进行区别
聚合函数
之前我们做的查询都是横向查询,根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值,另外聚合函数会忽略空值
五个聚合函数:
count:统计指定列记录数,记录为 null 的不统计
sum:计算指定列的数据和,如果不是数据类型,那么计算结果为 0
max:计算指定列的最大值
min:计算指定列的最小值
avg:计算指定列的平均值,如果不是数据类型,那么计算结果为 0
聚合函数的使用:写在 SQL 语句 select 后,字段名的地方
select 字段名 from 表名;
select count(age) from 表名;
具体操作:
查询英雄总数
mysql> select count(name) from number;
mysql> select count( * ) from number; // 指定 * 更加的真实,准确
使用 count 不能指定一列,应该指定 * 因为 * 表示的是全部,不会因为某一行的数据不是数据类型而发生改变
查询年龄大于 30 的总数
mysql> select count(*) from number where age>30; // 显示的是年龄大于 30 的总数
查询所有英雄的总攻击力
mysql> select sum(damage) from number; // 意思就是求和,所有英雄攻击力的总和
查询英雄的最高攻击力
mysql> select max(damage) from number; // 查询 number 表中最高攻击力
mysql> select * from number where damage order by damage desc ; // 使用排序排列攻击力降序
查询英雄的最小防御力
mysql> select min(defence) from number; // 查询 number 表中最小的防御力
mysql> select * from number where defence order by defence asc; // 使用排序排列防御力升序
查询英雄的平均防御力
mysql> select avg(defence) from number; // 意思就是求平均值,所有英雄防御力的平均值
分组
分组查询是使用 group by 语句对查询信息进行分组,相同数据作为一组
分组的目的是为了统计,一般分组会跟聚合函数一起使用
分组后聚合函数的作用,不是操作所有数据,而是操作一组数据
标准语法: select 字段1,字段2…from 表名 group by 分组字段 [having 条件];
having 是在分组后对数据的数量进行一些根本上的改变,可以指定 count() 的最小值,比如 count( * )>3,意思就是 count() 的最小值大于 3
group by 是怎么分组的,将分组字段结果中相同内容作为一组
select * from number group by sex; // 这句话会将 sex 相同的数据作为一组,但是会返回每组的第一条,没有任何意义--------此处的结果没有任何意义
mysql> select * from number where sex=‘男’; // 显示表中所有的男性,并单独列出一组
mysql> select * from number where sex=‘女’; // 显示表中所有的女性,单独列出一组
具体操作:
将男性和女性英雄的总和攻击力进行列举,并添加源字段
mysql> select sum(damage),sex from number group by sex; // 此处的意思是将男性和女性英雄的总和攻击力进行列举,sum(damage),sex 意思是查询两种数据,后面的 group by sex 是以性别进行分组,列出数据
查询年龄小于 30 岁的人,按照性别分组,统计每组人数
mysql> select sex,count(*) from number where age <30 group by sex; // 没能清晰的理解完整
查询年龄小于 30 岁的人,按照性别分组,统计每组人数,人数少于3的不显示
mysql> select sex,count( * ) from number where age<30 group by sex having count( * )>3;
此处后面的 having 是对 已经分组的数据,在最后的显示上进行改变,对 count(*) 的最小值进行改变,最小值大于 3 ,因此不会显示人数小于 3 的分组
注意事项:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不见数据属于哪组,就是在 select xxx xxx(字段) 在这里输入即可
基本的分组流程
基本分组流程:
1、首先查出年龄小于 30 的人
2、再分组
3、使用 count(*) 统计每组人数
4、显示人数大于3的数据 :count(*)>3
参数的区别
having 和 where 的区别
1、having 是在分组后对数据进行过滤
2、where 是在分组前对数据进行过滤
3、having 后面可以使用聚合函数
4、where 后面不可以使用聚合函数
limit 语句
limit 是限制的意思,所以 limit 的作用就是限制查询记录的条数
**标准格式:**select * 字段列表 [as 别名] from 表名 [where 子句] [group by 子句] [order by 子句] [limit 子句];
把 limit 子句放在最后的原因是,前面的所有限制条件都处理完了,只剩下显示多少条的问题了
limit 语法格式
limit offset length; 或者是 limit length;
**offset:**是指偏移量,可以认为是跳过的记录数量,默认是 0
**length:**是指需要显示的总记录数
具体操作:
查询 number 中数据,从第 3 条开始显示,显示 6 条
我们可以认为是跳过前面的 2 条显示 6 条数据,这种使用方法,避免了数据多的时候 降低工作效率,指定需求
mysql> select * from number limit 2,6; // 意思就是跳过前 2 条数据,玩后面显示 6 条数据
SELECT * FROM tb_students_info LIMIT 1,3; //查询表中 1-3 数据
limit 的使用场景
使用场景:分页
比如我们登录百度、京东之类的软件,返回的数据有很多条,不会一次性的显示完,每一页都会显示固定的条数,假如我们每条数据来进行分页,那么 SQL 语句就需要这么写
select * from number limit 0,5; // 跳过 0 之后显示 5 条,显示的是 1、2、3、4、5
select * from number limit 5,5; // 跳过 5 之后显示 5 条,显示的是 6、7、8、9、10
select * from number limit 10,5; // 跳过 10 之后显示 5 条,显示的是 11、12、13、14、15
注意:
如果第一个参数是 0 可以简写
select * from number limit 5;
select * from number limit 0,5;
两种代码的输出结果是一样的
limit 10,5; 不够 5 条的,有多少显示多少