SQL 逻辑处理核心知识点全解析,从入门到精通看这篇就够了!
wptr33 2025-05-26 19:24 17 浏览
刚入行程序员 / 数据分析?写 SQL 总卡壳?别愁!今天一次性把SQL 逻辑处理核心技能讲透,涵盖数值、字符、日期函数 + 条件表达式,附超全数据库差异对比,工作中直接套用!
一、SQL 函数大揭秘!这 4 类核心函数搞定 90% 数据处理难题
(1)数值函数:算工资 / 抽奖 / 取整全靠它
绝对值、取整函数:
- ABS(x) 直接算绝对值,负数变正数超简单
- 向上取整用CEIL(x)(Oracle/PostgreSQL),SQL Server 用CEILING(x),向下取整FLOOR(x)全库通用 场景:计算员工绩效分(如 0.6 分按 1 分算,直接CEIL(0.6))
随机数函数:抽奖必备!
- MySQL/SQLite:RAND() 生成 0-1 随机小数,每次调用都不同
- Oracle:DBMS_RANDOM.VALUE 更强大,还能生成随机字符串
- SQL Server:注意!同一查询里RAND()返回值相同,得用NEWID()辅助排序
(2)字符函数:处理姓名 / 邮箱 / 地址全靠它
字符串长度:
- 算字符数用CHAR_LENGTH(s)(MySQL/PostgreSQL),Oracle 用LENGTH(s),SQL Server 用LEN(s)
- 算字节数(存数据库必看!):OCTET_LENGTH(s)(MySQL)、LENGTHB(s)(Oracle)
字符串拼接:
- 通用CONCAT('S','Q','L')直接拼,Oracle 一次只能拼 2 个,得嵌套CONCAT(CONCAT('S','Q'),'L')
- 带分隔符拼接CONCAT_WS('-','S','Q','L')= S-Q-L,新手必学!
(3)日期函数:算工龄 / 考勤 / 截止日必备
当前时间:
- 查日期CURRENT_DATE、时间CURRENT_TIME,SQL Server 得用CAST(GETDATE() AS DATE)转换
日期加减:
- 算天数差:MySQL 用DATEDIFF('2023-10-01','2023-09-01'),Oracle 直接'2023-10-01'-'2023-09-01'
- 算月份差:SQL Server 用DATEADD(MONTH,-1,'2023-02-01'),SQLite 靠STRFTIME函数实现
(4)转换函数:避免类型错误!
- 显式转换CAST("123" AS INTEGER):字符串转数字必用,防止计算出错
- 隐式转换要小心!"666"+123会自动转数字,但"abc"+123直接报错,新手常踩坑!
二、告别复杂 IF 语句!SQL 条件表达式 CASE 让逻辑处理更简单
(1)简单 CASE:等值判断秒出结果
-- 根据部门编号转部门名称
SELECT emp_name,
CASE dept_id
WHEN 1 THEN '行政部'
WHEN 2 THEN '人事部'
ELSE '其他部门'
END AS 部门
FROM employee;
适合固定值匹配,比如性别、状态码转换
(2)搜索 CASE:复杂逻辑一步搞定
-- 根据月薪分收入等级
SELECT emp_name, salary,
CASE
WHEN salary < 10000 THEN '低收入'
WHEN salary < 20000 THEN '中收入'
ELSE '高收入'
END AS 收入级别
FROM employee;
重点!支持范围判断(如薪资区间)、多条件组合(AND/OR),比 Excel 函数强 10 倍!
(3)不同数据库 “平替” 函数
- Oracle 专属DECODE:功能类似简单 CASE,但移植性差,建议少用
- MySQL 的IF/SQL Server 的IIF:简化版条件判断,适合新手快速入门
三、3 个实战案例!直接套用解决工作难题
(1)年会抽奖:随机抽 1 人怎么写?
- MySQL/PostgreSQL:SELECT * FROM employee ORDER BY RAND() LIMIT 1;
- SQL Server:SELECT * FROM employee ORDER BY NEWID() FETCH FIRST 1 ROW ONLY; 注意!加LIMIT 1/FETCH FIRST才能只返回 1 条,新手常忘!
(2)隐私保护:姓名隐藏中间字(如 “张 * 三”)
-- 适用于3字及以上姓名
SELECT CONCAT(
LEFT(emp_name, CHAR_LENGTH(emp_name)-2), -- 取前n-2个字
'*', -- 中间用*代替
RIGHT(emp_name, 1) -- 取最后1个字
) AS 隐藏姓名
FROM employee;
(3)算入职年限发礼品:多条件判断怎么写?
-- 按入职年份+性别发礼品
SELECT emp_name,
CASE
WHEN EXTRACT(YEAR FROM hire_date) > 2011 AND sex='男' THEN '手表'
WHEN EXTRACT(YEAR FROM hire_date) > 2011 AND sex='女' THEN '化妆品'
ELSE '电脑'
END AS 礼品
FROM employee;
四、新手必看!不同数据库函数差异表(直接截图保存)
功能 | Oracle | MySQL | SQL Server | PostgreSQL | SQLite |
求余数 | MOD(x,y) | MOD(x,y)/% | % | MOD(x,y)/% | % |
随机数 | DBMS_RANDOM | RAND() | RAND ()(需 NEWID) | RANDOM() | RANDOM() |
字符串连接 | CONCAT(2 参) | CONCAT | + | ||
提取年份 | EXTRACT(YEAR) | EXTRACT(YEAR) | DATEPART(YEAR) | EXTRACT(YEAR) | STRFTIME("%Y") |
五、写在最后:3 个学习小贴士
- 记不住函数? 收藏这篇笔记,按 “数值 / 字符 / 日期 / 条件” 分类查,比翻文档快 10 倍!
- 避免踩坑! 不同数据库语法有差异(如 SQL Server 的 ROUND 不能省参数),写完先在本地测试!
- 实战最重要! 用员工表 / 订单表练手,比如算每个员工年薪、隐藏身份证号中间 8 位,边练边记印象深!
学会这一套,处理数据效率翻倍,写复杂报表再也不用加班!赶紧转发给需要的同事,一起涨薪升职!#SQL##数据分析师##数据库#
相关推荐
- redis的八种使用场景
-
前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...
- 基于Redis的3种分布式ID生成策略
-
在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...
- 基于OpenWrt系统路由器的模式切换与网页设计
-
摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...
- 这篇文章教你看明白 nginx-ingress 控制器
-
主机nginx一般nginx做主机反向代理(网关)有以下配置...
- 如何用redis实现注册中心
-
一句话总结使用Redis实现注册中心:服务注册...
- 爱可可老师24小时热门分享(2020.5.10)
-
No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...
- Apportable:拯救程序员,IOS一秒变安卓
-
摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...
- JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透
-
以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...
- 3月26日更新 快速施法自动施法可独立设置
-
2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...
- Redis 是如何提供服务的
-
在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...
- lua _G、_VERSION使用
-
到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...
- China's top diplomat to chair third China-Pacific Island countries foreign ministers' meeting
-
BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...
- 移动工作交流工具Lua推出Insights数据分析产品
-
Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...
- Redis 7新武器:用Redis Stack实现向量搜索的极限压测
-
当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...
- Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求
-
重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)