在上篇博文中介绍了T-SQL查询的基础知识,本篇主要介绍稍微复杂的查询形式。 表运算符 表运算符的作用是把为其提供的表作为输入,经过逻辑查询处理,返回一个表结果。...SQL Server支持四个表运算符:JOIN、APPLY、PIVOT、UNPIVOT,其中JOIN是标准SQL中的运算符,APPLY、PIVOT和UNPIVOT是T-SQL的扩展。...: [1240] 交叉联接 SQL中使用CROSS JOIN语句进行交叉联接查询,在逻辑处理上,交叉联接是最为简单的联接类型,它只获取表的笛卡尔乘积。...换句话说,外联接中ON子句的作用是进行表之间关联,如果外联接需要对结果集做进一步的筛选的话不能使用ON...AND...语句,而要使用WHERE条件。...通常,当SQL中出现多个表运算符时,从左到右进行逻辑处理,前一个联接的结果会作为下一个联接的左侧输入。
在上篇博文中介绍了T-SQL查询的基础知识,本篇主要介绍稍微复杂的查询形式。 表运算符 表运算符的作用是把为其提供的表作为输入,经过逻辑查询处理,返回一个表结果。...SQL Server支持四个表运算符:JOIN、APPLY、PIVOT、UNPIVOT,其中JOIN是标准SQL中的运算符,APPLY、PIVOT和UNPIVOT是T-SQL的扩展。...交叉联接 SQL中使用CROSS JOIN语句进行交叉联接查询,在逻辑处理上,交叉联接是最为简单的联接类型,它只获取表的笛卡尔乘积。...换句话说,外联接中ON子句的作用是进行表之间关联,如果外联接需要对结果集做进一步的筛选的话不能使用ON...AND...语句,而要使用WHERE条件。...通常,当SQL中出现多个表运算符时,从左到右进行逻辑处理,前一个联接的结果会作为下一个联接的左侧输入。
如果你使用的是2005及以下版本,你需要多个INSERT语句。最后的执行结果如下图所示: ? (2)需求说明 假设我们要生成一个报表,包含每个员工和客户组合之间的总订货量。...(4)使用T-SQL PIVOT运算符进行透视转换 自SQL Server 2005开始引入了一个T-SQL独有的表运算符-PIVOT,它可以对某个源表或表表达式进行操作、透视数据,再返回一个结果表...在PIVOT运算符的圆括号后面,可以为结果表制定一个别名。...MERGE语句是SQL标准的一部分,而T-SQL版本的MERGE语句也增加了一些非标准的扩展。 ...代码地服务器端例程,可以有输入和输出参数,可以返回多个查询的结果集。
在第一部分中,我们讨论了APPLY和CTE这两个T-SQL Enhancement。APPLY实现了Table和TVF的Join,CTE通过创建“临时的View”的方式使问题化繁为简。...现在我们接着来讨论另外两个重要的T-SQL Enhancement Items:PIVOT和Ranking。 ... ( COUNT(MON) FOR MON IN ([1],[2],[3],[4]) ) AS P 在上面的例子中,同过下面的SELECT语句筛选出来的是为经过PIVOT的数据。...ROW_NUMBER()比Oracle的ROWNUM更加强大的是,它可以通过OVER语句指定一个进行排序的Column,比如:ROW_NUMBER() OVER (ORDER BY CustomerID...T-SQL Enhancement in SQL Server 2005: [原创]T-SQL Enhancement in SQL Server 2005 - Part I [原创]T-SQL
概述: 本系列【T-SQL基础】主要是针对T-SQL基础的总结。 本篇主要是对多表查询基础的总结。...查询语句的FROM字句在逻辑上是第一条要处理的字句,在FROM字句内可以用表运算符对输入的表进行操作。...SQL Server 2008支持四中表运算符:JOIN/APPLY/PIVOT/UNPIVOT ?...如果不为表指定别名,联接结果中的列名就会有歧义。 比如在本例中,别名为A1,A2。 二、内联接 1.什么是内联接 对两个输入表进行笛卡尔积,然后根据指定的谓词对结果行进行过滤。...所以如果FROM字句包含多个连接,逻辑上只有第一个联接对两个基础表进行操作,而其他联接则将前一个联接的结果作为其左边的输入。 ?
group_by_expression] [ HAVING search_condition] [ ORDER BY order_expression [ ASC | DESC ] ] 1)UNION合并多个查询结果...首先用笛卡尔乘积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。...CASE函数用于计算条件列表并返回多个可能结果表达式之一。 CASE函数具有两种格式: 简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。...SQL Server并得以执行的一条或多条T-SQL语句。...GO本身不是T-SQL的组成部分,只是一个用于表示批处理结束的前端指令。
存储过程可包含逻辑控制语句和数据操作语句,它可以接收参数、输出参数、返回单个或多个结果集以及返回值。...但如果使用T-SQL批处理代码,每次运行T-SQL语句时,都要从客户端重复发送,并且在SQL-Server每次执行这些语句时,都要对其进行编译和优化。...3>减少网络流量 创建使用存储过程后,一个需要数百行T-SQL代码的操作,由一条执行该过程代码的单独语句就可实现,而不需要在网络中发送数百行代码 4>可作为安全机制使用 即使对于没有直接执行存储过程中语句的权限的用户...或使用T-SQL语句,使用Microsoft SQL Management Studio创建存储过程的步骤类似于视图,用于创建存储过程的T-SQL语句为CREATE PROCEDURE。...创建不带参数的存储过程: 使用T-SQL语句创建存储过程的语法如下: CREATE PROC[EDURE] 存储过程名 AS SQL语句 调用存储过程: EXEC
SQL表达式运算 谓词 SQL中谓词是指运算结果为True,False或Unknown的逻辑表达式。T-SQL中的谓词有IN,BETWEEN,LIKE等。...如:LIKE '%x' 运算符 SQL中的运算符与高级编程语言(C#,JAVA)类似。当多个运算符出现在同一表达式中时,SQL Server会按照运算符的优先级进行计算。...NULL GROUP BY和ORDER BY子句会将多个NULL值视为相等 标准SQL的UNIQUE约束认为NULL是为彼此不同 T-SQL中的UNIQUE约束认为多个NULL是相等的 COUNT(*)...SELECT语句用于指定返回到查询结果集中的列,生成查询结果表。注意,在SELECT子句之前执行的子句无法使用SELECT子句中的列的别名,否则会返回Invalid column name错误。...如,WHERE子句中的多个表达式的计算并没有确定的顺序。 CASE...WHEN... CASE表达式是标量表达式,返回一个符合条件的值。注意,CASE是表达式,不是语句,与COUNT类似。
但是并不意味着我们使用多年的T-SQL即将被淘汰,而事实上T-SQL仍然是我们最为常见的基于Database的编程语言。...为了使读者对这些新引入的T-SQL特性有一个大概的了解,我先概括性地列出这些特性: APPLY Operator Common Table Expression PIVOT Operator...语句中,对于查询出的每条数据行,都去调用一个Table Value Function(TVF),并将TVF的数据附加在现有的查询结果上。...下面介绍几个典型的运用: 1、将复杂的Aggregate置于CTE中,将复杂的问题分解为多个步骤。...虽然这样的功能很简单,但他体现了一种思想,把一部完成略显复杂的功能进程分解成多个简单的步骤。
为了创建批处理,你可以写出多个SQL语句,后面在结尾跟着关键字Go,Go是一个命令,它指定批处理的结束。 ...常用的系统存储过程 Ø 定义不带参数存储过程的语法 CREATE PROCEDURE 存储过程名 AS --注释:表示后面是存储过程要执行的语句...END块,它保存一系列T-SQL语句以创建和插入行盗临时表。临时表被在结果集中返回,并且基于函数中提到的规范创建。 ...6、CASE语句求一系列条件的值并且返回各种可能结果中的一个。 7、你可以在批处理中使用WHILE语句以允许一系列T-SQL语句重复执行,只要给定条件为真。...16、存储过程使用alter procedute语句执行修改 17、用户定函数是一个数据库对象,它包含一系列T-SQL语句。 18、用户定义函数可以返回一个单一标量值或结果集。
此外,该字句中可以使用不在SELECT列表中的字段排序,但如果使用了DISTINCT关键字,则必须使用SELECT列表中的列,否则由于单个结果行可能代表多个原行,造成排序的不清晰。...在某个条件(比如order by日期)下,有多个符合条件的记录时,这几个结果集的顺序是不一定的(已实际访问的物理记录行的顺序为准),属于不稳定排序。...,此外还是APPLY、PIVOT、UNPIVOT等操作符,之后会介绍。...交叉联接:只包含笛卡尔乘积阶段,比如一张表A有m行,表B有n行,其结果集有m*n行记录。该类型使用场景非常少,但其中有2个场景还是需要知道的。...第二是只要涉及多个表一定要习惯与使用别名,不然很容易出现因细微字母差异而造成的SQL语句错误。
一、关于T-SQL T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL。...(1-J1)笛卡尔积:对涉及到的两个表执行笛卡尔积(交叉联接),生成虚拟表VT1-J1。 (1-J2)ON筛选器:对VT1-J1中的行根据ON子句中出现的谓词进行筛选。...(2)WHERE:根据在WHERE子句中出现的谓词对VT1中的行进行筛选。只有让谓词计算结果为TRUE的行,才会插入VT2中。 ...(3)GROUP BY:按照GROUP BY子句中指定的列名列表,将VT2中的行进行分组,生成VT3。最终,每个分组只有一个结果行。 ...这里我们要查询来自Madrid并且订单数少于3个的客户,查询代码和结果也如下图所示: ?
大家好,又见面了,我是你们的朋友全栈君。 一、【存储过程】 存储过程的T-SQL语句编译以后可多次执行,由于T-SQL语句不需要重新编译,所以执行存储过程可以 提高性能。...存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指 定存储过程的名称并给出参数来执行。...存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果 集以及返回值。...语句 [ end ] 2、使用存储过程 使用T-SQL中的EXECUTE(或EXEC)语句可以执行一个已定义的存储过程。...----------------------------------------------------------- -- 自定义存储过程 select *from student -- 1、创建不带参数的存储过程
本系列包含上中下三篇,内容比较驳杂,望大家耐心阅读: 那些年我们写过的T-SQL(上篇):上篇介绍查询的基础,包括基本查询的逻辑顺序、联接和子查询 那些年我们写过的T-SQL(中篇):中篇介绍表表达式、...在对两个(或多个)查询结果集进行集合操作时,需要注意其中的查询并不支持ORDER BY操作,如果还是需要这样的功能可以使用外部的ORDER BY或者是使用TOP等操作符将返回的游标转化为结果集。...ALL的结果是2条。...PIVOT透视 PIVOT实际是一个表运算符,包含分组、扩展、聚合三个逻辑阶段 SELECT empid, A, B, C, D FROM ( SELECT empid, custid, qty FROM...分组集 分组集就是一个属性集,分组GROUP BY字句只支持在一个查询中使用一种分组方式,如果需要多种分组的结果就需要通过UNION ALL将多个分组聚合起来,为了字段对应,需要为部分列设置NULL
PIVOT和UNPIVOT PIVOT 通过将表达式中的一个列的唯一值转换为输出中的多列(即行转列),来轮替表值表达式。PIVOT 在需要对最终输出所需的所有剩余列值执行聚合时运行聚合。...PIVOT 执行聚合,并将多个可能的行合并为输出中的一行。UNPIVOT 不重现原始表值表达式的结果,因为行已被合并。...student_pivot 将上述结果新建表 Student_pivot create table Student_pivot ( sid varchar(10),sname nvarchar(10),...--: 转换操作的整个过程的别名。 然后将这张结果表里的数据UNPIVOT回去。...read the docs) https://sql50.readthedocs.io/zh_CN/latest/ 参考网址: https://docs.microsoft.com/zh-cn/sql/t-sql
2.2 联接查询 (1)交叉联接:返回笛卡尔积,即m*n行的结果集 -- CROSS JOIN select c.custid, e.empid from sales.Customers as c...(3)外联结:笛卡尔积→对结果过滤→添加外部行 通过例子来理解外联结:根据客户的客户ID和订单的客户ID来对Customers表和Orders表进行联接,并返回客户和他们的订单信息。...该查询语句使用的联接类型是左外连接,所以查询结果也包括那些没有发出任何订单的客户; --LEFT OUTER JOIN select c.custid,c.companyname,o.orderid from...在T-SQL中。UNION集合运算可以将两个输入查询的结果组合成一个结果集。需要注意的是:如果一个行在任何一个输入集合众出现,它也会在UNION运算的结果中出现。...在T-SQL中,INTERSECT集合运算对两个输入查询的结果取其交集,只返回在两个查询结果集中都出现的行。
SQL与其它编程语言不同的最明显特征就是代码的执行顺序,在大多数编程语言中,代码是按照编写顺序来执行的,但在SQL中,第一个要执行的子句是FROM子句,尽管SELECT 语句第一个出现,但是几乎总是放在最后执行...(1)FROM FROM 阶段主要标明查询语句的来源表,如果是单表就表示不存在表运算符会直接跳转到WHERE子句; 如果存在表运算符,则会根据每个表运算符执行一些列的子阶段,例如,在连接运算汇总涉及的阶段有...(1-J1)笛卡尔积 这个阶段对表运算符涉及的两个表执行笛卡尔积(cross join),会生成虚表VT1-J1。...(3)GROUP BY 在GROUP BY阶段,按照GROUP BY子句中指定的列名,将VT2中的行进行分组,生成VT3,最终每个分组只有几个结果行。...-3)中的行进行排序,生成游标VT6 至此,整个SQL查询过程执行结束,最终返回VT6的结果给SQL发起者。
,右外连接的结果。...(cross join) 用于生成两张表的笛卡尔结果集,结果集为左表中的每一行与右表中的所有行组合。...select * from A , B select * from A cross join B select * from A , B语句就是返回笛卡尔结果集,等同于 select * from A...cross join B 隐式交叉连接与显式交叉连接 交叉连接有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。...例如:下面的语句1和语句2的结果是相同的。 语句1:隐式的交叉连接,没有CROSS JOIN。
不要过多创建索引,除了增加额外的磁盘空间外,对于DML操作的速度影响很大,因为其每增删改一次就得从新建立索引。 使用组合索引,可以减少文件索引大小,在使用时速度要优于多个单列索引。...执行 T-SQL 时,MYSQL 很快将目标锁定在了 vc_Name=erquan 的 5 条记录上,取出来放到一中间结果集。...执行 T-SQL 时,MySQL 无须扫描任何记录就到找到唯一的记录!...所以我们建议在多表join的时候尽量少join几张表,因为一不小心就是一个笛卡尔乘积的恐怖扫描,另外,我们还建议尽量使用left join,以少关联多。...但是,在互联网应用中,查询的语句远远大于DML的语句,甚至可以占到80%~90%,所以也不要太在意,只是在大数据导入时,可以先删除索引,再批量插入数据,最后再添加索引。
领取专属 10元无门槛券
手把手带您无忧上云