SQL Server2012 T-SQL 基础教程
第一章 T-SQL查询与编程的背景
SQL Server的 排序规则(collation)
1.3 创建表和定义数据完整性
/* U:代表用户表,P:存储过程 -----*/
IF OBJECT_ID ('dbo.SixCampaign', 'U') IS NOT NULL
DROP TABLE dbo.SixCampaign
第二章 单表查询
2.1 SELECT语句的元素
top:select top(5) WITH TIES *
FROM 表 ORDER BY 字段 DESC ----返回与检索到的第5行中最后一行Orderby字段值相同的其它所有行
OFFSET-FETCH:
select * FROM 表 Order by 字段 OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY
OFFSET 0 ROW FETCH First(NEXT) 25 ROWS ONLY
逻辑处理顺序:1.FROM
2.WHERE
3.GROUP BY
4.HAVING
5.SELECT (表达式、DISTINCT)
6.ORDER BY (TOP/OFFSET-FETCH)
2.2 谓词和运算符
运算符优先级(从最高到最低):
1.() 圆括号
2.* 乘号、/ 除号、% 取余
3.+ 正号、- 负号、+ 加号 、+ 串联、- 减号
4.=、>、<、>=、<=、<>、!=、!>、!< 比较运算符
5.NOT
6.AND
7.Between 、IN、LIKE、OR
8.= 赋值
2.3 CASE 表达式
ISNULL:ISNULL(字段,'') 返回第一个非NULL的参数值 函数
COALESCE(字段1,字段2,字段3,.............) (标准):返回第一个非NULL值
IIF:IIF(表达式,1,0),满足表达式时返回1 ,否则返回0
CHOOSE:CHOOSE(<index>,<expr1>,<expre2>,<expre3>),返回列表中指定索引的表达式
2.4 NULL 标记
where [字段]='XX' 和 [字段]<>'XX' 输出结果中均不包含 NULL 值结果集,如需输出 NULL 结果集:[字段] IS NULL ([字段]=NULL 错误)
2.5 同时操作
2.6 使用字符数据
where [字段] COLLATE Latin1_General_CS_AS = N'davis' ----区分大小写
运算符和函数: 1.字符串连接(加号运算符和CONCAT函数) +号连接时如果某字段为NULL 则返回NULL,CONCAT([字段1],' '+[字段2],' '+[字段3])
2.Substring
3.Left RIGHT
4.LEN 字符数 和DATALENGTH 字节长度 函数 :LEN会删除字符串尾随空格
5.CHARINDEX函数:返回子字符串在字符串中第一次出现的位置
6.PATINDEX函数:返回模式在字符串中第一次出现的位置,例如 select PATINDEX ('%[0-9]%', 'abcc123hh7c') 输出结果:5
7.REPLACE函数
8.REPLICATE函数:按照指定的次数重复字符串,例如 select REPLICATE ('abc', 3) 输出结果:abcabcabc
9.STUFF函数
10.UPPER和LOWER函数:分别返回输入字符串的全部大写或小写字符
11.RTRIM和LTRIM函数:分别删除尾随或前导空格后的输入字符串
12.FORMAT函数:将输入值格式化成一个字符串, 例如 select FORMAT (123, '0000000') 输出结果:0000123
13.LIKE谓词:LIKE '[ABC]%' 、 LIKE '[^A-E]%'、LIKE '%[_]%' or LIKE '%!_%'ESCAPE'!' 转义字符
2.7 使用日期和时间数据
select GETDATE(),CURRENT_TIMESTAMP ,getutcdate(), sysdatetime(),sysutcdatetime (),sysdatetimeoffset()
CAST、CONVERT、PARSE函数,及其TRY_对应函数 (标准使用CAST)
DATEADD、DATEDIFF、DATEPART、DATENAME、YEAR、MONTH、DAY 、ISDATE 、
2012:FROMPARTS、EOMONTH返回月末日期
DATEFROMPARTS:select DATEFROMPARTS (2015, 8,1 ) 输出结果:2015-08-01
2.8 查询元数据
第三章 连接
Cross join 笛卡尔积
第四章 子查询
第五章 表表达式
表表达式:派生表、公用表表达式(CTE)、视图、内嵌表值函数(内嵌TVF)
递归CTE:默认递归100次
5.3 视图
1.ENCRYPTION :可用于创建或修改视图、存储过程、触发器、用户自定义函数 UDF
SELECT OBJECT_DEFINITION(OBJECT_ID('视图名')):获取视图定义文本,前提条件是该视图未定义ENCRYPTION 选项
Alter View 视图名 WITH ENCRYPTION。。。。。:EXEC sp_helptext '视图名' -----对象‘视图名’的文本已加密
SELECT OBJECT_DEFINITION(OBJECT_ID('视图名')) ---返回NULL
2.SCHEMABINING选项:对视图和UDF可用,它将被引用对象的架构和列绑定到引用对象架构中。它指示不能删除被引用对象,也不能删除或修改被引用的列。
3.Check Option选项:目的是防止出现视图修改与视图筛选的冲突,假设已存在一个视图查询定义。
Alter View *** With SCHEMABINING
As
Select *** From ** where **
with Check Option
Go
5.4 内嵌表值函数 :通过传递参数查询表
5.5 APPLY运算符
Cross Apply:(Cross join)
Outer Apply:(Left join)
第六章 集合运算符
6.1 UNION运算符
Union:A和B的并集
union All:A+B
6.2 INTERSECT运算符
Intersect:A和B的交集 (和谓词EXISTS)
Intersect all:如果A出现3行,B 5行,则返回minimum(x,y),返回3行
6.3 EXCEPT运算符
Except:A-B,A和B的差异
6.4 优先级 :1)INTERSECT;2)UNION/EXCEPT
6.5 规避不支持的逻辑阶段
第七章 查询
7.1 开窗函数
SUM(*) OVER(Partition by * order by * Rows Between Unbounded preceding and current row) --窗口的框架子句
Unbounded following窗口分区的最后一行 框架位于分区开始 当前行
7.1.1 排名开窗函数
ROW_NUMBER() OVER(Partition by [Values1] Order by [Values2]):1 2 3 4...
RANK() OVER(Partition by [Values1] Order by [Values2]):1 2 2 4。。。。
DENSE_RANK() OVER(Partition by [Values1] Order by [Values2]):1 2 2 3.。。。
NTILE(10) OVER(Partition by [Values1] Order by [Values2]):10个分区,每个分区的行数为总行数除以10取整,如果有余数从开头的分区依次添加一条额外行。
7.1.2 偏移开窗函数
LAG([字段1],n,x) OVER(Partition By [字段2] Order by ***):按照分区返回前n行【字段1】的值,没有返回值时默认为“x”,后两个参数没有时默认返回前一行,且无返回值时默认为NULL
LEAD:返回下一行值
FIRST_VALUE:返回分区的第一行的某指定字段值
LAST_VALUE:返回分区的最后一行的指定字段值
7.1.3 聚合窗口函数
SUM([字段1]) Over(Partiotion BY *** order by ****):Over部分均可省略
7.2 透视数据
PIVOT
7.3 逆透视数据
UNPIVOT
7.4 分组集
SQL能够在同一查询中定义多个分组集,包括Group By子句的Grouping sets、Cube和Rollup从属子句,以及Grouping和Grouping_ID函数。
Group by Grouping sets((分组1),(分组2),(分组3))
Group by Cube([a],[b],[c]):这3个字段的所有组合分组集和不分组的情况,((a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),())
Group by Rollup(a,b,c):其假定层次结构为a>b>c,分组集为((a,b,c),(a,b),(a),())
函数:Grouping([字段]),如果该列是当前分组集的成员返回0,否则返回1;
Grouping_ID(a,b,c):a 有4中组合方式,b有2中组合方式,c有1种,以0表示为分组集成员,1不是分组集成员,(a,b)分组集时该函数返回:0*4+1*2+1*1=1
第八章 数据修改
数据操作语言(Data Manipulation Language,DML):包括SELECT、INSERT、UPDATE、DELETE、TRUNCATE 和MERGE语句。
8.1 插入数据
1.INSERT VALUES:插入多行数据时以逗号分隔,可以将其作为表值构造函数以标准方式构造一个派生表,如
SELECT * From (Values (1,'20150701',4,'B'),(2,'20150702',1,'A'),(3,'20150703',3,'C'')) AS O(OrderID,OrderDate,EmpID,Custid);
2.INSERT SELECT
3.INSERT EXEC:将存储过程或动态SQL批处理返回的结果集插入到目标表中。
INSERT INTO [Table](Values.....) EXEC 存储过程
4.SELECT INTO
5.BULK INSERT:将来自文件的数据插入到一个现有表中。
BULK INSERT 表名 FROM '文件路径'
WITH
(
DATAFILETYPE = 'char' , ----数据文件类型,如char、native
FIELDTERMINATOR = ',' , ------字段终止符,如逗号
ROWTERMINATOR = '\n' ---行终止符,如换行符
);
8.1.6 标识列属性和序列对象
1.标识列属性:identity自增长列:identity(第一个值,增量值) ,可以使用更为通用的$identity 形式(SELECT $identity FROM 表名)
8.2 删除数据
1.DELETE
2.TRUNCATE
8.3 更新数据
1.UPDATE
8.4 合并数据
1.MERGE()
1 Merge into CHH_Owner AS T 2 3 Using (select * from VEDK_Owner where MyFlag in (0 ,1)) AS S 4 5 on T .Tmagic= s.tmagic and t.magic =s. magic and t. location=s .location 6 7 when matched 8 9 then update set t.Surname =s. Surname,t .Address= s.Address ,t. Email=s .Email, 10 11 t.MOBILE =s. MOBILE,t .Telephone_1= s.Telephone_1 ,t. Telephone_2=s .Telephone_2, t.Fdate =s. Fdate 12 13 when not matched --目标表中没有,源表中有 14 15 then insert values( s.Tmagic ,s. Magic,s .Location, s.VIN ,s. SaleDate,s .Surname, s.Address ,s. Email,s .MOBILE, s.Telephone_1 ,s. Telephone_2,s .Fdate, 1,'2500-12-31' ) 16 17 --when Not matched by source --目标表中存在,源表中不存在 18 19 --then delete
8.5 通过表表达式修改数据
8.6 使用TOP和OFFSET-FETCH修改
8.7 OUTPUT子句 inserted deleted
第九章 事务和并发处理
9.1 事物
事物是一个工作单元,可能包含查询和修改数据以及修改数据定义等多个活动。
显示定义事物的开始:BEGIN TRAN(或BEGIN TRANSACTION)
显示定义事物的结束:COMMIT TRAN
如果不希望提交事物(即要撤销修改):ROLLBACK TRAN (或 ROLLBACK TRANSACTION)
事物的四个属性(ACID):原子性、一致性、隔离性、持续性
9.2 锁和阻塞
第十章 可编程对象