2025年plsql12注册码(plsqldeveloper12注册码)

plsql12注册码(plsqldeveloper12注册码)SqlServer p br p p br p p T SQL p p br p p br p p 示例数据库 点我 p

大家好,我是讯享网,很高兴认识大家。




讯享网

 SqlServer </p><p> <br></p><p> <br></p><p> T-SQL </p><p> <br></p><p> <br></p><p>示例数据库:点我</p><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><p>&nbsp;</p><p> <br></p><p> <br></p><ul><li>Chapter 01 T-SQL 查询和编程背景</li></ul><ul data-indent="1"><li>1.3 创建表和定义数据的完整性</li></ul><ul data-indent="2"><li>1.3.1 创建表</li><li>1.3.2 定义数据的完整性</li></ul><ul data-indent="3"><li>1. 主键约束</li><li>2. 唯一约束</li><li>3. 外键束约</li><li>4. CHECK约束</li><li>5. 默认约束</li></ul><ul><li>Chapter 02 单表查询</li></ul><ul data-indent="1"><li>2.1 SELECT 语句元素</li></ul><ul data-indent="2"><li>2.1.7 TOP和OFFSET-FETCH</li></ul><ul data-indent="3"><li>1. TOP筛选</li><li>2. OFFSET-FETCH</li></ul><ul data-indent="2"><li>2.1.8 开窗函数速览</li></ul><ul data-indent="1"><li>2.2 谓词和运算符</li><li>2.3 CASE表达式</li><li>2.5 同时操作</li><li>2.6 运算符和函数</li></ul><ul data-indent="2"><li>2.6.1 字符串连接(+和CONCAT函数)</li><li>2.6.2 SUBSTRING 函数</li><li>2.6.3 LEFT 和 RIGHT函数</li><li>2.6.4 LEN 和 DATALENGTH 函数</li><li>2.6.5 CHARINDEX 函数</li><li>2.6.6 PATINDEX 函数</li><li>2.6.7 REPLACE 函数</li><li>2.6.8 REPLICATE 函数</li><li>2.6.9 STUFF 函数</li><li>2.6.10 UPPER 和 LOWER 函数</li><li>2.6.11 RTRIM 和 LRITM 函数</li><li>2.6.12 FORMAT 函数</li><li>2.6.13 LIKE 谓词</li></ul><ul data-indent="1"><li>2.7 时间和日期</li></ul><ul data-indent="2"><li>2.7.1 当前时间</li><li>2.7.2 CAST、CONVERT和PARSE函数,及其TRY_对应函数</li><li>2.7.3 SWITCHOFFSET 函数</li><li>2.7.4 TODATETIMEOFFSET 函数</li><li>2.7.5 DATEADD 函数</li><li>2.7.6 DATEDIFF 函数</li><li>2.7.7 DATEPART 、YEAR、MONTH、DAY和DATENAME 函数</li><li>2.7.7 ISDATE 函数</li><li>2.7.8 FORMPARTS 函数</li><li>2.7.9 EOMONTH 函数</li></ul><ul data-indent="1"><li>2.8 查询元数据</li></ul><ul data-indent="2"><li>2.8.1 目录视图</li><li>2.8.2 信息架构视图</li><li>2.8.3 系统存储过程和函数</li></ul><ul data-indent="1"><li>81.jpg</li><li>练习</li></ul><ul><li>CHAPTER 03 联接</li></ul><ul data-indent="1"><li>3.1交叉联接</li></ul><ul data-indent="2"><li>3.1.1 ANSI SQL-92 和 89 语法</li><li>3.1.2 自交叉联接</li><li>3.1.3 生成数字表</li></ul><ul data-indent="1"><li>3.2 内部联接</li></ul><ul data-indent="2"><li>3.2.1 ANSI SQL-92、89 语法和安全性</li></ul><ul data-indent="1"><li>3.3 更多联接示例</li></ul><ul data-indent="2"><li>3.3.1 复合联接</li><li>3.3.2 不等联接</li><li>3.3.3 多联接查询</li></ul><ul data-indent="1"><li>3.4 外部联接</li></ul><ul data-indent="2"><li>3.4.1 外联接基础知识</li><li>3.4.2 其他外联接知识</li></ul><ul data-indent="1"><li>练习</li></ul><ul><li>CHAPTER 04 子查询</li></ul><ul data-indent="1"><li>4.1 自包含子查询</li></ul><ul data-indent="2"><li>4.1.1 自包含标量子查询示例</li><li>4.1.2 自包含多值子查询示例</li></ul><ul data-indent="1"><li>4.2 相关子查询</li></ul><ul data-indent="2"><li>4.2.1 EXISTS 谓词</li></ul><ul data-indent="1"><li>4.3 额外子查询知识</li></ul><ul data-indent="2"><li>4.3.1 返回前一个或下一个值</li><li>4.3.2 使用运行聚合</li><li>4.3.3 不当子查询处理</li></ul><ul data-indent="3"><li>4.3.3.1 NULL故障</li><li>4.3.2 子查询列中的替换错误</li></ul><ul data-indent="1"><li>练习</li></ul><p> <br></p><p> <br></p><p>&nbsp;</p><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><h4 id="h3">1.3.1 创建表</h4><div></div><p>在创建对象脚本中包含语句是十分重要,能确保在指定的数据库中创建对象。</p><h4 id="h4">1.3.2 定义数据的完整性</h4><h5>1. 主键约束</h5><p>主键约束强制行的唯一性,在约束的属性中不允许使用标记。约束的属性的值必须是唯一的,每个表只能有一个主键。为了强制逻辑主键约束的一唯一性,SQL Server会在后台创建一个唯一索引。唯一索引是SQL Server为了强制唯一性所使用的一种物理机制。</p><div></div><h5>2. 唯一约束</h5><p>唯一约束强制行的唯一性,允许你在自己的数据库中实现关系模型的备用键概念。与主键不同,可以在同一个表内定义多个唯一约束,此外,唯一约束不限制列必须定义为。根据SQL标准,具有唯一约束的列应该允许重复的值。但是,SQL Server则不允许重复的标记</p><div></div><h5>3. 外键束约</h5><p>外键用于强制引用的完整性,此约束定义了引用表中的一个或多个属性指向被引用表(父表)中候选键(主键或唯一约束),引用表和被引用表可以是同一个。外键的目的是限制在外键列中允许的值要存在于那些被引用列中。</p><div></div><p>如果表中的订单引用了中的某一个雇员行,当尝试从中删除这一雇员行时,RDBMS会拒绝删除并抛出错误。</p><h5>4. CHECK约束</h5><p>CHECK允许定义一个谓词,确保进入到表中的行或是被修改的行必须满足些约束。</p><div></div><h5>5. 默认约束</h5><p>如果没有在插入时指定一个显式值时,将会使用该默认值。</p><div></div><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><p>SELECT语句的查询顺序:</p><ol><li>FROM</li><li>WHERE</li><li>GROUP BY</li><li>HAVING</li><li>SELECT</li><li>ORDER BY</li></ol><h4 id="h7">2.1.7 TOP和OFFSET-FETCH</h4><h5>1. TOP筛选</h5><p>指定<strong>10</strong>个最近的订单:</p><div></div><p>可以为选项指定关键字,向上舍入。</p><div></div><p>Orders中总共有830行,830 * 1%向上舍入则是9行。<br></p><p> 我们可以发现,在前4行的数据中,orderdate是相相同的,在这种没有指定决胜属性(<strong>tiebreaker</strong>)的情况下,对具有相同值的orderdate排序是没有意义的。<strong>SQL Server</strong>返回的结果是不确定的,即哪行先被物理访问到就先返回哪行。</p><p> 如果希望查询结果是确定的,则需要列出的数据是唯一的,即要添加一个决胜发展(<strong>tiebreaker</strong>)。如可在加入orderid作为</p><div></div><p>或者使用作为关联行,来实现tiebreaker</p><div></div><p>注意,即使指定了<strong>TOP 5</strong>,但是输出却是<strong>8</strong>行。SQL Server首先返回基于<strong>orderdate DESC</strong>排序的<strong>TOP 5</strong>行,然后是返回与检索到的5行中最后一行orderdate值相同的其他所有行。</p><h5>2. OFFSET-FETCH</h5><p><strong>TOP</strong>不是标准SQL,并且不支持跳过功能。标准的SQL定义的TOP类似筛选称为为<strong>OFFSET-FETCH</strong>,支持跳过功能。SQL SERVER 2012中的<strong>OFFSET-FETCH</strong>被视为<strong>ORDER BY</strong>子句的一部分,通常用于实现按顺序</p><p> 显示效果。子句指定要跳过的行数,子句指定在跳过的行数后要筛选的行数。</p><div></div><p>基于排序好的结果,子句跳过行,由FETCH子句往后取行。</p><p> 注意,使用<strong>OFFSET-FETCH</strong>的查询必须具有<strong>ORDER BY</strong>子句。此外<strong>FETCH</strong>子句不支持没有<strong>OFFSET</strong>子句。不过,没有<strong>FETCH</strong>的<strong>OFFSET</strong>是允许的,这种情况就是跳过多少行,并返回剩余的所有行。而且<strong>ROW</strong>和<strong>ROWS</strong>是可以互换的。</p><h4 id="h8">2.1.8 开窗函数速览</h4><p><strong>开窗函数</strong>的功能是:对于基本的每一行,按行的窗口(组)进行运算,并计算一个标量(单个)结果值,行的窗口使用<strong>OVER</strong>子句定义。<strong>OVER</strong>子句可以使用<strong>PARTITION BY</strong>子子句约束窗口中的行,并且可以使用<strong>ORDER BY</strong>子子名为计算结果定义排序。</p><div></div><p><strong>ROW_NUMBER</strong>函数对于查询结果按<strong>custid</strong>进行分区,并在各个分区内按照指定的<strong>val</strong>进行排序,分配了唯一、递增、连续的整数。<br> 注意,<strong>ROW_NUMBER</strong>函数必须在每个分区内生成唯一值 。这意味着即使排序值不增加,行号也会增加。<br><strong>SELECT</strong>列表中的表达式是在<strong>DISTINCT</strong>子句之前计算的,总之,sql语句的执行顺序为:</p><ul><li>FROM</li><li>WHERE</li><li>GROUP BY</li><li>HAVING</li><li>SELECT </li></ul><ul data-indent="1"><li>表达式</li><li>DISTINCT</li></ul><ul><li>ORDER BY </li></ul><ul data-indent="1"><li>TOP/OFFSET-FETCH</li></ul><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><p><strong>CASE</strong>是一个标题表达式,返回一个基于条件置逻辑的值。注意,<strong>CASE</strong>是表达式而不是语句。所以,它不支持你控制活动流或是做一些基于条件逻辑的损伤。可以在诸如:、、和 子句中以及在中使用。具有简单和复杂格式,ELSE子句默认值为<strong>NULL</strong></p><p>格式:</p><div></div><p>格式:</p><div></div><p>T-SQL 中某些函数可以看作是<em>CASE的表达式缩写,如:<strong>ISNULL</strong>、<strong>COALESCE</strong>、<strong>IIF</strong>和</em><em>CHOOSE</em><em>,其中只有</em><em>COALESCE</em>*是标准的,后两个仅在2012版本中可以使用</p><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><div></div><p>这是一个col2/col1大于2的查询语句,很有可能假定SQL Server 会从左到右计算此表达式。从而使得col=0时会出现短路,从而不继续进行col2/col1的计算。但是,SQL Server 支持短路,这是基于SQL标准的同时操作概念。SQL Server通常基于成本估计来进行表达式的计算顺序。所以此语句有可能会查询失败。对于此种特定情况,该语句可改写为</p><div></div><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><h4 id="h13">2.6.1 字符串连接(+和CONCAT函数)</h4><p>使用*+<em>CONVERT</em>*,<strong>CAST</strong>将转换为,否则可能会因不能转换为类型而报错,这是因为SQL Server会隐式的将其他转换为。</p><div></div><h4 id="h14">2.6.2 SUBSTRING 函数</h4><p>SUBSTRING(string, start, length) 在sql中,字符串下标从1开始算起,而不是0。</p><div></div><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><h4 id="h15">2.6.3 LEFT 和 RIGHT函数</h4><p>LEFT(string, n),RIGHT(string, n),n代表从LEFT或RIGHT提取的字符数</p><div></div><h4 id="h16">2.6.4 LEN 和 DATALENGTH 函数</h4><p>LENG(string) 返回字符数(或者长度),并且会删除字符串最后的空格.<br> DATALENG(string) 返回的是字节数</p><div></div><h4 id="h17">2.6.5 CHARINDEX 函数</h4><p>CHARINDEX(subString, string[,start_pos]) 返回字符串从开始在中第一次出现的位置。如果找不到指定的字符串,返回0</p><div></div><h4 id="h18">2.6.6 PATINDEX 函数</h4><p>PATINDEX(pattern,string) 与</p><div></div><h4 id="h19">2.6.7 REPLACE 函数</h4><p>REPLACE(string, subString1, subString2) 使用取代中所有的</p><div></div><h4 id="h20">2.6.8 REPLICATE 函数</h4><p>REPLICATE(string, n) 将复制次</p><div></div><h4 id="h21">2.6.9 STUFF 函数</h4><p>STUFF(string, pos, del_length, insertString) 从位置开始,删除指定长度的字符串,并从处插入字符串</p><div></div><h4 id="h22">2.6.10 UPPER 和 LOWER 函数</h4><p>返回大小写或小写字符串</p><h4 id="h23">2.6.11 RTRIM 和 LRITM 函数</h4><p>从右边或左边删句末或句首的空格</p><h4 id="h24">2.6.12 FORMAT 函数</h4><p>FORMAT(input, format_string, culture) 按照.NET格式和一个可选的区域参数,将格式化成一个字符串 从位置开始,删除指定长度的字符串,并从处插入字符串</p><div></div><h4 id="h25">2.6.13 LIKE 谓词</h4><p></p><ol><li> 通配符,代表单个字符必须是指定</li></ol><p></p><ol><li>内的字符之一</li></ol><p></p><ol><li> 字符,要查找上面定义的通配符时,需要使用转义字符。如要查找</li></ol><p></p><ol><li>:</li></ol><p></p><ol><li> 或 </li></ol><p></p><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><p>在筛选列上应用操作时,数据库不能以有效方式使用索引,所以如果要筛选日期范围时可使用如来代替</p><h4 id="h27">2.7.1 当前时间</h4><div></div><h4 id="h28">2.7.2 CAST、CONVERT和PARSE函数,及其TRY_对应函数</h4><p>输入值如果转换成功,则返回目标值,否则就会查询失败。其对应的 <strong>TRY_</strong> 函数执行的是相同的操作,只是如果查询失败返回的是 <strong>NULL</strong> 。<br> 语法:<br> CAST(val AS datatype)<br> CONVERT(dataType, val [,sytle_number])<br> PARSE(val AS dataType [USING culture])</p><div></div><h4 id="h29">2.7.3 SWITCHOFFSET 函数</h4><p>SEITCHOFFSET(datatimeoffset_val, time_zone) 该函数将输入的值调整为指定的时区</p><div></div><h4 id="h30">2.7.4 TODATETIMEOFFSET 函数</h4><p>TODATETIMEOFFSET(date_and_time_value,time_zone) 设置为时区,通常用于迁移非已知偏移量数据到已知偏移数据。</p><div></div><h4 id="h31">2.7.5 DATEADD 函数</h4><p>DATEADD(part,n,dt_val) 指定日期的某个部分part增加n到dt_val中</p><ul><li>part:</li></ul><p></p><ul><li>,也可以使用缩写形式,如yy代替year等</li><li>n:可以是正、负数</li></ul><div></div><h4 id="h32">2.7.6 DATEDIFF 函数</h4><p>DATEDIFF(part, dt_val1, dt_val2) 返回 到 之间指定日期部分 <em>part</em> 的间隔</p><h4 id="h33">2.7.7 DATEPART 、YEAR、MONTH、DAY和DATENAME 函数</h4><p>DATEPART(part, dt_val) 返回 指定日期部分 的值。可以使用 YEAR(),MONTH(),DAY() 代替</p><p> DATETIME(part, dt_val) 此函数和</p><div></div><h4 id="h34">2.7.7 ISDATE 函数</h4><p><strong>ISDATE(string)</strong> 判断 string 是否为日期格式可以转换为日期格式数据,可以则返回,否则返回。</p><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><h4 id="h35">2.7.8 FORMPARTS 函数</h4><ul><li>DATEFORMPARTS(year, month, day)</li><li>DATETIME2FORMPARTS(year, month, day,hour,minute,seconds,fractions,precisions)</li><li>DATETIMEFORMPARTS(year, month, day,hour,minute,seconds.millseconds)</li><li>DATETIMEOFFSETFORMPARTS(year,month,day,hour,minute,seconds,fractions,hour_offset,minute_offset,precision)</li><li>SMALLDATETIMEFORMPARTS(year, month, day,hour,minute)</li><li>TIMEFORMPARTS(hour,minute,seconds,fractions,precisions)</li></ul><p>这是SQL Server 2012中引入的,它们接受代表日期和时间各个部分的整数值,并根据这些值构建一个所请求类型的值。</p><div></div><h4 id="h36">2.7.9 EOMONTH 函数</h4><p><strong>EOMONTH(input[,months_to_add])</strong><br> 这是SQL Server 2012引入的函数。它接受一个日期和时间值输入,并返回相应的每个月的最后一天,作为 DATE 数据类型。第2个可选参数指示要增加多少个月。</p><div></div><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><h4 id="h38">2.8.1 目录视图</h4><div></div><p>&nbsp;</p><p> <br></p><p> <br></p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8917f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_SQL' title="enter description here" style="visibility: visible; width: 247px;"></p><p> <br></p><p> 02.jpg </p><p> <br></p><p>&nbsp;</p><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce89468e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_字符串_02' title="enter description here" style="visibility: visible; width: 254px;"></p><p> <br></p><p> 04.jpg </p><p> <br></p><p>&nbsp;</p><h4 id="h39">2.8.2 信息架构视图</h4><p>信息架构视图是一个视图合集,其位于 </p><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce896c4b.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_Server_03' title="enter description here" style="visibility: visible; width: 410px;"></p><p> <br></p><p> 27.jpg </p><p> <br></p><p>&nbsp;</p><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce89a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_字符串_04' title="enter description here" style="visibility: visible; width: 757px;"></p><p> <br></p><p> 10.jpg </p><p> <br></p><p>&nbsp;</p><h4 id="h40">2.8.3 系统存储过程和函数</h4><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce89c7c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_SQL_05' title="enter description here" style="visibility: visible; width: 478px;"></p><p> <br></p><p> 32.jpg </p><p> <br></p><p>&nbsp;</p><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8a0059e48296.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_字符串_06' title="enter description here" style="visibility: visible; width: 916px;"></p><p> <br></p><p> 12.jpg </p><p> <br></p><p>&nbsp;</p><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8a2c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_SQL_07' title="enter description here" style="visibility: visible; width: 916px;"></p><p> <br></p><p> 29.jpg </p><p> <br></p><p>&nbsp;</p><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8a58df96793.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_字符串_08' title="enter description here" style="visibility: visible; width: 916px;"></p><p> <br></p><p> 03.jpg </p><p> <br></p><p>&nbsp;</p><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8a86c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_Server_09' title="enter description here" style="visibility: visible; width: 248px;"></p><p> <br></p><p> 96.jpg </p><p> <br></p><p>&nbsp;</p><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8abc.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_数据库_10' title="enter description here" style="visibility: visible; width: 157px;"></p><p> <br></p><p> 71.jpg </p><p> <br></p><p>&nbsp;</p><div></div><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8ae0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_数据库_11' title="enter description here" style="visibility: visible; width: 161px;"></p><p> <br></p><p> 81.jpg </p><p> <br></p><div></div><ol start="8"><li>在SQL SERVER 中 <strong>NULL</strong> 默认为无穷小,所以排序时默认排在前面。</li></ol><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><p>联接的3个基本类型是<strong>交叉联接</strong>、<strong>内部联接</strong>和<strong>外部联接</strong>。<strong>交叉联接</strong>仅处理阶段——笛卡尔乘积,<strong>内部联接</strong>应用两个阶段——笛卡尔乘积和筛选,<strong>外部联接</strong>应用三个阶段——笛卡尔乘积、筛选和添加外部行。</p><h4 id="h44">3.1.1 ANSI SQL-92 和 89 语法</h4><p>两种语法没有逻辑或性能上的差异,但推荐使用92的SQL语法。</p><div></div><h4 id="h45">3.1.2 自交叉联接</h4><p>可以对一个表的多个实例进行联接,支持联接的基本类型,这功能就是<strong>自联接</strong>。</p><div></div><h4 id="h46">3.1.3 生成数字表</h4><p><strong>自联接</strong>生成整数数列(1,2,3....)结果集非常方便。</p><div></div><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><p>内部联接是默认联接,所以是可选的。</p><h4 id="h48">3.2.1 ANSI SQL-92、89 语法和安全性</h4><div></div><p>语法具有在联接安全性方面比较好,比如忘记写后面的联接条件时,SQL语句会运行异常,以便您对SQL进行修改。然而对于语法来说,如果忘记在后添加条件,此时SQL也可以进行有效查询,返回了错误的结果集,并且由于查询不会失败,SQL可能会运行一段时间。而且,其他维护人员也不会知道些SQL语句是<strong>交叉联接</strong>还是<strong>内联接</strong>。所以,建议使用语法的SQL。</p><h4 id="h50">3.3.1 复合联接</h4><p><strong>复合联接</strong>就是在之后涉及多个属性的简单联接。</p><div></div><h4 id="h51">3.3.2 不等联接</h4><p>联接条件除了号之外还有其他任何运算符的联接即为<strong>不等联接</strong></p><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8b3e9a018198.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_Server_12' title="enter description here" style="visibility: visible; width: 916px;"></p><p> <br></p><p> 36.jpg </p><p> <br></p><p>&nbsp;</p><h4 id="h52">3.3.3 多联接查询</h4><p>一般来说,当子句中出现多个表运算符时,表运算符会从左到右进行逻辑处理。也就是说,第一个运算符生成的结果集将会被视为第二个运算符的左侧驱动表,以此类推。</p><div></div><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><p>与其它联接相比,外部联接更难把握,因为你需要清楚知道哪个表的数据应该保留还是去掉。</p><h4 id="h54">3.4.1 外联接基础知识</h4><p><strong>外联接</strong>的语法是 和 , OUTER关键字可选,保留左侧表的行,则相反,则是两侧的行都需要保留。</p><div></div><p>Customers表中有两位客户(22、75)是没有orderid的,在Orders返回的orderid属性中是。逻辑上,这两个客户会被联接的第二阶段(基于的筛选)过滤掉,但是在第三个阶段将其作为外部行添加回了结果集。而在<strong>内联接</strong>中,这两行是不会返回的。这两行是在保留左侧表中所有行时添加的。</p><p> 所以在<strong>外联接</strong>的的结果中,保留的行有两种:<strong>内部行</strong>和<strong>外部行</strong>。内部行是基于与另一侧匹配的行,外部行则是未匹配的行。</p><p> 外部联接的一个混乱问题是:是在子句还是子句进行筛选。子句并不确定行是否会最终显示在输出的结果集中,只是判断行是否与另一侧是否匹配。所以,当需要表达的谓词不是最终结果时,在子句中进行指定谓词。当需要在外部行生成后再筛选,则应当使用子句。子句是在子句之后进行处理的,即外部行生成后。</p><h4 id="h55">3.4.2 其他外联接知识</h4><ol><li><strong>包含缺失值</strong></li><li><strong>从外联接的非保留侧筛选属性</strong><br> 当需要检查涉及外部联接的代码查找</li></ol><p></p><ol><li>时,要查的项目之一就是<strong>WHERE</strong>子句,查看是否引用了非保留侧的属性。这是因为联接非保留侧的属性在输出行中是<strong>NULL</strong>标记,通常<strong>NULL</strong>的<em>operator value</em> 形式的表达式会生成<strong>UNKNOWN</strong>值。<strong>WHERE</strong>子句通常会过滤掉<strong>UNKNOWN</strong>值,这样的谓词会导致所有外部行被过滤掉,实际上就抵消了<em>外联接</em> 。逻辑上就是实现了一个<em>内联接</em>。</li></ol><div></div><ol start="3"><li><strong>在多联接查询中使用外联接</strong><br> 在2.5中“同时操作”的概念不适用于 <em>FROM</em> 阶段中表运算符的处理,表运算符是<strong>从左到右</strong>进行逻辑计算的,重新排列在<strong>外联接</strong>中的顺序可能会生成不同的输出结果。<br> 下面这个</li></ol><p></p><ol start="3"><li>是上面的</li></ol><p></p><ol start="3"><li>的变异,第一个联接返回的是客户及其订单,以及没有订单的客户(即外部行,orderid为<strong>NULL</strong>标记)。第二个 <em>o.orderid = od.orderid</em> 作为<strong>内联接</strong>的联接条件,生成的结果将会是左右两侧表都有相应 <em>orderid</em> 记录的结果集。因此,第一个联接(<strong>外联接</strong>)得到的</li></ol><p></p><ol start="3"><li>将不会作为结果输出。所以,<strong>外联接</strong>后跟一个<strong>内联接</strong>或是<strong>右外联接</strong>查询都会使得</li></ol><p></p><ol start="3"><li>被删除。当然这是假设联接条件是来自左侧的<strong>NULL</strong>标记和右侧的任意值进行比较。<br> 解决方法:</li></ol><ul data-indent="1"><li>第二个联接使用<strong>LEFT JOIN</strong></li><li><strong>内联接</strong>先进行查询,再使用一个<strong>RIGHT JOIN</strong></li><li>使用</li></ul><p></p><ul data-indent="1"><li>将<strong>内联接</strong>括起来,使得<strong>内联接</strong>变成一个独立的逻辑阶段</li></ul><div></div><ol start="3"><li><strong>外部联接使用COUNT聚合</strong><br> 通常,不应该将外部行作为计数目标。进行<strong>COUN</strong>计算时不要使用 </li></ol><p></p><ol start="3"><li> 来进行计数,应当使用</li></ol><p></p><ol start="3"><li>代替。</li></ol><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><div></div><ol><li> 21.jpg </li><li> 66.jpg </li><li> 48.jpg </li><li> 33.jpg </li><li> 56.jpg </li></ol><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><p>最外面查询的查询结果集返回给调用者,被称为<strong>外部查询</strong>。内部查询的查询结果被用于外部查询,称为<strong>内部查询</strong>。</p><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><h4 id="h59">4.1.1 自包含标量子查询示例</h4><div></div><p>如果子查询没有返回值,则返回 <strong>NULL</strong> 。而与<strong>NULL</strong>的都会生成 <em>NUKNOWN</em>, 然而查询筛选是不返回筛选表达式试算为 <em>UNKNOWN</em> 的行。</p><h4 id="h60">4.1.2 自包含多值子查询示例</h4><p>多值子查询是作为单个列,返回多个值的子查询,无论子查询是否是自包含的。可使用<strong>IN</strong>谓词进行多值子查询操作。</p><p> 没有明确的经验方法表示子查询比联接要好,所以,在写<strong>SQL</strong>时先以直观的形式对指定任务写一个解决方案查询,如果性能不满意,可以尝试查询调教来进行调优,如:。</p><p> 在子查询中可以不使用 </p><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><p>相关子查询引用的表属性位于外部查询中,这意味着,该子查询依赖于外部查询并且无法单独调用。</p><div></div><h4 id="h62">4.2.1 EXISTS 谓词</h4><p>使用 <strong>EXISTS</strong> 可作为一个子查询作为输入,如果子查询返回任意行,<strong>EXISTS</strong> 返回<strong>TRUE</strong>,否则返回<strong>FALSE</strong>,所以 <strong>EXISTS</strong> 是一个两值逻辑运算。</p><div></div><p><strong>EXISTS</strong> 相当于短路计算功能,即SQL Server 只要知道子查询返回了一行或者没有数据返回就足够了, 它不需要处理所有符合条件的行。</p><p> 与其他大多数情况不同,在 <strong>EXISTS</strong>的上下文子查询中使用星号(*)并无不妥之处,<strong>EXISTS</strong>只关心匹配行的存在,并不关心<strong>SELECT</strong>列表中指定的列。数据库会自动忽略查询的 <strong>SELECT</strong> 列表, 所以并不会带来大的性能损耗。相比于,使用更让人容易理解,更加直观。</p><h4 id="h64">4.3.1 返回前一个或下一个值</h4><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_数据库_13' title="enter description here" style="visibility: visible; width: 346px;"></p><p> <br></p><p> 73.jpg </p><p> <br></p><p>&nbsp;</p><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8ca369d86401.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_数据库_14' title="enter description here" style="visibility: visible; width: 349px;"></p><p> <br></p><p> 97.jpg </p><p> <br></p><p> PS:在SQL2012中引入了 <strong>LAG</strong>和 <strong>LEAD</strong>两个新开窗函数,允许按照指定排序从“前一个”或“后一个”返回一个元素。 </p><p>&nbsp;</p><h4 id="h65">4.3.2 使用运行聚合</h4><p>运行聚合是随着时间累积值的聚合。</p><div></div><p>&nbsp;</p><p> <br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8cca4e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_字符串_15' title="enter description here" style="visibility: visible; width: 265px;"></p><p> <br></p><p> 51.jpg </p><p> <br></p><p>&nbsp;</p><h4 id="h66">4.3.3 不当子查询处理</h4><h5>4.3.3.1 NULL故障</h5><p>T-SQL 使用三值逻辑,下面将演示当子查询涉及<strong>NULL</strong>标记并且没有考虑三值逻辑情况下演变而来的问题。</p><div></div><p>当前示例似乎按照期望的方式工作,即返回两个没有下订单的客户。<br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670cce8d0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='SQL Server 2012 TSQL 中文手册_字符串_16' title="enter description here" style="visibility: visible; width: 191px;"></p><div></div><p>这一次查询返回的是一个空集。</p><div></div><p>我们知道<strong>IN</strong>返回的是<strong>TRUE</strong>,<strong>NOT IN</strong>则为<strong>FASLE</strong>。 如果Orders表中存在有一条custid为<strong>NULL</strong>的记录,Customers表的custid与该记录进行比较时产生的是<strong>UNKNOWN</strong>,所以整个 的返回结果是<strong>UNKNOWN</strong>。这意味着,这是一种不知道custid是否出现在集合中,也不知道其是否求出现在集合中的情况。总之,当对一个至少返回一个<strong>NULL</strong>的子查询使用谓词时,外部查询总是返回空集合。</p><p> 解决方案:<br></p><ol><li>列不允许<strong>NULL</strong>标记,将其定义为<strong>NOT NULL</strong>是什么必要的。</li><li>编写所有查询时,应考虑三值逻辑(TRUE,FALSE和UNKNNOW)的所有可能的三种真值。</li><li>考虑使用<strong>EXISTS</strong>代替<strong>IN</strong></li></ol><h5>4.3.2 子查询列中的替换错误</h5><p>在子查询中可以使用别名来查询正确的列。<br> PS:如果用提示插件就不会出现这种低级错误了。</p><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><div></div><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><p><br></p> 

讯享网


小讯
上一篇 2025-05-27 18:21
下一篇 2025-04-24 09:39

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/182783.html