嵌套查询
关联子查询
处理NULL数据——ISNULL函数
派生表
使用通用表达式(CTE)
insert into @t(name)(select CategoryName from Category)
SELECT * FROM Category where CategoryName in (select * from @t);
select CategoryName from Category
)
select * from Category where CategoryName in (select * from cr)
with
cr
as
(
select
CountryRegionCode from person.CountryRegion where Name like
'C%'
)
select
* from person.CountryRegion -- 应将这条SQL语句去掉
--
使用CTE的SQL语句应紧跟在相关的CTE后面 --
select
* from person.StateProvince where CountryRegionCode
in
(select
* from cr)
with
cte1
as
(
select
* from table1 where name like
'abc%'
),
cte2
as
(
select
* from table2 where id > 20
),
cte3
as
(
select
* from table3 where price < 100
)
select
a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id
3. 如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是CTE,当然,后面的SQL语句使用的就是数据表或视图了,如下面的SQL语句所示:
-- table1是一个实际存在的表
with
table1
as
(
select
* from persons where age < 30
)
select
* from table1 -- 使用了名为table1的公共表表达式
select
* from table1 -- 使用了名为table1的数据表
5. 不能在 CTE_query_definition 中使用以下子句:
(1)COMPUTE 或 COMPUTE BY
(2)ORDER BY(除非指定了 TOP 子句)
(3)INTO
(4)带有查询提示的 OPTION 子句
(5)FOR XML
(6)FOR BROWSE
6. 如果将 CTE 用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾,如下面的SQL所示:
declare
@s nvarchar(3)
set
@s =
'C%'
;
-- 必须加分号
with
t_tree
as
(
select
CountryRegionCode from person.CountryRegion where Name like @s
)
select
* from person.StateProvince where CountryRegionCode
in
(select
* from t_tree)
CTE除了可以简化嵌套SQL语句外,还可以进行递归调用。
使用EXISTS运算符
SELECT 'True' FROM sys.databases where name = 'abc'
)
BEGIN
DROP DATABASE abc;
END
ELSE
BEGIN
CREATE DATABASE abc;
END
GO
混合数据类型CAST和CONVERT
select CONVERT(varchar, getdate(), 120 )
2004-09-12 11:06:08
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')
20040912110608
select CONVERT(varchar(12) , getdate(), 111 )
2004/09/12
select CONVERT(varchar(12) , getdate(), 112 )
20040912
select CONVERT(varchar(12) , getdate(), 102 )
2004.09.12
select CONVERT(varchar(12) , getdate(), 101 )
09/12/2004
select CONVERT(varchar(12) , getdate(), 103 )
12/09/2004
select CONVERT(varchar(12) , getdate(), 104 )
12.09.2004
select CONVERT(varchar(12) , getdate(), 105 )
12-09-2004
select CONVERT(varchar(12) , getdate(), 106 )
12 09 2004
select CONVERT(varchar(12) , getdate(), 107 )
09 12, 2004
select CONVERT(varchar(12) , getdate(), 108 )
11:06:08
select CONVERT(varchar(12) , getdate(), 109 )
09 12 2004 1
select CONVERT(varchar(12) , getdate(), 110 )
09-12-2004
select CONVERT(varchar(12) , getdate(), 113 )
12 09 2004 1
select CONVERT(varchar(12) , getdate(), 114 )
11:06:08.177
select getdate()
结果:2003-12-28 16:52:00.107
select convert(char(8),getdate(),112)
结果:20031228
select convert(char(8),getdate(),108)
结果:16:52:00
select convert(char(8),getdate(),112)
|
指日期格式
规则如下:
1 101 美国 mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 英国/法国 dd/mm/yy
4 104 德国 dd.mm.yy
5 105 意大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 (*) 默认值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10 110 美国 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113 (*) 欧洲默认值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 或 120 (*) ODBC 规范 yyyy-mm-dd hh:mm:ss[.fff]
- 21 或 121 (*) ODBC 规范(带毫秒) yyyy-mm-dd hh:mm:ss[.fff]
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(不含空格)
- 130* 科威特 dd mon yyyy hh:mi:ss:mmmAM
- 131* 科威特 dd/mm/yy hh:mi:ss:mmmAM
关于Emaker中字段的格式转换和字段间的运算代码可以加到属性里的“格式转换(读出)”和“格式转换(写入)”,table字段设定里的“字段”位置也可以灵活加函数。比如:'AF'+ID 或者ID+'/'+PWD ,convert(varchar(50),F1) ,
convert(int,%)-19110000 (读出)
convert(char(8),convert(int,%)+19110000) (写入)
实现行的合计运算等等。加入:%系统变量%,则是调用在Emaker 系统中设定的系统变量。
使用MERGE命令同步数据
定义:通过MERGE命令,可以将多个DML操作语句(INSERT,UPDATE和DELETE)组合成一个整体操作,从而提高性能和简化事物
使用BY TARGET 和 BY SOURCE
使用OUTPUT 子句收集受影响的行
ON (FILENAME = 'E:\XXX_Data.mdf')
FOR ATTACH_REBUILD_LOG//意思是附加重建日志
研究窗口化参数
SELECT name,Class,(ROW_NUMBER() OVER (PARTITION BY Class ORDER BY score desc)) AS '排名' FROM StudentScore
)
SELECT * FROM Randked;
SELECT name,Class,(RANK() OVER (ORDER BY score desc)) AS '排名' FROM StudentScore
)
SELECT * FROM Randked;
WITH Randked AS(
SELECT name,Class,(DENSE_RANK() OVER (ORDER BY score desc)) AS '排名' FROM StudentScore
)
SELECT * FROM Randked;
WITH Randked AS(
SELECT name,Class,(NTILE(1) OVER (ORDER BY score desc)) AS '排名' FROM StudentScore
)
SELECT * FROM Randked;
一次一个数据块:特殊的查询分页
--SELECT TOP 20 ProductID,ProductNumber,Name FROM Production.Product;
--第二页
--SELECT ProductID,ProductNumber,Name FROM Production.Product ORDER BY ProductNumber OFFSET 20 ROWS FETCH NEXT 20 ROW ONLY;
--第三页
--SELECT ProductID,ProductNumber,Name FROM Production.Product ORDER BY ProductNumber OFFSET 40 ROWS FETCH NEXT 20 ROW ONLY;