SQL Server 常用语句

 

查看数据库中的表信息

select 
    table_name=
    (
    case when t_c.column_id=1 
        then t_o.name 
        else '' 
    end
    ),
    column_id=t_c.column_id,
    column_name=t_c.name,
    type=t.name,
    max_length=t_c.max_length,
    precision=isnull(t_c.precision,0),
    scale=isnull(t_c.scale,0),
    is_identity=case when t_c.is_identity=1 then '' else '' end,    
    is_primary=
    (
        case when exists
        (
            select 1 from sys.indexes i,sys.index_columns ic,sys.objects o
                where o.type='PK' and o.name=i.name and i.index_id=ic.index_id 
                    and i.object_id=ic.object_id and ic.column_id=t_c.column_id 
                    and o.parent_object_id=t_c.object_id
        )
        then ''
        else ''
        end
    ),
    is_nullable=case when t_c.is_nullable=1 then '' else '' end,
    default_value=isnull(c.definition,''),
    description=isnull(e.value,''),
    fk_column_name=isnull(f_c.name,''),
    fk_table_name=isnull(f_o.name,'')
from sys.columns t_c
    inner join sys.objects t_o on t_c.object_id=t_o.object_id        
    left join sys.types t on t.system_type_id=t_c.system_type_id 
        and t.user_type_id=t_c.user_type_id
    left join sys.default_constraints c on c.object_id=t_c.default_object_id 
        and c.parent_object_id=t_c.object_id and c.parent_column_id=t_c.column_id
    left join sys.extended_properties e on e.major_id=t_c.object_id 
        and e.minor_id=t_c.column_id    
    left join 
    (
        select parent_object_id,referenced_object_id,column_id=min(key_index_id) from sys.foreign_keys
            group by parent_object_id,referenced_object_id
    )f on f.parent_object_id=t_c.object_id and f.column_id=t_c.column_id  
    left join sys.columns f_c on f_c.object_id=f.referenced_object_id and f_c.column_id=f.column_id
    left join sys.objects f_o on f_o.object_id=f.referenced_object_id
where t_o.type='U' and t_o.name<>'sysdiagrams'
    order by t_o.name,t_c.column_id ;

 

 

创建/删除数据库

if object_id(N'mytest') is not null
drop DATABASE mytest;
GO
create DATABASE mytest ;
go

 

创建数据库,指定物理文件

Create Database dbtang1 on
(Name=tang, Filename='D:\Microsoft SQL Server02\MSSQL.2\MSSQL\Data\tang.mdf')

 

 

查看数据库

use mytest;

select name, size, size*1.0/128 AS [Size in MBs]  from sys.master_files where name='mytest';

 

创建表

create table t_user(id int primary key, name varchar(100));

 

修改表

alter table t_user add state int;

注:此处不可以用表的别名。

 

插入数据

use mytest
go
declare @i int;
set @i = 1;
while @i < 100
begin
  insert into dbo.t_user (id,name) values(@i,'name_' + convert(varchar(20),@i));
  set @i = @i + 1;
end;

插入数据可以单个记录插入,也可以批量插入。

 

操作表(增、删、改)

select * from t_user ;

delete from t_user ;

update t_user  set state = 1 ;

 

 

从已存在表中复制数据

select * into t_user_bak from t_user a where a.id<51;

 

添加时间过滤条件

SELECT *
  FROM CardInfo a where a.cardtype=11
and CONVERT(varchar(100), a.begindate, 112) > '201211'
and CONVERT(varchar(100), a.begindate, 112) < '201304'  ;

 

修改表字段属性

alter table [dbo].[cardinfo] alter column remark [varchar] (1000)

 

查看表结构

select * from information_schema.columns where table_name='ControlRoomInfo' ;

exec sp_columns 'ControlRoomInfo' ;

exec sp_help 'ControlRoomInfo' ;

 

分组统计

select CONVERT(varchar(100), sendcardtime, 112)card_date, count(1) num from cardinfo a, GuestInfo b
where a.cardid = b.cardid 
group by CONVERT(varchar(100), sendcardtime, 112) ;

 

使用 LTRIM() 函数可以去除查询结果中左边的空格,RTRIM() 函数可以去除查询结果中右边的空格,那么嵌套这两个函数即可去除查询结果中两边的空格了。

SELECT LTRIM(RTRIM(字段名)) FROM 表名

 

获取英文月份

select DATENAME(mm,getdate())

select DATENAME(month,getdate())

 

获取年月数字

Select CONVERT(varchar(6), GETDATE(), 112)

 

获取字符或者字符串在另一个字符串中的起始位置

select charindex(' ', b.remark) from dbo.CardInfo b

 

查询每日的发卡数量(以房间、通道、门禁等为单位),汇总每日房卡报表

select  ROW_NUMBER() OVER (ORDER BY CONVERT(varchar(100), sendcardtime, 112) desc) id,CONVERT(varchar(100), e.sendcardtime, 112) mth, typename, count(1) num from (
select d.*, b.locktype, c.typename 
from (
select a.*, substring(a.remark, 1, (select charindex(' ', b.remark) from dbo.CardInfo b where b.cardid=a.cardid ))roomname from dbo.CardInfo a 
where a.remark<>''
) d ,
roominfo b, locktypeinfo c 
where d.roomname=b.roomname and b.locktype=c.locktype
and d.sendcardtime>='2014-10-25' and d.sendcardtime<='2014-12-01' ) e
group by CONVERT(varchar(100), sendcardtime, 112), locktype, typename order by CONVERT(varchar(100), sendcardtime, 112) desc ;

 

生成月总发卡数量报表

select CONVERT(varchar(6), e.sendcardtime, 112) mth, typename, count(1) num from (
select d.*, b.locktype, c.typename 
from (
select a.*, substring(a.remark, 1, (select charindex(' ', b.remark) from dbo.CardInfo b where b.cardid=a.cardid ))roomname from dbo.CardInfo a 
where a.remark<>''
) d ,
roominfo b, locktypeinfo c 
where d.roomname=b.roomname and b.locktype=c.locktype
) e
group by CONVERT(varchar(6), sendcardtime, 112), locktype, typename 
order by CONVERT(varchar(6), sendcardtime, 112) desc  ;

 

 

查询前 n 条记录

SELECT  top 3 * FROM SystemVariables

 

with as 语句

WITH 
RoomsWithCustomEvents AS 
(
    SELECT RoomID, case when COUNT('1') = 0 then 0 else 1 end AS Events FROM RecordConfig GROUP BY RoomID
), 
RoomsWithAlarms AS 
(
    SELECT RoomID, case when COUNT('1') = 0 then 0 else 1 end AS Alarms FROM RecordConfig R Inner Join RecordTypes RT on R.RecordTypeId = RT.RecordTypeId Where RT.Alarm = 1 GROUP BY R.RoomID
) 
SELECT  a.*, b.TypeName,RC.Events AS HasEvent, RA.Alarms AS HasAlarm FROM 
RoomInfo AS a 
inner join RoomTypeInfo b on a.RoomType = b.RoomType 
LEFT OUTER JOIN RoomsWithCustomEvents AS RC ON a.RoomID = RC.RoomID 
Left Outer join RoomsWithAlarms RA on a.RoomID = RA.RoomID 
WHERE a.roomstatus=0 And a.Building=1 And a.Floor=1 ;

 

查询 SQL SERVER 2005 的版本

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

或者

SELECT @@VERSION ;

 

事务

USE tempdb
GO
BEGIN TRAN --标记事务开始
INSERT INTO Table2 Values(1)
Waitfor delay '00:00:10' --表时等待10秒后再执行后面的代码
Select * from Table2
COMMIT TRAN --提交事务
Rollback TRAN --回滚事务

 

 

表dept

id  name

 

表person

id name did score

 

统计各部门的员工分数<60, 60-80, >80的人数

 

select t.name,
(select case when low is null then 0 else low end from(
select a.did, COUNT(1) as low
from t_person a
where a.score < 60
group by did
)b where id=b.did)low,
(select case when mid is null then 0 else mid end from (
select a.did, COUNT(1) as mid
from t_person a
where a.score >= 60 and a.score <= 80
group by did
)c where id=c.did ) mid,
(select high from(
select a.did, COUNT(1) as high
from t_person a
where a.score > 80
group by did
) d where id=d.did)high
from t_dept t

 

posted @ 2014-09-09 10:43  ivantang  阅读(295)  评论(0编辑  收藏  举报