SQL Server常语法语句操作

SQL Server语句操作

--1、获取表的主键字段
SELECT name FROM SysColumns WHERE id=Object_Id(‘表名‘) and colid=(select top 1 colid from sysindexkeys where id=Object_Id(‘表名‘))

select A.COLUMN_NAME  
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE A join
(select * from sysobjects where xtype=N‘PK‘ ) B
on object_id(A.CONSTRAINT_NAME)=B.id where a.table_name=‘表名‘

第一种方法只使用于表中只有一个主键,不适合与多字段联合主键。
第二种方法,两中都适合。

--2、获取表的字段名、类型、长度
select dbo.sysobjects.name as Table_name, 
dbo.syscolumns.name as Column_name,
dbo.systypes.name as Type_name,
dbo.systypes.length as Type_length,
columnproperty(dbo.syscolumns.id,dbo.syscolumns.name,‘precision‘) as Column_lengh
from dbo.syscolumns inner join dbo.sysobjects 
on dbo.syscolumns.id = dbo.sysobjects.id
left join dbo.systypes
on dbo.syscolumns.xtype = dbo.systypes.xusertype
where dbo.sysobjects.name = ‘denglu‘ --表名
and (dbo.sysobjects.xtype = ‘u‘) 
and (not (dbo.sysobjects.name like ‘dtproperties‘))

--1、创建数据库
create database DataBase_Name

--2、删除数据库
drop database DataBase_Name

--4、创建新表
create table Table_Name
(
    --创建列
    col1 type1 [not null] [primary key],
    col2 type2 [not null]
    
    --实例
    Name varchar(100) not null primary key,
    Age Int not null
)
--根据已有的表创建新表
 create table New_Table like Old_Table --使用旧表创建新表
 create table New_Table as select col1,col2,col3 from Ole_Table definition only --definition only 就是在create table 的时候不同时进行数据插入。那个关键字就是指“只定义无数据"

--5、删除新表
 drop table Table_Name
 
 --6、添加一个列
 Alter table Table_Name add column col type --col 为新增列名,type为类型
     --注:列增加后将不能删除,DB2中列加上后数据类型也不能改变,唯一能改变的是增加是varchar的长度。
 
 --7、添加主键
  Alter table Table_Name add primary key(col) --col 为列名
  
 --8、删除主键
  Alter table Table_Name drop primary key(col) --col为列名
 
 --9、创建索引
  create [unique] index idxname on TableName(col1,col2)
 
 --10、删除索引
  drop index idxname --注:索引是不可更改的,想更改必须删除新创建

--11、创建视图
  create view View_Name as select col1,col2,col3 from Table_Name

--12、删除视图
  drop view View_Name
  
 --13、几个简单的基本的Sql语句
      select * from Table_Name where 条件
      Insert into Table_Name(Field1,Field2) values(values1,values2)
      delete from Table_Name where 范围
      update Table_Name set field1=values1,field2=values2 where 条件
      select * from Table_Name where field1 like ‘%values1%‘ --like 的语法很精妙,请查资料
      select * from Table_Name order by field1,field2 desc --desc为倒叙排列,asc为正序排列
      select count as ‘总数名‘ from Table_Name
      select sum(field1) as ‘总和‘ from Table_Name
      select avg(field2) as ‘平均值‘ from Table_Name
      select max(field3) as ‘最大值‘ from Table_Name
      select min(filed4) as ‘最小值‘ from Table_Name

----14、几个高级查询运算词
A:union 运算符
 union运算符通过组合其他两个结果表(例如 Table_Name1 和 Table_Name2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 union all),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

B:Except 运算符
Except 运算符通过包括所有在Table1中但不在
Table2中的行并清除所有重复行而派生出一个结果表,当All随Except一起使用时(Except All),不清除重复行。

C:Intersect 运算符
Intersect 运算符通过只包括Table1和Table2中都有的行并清除所有重复行而派生出一个结果表,当all随intersect一起使用时(Intersect all),不清除重复行
注:使用运算词的几个查询结果行必须是一致的。

--15、使用外连接
A、left (outer) join:
左外连接(左连接):结果集包括连接表的匹配行,也包括左连接表的所有行。

Sql:select a.a,a.b,b.a,b.b from a left out join b on a.a=b.b

B、right(outer)join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

C、full/cross (outer)join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中得所有记录。

--16、分组:group by
一张表,一旦分组完成后,查询后只能得到组相关的信息,
组相关的信息:(统计信息)count,sum,max,min,avg

分组的标准,在SQL Server中分组时:不能以text,ntext,image类型的字段作为分组依据,
在select 统计函数中得字段,不能喝普通的字段放在一起;

--17、对数据库进行操作:
分离数据库:sp_detach_db DataBase_Name 路径名
附加数据库:sp_attach_db DataBase_Name 路径名

--18、修改数据库的名称
sp_renamedb ‘Old_DatabaseName‘ ‘New_DatabaseName‘

--1、复制表(只复制结构,源表名:a,新表名:b)(Access可用)
方法一:select * into b from a where 1<>1 (仅用于SQLServer)
方法二:select top 0 * into b from a

--2、拷贝表(拷贝数据,源表名:a,新表名:b)(Access可用)
insert into b(a,b,c) select d,e,f from a;

--3、跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用)
insert into b(a,b,c) select d,e,f from a in ‘具体数据库‘ where 条件

--4、子查询(表名1:ta,表名2:tb)
select a,b,c from ta where a in (select d from tb)
select a,b,c from ta where a in (1,2,3)

--5、显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from ta,(select max(adddate) adddate from tb where ta,title=tb.title) b

--6、外连接查询(表名1:ta,表名2:tb)
select ta.a,ta.b,ta.c,tb.c,tb.f from ta left out join tb on ta.a=tb.c

--7、在线视图查询
select * from (select a,b,c from ta)T where T.a>1

--8、between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where timea between time1 and time2
select a,b,c from table1 where a not between 数值1 and 数值2

--9、in的使用方法
select * from table1 where a [not] in(‘值1‘,‘值2‘,‘值3‘,‘值4‘)

--10、两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists (select * from table2 where table1.field1=table2.field1)

--11、四表联查问题
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ‘条件‘

--12、日程安排提前五分钟提醒
select * from 日程安排 where datediff(‘minute‘,f 开始时间,getdate())>5

--13、一条sql语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)a,表名 b where b.主键字段=a.主键字段 order by a.排序字段
具体实现:
关于数据库分页:
declare @start int,@end int
declare @sql nvarchar(600)

set @sql=‘select top‘+str(@[email protected]+1)+‘* from userinfo where userID not in (select top ‘+str(@start-1)+‘ userID from userinfo where userID>-1)‘
exec sp_executesql @sql

注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理.userID为一个标识列,如果top后还有具体的字段,这样做是非常有好处的,因为这样可以避免top的字段如果是逻辑索引的,查询的结果后实际表中得不一致(逻辑索引中得数据有可能和数据表中得不一致,而查询时如果处在索引则首先查询索引)

--14、前10条记录
select top 10 * from table1 where ‘条件‘

--15、选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名等等。)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

--16、包括所有在TableA 中但不在TableB和TableC中得行并消除所有重复行而派生一个结果行
(select a from TableA) except (select a from TableB) except (select a from TableC)

--17、随机取出10条数据
select top 10 * from Table_Name order by newid()

--18、随机选择记录
select newid()

--19、删除重复记录
delete from Table_Name where id not in(select max(id) from Table_Name group by col1,col2)

select distinct * into temp from Table_Name 
delete from Table_Name
Insert into Table_Name select * from temp
--评价:这种操作牵连大量的数据的移动,这种做法不适合大容量的数据操作

--在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判读具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎么删除重复字段
alter table Table_Name
--添加一个自增列
add column_b int identity(1,1)

delete from Table_Name where column_b not in(select max(column_b) from Table_Name group by column1,column2)

--删除递增列
alter table Table_Name drop column column_b

--20、列出数据库里的所有表名
select name from sysobjects where type=‘sa‘ --sa为用户

--21、列出表里的所有列名
select name from syscolumns where id=object_id(‘Table_Name‘)

--22、列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select中得case
select type,sum(case vender when ‘A‘then pcs else 0 end),sum(case vender when ‘c‘ then pcs else 0 end),sum(case vender when ‘B‘ then pcs else 0 end)from Table_Name group by type

--23、初始化表Table
truncate table Table_Name

--24、选择从10到15的记录
select top 5 * from (select top 15 * from Table_Name order by id asc)Table_new order by id desc

第三层 出神入化

--1、1=1 1=2的使用,在SQL语句组合时用得较多
where 1=1 是表示选择全部,
where 1=2 是表示全部不选
如:
if @strWhere !=‘‘
begin
  set @strSQL=‘select count(*) as Total from [‘[email protected]+‘] where ‘[email protected] 
end
else
begin
  set @strSQL=‘select count(*) as Total from [‘[email protected]+‘]‘
end

--2、收缩数据库
--重建索引
dbcc reindex
dbcc indexdefrag
--收缩数据和日志
dbcc shrinkdb
dbcc shrinkfile

--3、压缩数据库
dbcc shrinkdatabase(DataBase_Name)

--4、转移数据库给新用户已存在用户权限
exec sp_change_users_login ‘update_one‘,‘newname‘,‘oldname‘
go

--5、检查备份集
restore verifyonly from disk=‘路径‘

--6、修复数据库
alter database [dvbbs]set single_user
go
dbcc checkdb(‘dvbbs‘,repair_allow_data_loss)with Tablock
go
alter database [dvbbs]set multl_user
go

经典
--1、按姓氏笔画排序
select * from Table_Name order by CustomerName Collate chinese_PRC_Stroke_ci_as --从少到多

--2、数据库加密
select enctypt(‘原始密码‘)
select pwdencrypt(‘原始密码‘)
select pwdcompare(‘原始密码‘,‘加密后密码‘)=1--相同,否则不相同 encrype(‘原始密码‘)

select pwdencrypt(‘原始密码‘)
select pwdcompare(‘原始密码‘,‘加密后密码‘)=1--相同;否则不相同

--3、取回表中字段
declare @list varchar(1000)
declare @sql nvarchar(1000)
select @[email protected]+‘,‘+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name=‘表A‘
set @sql=‘select‘+right(@list,len(@list)-1)+‘from 表A‘
exec (@sql)

--4、查看硬盘分区
Exec master..xp_fixeddrives

--5、比较 A,B 表是否相等
if(select checksum_agg(binary_checksum(*))from 表A)
=(select checksum_agg(binary_checksum(*))from 表B)
print ‘相等‘
else
print ‘不相等‘

--6、杀掉所有的事件探查器进程:
declare hcforeach cursor global for select ‘kill‘+rtrim(spid) from master.dbo.sysprocesses
where program_name in(‘SQL profiler‘,‘SQL 事件探查器‘)

--7、记录搜索
--开头到n条记录
select top n * from 表

--N到M条记录(要有主索引ID)
select top M-N * from 表 where ID in (select top M ID from 表)order by ID desc

--N到结尾记录
select top N * from order by ID desc

案例
例如 1:一张表有一万多条记录,表的第一个字段RecID是自增长字段,写一个SQL语句,找出表的第31到di40个记录
select top 10 recid from A where recid not in(select top 30 recid from A)
分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。
select top 10 recid from A where ...是从索引中查找,而后面的 select top 30 recid from A 则在数据表中查找,这样由于索引中得顺序有可能和数据表中得不一致,这样就导致查询到得不是本来的欲得到的数据.
解决方案:
 1、用 order by:
    select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题.
 2、在那个子查询中也加条件:
    select top 30 recid from A where recid>-1

例如 2:查询表中的最后几条记录,并不知道这个表共有多少数据以及表结构
set @s=‘select top 1 from T where pid not in(select top‘+str(@count-1)+‘ pid from T)‘
print @s 
exec sp_executesql @s

--8、获取当前数据库中得所有用户表
select Name from sysobjects where type=‘u‘ and status>=0

select Name from sysobjects where xtype=‘u‘ and status>=0

--9、获取某一个表的所有字段
select name from syscolumns where id=object_id(‘表名‘)

select name from syscolumns where id in(select id from sysobjects where type=‘u‘ and name=‘表名‘)

--10、查看与某一个表相关的试图、存储过程、函数
select a.* from sysobjects a,syscomments b where a.id=b.id and b.text like ‘%表名%‘

--11、查看当前数据库中所有存储过程
select name as ‘存储过程名称‘ from sysobjects where xtype=‘p‘

--12、查询用户创建的所有数据库
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name=‘sa‘)

select dbid,name as db_name from master.. sysdatabases where sid<>0x01

--13、查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns
where table_name=‘userinfo‘ --userinfo 表名

--14、不同服务器数据库之间的数据操作
--创建连接服务器

exec sp_addlinkedserver ‘ITSV‘,‘‘,‘SQLOLEDB‘,‘远程服务器名或IP地址‘

exec sp_addlinkedsrvlogin ‘ITSV‘,‘false‘,null,‘用户名‘,‘密码‘

--查询示例
select * from ITSV.数据库名.dbo.表名

--导入示例
select * into 表 from ITSV.数据库名.dbo.表名

--以后不再使用时删除连接服务器
exec sp_dropserver ‘ITSV‘,‘droplogins‘

--连接远程/局域网数据(openrowset/openquery/opendatasource)

-- 1、openrowset

--查询示例
select * from openrowset(‘SQLOLEDB‘,‘sql服务器名‘;‘用户名‘,‘密码‘,‘数据库名.dbo.表名‘)

--生成本地表
select * into 表 from openrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)

--把本地表导入远程表
insert openrowset(‘SQLOLEDB‘,‘sql服务器名‘;‘用户名‘;‘密码‘,数据库名.dbo.表名) select * from 本地表

--更新本地表
update b set b.列 A=a.列 A from openrowset(‘SQLOLEDB‘,‘sql服务器名‘;‘用户名‘;‘密码‘,数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1

-- 2 openquery 用法需要创建一个连接

--首先创建一个连接创建连接服务器
exec sp_addlinkedserver ‘ITSV‘,‘‘,‘SQLOLEDB‘,‘远程服务器名或IP地址‘

--查询
select * from openquery(ITSV,‘select * from 数据库.dbo.表名‘)

--把本地表导入远程表
insert openquery(ITSV,‘select * from 数据库.dbo.表名‘) select * from 本地表

--更新本地表
update b set b.列 B=a.列 B from(ITSV,‘select * from 数据库.dbo.表名‘) as a inner join 本地表 b on a.列 A=b.列 A

-- 3 opendatasource/openrowset
select * from opendatasource(‘SQLOlEDB‘,‘Data Source=ip/serverName;User ID=登录名;password=密码‘).text.dbo.roy_ta

--本地表导入远程表
insert opendatasource(‘SQLOLEDB‘,‘Data Source=ip/ServerName;User ID=登录名;Password=密码‘).数据库.dbo.表名 select * from 本地表

时间: 2024-10-14 00:40:42

SQL Server常语法语句操作的相关文章

【转载】SQL Server - 使用 Merge 语句实现表数据之间的对比同步

原文地址:SQL Server - 使用 Merge 语句实现表数据之间的对比同步 表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等.包括在 SSIS Package 中也可以通过 Lookup, Condition Split 等多种 Task 的组合来实现表数据之间的同步.在这里 "同步" 的意思是指每次执行一段代码的时候能够确保 A 表的数据和 B 表的数据始终相同. 可以通过 SQL Se

SQL Server中DML语句要申请的锁

对于select语句: 1.当采用表扫描时,会直接锁定page,而不是锁定具体的某条记录,所以会有这些锁: A.数据库S锁 B.表的IS锁 C.页的S锁 2.当采用索引来查找数据时,会锁定具体的记录,所以会有这些锁: A.数据库S锁 B.索引中page的IS锁 C.索引中page中的key的S锁 D.表的IS锁 E.页的IS锁 F.RID的S锁 3.对于读过的页面,会加一个IS锁. 对于使用的索引,会对key加上S锁,对索引key所在的页面会加上IS锁. 在查询过程中,会对每一条读到的记录或ke

SQL Server - 使用 Merge 语句实现表数据之间的对比同步

原文:SQL Server - 使用 Merge 语句实现表数据之间的对比同步 表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等.包括在 SSIS Package 中也可以通过 Lookup, Condition Split 等多种 Task 的组合来实现表数据之间的同步.在这里 "同步" 的意思是指每次执行一段代码的时候能够确保 A 表的数据和 B 表的数据始终相同. 可以通过 SQL Serv

SQL server 查看什么语句在使用临时表

SQL server 查询那些语句在使用临时表 最近在日常的性能测试工作中发现,数据库端的IO读写比较大,有规律的2-8M的波动,数据库的版本为 SQL server 2008 sp3. 这些IO操作主要来自于临时表,在测试之前,我们已经对部分消耗资源较多的语句进行了跟踪. 对一些使用临时表的语句进行了修改,但是肯定还是有落网之鱼.我们需要对其进行甄别,做到进一步的优化. 在开始之前,我们先来了解下什么样的操作会使用到临时表: 时的用户对象, 比如临时表,表变量等(#,##,@开头的一些变量)

SQL Server性能常用语句

查看各表的数据行数 SELECT o.name, i. ROWS FROM sysobjects o, sysindexes i WHERE o.id = i.id AND o.Xtype = 'U' AND i.indid < 2 ORDER BY o.name; 计算数据库中各个表每行记录所占用空间 --SELECT * FROM Employees AS e; CREATE TABLE #tablespaceinfo ( nameinfo VARCHAR(50) , rowsinfo BI

对于超大型SQL SERVER数据库执行DBCC操作

原文:对于超大型SQL SERVER数据库执行DBCC操作 对于数据库维护,主要使用DBCC CHECKDB来实现,以下是对大型数据库的使用说明,小型数据库一般直接使用就可以了: 1.2008(2005我不确认)已经实现了快照检查,也就是当你执行DBCC时,DBMS会先快照出一个数据库,然后在快照上执行检查,这样对原来的库不造成锁的影响. 2.使用Physical_only选项,可以以较少的开销检查数据库的物理一致性.并且能检查出会危及用户数据安全的残缺页.校验和错误及常见的硬件故障.所以对于频

Sql server的Merge语句,源表中如果有重复数据会导致执行报错

用过sql server的Merge语句的开发人员都应该很清楚Merge用来做表数据的插入/更新是非常方便的,但是其中有一个问题值得关注,那就是Merge语句中的源表中不能出现重复的数据,我们举例来说明这个问题. 现在我们有一张表叫T_Class_A,其建表语句如下: CREATE TABLE [dbo].[T_Class_A]( [ID] [int] IDENTITY(1,1) NOT NULL, [ClassName] [nvarchar](50) NULL, [StudentTotalCo

SQL Server 最小化日志操作解析,应用

Sql Server 中数据库在BULK_LOGGED/SIMPLE模式下的一些操作会采用最小化日志的记录方式,以减小tran log落盘日志量从而提高整体性能. 这里我简单介绍下哪些操作在什么样的情况下会最小化日志记录.以及现实生产环境中如何应用最小化日志. 概念:SQL Server在满足相应条件的基础上时进行一些特定的操作如Rebuild Index时会进行最小化Tran Log记录操作,从而改善系统性能. 注意:含最小化操作日志操作段日志无法按时间点恢复(point in time) 需

C#与sql server数据库存储过程的操作实例

通过这几天的学习和实际操作,把C#与sql server数据库存储过程的操作搞清楚了. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Windows.