Sql小技巧
1.CTE
with as类似于临时表,子查询,但它整句只相当于一句sql语句,复合查询时很好用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 with cr as 2 (select * from a) 3 select * from cr
2.PATINDEX
返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。
基本语法:PATINDEX ( '%pattern%' , expression )
pattern:字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个和最后一个字符时除外)。pattern 是短字符数据类型类别的表达式
expression:表达式,通常为要在其中搜索指定模式的列,expression 为字符串数据类型类别
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 patindex('%[^0-9|\\.]%',name) --获取第一个非数字和点的字符的位置
3.PARTITION BY
PARTITION BY是分组,GROUP BY 是分组聚合
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 NAME SCORE 2 A 13 3 B 34 4 A 56 5 B 68 6 C 4 7 SELECT NAME,ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY SCORE) rownum FROM dbo.USERS 8 NAME rownum 9 A 1 10 A 2 11 B 1 12 B 2 13 C 1
4.rowcount与@@rowcount
rowcount限定之后语句影响的行数,与top差不多,但top影响的行数不能用变量,rowcount可以;@@rowcount返回上一句sql影响的数据行数。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 set rowcount 10 2 select * from 表A--返回10条数据 3 4 select * from 表A 5 select @@Rowcount --返回表A的行数
5.删除除了自动编号不同, 其他都相同的学生冗余信息
delete tablename where ID not in(select min( ID) from tablename group by学号, 姓名, 课程编号, 课程名称, 分数)
6.复制(备份)表(只复制结构,源表名:a 新表名:b)
select * into b from a where 1<>1 (where1=1,拷贝表结构和数据内容)