SQL Server进阶教程读书笔记

这篇具有很好参考价值的文章主要介绍了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等)文章来源地址https://www.toymoban.com/news/detail-702039.html

到了这里,关于SQL Server进阶教程读书笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 读SQL进阶教程笔记13_SQL中的分组和层级

    1.3.1.1. 还有一种只包含NULL的集合 1.4.1.1. 通过对3取余给自然数集合N分类后 1.4.1.1.1. “模3剩余类” 1.4.1.2. 模在SQL中也有实现,就是取模函数MOD 1.4.1.2.1. --对从1到10的整数以3为模求剩余类 1.4.1.3. --从原来的表中抽出(大约)五分之一行的数据 1.4.2.1. 数学理论并不是脱离实

    2023年04月21日
    浏览(38)
  • 读SQL进阶教程笔记12_地址与三值逻辑

    5.1.4.1. 命题其实不存在于客观世界,而存在于我们的内心

    2023年04月19日
    浏览(51)
  • Lua 进阶 · 教程笔记

    笔记的内容出自 Bilibili 上的视频:Lua教程-进阶部分 - 4K超清【不定期更新】 笔记主要用于供笔者个人或读者回顾知识点,如有纰漏,烦请指出 : ) 国内的大佬 云风 翻译了 Lua 的 Api 参考手册:传送门【】 以后读者在练习或者开发途中可以在参考手册里查看 Lua 提供的 Api。

    2024年01月24日
    浏览(55)
  • ROS2 Navigation 进阶教程学习笔记 第一章

    Nav2提供了新的拱你和工具,使创建机器人应用程序变得更容易 在本单元中,将学习 1. 通过simple Commander API进行基本Nav2操作 2. 通过followwaypoints使用waypoint follower和task executor插件 3. 禁区和限速区简介 然后您将基于Nav2创建一个基本的自主机器人demo。您将经常在一个仿真仓库中

    2024年02月08日
    浏览(48)
  • SQL Server 数据库安装教程SQL Server 2017

    官网: SQL Server 下载 | Microsoft  软件版本看你自己需求啦,反正我是下了SQL Server 2017 评估版(试用180天,秘钥自己百度)  下载后,软件有点小,不是实际的安装包,只是安装导向包,在安装过程才下载实际的安装包:      要保持有网络,直接双击安装,选基本即可:  选好

    2024年02月05日
    浏览(93)
  • aardio教程二) 进阶语法

    aardio中除了基础数据类型外,其他的复合对象都是table(例如类和名字空间等)。table可以用来存放aardio的任何对象,包括另一个table。 在其他语言中的字典、列表、数组、集合映射等,在aardio中都使用table来实现。 创建字典 创建数组 数组和字典可以混用 使用class定义类

    2024年03月18日
    浏览(57)
  • kotlin教程4:函数进阶

    kotlin教程:编程基础💎数据结构💎面向对象 kotlin 的函数定义非常灵活,既可以按照顺序传参,也可以通过参数名传参,而且可以设置参数默认值,这些在基础教程中已经讲过了。 此外, kotlin 中用 vararg 修饰的参数,为长度可变的参数列表 递归是一种常用的编程技巧,就像

    2024年02月05日
    浏览(50)
  • SpringBoot进阶教程(七十七)WebSocket

    WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 很多

    2024年02月08日
    浏览(79)
  • git 进阶系列教程--add

    功能介绍 将工作区(working directory)中的内容放入暂存区(staging area) 追踪文件(解释:刚被添加到工作区的文件处于未跟踪状态(Untracked files),该命令会将新添加的文件放入暂存区,并且文件将处于已跟踪状态) 命令解析 添加工作区所有文件进入暂存区 最后的点可以理解为正则里的

    2024年02月06日
    浏览(53)
  • git 进阶系列教程--pull

    功能 从远程仓库拉取最新代码到本地 代码解析 将远程仓库代码拉取到本地。当然这个命令的前提是你本地代码与远程代码有链接,无论是你upstream也好git clone也罢。而且是默认拉取远程代码中与该分支有关联的分支与本地该分支合并。同时,git pull不止是拉取代码,同时会将

    2024年02月11日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包