02 MySQL --DQL专题--条件查询、函数、分组查询

news2024/11/26 10:16:50

一些盲点.

数据库中仅有月薪字段(month_salary),要求查询所有员工的年薪,并以年薪(year_salary)输出:

分析:

  1. 查询操作中,字段可以参与数学运算
  2. as 起别名,但实际上可以省略
#以下两句效果完全一致
select month_salary as year_salary from emp
select month_salary year_salary from emp

. 条件查询

#条件查询的语法
select   
...
from  
...
where  过滤条件;

带有

除了数学符号外,常见的条件

| between...and...   | 等同于 >= and <=                   |
| is null            | 为空                               |
| is not null        | 不为空                             |            |                |
| in                 | 在指定的值当中                     |
| not in             | 不在指定的值当中                   |
| exists             |                                    |
| not exists         |                                    |
| like               | 模糊查询                           |

in 和 or 的效率

我们知道, in的执行原理实际上是采用 = 和 or 的方式,

job in(‘MANAGER’,‘SALESMAN’,‘CLERK’)
等同于
job = ‘MANAGER’ or job = ‘SALESMAN’ or job = ‘CLERK’

sal in(1600, 3000, 5000)
等同于
sal = 1600 or sal = 3000 or sal = 5000

查询的列如果有索引或者主键,那么二者效率基本相当
否则
or的效率为O(n),而in的效率为O(log n), 当n越大的时候效率相差越明显(也就是说数据量越大的时候,in的效率越高)。

.1 and 和 or 优先级问题

找出薪资小于1500,并且部门编号是20或30的员工姓名、薪资、部门编号。

直接给出错误 SQL:

select
  ename,sal,deptno
from
  emp
where
  sal < 1500 and deptno = 20 or deptno = 30;

结果是错的,有两个部门 30 且工资超过 1500 的也被查询了
在这里插入图片描述

分析:

  1. MS 中,and 的优先级大于 or
# 我们想要的执行顺序是  sal < 1500 and (deptno = 20 or deptno = 30)
# 实际的执行顺序是  (sal < 1500 and deptno = 20) or deptno = 30;
# 即系统先筛选出同时满足工资小于 1500 且部门 20 的人,再加上所有部分 30 的人后一起输出
  sal < 1500 and deptno = 20 or deptno = 30;
# 由于 and 优先级高,系统先执行所有 and,因此执行顺序是(条件1 and 条件2)or(条件3 and 条件4 )
 where 条件1 and 条件2 or 条件3 and 条件4
  1. 不用记忆优先级。遇到不确定的优先级时,用小括号来保证正确。
sal < 1500 and (deptno = 20 or deptno = 30

模糊查询

模糊查询的语法格式如下:

select .. from .. where 字段 like '通配符表达式';

通配表达式也很简单,主要是

  1. % 代表任意多个字符。
  2. 下划线 “_” 代表任意一个字符。

order by排序

order by 关键字默认采用 asc 升序

#按照 sal 升序排列,如果 sal 相同的,再按照 ename 升序排列。
select empno,ename,sal from emp order by sal asc, ename asc;

distinct 去重

  1. distinct只能出现在所有字段的最前面。
  2. 且当distinct出现后,后面多个字段一定是联合去重的: 即将多个字段视为一个整体,允许部分重复,不允许整体重复。
    在这里插入图片描述
    在这里插入图片描述

数据处理函数

字符串处理相关之 upper/ucase、lower/lcase

# 查询所有员工名字,以大写形式展现
select upper(ename) as ename from emp;

#数据库是否对大小写敏感主要取决于操作系统.win 内不敏感,linux 内敏感
#若在 linux 内部署数据库,并且此时不知道表中的人名是大写、小写还是大小写混合,
#不妨直接将 ename 一整列都转大写,然后再用大写的人名去匹配,这样,只要确实存在这个人,不管大小写都能匹配出来
select ename, job, sal from emp where upper(ename) = 'SMITH';

字符串处理相关之 截取字符串substr

语法:substr(‘被截取的字符串’, 起始下标, 截取长度)
有两种写法:
第一种:substr(‘被截取的字符串’, 起始下标, 截取长度)
第二种:substr(‘被截取的字符串’, 起始下标),当第三个参数“截取长度”缺失时,截取到字符串末尾
注意:起始下标从1开始,不是从0开始。(1表示从左侧开始的第一个位置,-1表示从右侧开始的第一个位置。)
在这里插入图片描述
练习:找出员工名字中第二个字母是A的

select ename from emp where substr(ename, 2, 1) = 'A';

字符串处理相关之 concat 函数拼接字符串


语法:concat('字符串1', '字符串2', '字符串3'....)

字符串处理相关之 trim 字符串剪裁函数

### trim 函数默认体同时去除字符串前后空白
### 最终结果为 abcdef
select concat(trim('    abc    '), 'def');

### 当然也可以指定仅去除前缀/后缀
###最终结果为 '111   '
select trim(leading ' ' from '   111   ');
###最终结果为 '   111'
select trim(trailing ' ' from '   111   ');
###最终结尾为 '111'
select trim(both ' ' from '   111   ')

###也可以指定去除的内容
###最终结果为 '000111'
select trim(trailing '0' from '000111000');

数字相关之 rand 生成随机浮点数

rand()生成01的随机浮点数。
rand(x)生成01的随机浮点数,通过指定整数x来确定每次获取到相同的浮点值。

在这里插入图片描述

数字相关之 round 四舍五入

### 对 x 进行四舍五入,只保留整数位
round(x)

### 对 x 进行四舍五入,保留 y 位小数
round(x,y) 

数字相关之 ceil与floor 返回整数

  • ceil函数:返回大于或等于数值x的最小整数
  • floor函数:返回小于或等于数值x的最大整数
    在这里插入图片描述

数字相关之 ifnull 空处理函数

  • 在SQL语句中,凡是有NULL参与的数学运算,最终的计算结果都是NULL:
#当x为NULL时,将x当做y处理;当x不为null时,不做任何处理。
ifnull(x, y)

需求:查询每个员工的年薪。(年薪 = (月薪 + 津贴) * 12个月。注意:有的员工津贴comm是NULL。)

分析,某些行的 comm 可能是 null ,而 null 与数字做任何数学运算都得到 null

#
select (month_salary + ifnull(comm,0)) * 12 as year_salary from emp

日期相关之 获取当前日期、时间

#获取执行select语句的时间 + 日期。
now()
#获取执行sysdate()函数的时间 + 日期。
sysdate()

在这里插入图片描述

日期之 date_format 日期格式化字符串化

  • 在 MS 中,默认的日期格式是:%Y-%m-%d %H:%i:%s,
  • 直接输出日期数据的时候,日期数据会自动转换成字符串输出:

date_format 将日期转换成具有某种格式的日期字符串,通常用在查询操作当中。(date类型转换成char类型)

语法格式:

date_format(日期, '日期格式')

该函数有两个参数:

  • 第一个参数:日期。这个参数就是即将要被格式化的日期。类型是date类型。
  • 第二个参数:指定要格式化的格式字符串。
    • %Y:四位年份
    • %y:两位年份
    • %m:月份(1…12)
    • %d:日(1…30)
    • %H:小时(0…23)
    • %i:分(0…59)
    • %s:秒(0…59)

需求:获取系统日期和时间,并转为这个格式展示:2000-10-11 20-15-30
在这里插入图片描述

日期之 str_to_date 字符串转日期

str_to_date 将 char 类型的日期字符串转换成日期类型 date,通常使用在插入和修改操作当中。(char类型转换成date类型)

str_to_date('日期字符串','指定解析模式')

需求:为一个生日字段 birth 插入数据

首先,如果提供的日期字符串格式能够被mysql解析,str_to_date函数是可以省略的,底层会自动调用该函数进行类型转换:
在这里插入图片描述

但如果并非指定格式,那么直接插入显然是不行的,这里采用月、日、年的格式,MS 无法解析
在这里插入图片描述
用 str_to_date 函数指定解析模式为 月/日/年
在这里插入图片描述
再例如:
在这里插入图片描述

日期之 时间差函数

datediff函数
计算两个日期之间所差天数:

timediff函数
计算两个日期所差时间,例如日期1和日期2所差10:20:30,表示差10小时20分钟30秒。

条件判断函数 if

#IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
#如果 expr1 是TRUE ,则 IF()的返回值为expr2; 否则返回值则为 expr3。
IF(expr1,expr2,expr3)

#如果 sex 为1,返回字符串 '男'
select name,if(sex = 0,'男','女')

#如果工资大于3000,返回数字1
select *,if(month_salary > 3000,1,0) as High_Paid from user;

在这里插入图片描述

条件判断语句 case when

可以继续细分为 简单 CASE 函数CASE 搜索函数

  • 简单 case 函数和 if 往往能起到相同的作用
  • 在 SELECT 语句中,简单 CASE 函数仅检查是否相等,而不进行其它比较。
#简单 case 函数语法格式
CASE input_expression
WHEN when_expression THEN
    result_expression [...n ] [
ELSE
    else_result_expression
END

#查询 sex 字段,如果是 0 则返回 '男'
SELECT CASE sex 
        WHEN 0 THEN '男'
        WHEN 1 THEN '女' 
        ELSE '未知' 
    END
as ages

CASE 搜索函数:

  • 在 SELECT 语句中,CASE 搜索函数允许根据比较值在结果集内对值进行替换。
#CASE 搜索函数语法格式:
CASE
WHEN Boolean_expression THEN
    result_expression [...n ] [
ELSE
    else_result_expression
#对 parent_id 一列的所有查询数据进行替换,若原本小于3,则输出 '<3',而不是输出具体数值
SELECT
    CASE
WHEN parent_id < 3 THEN
    '<3'
WHEN parent_id >= 3
AND parent_id < 5 THEN
    '>=3 && <5'
ELSE
    '>=5'
END AS parent_id_new ,
parent_id ,
type_id ,
type_name
FROM
    tdb_goods_type

在这里插入图片描述

数据类型转换函数 cast

cast函数用于将值从一种数据类型转换为表达式中指定的另一种数据类型

#语法:
cast(as 数据类型)

#将字符串'2020-10-11'转换成日期date类型。
cast('2020-10-11' as date)

分组查询 group by、having

groupt by 按照某个字段分组,或者按照某些字段联合分组。

  • 执行的顺序是 where --> group by --> having
  • 越早过滤效率越高。因此,尽量在where中过滤,实在不行,再使用having。
  • 存在 group by 关键字时,select 后面只能跟分组函数或参加分组的字段
// 报错,仅 deptno 参与了分组,而 select 后出现了 ename
select ename,deptno,avg(sal) from emp group by deptno; 

having 写在group by的后面,当你对分组之后的数据不满意,可以继续通过having对分组之后的数据进行过滤。

#找出除20部分之外,其它部门的平均薪资。
#以下两句效果完全一致,但推荐第一句,尽量在 where 中过滤
select deptno,avg(month_salary) from emp where deptno != 20 group by deptno
select deptno,avg(sal) from emp group by deptno having deptno <> 20;

#查询每个部门平均薪资,找出平均薪资高于2000的部分
#这里必须要用 having 了,因为必须要找的是平均薪资大于 2000 的部分,而计算部门的平均薪资,首先要分组
select deptno,avg(month_salary) from emp group by deptno having avg(month_salary) > 2000

分组函数

SELECT colum,group_function(colum)
FROM table
[WHERE conditoin]
[GROUP BY  group_by_expression]
[ORDER BY  column]
  • 没有 group by 关键字进行分组时也能使用分组函数
  • 使用了 group by 关键字进行分组时,如果想使用函数,仅能使用分组函数,不能使用别的函数
  • 由于执行的顺序是 where -> group by -> having -> select,因此分组函数不能出现在 where 之后(此时都没有分组完,怎么用分组函数?)

分组函数的执行原则:如果有group by 语句,先按照分组条件进行分组,然后对每一组数据执行分组函数;如果没有分组语句group by的话,整张表的数据自成一组。

分组函数包括五个:

  • max:最大值
  • min:最小值
  • avg:平均值
  • sum:求和
  • count:计数,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1604376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stronghold Village

有了近2000个预制件和大量资产,您可以用基本的或先进的模块化预制件建造您的设防城镇或梦幻村庄,其中有许多定制选项和大量道具和物品 【资产描述】 你准备好建造你的史诗般的奇幻设防小镇了吗?有了这个庞大的资产库,您将能够创建村庄、城市、据点、乡村建筑、大教堂、城堡…

Tricentis测试生成式人工智能系统和红队:入门指南

Tricentis测试生成式人工智能系统和红队:入门指南 测试人工智能并确保其责任、安全和保障的话题从未如此紧迫。自 2021 年以来,人工智能滥用的争议和事件增加了26 倍,凸显了日益增长的担忧。用户很快就会发现,人工智能工具并非万无一失。他们可能会表现出过度自信,并且缺…

JavaWeb--04YApi,Vue-cli脚手架Node.js环境搭建,创建第一个Vue项目

04 1 Yapi2 Vue-cli脚手架Node.js环境搭建配置npm的全局安装路径 3 创建项目&#xff08;这个看下一篇文章吧&#xff09; 1 Yapi 前后端分离中的重要枢纽"接口文档",以下一款为Yapi的接口文档 介绍&#xff1a;YApi 是高效、易用、功能强大的 api 管理平台&#…

使用vite从头搭建一个vue3项目(四)使用axios封装request.js文件,并使用proxy解决跨域问题

目录 一、创建request.js文件二、创建axios实例三、创建请求、响应拦截器四、使用 request.js&#xff0c;测试接口&#xff1a;https://api.uomg.com/api/rand.qinghua1、调取接口代码书写2、注意&#xff08;跨域问题&#xff09; axios 的二次封装有三个要点&#xff1a; 创…

解决程序化刷新EXCEL提示更新外部链接的弹窗问题

解决方法 【信任中心】-> 【消息栏】->勾选如下策略提示 2. 【信任中心】->【外部内容】->启用下面的三项链接 3. 【信任中心】->【宏设置】->启用所有宏

【Python小游戏】植物大战僵尸的实现与源码分享

文章目录 Python版植物大战僵尸环境要求方法源码分享初始化页面&#xff08;部分&#xff09;地图搭建&#xff08;部分&#xff09;定义植物类 &#xff08;部分&#xff09;定义僵尸类&#xff08;部分&#xff09;游戏运行入口 游戏源码获取 Python版植物大战僵尸 已有的植…

MySQL-笔记-06.数据高级查询

目录 6.1 连接查询 6.1.1 交叉连接&#xff08;cross join&#xff09; 6.1.2 内连接&#xff08;inner join&#xff09; 6.1.3 外连接&#xff08;outer join&#xff09; 6.1.3.1 左外连接&#xff08;left [outer] join&#xff09; 6.1.3.2 右外连接&#xff08;rig…

Meta因露骨AI图片陷入困境

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Postgresql源码(126)TupleStore使用场景与原理分析

相关 《Postgresql源码&#xff08;125&#xff09;游标恢复执行的原理分析》 《Postgresql游标使用介绍&#xff08;cursor&#xff09;》 总结 开源PG中使用tuple store来缓存tuple集&#xff0c;默认使用work_mem空间存放&#xff0c;超过可以落盘。在PL的returns setof场景…

回文链表leecode

回文链表 偶数情况奇数情况 回文链表leecode 偶数情况 public boolean isPalindrome(ListNode head) {if (head null) {return true;}ListNode fast head;ListNode slow head;while (fast ! null && fast.next ! null) {fast fast.next.next;slow slow.next;}//反…

Day43:LeedCode 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…

Excel文件解析(Java)

一、概述 在应用程序的开发过程中&#xff0c;经常需要使用 Excel文件来进行数据的导入或导出。所以&#xff0c;在通过Java语言实现此类需求的时候&#xff0c;往往会面临着Excel文件的解析(导入&#xff09;或生成&#xff08;导出)。 在Java技术生态圈中&#xff0c…

Java实现RSA加密示例代码

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 RSA加密是一种非对…

如何配置Postgres的自动扩展功能以应对数据增长

文章目录 解决方案1. 表空间管理2. 分区表3. 自动扩展配置4. 监控和告警5. 使用外部工具和服务 示例代码示例1&#xff1a;创建表空间示例2&#xff1a;创建分区表示例3&#xff1a;调整配置参数示例4&#xff1a;使用监控和告警工具 总结 在PostgreSQL中&#xff0c;随着数据的…

QT-编译报库错误(LF/CRLF)

QT-安装后环境问题记录 版本和环境问题 版本和环境 QT5.15.2 Windows10 QT Creator 问题 在QT夸端开发的项目中 &#xff0c;使用QTCreator打开项目pro文件&#xff0c;编译报出很多系统库 及本地文件中的一些问题&#xff0c;具体如图&#xff1a; 后续&#xff0c;我以为…

宠物店小程序如何搭建制作?宠物店小程序核心功能有哪些?

随着宠物经济的兴起&#xff0c;宠物店的线上服务需求日益增长。微信小程序作为一种便捷的线上服务平台&#xff0c;为宠物店提供了一个与爱宠人士建立联系的新渠道。面对市场上众多的小程序开发选项&#xff0c;宠物店应该如何选择或制作一款适合自己的小程序呢&#xff1f;本…

Java高阶私房菜:快速学会异步编程CompletableFuture

为了使主程代码不受阻塞之苦&#xff0c;一般使用异步编程&#xff0c;而异步编程架构在JDK1.5便已有了雏形&#xff0c;主要通过Future和Callable实现&#xff0c;但其操作方法十分繁琐&#xff0c;想要异步获取结果,通常要以轮询的方式去获取结果&#xff0c;具体如下&#x…

登录github突然出现Two-factor authentication怎么办?

起因 今天想登录github下载项目&#xff0c;输入用户名密码认证之后竟然弹出来了Two-factor authentication&#xff0c;像下图&#xff0c;我只记得之前好像开启过这玩意&#xff0c;但是不知道哪里找这个code了。 解决 在你的iphone里面搜索密码。然后找到github网页&…

程序员能做什么副业?增收致富就靠它们了

作为一个程序员&#xff0c;大家都习惯了朝九晚六&#xff0c;时不时加班的生活。虽然工资听起来比其他行业高一些&#xff0c;但是&#xff0c;都是靠命拼出来的。如何摆脱这种枯燥乏味且前途未卜的生活&#xff0c;应该是很多程序员都在考虑的事情。 而作为一个做了十几年的…

【微服务-Ribbon】什么是负载均衡?微服务中负载均衡有哪些策略呢?

前面几篇文章&#xff0c;我们了解了一下Nacos的单机部署、集群部署以及微服务接入Nacos的步骤。从本篇开始&#xff0c;我们来看一下微服务第二个通用组件-负载均衡&#xff08;Ribbon&#xff09;。 1、Ribbon负载均衡器 负载均衡顾名思义&#xff0c;是指通过软件或者硬件…