当前位置: 首页 > news >正文

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等)

相关文章:

SQL Server进阶教程读书笔记

最近把SQL Server进阶教程重新读了一遍&#xff0c;顺便整理了一下书本中的知识点 1.关键知识点 CASE WHEN ❑ 高手使用select做分支&#xff0c;新手用where和having做分支 ❑ 要写ELSE&#xff0c;要写END&#xff0c;避免未匹配上得到NULL ❑ check到底怎…...

DHTMLX Gantt 8.0.5 Crack -甘特图

8.0.5 2023 年 9 月 1 日。错误修复版本 修复 修复通过gantt.getGanttInstance配置启用扩展而触发的错误警告修复启用skip_off_time配置时gantt.exportToExcel()的不正确工作示例查看器的改进 8.0.4 2023 年 7 月 31 日。错误修复版本 修复 修复数据处理器不跟踪资源数据…...

RHCA之路---EX280(5)

RHCA之路—EX280(5) 1. 题目 Using the example files from the wordpress directory under http://materials.example.com/exam280/wordpress create a WordPress application in the farm project For permanent storage use the NFS shares /exports/wordpress and /export…...

”轻舟已过万重山“-----我回归更新了-----

嘿&#xff0c;朋友们&#xff0c;很久不见&#xff0c;甚是想念&#xff0c;经历过漫长的暑期生活&#xff0c;也许你已然收获满满。有可能你拿到了那梦寐以求的机动车行驶证&#xff0c;开着家长的小车在道路上自由的兜风&#xff1b;有可能你来了一场说走就走的旅行&#xf…...

win11右键菜单恢复win10风格

按 winx 输入以下命令 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve...

Nginx安装及配置负载均衡

文章目录 官网下载Nginx解压安装常用命令配置负载均衡七层负载均衡nginx的负载均衡语法nginx的负载均衡策略故障下线和备份服务设置proxy_pass参数 官网下载Nginx http://nginx.org/en/download.html 注&#xff1a;下载稳定版&#xff0c;即Stateable Version的&#xff0c;…...

C# OpenCvSharp 通道分离

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Extensions;namespac…...

oracle 自定义存储过程(非常简单明了)

语法说明 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN %TYPE, 参数2 IN %TYPE, 参数3 OUT %TYPE) IS 变量1 %TYPE; 变量2 %TYPE; BEGIN存储过程执行语句块 END 存储过程名字;举例说明 1.举一个简单的例子 定义存储过程 easyProcedure 入参为 两个数 出参为 他们的…...

layui--记录

layui 行点击事件&#xff1a;点了没反应&#xff1f; //监听行工具事件layui.table.on(tool(demo), function (obj) {//alert(222) });原因&#xff1a;检查下id与lay-filter是否一致&#xff1b;id与lay-filter必须一致。 <table id"demo" lay-filter"dem…...

【校招VIP】测试技术考点之单元测试集成测试

考点介绍&#xff1a; 单元测试,集成测试的区别是&#xff1a;方式不同、粒度不同、内容不同。单元测试用用于验证编码单元的正确性。集成测试用于验证详细设计。体现了测试由小到大、又内至外、循序渐进的测试过程和分而治之的思想。 测试技术考点之单元测试&集成测试-相…...

【Redis专题】Redis核心数据结构实战与高性能原理解析

目录 前言课程内容一、redis数据类型1.1 字符串&#xff08;string&#xff09;类型&#xff1a;比较简单的一种使用存储模型常用命令&#xff1a;&#xff08;截取自【菜鸟教程】&#xff09;部分演示应用场景 1.2 哈希&#xff08;hash&#xff09;类型&#xff1a;同类数据归…...

常见的几种排序算法

目录 一、插入排序 1、直接插入排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、希尔排序 2.1、排序方法 2.2、图解分析 2.3、代码实现 二、选择排序 1、直接选择排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、堆排序 2.1、排序方法 2.2、图解分析 …...

动态贴纸、美颜SDK与AR:创造独特的互动体验

目前&#xff0c;动态贴纸、美颜SDK、增强现实&#xff08;AR&#xff09;等技术是比较热门的话题&#xff0c;它们所结合的新兴玩法更是收到大家推崇&#xff0c;正潜移默化的改变我们与数字世界互动的方式。 一、动态贴纸&#xff1a;个性化互动的开始 动态贴纸&#xff0c…...

〔021〕Stable Diffusion 之 提示词反推、自动补全、中文输入 篇

✨ 目录 &#x1f388; 反推提示词 / Tagger&#x1f388; 反推提示词 Tagger 使用&#x1f388; 英文提示词自动补全 / Booru tag&#x1f388; 英文提示词自动补全 Booru tag 使用&#x1f388; 中文提示词自动补全 / tagcomplete&#x1f388; 中文提示词自动补全 tagcomple…...

如何实现响应式布局

要实现响应式布局&#xff0c;您可以采用以下方法&#xff1a; 视口设置&#xff1a; 在HTML的<head>部分中使用meta标签设置视口&#xff1a; <meta name"viewport" content"widthdevice-width, initial-scale1.0">使用百分比&#xff1a; 使…...

HTML <tr> 标签

实例 一个简单的 HTML 表格,包含两行两列: <table border="1"><tr><th>Month</th><th>Savings</th></tr><tr><td>January</td><td>$100</td></tr> </table>定义和用法 &l…...

点云从入门到精通技术详解100篇-点云多尺度分类网络

目录 前言 研究现状与发展趋势 国内外研究现状 点云处理应用研究现状...

电脑怎么设置定时关机,2个简单的操作

电脑作为现代生活中不可或缺的工具&#xff0c;我们通常会在工作或娱乐过程中使用它。但有时候&#xff0c;我们可能需要在一段时间后自动关机&#xff0c;例如在下载完成后或在睡觉前。那么电脑怎么设置定时关机呢&#xff1f;为了满足这种需求&#xff0c;电脑提供了多种定时…...

Uboot指令与烧录

目录 1 NAND Flash&#xff1a; 1&#xff09;地址空间说明 2&#xff09;烧写u-boot 3&#xff09;烧写内核 4&#xff09;烧写文件系统 5&#xff09;设置启动参数 2 SPI Flash&#xff1a; 1&#xff09;地址空间说明 2&#xff09;烧写u-boot 3&#xff09;烧写内…...

Visual Studio中使用预编译头文件

预编译头文件&#xff08;Precompiled Header&#xff0c;PCH&#xff09;是一种C/C编译优化技术&#xff0c;用于提高大型项目的编译速度。PCH 文件包含了常用的头文件的预编译结果&#xff0c;它可以在编译其他源文件之前被加载到内存中&#xff0c;从而减少了重复的头文件解…...

C语言:选择+编程(每日一练Day15)

目录 选择题&#xff1a; 题一&#xff1a; 题二&#xff1a; 题三&#xff1a; 题四&#xff1a; 题五&#xff1a; 编程题&#xff1a; 题一&#xff1a;寻找奇数 思路一&#xff1a; 题二&#xff1a;寻找峰值 思路一&#xff1a; 本人实力有限可能对一些地方解…...

确定Mac\Linux系统的架构类型是 x86-64(amd64),还是 arm64 架构

我们在下载软件或镜像时会有很多版本&#xff0c;那需要根据我们的系统架构选择正确的软件或镜像版本。 要确定你的系统使用的是 x86-64&#xff08;amd64&#xff09; 还是 arm64 架构&#xff0c;可以使用以下方法之一&#xff1a; 使用 uname 命令&#xff1a; 打开终端&am…...

Python脚本

update_format.py 批量转视频格式&#xff0c;超级慢&#xff0c;没什么卵用 import os import asyncio import subprocess import concurrent.futures import tracemalloctracemalloc.start()# 创建日志文件 log_file open(conversion_log.txt, w)async def convert_mkv_t…...

Kotlin的遍历方法

for循环 在下面代码中1…10表示的是1到10&#xff0c;两边都是闭包&#xff0c;输出12345678910 for (i in 1..10) println(i)加上花括号也支持 for (i: Int in 1..10) {println(i)}另外&#xff0c;当对整数进行for循环时&#xff0c;Kotlin还提供了一个step函数来定义迭代的…...

AskIt: Unified Programming Interface for Programming with Large Language Models

本文是LLM系列文章&#xff0c;针对《AskIt: Unified Programming Interface for Programming with Large Language Models》的翻译。 AskIt&#xff1a;用于大型语言模型编程的统一编程接口 摘要1 引言2 动机例子3 设计与实现4 实验评估5 相关工作6 结论 摘要 在不断发展的软…...

【wireshark抓取数据包-PGSQL协议】

测试查看PGSQL协议的网络流量数据明细 &#xff11;&#xff09;捕获过滤的条件设置&#xff0c;tcp.port5432(数据库的端口&#xff09; &#xff12;&#xff09;上面是wireshark的主窗口&#xff0c;分三大主块&#xff1a;Packlist List&#xff08;数据包列表&#xff09…...

【idea学习】

1.debug: 文章详解 2.导入SpringBoot项目 文章详情...

ZooKeeper数据模型/znode节点深入

1、Znode的数据模型 1.1 Znode是什么&#xff1f; Znode维护了一个stat结构&#xff0c;这个stat包含数据变化的版本号、访问控制列表变化、还有时间戳。版本号和时间戳一起&#xff0c;可让Zookeeper验证缓存和协调更新。每次znode的数据发生了变化&#xff0c;版本号就增加。…...

容器编排工具的比较:Kubernetes、Docker Swarm、Nomad

随着容器化技术的普及&#xff0c;容器编排工具成为了现代应用部署和管理的重要组成部分。容器编排工具能够自动化容器的部署、扩展和管理&#xff0c;从而提高应用的可靠性和可伸缩性。在众多的容器编排工具中&#xff0c;Kubernetes、Docker Swarm和Nomad是三个备受关注的主要…...

nginx--技术文档--架构体系--底层核心-原理

Nginx的架构体系可以概括为“一个核心、两个模型。” “一个核心”指Nginx的核心功能&#xff0c;即HTTP请求处理。Nginx作为一个高性能的Web服务器&#xff0c;其核心功能是处理HTTP请求&#xff0c;包括接收请求、解析请求、处理请求和返回响应等。 “两个模型”指Nginx的多…...