当前位置: 首页 > article >正文

Mysql-DQL条件查询

文章目录

    • 条件查询
      • 比较运算符
      • 逻辑运算符
      • 范围
      • like 关键字
      • 排序
        • 单列顺序
        • 组合排序
      • 聚合函数
      • 分组
        • 基本的分组流程
        • 参数的区别
      • limit 语句
        • limit 语法格式
        • limit 的使用场景

https://i-blog.csdnimg.cn/blog_migrate/58966ddd9b29aabe8841f5ec34f0d31c.gif

🏡作者主页:点击!

🤖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 条的,有多少显示多少


http://www.kler.cn/a/399682.html

相关文章:

  • 经验笔记:Git 基础操作指南
  • 阿里云引领智算集群网络架构的新一轮变革
  • Python绘制雪花
  • 前端开发设计模式——责任链模式
  • Vue2教程002:Vue指令
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验一(下)----空间数据的编辑与处理(超超超详细!!!)
  • AI在电商平台中的创新应用:提升销售效率与用户体验的数字化转型
  • Docker Compose部署Kafka(非Zookeeper​)
  • apache2配置多站点
  • 品牌如何利用大数据工具,进行消费者洞察分析?
  • dnaMethyAge包学习笔记
  • nodejs入门(1):nodejs的前后端分离
  • ✅DAY27贪心算法 | 455.分发饼干 | 376. 摆动序列 | 53. 最大子序和
  • 认证鉴权框架SpringSecurity-6--6.x版本升级篇
  • IQ Offset之工厂实例分析
  • 一文简单了解Android中的input流程
  • QT5.14*解决QSslSocket::connectToHostEncrypted: TLS initialization faile
  • 网络常用特殊地址-127.0.0.1
  • SRP 实现 Cook-Torrance BRDF
  • 网络物理隔离技术
  • 一文了解清楚oracle数据库undo表空间
  • 前端人之网络通信概述
  • 重构Action-cli前端脚手架
  • 【jvm】如何判断一个对象是否可以回收
  • 力扣经典面试题
  • 【原创】java+ssm+mysql商品库存管理系统(进销存)设计与实现