【Sqlserver】T-Sql语言基础

1. 数据的生命周期

OLTP(连接事务处理)-->ETL(将数据移动到仓库)-->DW(数据仓库)-->OLAP(联机分析处理)-->DM(数据检索,对数据模型进行设计和优化)

 

2.  sqlserver安装时默认的数据库

master:保存实例范围的元数据/服务器配置/实例中的数据库的信。

resource:保存系统的所有对象

model:新数据的模板

tempdb:保存临时数据的地方

msdb:服务保存的数据,如作业计划之类的

 

master数据库的屋里属性

主数据库(.mdf),日志(.ldf)。

 

3.  集合运算

并集[union]:两集合的总和,默认union distinct两集合去除了重复的数据。可u用union all 去带重复的数据。

交集[intersect]:取两集合的相同的数据,剔除了重复的数据。不可与all合用。

差集[except]:A except B = A-B 。从A集合中剔除有B集合的数据。

差集的优先级大于并集和交集,交集和并集优先级相同。

 

4.  判断数据库是否存在

if db_id('数据库名称') is null

create database name( 

)

5.  数据库的完整性(约束)

1] 主键约束 : constraint pk_name primary key (主键)

2] 外键约束 : constraint fk_name foreign key(外键) references 外表名称(外表主键) 

3] 唯一约束 : constraint unq_name unique(字段)

4] 检查约束 : constraint chk_name check(xxx>0表达式)

5] 默认约束 : constraint dft_name default(默认值) from 字段

 

添加约束

--主键

alter table abo.tableName Add constraint pk_name primary key

--外

alter table orders add constraint FK_Name foreign key (customerId) references customer(customerId)  

--外键联级动作

alter table orders   add constraint FK_Orders_CustomerId        --添加约束 名称

    foreign key (customerId)    references customer(customerId)    --外键约束,外键列名,被引用列名

    on update     no action    --默认  修改时不级联更新子表

    on delete     cascade      --删除时级联删除依赖行  

--唯一约束

alter table Account add constraint AK_AccountName unique (Account_Name) 

--check约束

alter table Account  add constraint CN_AccountAge check  (Account_Age > 18);  

--默认约束

alter table person add constraint CN_DefaultName default '无名氏' for person_name

删除约束

alter table AdItem drop constraint AdOrder_AdItem_FK1

规则添加约束

--添加规则

CREATE RULE Age18Rule AS @Age > 18;

go;

--激活规则,指定表列

EXEC sp_bindrule 'Age18Rule','person.person_age';

--接触规则

EXEC sp_unbindrule 'person.person_age';

--删除规则

go;

DROP RULE Age18Rule;

默认值创建

--创建默认值,绑定如规则绑定一致

CREATE DEFAULT AgeDefault AS 0;

DROP DEFAULT AgeDefault

禁用约束

--生成启用or禁用指定表外键约束的sql

select 'ALTER TABLE ' + b.name + ' NOCHECK CONSTRAINT ' + a.name +';'  from sysobjects a ,sysobjects b where a.xtype ='pk' and a.parent_obj = b.id and b.name='classify'; 

select 'ALTER TABLE ' + b.name + ' CHECK CONSTRAINT ' + a.name +';'  from sysobjects a ,sysobjects b where a.xtype ='f' and a.parent_obj = b.id and b.name='表名'; 

查询约束信息

EXEC sys.sp_helpconstraint @objname = N'Users'

 

注:当表中的数据有不符合新添加的约束,约束条件无法添加。

 

6.  查询表字段信息

7.  系统数据表

-- 移动每个文件

alter database database_name modify file (name=logical_name,filename='new_path');

--查询数据信息

select * from sys.databases;

--查询数据物理文件

select * from sys.master_files;

--查询在数据库中创建的每个对象(例如约束、默认值、日志、规则以及存储过程)

--F 外键; V 视图; P 存储过程; C check约束; D 默认约束; U 表; S 系统表; PK 主键

select * from sysobjects a 

where a.xtype = 'PK';

--外键约束表

select * from sys.foreign_keys;

8.  sql的执行顺序

from

where

group by

having

select

over

distinct

top

order by

 

9.  over的使用

select sum(1) over(),

sum(1) over(partition by name ,idcard) from carddetail;

over的四种用法

row_number() 此用于递增数据

rank() 有并列的情况下,之后递增的数据根据并列+1

dense_rank() 在并列情况下,之后递增的数据根据总数据递增,会看出有跳数

ntile(10) 将数据分组,可这设置多少条数据为一组

 

10.  运算符

between xx and xxx

like ‘[abc]_%’

in or not in 在查询的字段中值很少有重复的尽量少用in关键字,使用exists

case 字段 when 值或表达式 then 赋值 else 值 end

null unknown,当不同类型比较或运算无法计算时得出的结果为unknown,逻辑运算为false。

 

11.  排序规则

select * from sys.fn_helpcollations();--Arabic_CI_AS

ci 不区分大小写

字典排序法

set concat_null_yields_null off; --不支持null字符拼接

12.  递归查询 

13.  获取分组的前几位

14.  函数

字符串

substring(string,start,length);--下标从1开始

left(string,n);

right(string,n);

len(string);--计算字符的长度(个数)

datalength(string);按照ascii计算,unicode一个字符算两个长度

charindex(substring,string[,start_pos]) --查找字符在某字符串中在哪个位置

patindex('%[0-9]%','xxx'),--查找字符第一次出现的位置

replace(string,substring,substring),替换字符

replicate(string,n)--将字符重复几次

stuff('xyz',2,1,'abc')--xabcz

--upper和lower 大小姐转换

rtrim、ltrim

日期

datetime [19530101-99991231]

smalldatetime [19000101-20790606]

--year,quarter,month,dayofyear,day,week,hour,second,minute

dateadd(part,n,val)

datediff(part,val,val2)--两日期相差

datepart(part,val)--指定日期的数值 datename(part,val)

year、month、day

isdate(val)--是否是日期格式 返回1为日期格式

其他函数

cast('' AS datatime)

convert(类型,'',101);

 

15.  链接查询

cross join --n*m

inner join -- A并B

left join -- A(包括重复的)

left outer join -- 等价left join

full join -- 全表链接

 

16.  表表达式

***** with关键字

with ets as(

select id,parentid,name

from tableName

where id = 1

union all

select ets as t

join on tableName as n on t.parentid = t.id

)

select * from ets;

***** 创建视图

if object_id('','V')

drop view viewName

go

create view viewName 

as

select * from aa;

go;

select * from viewName;

***** 视图参数选项

alter view viewName with encryption

as

select * from tableName

go

schemabinding --此关键字定义在视图中,视图中引用的表不能随意修改

--查询视图存储过程等定义的文本

select object_definition(object_id('sp_addarticle'));

exec sp_helptext 'sp_addarticle';

在视图中sql尾部添加with check option,通过视图添加或修改的数据只能满足查询的条件内容

***** 创建函数

go

create function funcName(@cid as int)

returns table

as 

return

select * from blogs

where id = @cid

go

 

17.  集合运算

并集[union]:两集合的总和,默认union distinct两集合去除了重复的数据。可u用union all 带重复的数据。

交集[intersect]:取两集合的相同的数据,剔除了重复的数据。不可与all合用,在内部构建已经不使用,如使用它所查询的是A重复x乘以B重复的y。建议应row_number()

差集[except]:A except B = A-B 。从A集合中剔除有B集合的数据。

差集的优先级大于并集和交集,交集和并集优先级相同,except all

 

18.  透视及分组集

select  empid, A, B, C, D

from(

  select empid ,custid,qty from ordrs

) as E

[un]pivot(sum(qty) for cusid in(A,B,C,D)) as P;

ag:

select  userid, 语文, 数学

from(

  select userid ,Subject,Amount from Income

) as E

pivot(sum(Amount) for Subject in(语文, 数学)) as P;

19.  分组集

group by:结合合计,根据一列或多列进行分组。

--类似几个分组 union all 在一起

select * from [order]

group by 

grouping sets

(

(empid,custid),

(empid),

(custid)

)

grouping:指示是否聚合group by列表中的指定列表表达式。如grouping返回1则聚合;返回0则不聚合。

rollup/cube:生成简单的group by集合行及小计行或超聚行,还生成一个总计行。rollup选取的列从左到右排序进行聚行,cube则从右到左。grouping_id 获取当列的汇总的列数

select empid,custid,sum(qty) as sumqty from seven_sale_orders

group by 

grouping sets

(zz

(empid ,custid),(empid)--根据此进行分组计算汇总

)

 

20.  插入数据

insert into tablename(col1, col2....)

values(col1val, col2val....)

,(col1val, col2val....)--支持2005以上sqlserver

;

--将其他查询的结果插入到另一个表中,

insert into tablename(col1, col2....)

select col1,col2.....

from oldtablename 

where.....;

 

insert into tablename(col1, col2....)

select col1val, col2val.... union all

select col1val, col2val.... union all

select col1val, col2val.... ;

 

--利用存储过程进行插入数据

insert into tablename(col1, col2....)

exec procname @var ='' --执行存储过程 传递参数,返回的结果为集合

 

--此语法从其他表中的数据插入数据时创建新表

select col1, col2......

into talename

from oldtablename

 

--文件形式插入

bulk insert tablename from xxxxsql插入的文件.txt

with(

datafileType = 'char', --文件选取的类型

fieldterminator = ',', --分割符

rowterminator = '\n' --分界

);

 

--显示每个插入的记录

insert into Income 

output inserted.Id,inserted.Amount

values(2,10,2014,6,'C'),

(2,20,2014,6,'B');

 

declare @newRows table(id int,Amount numeric(18, 3))

insert into Income 

output inserted.Id,inserted.Amount

into @newRows

values(2,10,2014,6,'C'),

(2,20,2014,6,'B');

  select * from @newRows;

 

--带参数赋值

declare @row tables(xxx int,xxx nvarchar(40))

insert into tabname

output instered.xx,instered.xxx

select xxx from tab2

where 1=1

 

delete from orders

ouput deleted.xxxx

where 1=1

 

21.  自增列

--自增列语法

 

--获取当前作用域插入语句的自增列数值,没有插入记录为null

declare @new_key as int

--插入语句

set @new_key = scope_identity();

select @new_key as new_key

 

--获取表的自增列值

select IDENT_CURRENT('Income') as [ident_current],--当前表中的最新自增id

@@identity ,--获取最后一次会话的自增id

scope_identity() as id;

 

--更改自增列值

dbcc checkident('dbo.Income',RESEED ,26)

 

--更改自增列值 前提更改的值需比目前自增值小

set identity_insert seven_sys_loginuser on;

insert into seven_sys_loginuser(Id) values(5);

set identity_insert seven_sys_loginuser off;

 

22.  删除数据

/*

delete truncate 区别

1、delete后面可以写条件删除数据,truncate则是将表中的数据全部删除

2、delete删除每行的数据都会记录在数据日志中,而truncate的删除则只记录每页的数据,它不能激活触发器。

3、delete删除全部的数据会将之前占用的页数保留,再去添加是累计添加,删除的数据临时存在于电脑的回车站中可恢复[重启电脑不可恢复],可根据自增列查看再添加数据自增列以之前的自增列值累加。

   truncate则是将表中页全部删除,再增加数据时重新计算。

*/

delete from seven_sys_loginuser where PersonId=0;

truncate table textPact;

 

--联表删除

delete from A

[output deleted.xx]

from tableA as A

join tableB as B on A.id = b.ID

where b.name='';

 

23.  联接更新

update od set  xxx=xxx

[output inserted.xx,deleted.xx]

from name2 as od

join order as o on()

where 1=1

 

24.  查询数据

--多字段指定值显示

select * from (

values

(1003,'20150502',4,'B'),

(1003,'20150502',4,'B'),

(1003,'20150502',4,'B')

)

as o(orderid,orderdate,empid,custid)

 

25.  merge关键字 合并数据

merge /* top(2) */into TargetTable As T  --需要更改的数据对象

using SourceTable as S --以某数据对象为目标进行查看

on T.id = S.id --以什么字段进行比较

when Matched and(

t.xxx <> s.xxx

or t.xxx <> s.xxx

) then --字段比较相等

update set T.[desc] = S.[desc]  --更新

when not matched then--字段比较不相等

insert values(s.id,s.[desc]) --插入

when not matched by source then delete --目标表存在,原表不存在,则删除目标表不同的数据

output $Action As [action],inserted.id as 插入id, --显示操作的视图,$action 显示操作动作

inserted.[desc] as 插入的desc,

deleted.id as 删除的id,

deleted.[desc] as 删除的desc;

 

26.  事务

/*

原子性:对整个事务是一个整体,要么全部执行要不全部不执行。

一致性:事务在对数据修改时不会发生冲突,数据要保持一致性。

隔离性: 各事务的修改和查下隔离。

持久性:事务执行后数据是持久进行保持。

 

锁:

》按锁的级别分为:共享锁和排他锁、意向排他锁和意向共享锁。还有更新锁、意向锁、架构锁。

mssql系统默认每条增删改是一个事务的处理【除自定意外】,在事务中只有当事务执行请求资源时,其他资源请求无法请求,只有结束事务才可请求。

》当单个语句获得至少5000个锁时,就会触发锁的升级。

*/

 

--设置锁超时时间 -1 无限等待

set lock_timeout 5000;

--杀死线程,可利用sys.dm_exec_requests,sys.dm_exec_requests,sys.dm_tran_locks

kill 52;

隔离级别:

Read Uncommitted --未提交读

Read Committed --已提交读(默认)

Repeatable Read --可重复读

Serializable --可序列化

Snapshot --快照

Read Committed Snapshot --已提交读隔离

set transaction isolation level <name>

 

对数据库进行备份

if day(current_timestamp)=1

begin --全部复制

print '';

backup database xxx

to disk = '地址' with init

print '';

end

else

begin--差异备份

backup database xxx

to disk = '地址' with differential

end

27.  游标 

28.  数据库内部表、视图、函数、存储过程

select * from sys.tables;

select * from sys.columns;

select * from INFORMATION_SCHEMA.TABLES;--视图

select * from INFORMATION_SCHEMA.COLUMNS;

exec sys.sp_tables;

exec sys.sp_help;

exec sys.sp_columns @table_name='';

exec sys.sp_helpconstraint @objname='';--可查询是否有约束

select SERVERPROPERTY('属性名称');--

select DATABASEPROPERTYEX('数据库名称','');

select OBJECTPROPERTY(object_id('表名'),'');

select COLUMNPROPERTY(object_id('表名'),'字段名','');

--查看视图事务等创建文本

select object_definition(object_id('sp_addarticle'));

exec sp_helptext 'sp_addarticle';

--事物锁

select DB_NAME(resource_database_id),l.*

from sys.dm_tran_locks l

 

--查询最近链接数据信息

select *

from sys.dm_exec_connections c

cross apply sys.dm_exec_sql_text(c.most_recent_sql_handle) as ST;

--执行sql请求信息

select * from sys.dm_exec_requests

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/Seven77yixuan/p/10843797.html