SQL Server进阶教程读书笔记

最近把SQL Server进阶教程重新读了一遍,顺便整理了一下书本中的知识点

1.关键知识点

CASE WHEN

        ❑ 高手使用select做分支,新手用where和having做分支
        ❑ 要写ELSE,要写END,避免未匹配上得到NULL
        ❑ check到底怎么用? 
                在SQL Server中,select中无法使用该关键字,只能在表字段里面设置,对某个(或者N个)字段进行条件约束
        ❑ 作为表达式,CASE表达式在执行时会被判定为一个固定值,在能写列名和常量的地方,通常都可以写CASE表达式

NULL

        ❑ NULL不是值,判断NULL只能写成IS NULL,不能写成=NULL
        ❑ 因为NULL不是值,所以不能对其使用谓词。
                --以下的式子都会被判为 unknown
                1 = NULL
                1 > NULL
                1 < NULL
                1<> NULL
                NULL = NULL
        ❑ 对NULL使用谓词后的结果是unknown。
        ❑ unknown参与到逻辑运算时,SQL的运行会和预想的不一样。
        ❑ 按步骤追踪SQL的执行过程能有效应对4中的情况。
        ❑ 尽量对字段进行NOT NULL限制

EXIST和IN

        ❑ exist和in可以等价替换,not exist和not in却不行(not in 返回的是某个字段值的集合,然后根据集合去匹配,可能会得到true,false和unknown,not exist返回的是true或者false,这个可以参考1.3,有点难理解)

HAVING

        ❑ having子句是可以单独使用的(以前是要跟GROUP BY一起使用),不过这种情况下,就不能在SELECT子句里引用原来的表里的列了,要么就得像示例里一样使用常量,要么就得像SELECT COUNT(*)这样使用聚合函数。
        ❑ 如果实体对应的是表中的一行数据,那么该实体应该被看作集合中的元素,因此指定查询条件时应该使用WHERE子句。如果实体对应的是表中的多行数据,那么该实体应该被看作集合,因此指定查询条件时应该使用HAVING子句。

WITH

        ❑用于树状排序

2.常用函数(或者运算符)

        ❑COUNT

                 count(*)、count(1)和count(列名)区别
                count(*):包含所有列,相当于行数,你就把他看作统计所有的行和列,统计结果包含列值为null
                count(1):会去统计表中的所有的记录数,可以理解为计算一共有多少符合条件的行,统计结果也包含列值为null
                count(列名)的区别:只展现对应列名的值,会自动屏蔽列值为null的值
所以说count(*)和count(1)本质区别不大,count(1),这个“1”,指的代码行,你可以把他当作一个固定字段1,count(1),就是计算一共有多少个1。

                执行效率来看:
                        若列名为主键,count(列名)会比count(1)快
                        反之列名不为主键,count(1)会比count(列名)快
                        若表多个列且没有主键,则 count(1) 的执行效率优于 count(*)
                        若表有主键,则 select count(主键)的执行效率是最优
                        若表只有一个字段,则 select count(*)最优

        ❑ALL

                其实就是子查询结果AND起来的表达式之和

        ❑ANY

                相当于OR表达式之和之和

        ❑OVER

                按顺序累加或者逐年累加
                参见GROUP BY和PARTITION BY
                    --求移动累计值(1):使用窗口函数
                    SELECT prc_date, prc_amt,
                          SUM(prc_amt) OVER (ORDER BY prc_date
                            ROWS 2 PRECEDING) AS onhand_amt
                      FROM Accounts;

        ❑COALESCE

                函数将会返回包括expression在内的所有参数中的第一个非空表达式

        ❑UNION和UNION ALL

                UNION 合并两个集合,去掉重复项
                UNION ALL 合并两个集合,保留重复项

        ❑EXCEPT

                获取两个集合的差集;两个结果用EXCEPT链接,返回第一个结果集不在第二个结果集中的数据。

        ❑INTERSECT

                获取两个集合的交集;两个结果用INTERSECT链接,返回两个结果集中的相同部分

        ❑GROUP BY和PARTITION BY

                GROUP BY:对集合进行分组和统计,根据分组条件,每个条件只有一行统计值
                PARTITION BY:对集合进行分组和统计,统计结果行数跟原来分组前一样,如果搭配OVER使用,可以呈现逐条累加的效果
                        RANK() OVER(PARTITION BY name ORDER BY price desc)
                        DENSE_RANK() OVER(PARTITION BY name ORDER BY price desc)

        ❑MERGE

                对两个数据源进行合并

3.注意事项


        ❑ 用CASE表达式代替IF语句和CASE语句
        ❑ 用GROUP BY和关联子查询代替循环
        ❑ 表中的行没有顺序
        ❑ 将表看成集合(对于集合的运算和处理,可以考虑用集合函数(UNION、UNION ALL、EXCEPT、INTERSECT))
        ❑ 理解EXISTS谓词和“量化”的概念(遇见全称量化需要转换为双重否定,就是不能用exist所有的A.a=1,应该用not esixt有A.a<>1)
        ❑ 学习HAVING子句的真正价值
        ❑ 不要画长方形,去画圆(用圆去绘制集合之间的关系,不要用面向对象的思维去看待SQL)
        ❑ 消除NULL值
                (1)首先分析能不能设置默认值。
                (2)仅在无论如何都无法设置默认值时允许使用NULL。
        ❑ 理解SQL的执行顺序FROM→WHERE→GROUP BY→HAVING→SELECT(→ORDER BY)


4.性能优化方面


        ❑ 连接查询替代子查询
                多表连接通常比子查询执行速度更快,因为在多表连接中,查询可以同时考虑多个表的关联,而子查询则需要先执行子查询,然后将结果作为临时表与其他表进行连接,这样会增加查询的开销。但是,在某些情况下,子查询可能更适合。例如,在查询结果作为子查询时,如果结果集非常小,则使用子查询可能会更快,因为查询结果集不会被重复扫描多次。
        ❑ 使用高效的查询
                参数是子查询时,使用EXISTS代替IN  
                参数是子查询时,使用连接代替IN (如果连接字段不是索引的话,那EXISTS性能更快)
                对于数据量大的表,应该使用 WITH NOLOCK防止锁表
        ❑ 避免排序
                以下会进行排序
                        ● GROUP BY子句
                        ● ORDER BY子句
                        ● 聚合函数(SUM、COUNT、AVG、MAX、MIN)
                        ● DISTINCT
                        ● 集合运算符(UNION、INTERSECT、EXCEPT)
                        ● 窗口函数(RANK、ROW_NUMBER等)
                灵活使用集合运算符的ALL可选项(如果不在乎结果是否存在重复项,则可以带上ALL)
UNION ALL
                使用EXISTS代替DISTINCT
                在极值函数中使用索引(MAX/MIN)
                能写在WHERE子句里的条件不要写在HAVING子句里
                在GROUP BY子句和ORDER BY子句中使用索引

        ❑ 索引失效
                使用索引时,条件表达式的左侧应该是原始字段;
                在索引字段上进行运算,会使索引失效,导致全表扫描,例如:WHERE col_1 * 1.1 > 100,改成 WHERE col_1 > 100 / 1.1 就可以正常使用索引
                使用函数也会导致全表扫描例如: WHERE SUBSTR(col_1, 1, 1) = 'a'
                使用IS NULL谓词(索引字段是不能为NULL的,对于索引字段不要使用IS (NOT) NULL,会导致索引失效)
                使用否定形式(对于索引字段不要使用<>、 !=、 NOT IN,会导致索引失效)
                使用OR
                使用联合索引时,列的顺序错误
                使用LIKE谓词进行后方一致或中间一致的匹配(%a%、%a)
                进行默认的类型转换
        ❑ 减少中间表
                灵活使用HAVING子句
                需要对多个字段使用IN谓词时,将它们汇总到一处(可以用EXISTS代替)
                先进行连接再进行聚合
                合理地使用视图(在视图中使用以下运算,会降低性能)
                       a. 聚合函数(AVG、COUNT、SUM、MIN、MAX)
                        b.集合运算符(UNION、INTERSECT、EXCEPT等)

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

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

相关文章

应用案例 | 3D视觉引导解决方案汽车零部件上下料

Part.1 行业背景 三维视觉引导技术在国内外汽车零部件领域得到了广泛应用。随着汽车制造业的不断发展和创新&#xff0c;对于零部件的加工和装配要求越来越高&#xff0c;而三维视觉引导技术能够帮助企业实现更精确、更高效的零部件上下料过程。 纵览国外&#xff0c;部分汽车…

如何使用GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。例如在科研编程、绘图领域&#xff1a; 1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。 2、数据可…

车规微控制器的ECC机制及EMU外设

车规微控制器的ECC机制及EMU外设 文章目录 车规微控制器的ECC机制及EMU外设引言ECC的基本原理ECC RAM的访问方式ECC RAM的初始化SRAM ECC错误注入及EMU外设Flash ECC校验参考文献 引言 ECC是微控制器系统中&#xff0c;用于保障信息安全的常用机制&#xff0c;主要是避免存储设…

IntelliJ IDEA中用git提交代码时忽略文件的设置

设置IDEA自动过滤掉不需要提交的文件或文件夹&#xff1a;如*.iml, .idea,target 文件夹 1、进入idea设置界面 Windows环境&#xff1a;File - Settings - Editor - File Types Mac环境&#xff1a;Preferences… - Editor - File Types 2、在下面的ignore files and folders…

K210-AI视觉

1、颜色识别 image.find_blobs( thresholds, invertFalse, roi, x_stride2, y_stride1, area_threshold10, pixels_threshold10, mergeFalse, margin0, threshold_cbNone, merge_cbNone)thresholds : 必须是元组列表。 [(lo, hi), (lo, hi), …, (lo, hi)] 定义你想追踪…

Java elasticsearch scroll模板实现

一、scroll说明和使用场景 scroll的使用场景&#xff1a;大数据量的检索和操作 scroll顾名思义&#xff0c;就是游标的意思&#xff0c;核心的应用场景就是遍历 elasticsearch中的数据&#xff1b; 通常我们遍历数据采用的是分页&#xff0c;elastcisearch还支持from size的…

面向对象基础

文章目录 面向对象基础一.面向对象介绍二.设计对象并使用三.封装四.This关键字五.构造方法六.标准的Javabean类七.对象内存图八.基本数据类型和引用数据类型九.成员和局部 面向对象基础 一.面向对象介绍 面向:拿,找 对象:能干活的东西 面向对象编程:找东西来做对应的事情 …

面试2:通用能力

15丨如何做好开场&#xff1a;给自我介绍加“特效 第一层&#xff0c;满足面试官对信息的期待 这是对自我介绍的基本要求&#xff0c;把个人信息、主要经历、经验和技能有条理地组织起来&#xff0c; 有逻辑地讲出来。需要找出多段经历的关联性和发展变化&#xff0c;形成连…

两个路由器如何连接设置的方法攻略

一、前言 随着智能家居时代来临&#xff0c;家里的网络部署需求开始复杂起来。往往一个路由器已经不能满足需求或者不利于拓展。两个路由器连接最常见的情况是家中已有一个路由器&#xff0c;并且已经通过这个路由器来正常上网。现在是因某些原因想在不改变已经在用的路由器的设…

将本地jar打包到本地maven仓库或maven私服仓库中

将本地jar包打包到本地的maven仓库中的命令&#xff1a; mvn install:install-file -DgroupIdtebie.applib.api -DartifactIdapiclient -Dversion1.0-SNAPSHOT -Dfile本地jar路径 -Dpackagingjar说明&#xff1a; DgroupId pom中的<groupId></groupId> Dartifact…

[git]分支操作

Checkout 相当于切换到该分支&#xff0c;但是因为不能直接操作远程分支&#xff0c;会在本地同步一个完全一样的分支。 注意&#xff1a;切换分支前本地先进行提交&#xff08;addcommit&#xff09;&#xff0c;否则有可能代码会丢失。 New Branch from Selected... 创建一…

SpringBoot集成websocket(4)|(使用okhttp3实现websocket)

SpringBoot集成websocket&#xff08;4&#xff09;|&#xff08;使用okhttp3实现websocket&#xff09; 文章目录 SpringBoot集成websocket&#xff08;4&#xff09;|&#xff08;使用okhttp3实现websocket&#xff09;[TOC] 前言一、实现步骤1.实现步骤 二、websocket服务代…

Websocket、SessionCookie、前端基础知识

目录 1.Websocket Websocket与HTTP的介绍 不同使用场景 Websocket链接过程 2.Session&Cookie Cookie的工作原理 Session的工作原理 区别 3.前端基础知识 1.Websocket Websocket与HTTP的介绍 HTTP&#xff1a; 1.HTTP是单向的&#xff0c;客户端发送请求&#xff0…

Middleware ❀ Kafka功能与使用详解

文章目录 1. 概述1.1. 消息队列1.2. 应用场景1.3. 工作模式1.4. 基础结构1.4.1. 结构组件1.4.2. 数据同步1.4.3. ACK机制1.4.4. 分区机制1.4.4.1. 使用Partition Key写入1.4.4.2. 轮询写入 - 默认规则1.4.4.3. 指定Partition写入 1.4.5. Offset偏移量1.4.5.1. 消息顺序性1.4.5.…

macOS通过钥匙串访问找回WiFi密码的详细教程

如果您忘记了Mac电脑上的WiFi密码&#xff0c;可以通过钥匙串访问来找回它。具体步骤如下&#xff1a; 1.打开Mac电脑的“启动台”&#xff0c;然后在其他文件中找到“钥匙串访问”。 2.运行“钥匙串访问”应用程序&#xff0c;点击左侧的“系统”&#xff0c;然后在右侧找到…

Ubuntu22.04 LTS+NVIDIA 4090+Cuda12.1+cudnn8.8.1

系统环境中&#xff1a; 1.系统驱动安装的是&#xff1a; NVIDIA-Linux-x86_64-530.30.02.run 2.CUDA安装&#xff1a;cuda_12.1.0_530.30.02_linux.run&#xff08;无需第1步&#xff0c;直接安装它就带配套驱动&#xff09; wget https://developer.download.nvidia.com/…

R语言应用interactionR包进行亚组相加交互作用分析

在统计分析中交互作用是指某因素的作用随其他因素水平变化而变化&#xff0c;两因素共同作用不等于两因素单独作用之和(相加交互作用)或之积(相乘交互作用)。相互作用的评估是尺度相关的&#xff1a;乘法或加法。乘法尺度上的相互作用意味着两次暴露的综合效应大于&#xff08;…

【**】破解复制网页的内容,粘贴后没有图片的方法

破解CSDN复制网页的内容&#xff0c;粘贴后没有图片的方法 解决方法 页面临时禁用JavaScript&#xff0c;然后再复制粘贴。不会操作的继续往下看。 具体步骤 以下在Chrome浏览器操作。 按F12&#xff0c;调出DevTools。通常出现在页面底部。 按CtrlShiftP&#xff0c;调出r…

023-从零搭建微服务-推送服务(三)

原【短信服务】更名【推送服务】 写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&a…

地理测绘基础知识(5) 照射计算下篇

在上一篇中&#xff0c;我们解决了照射计算的基本模型关系&#xff0c;并能够根据手电的位置指向&#xff0c;在地表求取光斑。但是&#xff0c;前文使用的是设置探针求取场强的点求取&#xff0c;对于绘制地表的等值线包络图、求取地表包线的具体解析情况&#xff0c;就不够用…