《SQL进阶教程》学习

本文详细介绍了SQL中的CASE表达式,包括其概述、使用注意事项和实际应用,如条件分支、数据转换和统计。此外,还讨论了自连接的用法,如排列组合、去重和条件查询。文中通过实例分析了CASE表达式与NULL、HAVING子句以及外连接的关系,探讨了它们在数据处理和分析中的重要作用。
摘要由CSDN通过智能技术生成

2021/10/31

今天开始学习SQL进阶教程。听了两天的培训讲座,受益还挺多,如果我是想要毕业直接去工作的话,实习的经历非常重要,可以多多学习待人处事的方法,当然,技术的学习也非常重要。所以加油吧!

CASE表达式

CASE表达式概述

简单CASE表达式

CASE sex
    when '1' then '男'
    when '2' then '女‘
ELSE '其他' END

搜索CASE表达式

CASE when sex='1' then '男'
        when sex='2' then '女'
else '其他' end

使用CASE表达式需要注意的事情

我们在编写 SQL 语句的时候需要注意,在发现为真的 WHEN 子句时, CASE 表达式的真假值判断就会中止,而剩余的 WHEN 子句会被忽略。为了 避免引起不必要的混乱,使用 WHEN 子句时要注意条件的排他性

CASE WHEN COL_1 IN ('a','b') then '第一'
        when col_1 in ('a') then '第二'
else '其他' end

例如这条SQL语句,结果里不会出现“第二”,因为判断第一条WHEN子句为TRUE,剩余的WHEN子句就被忽略了。

注意事项1:统一各分支返回的数据类型

        CASE表达式里各个分支返回的数据类型都要一致。

注意事项2:不要忘了写END

注意事项3:养成写ELSE子句的习惯

        虽然不写ELSE子句也不会报错(不写ELSE子句时,CASE表达式的执行结果时NULL)。但是不写可能会造成“语法没有错误,结果却不对”的情况。养成习惯可以减少失误。

将已有编号方式转换为新的方式并统计

-- 把县编号转换成地区编号 (1)
SELECT CASE pref_name

 WHEN '德岛' THEN '四国'
 WHEN '香川' THEN '四国'
 WHEN '爱媛' THEN '四国'
 WHEN '高知' THEN '四国'
 WHEN '福冈' THEN '九州'
 WHEN '佐贺' THEN '九州'
 WHEN '长崎' THEN '九州'
 ELSE '其他' END AS district,

 SUM(population)
 FROM PopTbl

 GROUP BY CASE pref_name
 WHEN '德岛' THEN '四国'
 WHEN '香川' THEN '四国'
 WHEN '爱媛' THEN '四国'
 WHEN '高知' THEN '四国'
 WHEN '福冈' THEN '九州'
 WHEN '佐贺' THEN '九州'
 WHEN '长崎' THEN '九州'
 ELSE '其他' END;

   这里的关键在于将 SELECT 子句里的 CASE 表达式复制到 GROUP BY 子句里。需要注意的是,如果对转换前的列“pref_name”进行 GROUP BY,就得不到正确的结果(因为这并不会引起语法错误,所以容易被忽视)。     

-- 按人口数量等级划分都道府县
SELECT 
    CASE WHEN population < 100 THEN '01'
    WHEN population >= 100 AND population < 200 THEN '02'
    WHEN population >= 200 AND population < 300 THEN '03'
    WHEN population >= 300 THEN '04'
    ELSE NULL END AS pop_class,
 COUNT(*) AS cnt
 FROM PopTbl

 GROUP BY CASE WHEN population < 100 THEN '01'
 WHEN population >= 100 AND population < 200 THEN '02'
 WHEN population >= 200 AND population < 300 THEN '03'
 WHEN population >= 300 THEN '04'
 ELSE NULL END;

pop_class cnt
--------- ----
01 1
02 3
03 3
04 2

 自己尝试写的。

这个技巧非常好用。不过,必须在 SELECT 子句和 GROUP BY 子句这 两处写一样的 CASE 表达式,这有点儿麻烦。后期需要修改的时候,很容 易发生只改了这一处而忘掉改另一处的失误。 所以,如果我们可以像下面这样写,那就方便多了。

-- 把县编号转换成地区编号 (2) :将 CASE 表达式归纳到一处
SELECT CASE pref_name
 WHEN '德岛' THEN '四国'
 WHEN '香川' THEN '四国'
 WHEN '爱媛' THEN '四国'
 WHEN '高知' THEN '四国'
 WHEN '福冈' THEN '九州'
 WHEN '佐贺' THEN '九州'
 WHEN '长崎' THEN '九州'
 ELSE '其他' END AS district,
 SUM(population)
FROM PopTbl
GROUP BY district;

 但是严格来说,这种写法是违反标准 SQL 的规则的。 因为 GROUP BY 子句比 SELECT 语句先执行,所以在 GROUP BY 子句中引 用在 SELECT 子句里定义的别称是不被允许的。事实上,在 Oracle、DB2、 SQL Server 等数据库里采用这种写法时就会出错。

用一条SQL语句进行不同条件的统计

-- 男性人口
SELECT pref_name,
 SUM(population)
 FROM PopTbl2
 WHERE sex = '1'
 GROUP BY pref_name;
-- 女性人口
SELECT pref_name,
 SUM(population)
 FROM PopTbl2
 WHERE sex = '2'
 GROUP BY pref_name;

--再用UNION连接

如果使用 CASE 表达式,下面这一条 简单的 SQL 语句就可以搞定。

select pref_name,
    --男性人口
    sum( case when sex='1' then population else 0 end) as cnt-m,
    --女性人口
    sum( case when sex='2' then population else 0 end) as cnt_f
from PopTbl2
group by pref_name;

上面这段代码所做的是,分别统计每个县的“男性”(即 '1')人数和 “女性”(即 '2')人数。也就是说,这里是将“行结构”的数据转换成了“列 结构”的数据。除了 SUM,COUNT、AVG 等聚合函数也都可以用于将行结构的数据转换成列结构的数据

这个技巧可贵的地方在于,它能将 SQL 的查询结果转换为二维表的格式

新手用 WHERE 子句进行条件分支,高手用 SELECT 子句进行条件 分支。

 自己写的,不过不是一个好例子(捂脸)。

用CHECK约束定义多个列的条件关系

CASE 表达式和 CHECK 约束是很般配的一对组合。

--假设某公司规定“女性员工的工资必须在 20 万日元以下”
CONSTRAINT check_salary CHECK
        (CASE WHEN sex='2'
            THEN CASE WHEN salary <= 2000
                    THEN 1 ELSE 0 END
            ELSE 1 END =1)

在这段代码里,CASE 表达式被嵌入到 CHECK 约束里,描述了“如果 是女性员工,则工资是 20 万日元以下”这个命题。在命题逻辑中,该命题是叫作蕴含式(conditional)的逻辑表达式,记作 P → Q

这里需要重点理解的是蕴含式和逻辑与(logical product)的区别。逻 辑与也是一个逻辑表达式,意思是“P 且 Q”,记作 P ∧ Q。用逻辑与改 写的 CHECK 约束如下所示。

CONSTRAINT check_salary CHECK
        (sex = '2' and salary<=2000)

 

在UPDATE语句里进行条件分支

 

-- 用 CASE 表达式写正确的更新操作
UPDATE Salaries
 SET salary = CASE WHEN salary >= 300000
 THEN salary * 0.9
 WHEN salary >= 250000 AND salary < 280000
 THEN salary * 1.2
 ELSE salary END;

-- 条件 1
UPDATE Salaries
 SET salary = salary * 0.9
 WHERE salary >= 300000;
-- 条件 2
UPDATE Salaries
 SET salary = salary * 1.2
 WHERE salary >= 250000 AND salary < 280000;
--然后用UNION连接

这种写法是错误的。

这个技巧的应用范围很广。例如,可以用它简单地完成主键值调换这 种繁重的工作。通常,当我们想调换主键值 a 和 b 时,需要将主键值临时 转换成某个中间值。使用这种方法时需要执行 3 次 UPDATE 操作,但是如 果使用 CASE 表达式,1 次就可以做到。

--1. 将 a 转换为中间值 d
UPDATE SomeTable
 SET p_key = 'd'
 WHERE p_key = 'a';

--2. 将 b 调换为 a
UPDATE SomeTable
 SET p_key = 'a'
1-1 CASE表达式 13 ●
 WHERE p_key = 'b';

--3. 将 d 调换为 b
UPDATE SomeTable
 SET p_key = 'b'
 WHERE p_key = 'd';

-- 用 CASE 表达式调换主键值
UPDATE SomeTable
 SET p_key = CASE WHEN p_key = 'a'
 THEN 'b'
 WHEN p_key = 'b'
 THEN 'a'
 ELSE p_key END
 WHERE p_key IN ('a', 'b');

显而易见,这条 SQL 语句按照“如果是 a 则更新为 b,如果是 b 则 更新为 a”这样的条件分支进行了 UPDATE 操作。不只是主键,唯一键的 调换也可以用同样的方法进行。本例的关键点和上一例的加薪与降薪一样, 即用 CASE 表达式的条件分支进行的更新操作是一气呵成的,因此可以避免出现主键重复所导致的错误

表之间的数据匹配

与 DECODE 函数等相比,CASE 表达式的一大优势在于能够判断表达式。 也就是说,在 CASE 表达式里,我们可以使用 BETWEEN、LIKE 和 等 便利的谓词组合,以及能嵌套子查询的 IN 和 EXISTS 谓词。因此,CASE 表达式具有非常强大的表达能力

--我们需要做的是,检查表 OpenCourses 中的各月里有表 CourseMaster
--中的哪些课程。这个匹配条件可以用 CASE 表达式来写。

--表的匹配:使用IN谓词
SELECT course_name,
     CASE WHEN course_id IN 
         (SELECT course_id FROM OpenCourses 
         WHERE month = 200706) THEN '○'
weixin_53794695
关注 关注
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sql进阶教程学习必备
05-13
以上内容仅是SQL进阶教程中可能涵盖的部分知识点,实际学习中还可能涉及更复杂的数据仓库概念、SQL Server特有的特性,如SSIS、SSRS、SSAS,或者MySQL、Oracle、PostgreSQL等不同数据库系统的特定功能。通过系统学习...
Hive常用函数
Piepis的博客
09-23 1760
IF函数:if 语法: if(testCondition,valuTrue,valueFalseOrNull)说明:当条件 testCondition 为True时,返回valueTrue, 否则返回valueFalseOrNull 条件判断函数:CASE 语法: Case A when b THEN c [WHEN d THEN e] * [ELSE f] END说明:如果a 等于 b,那么返回c,如果a等于d,那么返回e,否则返回f eg: -- 销售类型增加一级部门的prt_distributio
sql进阶教程
保持热爱,持续学习
02-01 4167
SQL进阶教程
SQL学习分享(进阶篇)
最新发布
zzhqjnm的博客
07-31 953
- 创建course数据表-- 创建score数据表s_id INT,c_id INT,score INT);-- 创建teacher数据表t_id INT,-- 清空student数据表并插入数据INSERT INTO student VALUES(1,'胡图图','男',6);INSERT INTO student VALUES(2,'牛爷爷','男',55);INSERT INTO student VALUES(3,'壮壮妈','女',33);
SQL进阶教程 | 史上最易懂SQL教程 5小时零基础成长SQL大师(1)
m0_51448653的博客
03-23 6032
目录 第一部分:基础——增删查改 【第一章】做好准备 Getting Started (时长25分钟) 【第二章】在单一表格中检索数据 Retrieving Data From a Single Table (时长53分钟) 【第三章】在多张表格中检索数据 Retrieving Data From Multiple Tables (时长1小时2分) 【第四章】插入、更新和删除数据 Inserting, Updating, and Deleting Data (时长42分钟) 第二部分:基础进阶——汇总、复杂
hive 数据类型转换、字符串函数、条件判断
SeaSky_Steven的博客
11-27 2654
数据类型转换 同Java语言一样,Hive也包括 隐式转换(implicit conversions)和显式转换(explicitly conversions)。 Hive在需要的时候将会对numeric类型的数据进行隐式转换。比如我们对两个不同数据类型的数字进行比较,假如一个数据类型是INT型,另一个 是SMALLINT类型,那么SMALLINT类型的数据将会被隐式转换地转换为INT类型,这个...
SQL进阶教程 | 史上最易懂SQL教程!10小时零基础成长SQL大师!!
weixin_45732235的博客
09-28 2378
mysql学习
PDF00213.SQL进阶教程_sql_
09-30
SQL进阶教程》是一本面向中级用户的实用指南,旨在帮助读者深入理解并掌握SQL语言的高级技巧,进一步提升在数据库管理和数据处理方面的技能。在本教程中,我们将探讨SQL的多个关键领域,包括复杂的查询、性能优化...
SQL进阶教程 配套示例SQL语句
07-05
SQL(Structured Query Language)的世界里,进阶教程通常涵盖了超越基础查询的复杂操作,旨在帮助用户提升数据库管理和分析的能力。本教程配套的SQL语句示例,将为我们揭示一些高级概念和技术,如联接、子查询、...
MySQL从库的列类型不一致导致的复制异常问题
weixin_34043301的博客
04-05 143
官方文档:https://dev.mysql.com/doc/refman/5.6/en/replication-features-differing-tables.htmlslave_type_conversions 这个参数在mysql5.5.3 引入,目的是启用row 格式的bin-log 的时候,如果主从的column 的数据类型不一致,会导致复制失败,mysql5...
oracle 071中英翻译,oracle_ocp_071
weixin_36370851的博客
04-05 1367
FROM customersWHERE country_id = 10UNIONSELECT cust_id CUST_NO, cust_last_nameFROM customersWHERE country_id = 30;Which ORDER BY clause are valid for the above query?(Choose all that apply.)::A.ORDER ...
数据库SQL入门教程(非常详细),从零基础入门到精通,看完这一篇就够了
Innocence_0的博客
08-22 2万+
SQL语言有40多年的历史,从它被应用至今几乎无处不在。我们消费的每一笔支付记录,收集的每一条用户信息,发出去的每一条消息,都会使用数据库或与其相关的产品来存储,而操纵数据库的语言正是 SQLSQL 对于现在的互联网公司生产研发等岗位几乎是一个必备技能,如果不会 SQL 的话,可能什么都做不了。你可以把 SQL 当做是一种工具,利用它可以帮助你完成你的工作,创造价值。文章结尾有 SQL 小测验哦!看看你能得几分?⭐️ 点我跳转到 SQL 测验!SQL 是用于访问和处理数据库的标准的计算机语言。
Mysqlcase when基本用法以及它的返回值类型
weixin_34148340的博客
05-19 3142
2019独角兽企业重金招聘Python工程师标准>>> ...
7种SQL 进阶用法,你一定能用到
Leon的博客
11-05 210
MySql,进阶用法,在实际应用种一定能用到
分享7种SQL进阶用法
csbysj2020
01-29 4435
本文分享了7种 SQL进阶用法,包括子查询、连接查询、聚合函数、GROUP BY 和 HAVING、窗口函数、CASE 语句和事务处理。子查询是 SQL 查询中的一部分,用于从表中检索数据。子查询可以嵌套,即一个查询作为另一个查询的条件。连接查询有多种类型,包括内连接、左连接、右连接和全连接。GROUP BY 用于对查询结果进行分组,而 HAVING 用于过滤分组后的结果。聚合函数用于对一组数据进行汇总,如求和、平均、最大值、最小值等。窗口函数用于对查询结果进行分组和聚合,如计算排名、分组统计等。
sql语句进阶教程学习sql这一篇就够了)
java、c++、机器学习方向King
05-04 1万+
最近从图书馆借了本介绍SQL的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用。 PS:本文适用SQL Server2008语法。 一、关系型数据库SQL 实际上准确的讲,SQL是一门语言,而不是一个数据库。 什么是SQL呢?简而言之,SQL就是维护和使用关系型数据库中的的数据的一种标准的计算机语言。 1.1 SQL语言主要有3个主要的组成
SQL入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
热门推荐
Python84310366的博客
07-05 8万+
SQL 是用于访问和处理数据库的标准的计算机语言。SQL 指结构化查询语言SQL 使我们有能力访问数据库SQL 是一种 ANSI 的标准计算机语言SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。但是由于各种各样的数据库出现,导致很多不同版本的 SQL 语言。
写文章

热门文章

  • 《SQL进阶教程》学习 1113
  • 《SQL基础教程》学习打卡 544
  • 学习MYSQL和PGSQL 523
  • 学习SQL时遇到的问题——利用HAVING子句进行自连接求中位数 417
  • 数据库课上遇到的问题汇总 206

最新文章

  • 学习MYSQL和PGSQL
  • 学习SQL时遇到的问题——利用HAVING子句进行自连接求中位数
  • 学习数据库时遇到的问题——使用自连接排序
2021年7篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家选择好的玻璃钢花盆雕塑北京环保玻璃钢雕塑供应商温州玻璃钢花盆哪里有浚县玻璃钢雕塑定制宁波卡通雕塑玻璃钢玻璃钢雕塑合同范本江苏花园玻璃钢花盆深圳卡通玻璃钢雕塑厂家哪家好福建高质量玻璃钢雕塑市场上海玻璃钢狮子雕塑合作玻璃钢仿铜雕塑泰安玻璃钢雕塑价格云浮玻璃钢卡通雕塑厂家呼和浩特玻璃钢雕塑设计定制玻璃钢仿铜雕塑定做厂浙江开业商场美陈供应商上海玻璃钢雕塑摆件销售珠海玻璃钢卡通雕塑摆件乐山玻璃钢雕塑摆件施工滨州仿铜玻璃钢雕塑生产厂家玻璃钢雕塑材料制作郑州组合式玻璃钢花盆玻璃钢花盆用什么材料制淮北动物玻璃钢雕塑市场led发光玻璃钢雕塑制作保山市玻璃钢雕塑设计订做威海小区玻璃钢雕塑厂家萍乡动物玻璃钢雕塑生产厂家江宁百货商场美陈北海玻璃钢雕塑特点香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化