赞
踩
目录
sqlserver不支持create table 表名 as select 的写法
select * into 备份的表名 from 原表名;
- 2.1 本地临时表,只能有创建者使用(断开连接会自动删除)
- create table #tableName(column1 dataType,...)
- 2.2 全局临时表,所有用户都能使用(使用drop table ##tableName 删除)
- create table ##tableName(column1 dataType,...)
- 2.3 使用一条WITH子句来指定临时结果表
- with 临时表名(列名) as (select 字段 from 表)
- select * from 临时表名;--这可以写select、update、insert、delete、create view
- eg:
- with tmp1(name) as(SELECT name FROM TEST_1)
- select tmp1.name from tmp1
可以使用上述2.1、2.2方法创建出临时表再往里面insert数据,还可以直接通过
select 字段 into #tableName;
来直接创建临时表 --相当于create as的写法。
在写一段select语句的时候要在表名后面加上WITH (NOLOCK)
减少锁和不受排它锁影响来减少阻塞,从而提高并发时的性能。
alter table 表名 add 列名 类型;
alter table 表名 alter column 列名 新的类型;
alter table 表名 drop column 列名,列名,....;
DATEADD(datepart,number,date)
参数含义:date 参数是合法的日期表达式。number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数 。datepart值如下:
select DATEADD(month,-1,'2021-05-01'); --'2021-04-01'
获取当前时间
SELECT GETDATE();
- select EOMONTH(GETDATE()) AS '本月最后一天'
- ,EOMONTH(GETDATE(),1) AS '下月最后一天'
- ,EOMONTH(GETDATE(),-1) AS '上个月最后一天'
- ,FORMAT(EOMONTH (getdate()),'yyyy-MM-01') AS '本月第一天'
- ,FORMAT(EOMONTH (getdate(),-1),'yyyy-MM-01')AS '上个月第一天'
select datediff(day,getdate()-1,getdate()); 结果为1,前面的日期减后面的日期
CONVERT(data_type(length),data_to_be_converted,style)
参数含义:data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。 style值如下
- select convert(varchar(20),created,120) from 表 with(nolock); 2019-10-12 18:46:43
- select convert(varchar(10),created,120) from 表 with(nolock);-2019-10-12
查看数据库 | exec sp_databases; |
查看表信息 | exec sp_tables ’表名’; SELECT * FROM sys.objects WHERE name='表名' |
查看列信息 | exec sp_columns 表名; select * from syscolumns where id=object_id('表名') and name='列名' sp_help 表名 (相当于desc) |
查看索引 | exec sp_helpIndex 表名; |
查看约束名称 | exec sp_helpConstraint 表名; |
查看存储过程的名字 | exec sp_stored_procedures; |
查看存储过程创建、定义语句 | exec sp_helptext '存储过程名'; |
- create table test_1(
- name varchar(100)
- ,age varchar(100)
- );
- insert into test_1 values ('张三',15);
- insert into test_1 values ('李四',16);
- insert into test_1 values ('王五',17);
- insert into test_1 values ('张六',21);
-
- create table test_2(
- name varchar(100)
- ,id varchar(100)
- );
- insert into test_2 values ('张三',18);
- insert into test_2 values ('张三',1);
- insert into test_2 values ('李四',19);
- insert into test_2 values ('王五',20);
CROSS APPLY 相当于join
- SELECT *
- FROM TEST_1 AS C
- CROSS APPLY (SELECT TOP 1 *
- FROM TEST_2 AS O
- WHERE C.NAME=O.NAME
- ORDER BY ID ASC
- ) AS CA
- 取TEST_1表与TEST_2表使用name字段进行join关联,取TEST_2表id的第一条
- --------------相当于row_number的写法-------------
- SELECT T.NAME1,T.AGE,T.NAME,T.ID
- FROM(SELECT ROW_NUMBER() OVER(PARTITION BY O.NAME ORDER BY O.ID ASC) AS RN
- ,C.NAME AS NAME1,C.AGE,O.NAME,O.ID
- FROM TEST_1 AS C
- JOIN TEST_2 AS O
- ON C.NAME=O.NAME
- )T
- WHERE RN=1
- order by T.ID ASC
OUTER APPLY相当于left join
- SELECT *
- FROM TEST_1 AS C
- OUTER APPLY (SELECT TOP 1 *
- FROM TEST_2 AS O
- WHERE C.NAME=O.NAME
- ORDER BY ID ASC
- ) AS CA;
(sqlserver2012开始支持contract的用法)
STUFF(字符串, 从第几个字符开始删除, 删除的字符数, 拼接的字符串)
- 从第二个字符开始删除一个字符,插入【拼接】字段
- SELECT STUFF('abcdef', 2, 1, '拼接'); a拼接cdef
测试数据还是用刚才的test_!和test_2表
- SELECT TEST_1.NAME
- ,STUFF(
- (SELECT ',' + CAST(TEST_2.ID AS VARCHAR)
- FROM TEST_2 WITH (NOLOCK)
- WHERE 1 = 1
- AND TEST_1.NAME = TEST_2.NAME --相当于left join
- ORDER BY TEST_2.ID
- FOR XML PATH('')
- ),1,1,'')--把第一个【,】去掉
- FROM TEST_1
- group by TEST_1.NAME --防止重复
- ;
可以看到TEST_2中有两条NAME是张三的id,使用逗号拼接成了1,18
参考书籍《SQL Server实用教程 SQL Server 2014版》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。