简介
逛公众号的时候看到了一篇有意思的技术文章----一行SQl代码能做什么? 在此记录一下,尊重原创,故:
详解
- 复制表结构
SELECT * INTO Customers_bak FROM Customers WHERE 1=2;
或者SELECT TOP 0 * INTO Customers_bak FROM Customers;
可以得到与Customers 表结构一样的Customers_bak ,而且Customers_bak 中没有数据。- 查询表里是否存在数据
SELECT TOP 1 1 FROM Customers
- 随机获取一行数据
SELECT TOP 1 * FROM Customers ORDER BY NEWID();
- 获取第6到10行的记录
SELECT TOP 5 * FROM (SELECT TOP 10 * FROM Person ORDER BY ID ) a ORDER BY ID DESC
- 对空值赋默认值
SELECT ISNULL(Price,0) FROM Orders
注:Price为空值时会默认赋0
- 将日期转换成文本格式
SELECT CONVERT(VARCHAR(10),CreateDate,120) FROM Students
注:CreateDate为带时间的完整日期格式,执行后会得到不带时间的字符串,如'2020-05-31'
- 删除重复记录(除了主键不同,其他字段均相同)
表Person数据如下:
- 查询表里是否存在数据
删除其中除ID以为其他都重复的记录
DELETE FROM Person WHERE ID NOT IN (SELECT MAX(ID) FROM Person GROUP BY Name,Age,Sex,Phone)
- 保留2位小数
SELECT CAST(Amount as NUMERIC(18,2)) FROM Orders
注:Amount是带2位以上的小数格式,转换后的小数会四舍五入。
- 查询当前数据库中的所有表名
SELECT NAME FROM SYSOBJECTS WHERE TYPE='U'
- 查询某个表里的所有列名
SELECT NAME FROM SYSCOLUMNS WHERE ID=OBJECT_ID('Person')
- 将B表中的字段内容更新到A表
UPDATE A SET A.Name=(SELECT B.Name FROM B WHERE A.ID=B.ID)
- 获取笛卡尔积
SELECT A.*,B.* FROM A,B
- 按姓氏笔画多少排序
SELECT Name FROM Person ORDER BY Name Collate Chinese_PRC_Stroke_CI_AS
- 延迟3秒执行查询语句
WAITFOR DELAY '0:0:3' SELECT * FROM Person
- 将查询结果转换为XML格式
SELECT * FROM Person WHERE ID=1 FOR XML PATH
- 将小数转换成百分数
SELECT CAST(CAST((0.8888*100) AS NUMERIC(18,2)) as VARCHAR(20)) '%'
- 处理除数为0
SELECT ISNULL(A/NULLIF(B,0),1) FROM TABLEA
或者
SELECT CASE WHEN B=0 THEN 1 ELSE A/B END FROM TABLEA
注:A为任意数值,B为0