SQL进阶教程学习笔记

在学习《SQL进阶教程学习》的记录笔记,现学现用效率真的很高,带着问题学习,记忆会深很多很多。


  • CASE表达式

CASE表达式有简单CASE表达式(simple caseexpression)和搜索CASE表达式(searched case expression)两种写法。

    --简单CASE表达式CASE sexWHEN '1' THEN ’男’WHEN '2' THEN ’女’ELSE ’其他’ END--搜索CASE表达式CASE WHEN sex ='1'THEN’男’WHEN sex ='2'THEN’女’ELSE ’其他’ END

tips:

  1. 因为GROUP BY子句比SELECT语句先执行,所以在GROUP BY子句中引用在SELECT子句里定义的别称是不被允许的。
  • 用一条SQL语句进行不同条件的统计:

进行不同条件的统计是CASE表达式的著名用法之一。

  • 新手用WHERE子句进行条件分支,高手用SELECT子句进行条件分支:
    -- 男性人口SELECT pref_name,SUM(population)FROM PopTbl2WHERE sex ='1'GROUP BY pref_name;-- 女性人口SELECT pref_name,SUM(population)FROM PopTbl2WHERE sex ='2'GROUP BY pref_name;
    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_fFROM  PopTbl2GROUP BY pref_name;
  • 用CHECK约束定义多个列的条件关系

  • 在UPDATE语句里进行条件分支
    --条件1UPDATE SalariesSET salary = salary * 0.9WHERE salary >= 300000;--条件2UPDATE SalariesSET salary = salary * 1.2WHERE salary >= 250000 AND salary < 280000;

两个UPDATE函数依次执行的话,可能会反复操作同一个数据,因此会造成错误。因此使用UPDATE与CASE函数结合,而且因为只需执行一次,所以速度也更快:

    --用CASE表达式写正确的更新操作UPDATE SalariesSET salary = CASE WHEN salary >= 300000THEN salary * 0.9WHEN salary >= 250000 AND salary < 280000THEN salary * 1.2ELSE salary END;
  • 主键值调换:
    --1.将a转换为中间值dUPDATE SomeTableSET p_key ='d'WHERE p_key ='a';--2.将b调换为aUPDATE SomeTableSET p_key ='a'WHERE p_key ='b';--3.将d调换为bUPDATE SomeTableSET p_key ='b'WHERE p_key ='d';

​​​​​​​没有必要执行3次UPDATE操作,因此可以用UPDATE结合CASE:

    --用CASE表达式调换主键值UPDATE SomeTableSET p_key = CASE WHEN p_key ='a'THEN 'b'WHEN p_key ='b'THEN 'a'ELSE p_key ENDWHERE p_key IN ('a', 'b');
  • 表之间的数据匹配
    --表的匹配:使用IN谓词SELECT course_name,CASE WHEN course_id IN(SELECT course_id FROM OpenCoursesWHERE month = 200706) THEN'○'ELSE'×'END AS "6月",CASE WHEN course_id IN(SELECT course_id FROM OpenCoursesWHERE month = 200707) THEN'○'ELSE'×'END AS "7月",CASE WHEN course_id IN(SELECT course_id FROM OpenCoursesWHERE month = 200708) THEN'○'ELSE'×'END  AS "8月"FROM CourseMaster;--表的匹配:使用EXISTS谓词SELECT CM.course_name,CASE WHEN EXISTS(SELECT course_id FROM OpenCourses OCWHERE month = 200706AND OC.course_id = CM.course_id) THEN'○'ELSE'×'END AS "6月",CASE WHEN EXISTS(SELECT course_id FROM OpenCourses OCWHERE month = 200707AND OC.course_id = CM.course_id) THEN'○'ELSE'×'END AS "7月",CASE WHEN EXISTS(SELECT course_id FROM OpenCourses OCWHERE month = 200708AND OC.course_id = CM.course_id) THEN'○'ELSE'×'END  AS "8月"FROM CourseMaster CM;

tips:

使用EXISTS时还要把两个表格的相同列表示出来。

  • 自连接
  • 排序

方法一、使用窗口函数:

    --排序:使用窗口函数SELECT name, price,RANK() OVER (ORDER BY price DESC) AS rank_1,DENSE_RANK() OVER (ORDER BY price DESC) AS rank_2FROM Products;

​​​​​​​tips:

  1. rank_1跳过了之后的位次,rank_2没有跳过,而是连续排序。

方法二、使用自连接:

    --排序从1开始。如果已出现相同位次,则跳过之后的位次SELECT P1.name,P1.price,(SELECT COUNT(P2.price)FROM Products P2WHERE P2.price > P1.price) + 1 AS rank_1FROM Products P1ORDER BY rank_1;

​​​​​​​

  • 三值逻辑和NULL:

二值逻辑:true、false

三值逻辑(three-valued logic):true、false、unknown

两种NULL分别指的是“未知”(unknown)和“不适用”(not applicable,inapplicable)。“未知”指的是“虽然现在不知道,但加上某些条件后就可以知道”;而“不适用”指的是“无论怎么努力都无法知道”。

三个真值之间的优先级顺序:

  1. AND的情况: false > unknown > true
  2. OR的情况: true > unknown > false

  • HAVING子句的力量:

SQL是一种基于“面向集合”思想设计的语言,同样具备这种设计思想的语言很少;最开始学习过了某种理念的语言后,心理上会形成思维定式,从而妨碍我们理解另一种理念的语言。

  • 寻找缺失的编号
    -- 如果有查询结果,说明存在缺失的编号SELECT’存在缺失的编号’AS gapFROM SeqTblHAVING COUNT(*) <> MAX(seq);

​​​​​​​

如果这个查询结果有1行,说明存在缺失的编号;如果1行都没有,说明不存在缺失的编号。

    -- 查询缺失编号的最小值SELECT MIN(seq + 1) AS gapFROM SeqTblWHERE (seq+ 1) NOT IN ( SELECT seq FROM SeqTbl);

tips:

  1. HAVING子句是可以单独使用的
  • 用HAVING子句进行子查询:求众数

众数(mode):指的是在群体中出现次数最多的值.

    --求众数的SQL语句(1):使用谓词SELECT income, COUNT(*) AS cntFROM GraduatesGROUP BY incomeHAVING COUNT(*) >= ALL ( SELECT COUNT(*)FROM GraduatesGROUP BY income);
    --求众数的SQL语句(2):使用极值函数SELECT income, COUNT(*) AS cntFROM GraduatesGROUP BY incomeHAVING COUNT(*) >=  ( SELECT MAX(cnt)FROM ( SELECT COUNT(*) AS cntFROM GraduatesGROUP BY income) TMP ) ;

​​​​​​​

  • 用HAVING子句进行自连接:求中位数

中位数(median):指的是将集合中的元素按升序排列后恰好位于正中间的元素。

    --求中位数的SQL语句:在HAVING子句中使用非等值自连接SELECT AVG(DISTINCT income)FROM (SELECT T1.incomeFROM Graduates T1, Graduates T2GROUP BY T1.income--S1的条件HAVING SUM(CASE WHEN T2.income >= T1.income THEN 1 ELSE 0 END)>= COUNT(*) / 2--S2的条件AND SUM(CASE WHEN T2.income <= T1.income THEN 1 ELSE 0 END)>= COUNT(*) / 2 ) TMP;
  • 查询不包含NULL的集合

COUNT函数的使用方法有COUNT(*)和COUNT(列名)两种,它们的区别有两个:

  1. 第一个是性能上的区别;
  2. 第二个是COUNT(*)可以用于NULL,而COUNT(列名)与其他聚合函数一样,要先排除掉NULL的行再进行统计。第二个区别也可以这么理解:COUNT(*)查询的是所有行的数目,而COUNT(列名)查询的则不一定是。
    --查询“提交日期”列内不包含NULL的学院(1):使用COUNT函数SELECT dptFROM StudentsGROUP BY dptHAVING COUNT(*) = COUNT(sbmt_date);
    --查询“提交日期”列内不包含NULL的学院(2):使用CASE表达式SELECT dptFROM StudentsGROUP BY dptHAVING COUNT(*) = SUM(CASE WHEN sbmt_date IS NOT NULLTHEN 1ELSE 0 END);

tips:

  1. 表不是文件,记录也没有顺序,所以SQL不进行排序。
  2. SQL不是面向过程语言,没有循环、条件分支、赋值操作。(这个思维模式真的很难改变,我的第一反应就是循环、条件分支)
  3. SQL通过不断生成子集来求得目标集合。SQL不像面向过程语言那样通过画流程图来思考问题,而是通过画集合的关系图来思考。SQL是集合语言
  •  外连接的用法:

  • ​​​​​​​EXISTS:

  • 让SQL飞起来:

参数是子查询时,使用EXISTS代替IN

tips:

  1. 如果IN的参数是“1, 2, 3”这样的数值列表,一般还不需要特别注意。但是如果参数是子查询,那么就需要注意了。
  2. 但是从代码的可读性上来看,IN要比EXISTS好。使用IN时的代码看起来更加一目了然,易于理解。因此,如果确信使用IN也能快速获取结果,就没有必要非得改成EXISTS了。
  3. IN的参数是子查询时,数据库首先会执行子查询,然后将结果存储在一张临时的工作表里(内联视图),然后扫描整个视图。很多情况下这种做法都非常耗费资源。使用EXISTS的话,数据库不会生成临时的工作表

使用EXISTS时更快的原因有以下两个:

  1. 如果连接列(id)上建立了索引,那么查询Class_B时不用查实际的表,只需查索引就可以了。
  2. 如果使用EXISTS,那么只要查到一行数据满足条件就会终止查询,不用像使用IN时一样扫描全表。在这一点上NOT EXISTS也一样。

tips:

  1. 极值函数在统计时会把为NULL的数据排除掉。

(不定期更新。。。)

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

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

相关文章

实战!工作中常用的设计模式

文章目录 前言一、策略模式1.1、 业务场景1.2 、策略模式定义1.3、 策略模式使用1.3.1、一个接口&#xff0c;两个方法1.3.2、不同策略的差异化实现1.3.3、使用策略模式 二、责任链模式2.1、业务场景2.2、责任链模式定义2.3、责任链模式使用2.3.1、一个接口或者抽象类2.3.2、每…

rust从0开始写项目-03-多样话错误处理

一个优秀的项目&#xff0c;错误处理的优雅性是至关重要的&#xff0c;而rust&#xff0c;anyhow creat是绕不过去的一个&#xff0c;今天我们来研究下&#xff0c;怎么使用它&#xff0c;帮助我们写出更优雅的代码 关注 vx golang技术实验室&#xff0c;获取更多golang、rust好…

解决Huggingface被墙下载模型的问题

参考&#xff1a; 如何快速下载huggingface模型——全方法总结 - padeoe的文章 - 知乎 https://zhuanlan.zhihu.com/p/663712983 和&#xff1a; https://hf-mirror.com/docs/huggingface_hub/guides/download#download-from-the-cli 最近几月huggingface彻底无法访问&…

【springboot配置项动态刷新】与【yaml文件转换为java对象】

文章目录 一&#xff0c;序言二&#xff0c;准备工作1. pom.xml引入组件2. 配置文件示例 三&#xff0c;自定义配置项动态刷新编码实现1. 定义自定义配置项对象2. 添加注解实现启动时自动注入3. 实现yml文件监听以及文件变化处理 四&#xff0c;yaml文件转换为java对象1. 无法使…

大容量疯了!居然想把磁带放到硬盘,100TB+是否可以实现?

1.引言 上一篇关于大容量硬盘的文章&#xff08;HDD最后的冲刺&#xff1a;大容量硬盘的奋力一搏&#xff09;中&#xff0c;我们针对大容量硬盘研发状态&#xff0c;小编最近又有了新发现。WDC希望可以通过HDD和磁带结合&#xff0c;把盘的容量提升到100TB。 2.数据大爆炸的…

问题描述:64位计算机的寻址能力是多少TB

问题描述&#xff1a;64位计算机的寻址能力是多少TB 我在看到一个32位电脑的寻址能力计算时&#xff0c;看到是这么计算的。 虚拟内存的大小受到计算机地址位数的限制&#xff0c; 那么32位电脑的寻址能力计算应该是这样 为什么网上百度到的是16TB呢&#xff0c;如下图所示 中…

大数据毕业设计选题推荐-农作物观测站综合监控平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Web实验总

目录 网站需求&#xff1a; 思路&#xff1a; 实验步骤&#xff1a; 第一步&#xff1a;准备工作 第二步&#xff1a;新建一个存储网页的目录 第三步&#xff1a;修改本地hosts映射 第四步&#xff1a;修改配置文件&#xff0c;建立基于http服务的网站 1)创建用户song和…

宠物医院信息展示预约小程序的效果如何

养宠家庭越来越多&#xff0c;随之带来的就是宠物健康问题&#xff0c;生活条件稍微好点的家庭&#xff0c;只要宠物生病或洗护、寄养、美容等就会前往宠物医院&#xff0c;而近些年来&#xff0c;市场中的宠物医院也在连年增加&#xff0c;可以预见市场需求度较高。 而对宠物…

打开ps提示,计算机中丢失d3dcompiler_47.dll怎么解决?

“d3dcompiler_47.dll丢失5个解决办法”。相信很多同事在工作或者娱乐的过程中&#xff0c;都遇到过这个错误提示。那么&#xff0c;究竟什么是d3dcompiler_47.dll文件&#xff1f;为什么会丢失呢&#xff1f;又该如何解决这个问题呢&#xff1f;接下来&#xff0c;我将为大家详…

【CMU 15-445】Proj1 Buffer Pool Manager

Buffer Pool Manager 通关记录Task1 LRU-K Replacement PolicyTask2 Disk SchedulerTask3 Buffer Pool ManagerFlushPageFlushAllPagesUnpinPageNewPageFetchPageDeletePage Optimizations CMU-15445汇总 本文对应的project版本为CMU-Fall-2023的project1 由于Andy要求&#xf…

JavaEE初阶学习:Linux 基本使用和 web 程序部署

1.Linux的基本认识 Linux 是一个操作系统.(搞管理的系统) 和Windows都是同类产品~~ Linux 实际的场景: 1.服务器 2.嵌入式设备 3.移动端(手机)Android 其实就是Linux 1991年,还在读大学的 芬兰人 Linus Benedict Torvalds,搞了一个Linux 这样的系统0.01版,正式发布了~ 后…

基于pytorch使用特征图输出进行特征图可视化

使用特征图输出进行特征图可视化 文章目录 前言效果展示获取某一层特征图输出原图方法一&#xff1a;使用IntermediateLayerGetter类方法二&#xff1a;使用hook机制&#xff08;推荐&#xff09; 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例…

【 云原生 | K8S 】kubectl 详解

目录 1 kubectl 2 基本信息查看 2.1 查看 master 节点状态 2.2 查看命名空间 2.3 查看default命名空间的所有资源 2.4 创建命名空间app 2.5 删除命名空间app 2.6 在命名空间kube-public 创建副本控制器&#xff08;deployment&#xff09;来启动Pod&#xff08;nginx-wl…

大数据-之LibrA数据库系统告警处理(ALM-12036 license文件即将过期)

告警解释 系统每天零点检查一次当前系统中的license文件&#xff0c;如果当前时间距离过期时间不足60天&#xff0c;则license文件即将过期&#xff0c;产生该告警。 当重新导入一个正常license&#xff0c;告警恢复。 说明&#xff1a; 如果当前集群使用节点数小于等于10节…

linux环境安装SVN,以及常用的SVN操作

1、检查系统是否已经安装如果安装就卸载 检查&#xff1a; svnserve --version 卸载&#xff1a; yum remove subversion 2、安装 yum install subversion 3、建立SVN库&#xff08;文件位置可自由&#xff09; 创建仓库文件夹&#xff1a; mkdir -p /opt/svn/repositor…

RLHF的替代算法之DPO原理解析:从Zephyr的DPO到Claude的RAILF

前言 本文的成就是一个点顺着一个点而来的&#xff0c;成文过程颇有意思 首先&#xff0c;如上文所说&#xff0c;我司正在做三大LLM项目&#xff0c;其中一个是论文审稿GPT第二版&#xff0c;在模型选型的时候&#xff0c;关注到了Mistral 7B(其背后的公司Mistral AI号称欧洲…

049-第三代软件开发-软件部署脚本(一)

第三代软件开发-软件部署脚本(一) 文章目录 第三代软件开发-软件部署脚本(一)项目介绍软件部署脚本(一)其他方式 关键字&#xff1a; Qt、 Qml、 bash、 shell、 脚本 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object…

使用iperf3在macOS上进行网络性能测试

iperf3是一个用于测量网络性能的工具&#xff0c;它可以帮助你了解两台服务器之间的带宽和延迟。本博客将指导你在macOS上安装iperf3&#xff0c;并展示如何连接服务器进行网络性能测试。 步骤1&#xff1a;安装Homebrew 如果你尚未安装Homebrew&#xff0c;可以通过以下步骤…

nfs配置

1.NFS介绍 NFS就是Network File System的缩写&#xff0c;它最大的功能就是可以通过网络&#xff0c;让不同的机器、不同的操 作系统可以共享彼此的文件。 NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文 件系统中&#xff0c;而在本地端的系统中来看&#…