摘要信息:
1.查询指定数据库
2.查询数据库是否存在
3.查询指定列是否存在
4.查询表是否存在
5.分页查询
6.字段中字符串批量修改
7.字符串截取
8.生成随机数
9.创建登录名与数据库用户
10.解决无法删除数据库问题
11.查看系统用户
12.主键自动增长类型
13.查询指定表的字段类型
14.存储过程
15.规则创建与绑定
16.约束创建与删除
17.触发器
具体如下:
1.查询指定数据库
select * From master.dbo.sysdatabases where name='db_61'
2.查询数据库是否存在
-- 方法一:判断数据库 test_db是否存在
if exists (select * from master.dbo.sysdatabases where name='dd_61')
print 'exists' else print 'not exists';
-- 方法二:判断数据库 test_db是否存在
if db_id('test_db') is not null print 'exists' else print 'not exists';
-- 查询数据库 db_61
-- 数据库不存在则输出 NULL
select db_id('db_61');
3.查询指定列是否存在
-- 查询所有列
select * from syscolumns where id=object_id('test');
select * from syscolumns where id=object_id('test') and objectproperty(id,'isusertable')=1;
-- 查询指定表的列
select * from syscolumns where id=object_id('test') and name='num';
-- 如果列不存在则添加列
if not exists (select * from syscolumns where id=object_id('student_61') and name='addr') alter table student_61 add addr varchar(20);
4.查询表是否存在
-- 查询表
select * from sysobjects where id=object_id('test');
-- 查询表指定是用户表
select * from sysobjects where id=object_id('test')and objectproperty(id,'isusertable')=1;
-- 表不存在则创建
-- 其中表名 sc1_61,列名 sno
if not exists (select * from syscolumns where id=object_id('sc1_61') and name='sno')
Create table sc1_61(
Sno Char(10),
Cno varchar(12),
Grade int default 2 ,
Primary key(sno),
Foreign key(cno) references course_61(cno)
);
-- 表存在则删除
if exists(select * from sysobjects where id=object_id('test'))
drop table test;
-- 存在则删除后再建表
if exists(select * from sysobjects where id=object_id('test'))
drop table sc1_61
Create table sc1_61(
Sno Char(10),
Cno varchar(12),
Grade int default 2 ,
Primary key(sno),
Foreign key(cno) references course_61(cno)
);
5.分页查询
– 假设每页显示n条记录,当前显示的是第m页,表名是A,主键是A_id
select top n * from A where A_id not in (select top (m-1)*n A_id from A);
-- 每页2条,当前显示在第3页,查询第5、6条记录
select top 2 * from student_61 where sno not in (select top ((3-1)*2) sno from student_61 order by sno asc) order by sno asc;
6.字段中字符串批量修改
-- 声明 用户变量@i,则在SQL语句中应用 (@i),需用括号括起来
-- 实现把字符串截短再放回去
declare @i int
set @i=0
while @i<10
begin
update student_61 set sno=right((select top 1 sno from student_61 where sno not in
(select top (@i) sno from student_61)),4) from student_61
where sno=(select top 1 sno from student_61 where sno not in (select top (@i) sno from student_61))
set @i=@i+1
end;
-- 说明
-- select top 1 sno from student_61 where sno not in (select top (@i) sno from student_61)
-- i从0开始,表示每次选取一条记录,i++;到下一条记录 当 i=0;查询为第2条;i=1,查询为第第2条
7.字符串截取
select right('1234',2); -- '34'
select left('1234',2); --'12'
LTRIM(' 123'); --左边去空格
RTRIM('123 '); --右边去空格
SUBSTRING('string',start,len);
--从第start个字符开始,截取len个字符
8.生成随机数
-- 方法1:数字范围:0至N-1之间,如
cast(floor(rand()*100) as int) -- 生成0至99之间任一整数
-- 方法2:数字范围:1至N之间,如
cast(ceiling(rand() * 100) as int) -- 就会生成1至100之间任一整数
-- 随机获取随机表中前几列数据
select top (cast(ceiling(rand()*10) as int)) * from student_61;
-- 复合语句
-- 测试表中随机插入数据
insert into sc_61(sno,cno,grade) values((
select top 1 sno from student_61
where sno not in (select top (cast(ceiling(rand()*8) as int)) sno from student_61)),
(select top 1 cno from course_61
where cno not in (select top (cast(ceiling(rand()*8) as int)) cno from course_61)),
(cast(50+ceiling(rand() * 50) as int)));
9.创建登录名与数据库用户
create database test;
-- 创建登录名 wang,指定默认数据库
-- 如果登录名的默认数据库中没有数据,会无法进入
create login wang with password='666666',default_database=test;
--为登录名 wang 创建数据库用户 wz_61
create user wz_61 for login wang with default_schema=dbo;
-- 赋予 数据库用户 wz_61 管理员权限,到这一步基本完成
exec sp_addrolemember 'db_owner','wz_61';
-- 修改及删除的部分操作语句
-- 修改密码
alter login wang with password='111111';
-- 要先删除数据库用户 wz_61;
drop user wz_61;
-- 然后再删除登录名
drop login wang;
10.解决无法删除数据库问题
-- 假设数据库rantal_db无法删除
-- msdb.dbo.sp_delete_database_backuphistory 删除数据库备份和还原历史记录信息
EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'rantal_db'
GO
USE [master]
GO
ALTER DATABASE rantal_db SET SINGLE_USER WITH ROLLBACK IMMEDIATE -- 设置库单用户模式,和设置立即回滚
GO
USE [master]
GO
DROP DATABASE rantal_db
GO
11.查看系统用户
select name from sysusers;
select name from sysusers where name='wz_61';
12.主键自动增长类型
-- identity(m,n)
-- m表示的是初始值,n表示的是每次自动增加的值
-- 如果m和n的值都没有指定,默认为(1,1)
-- 一旦使用自动增长类型,将不能再对主键插入数据,只能由系统自动生成
num int identity(100,10);
num int identity;
13.查询指定表的字段类型
-- 查询指定表的字段属性说明
-- 1.连接syscolumns表、systypes表,选取其中几项信息输出
-- 2.syscolumns表中只含有数据类型编号
-- 3.要获取完整的名字需要从systypes表中找
-- 4.syscolumns.length得到物理内存的长度,对于nvarchar和varchar等类型在数据库中的显示是这个的一半
-- 查询指定表的字段属性
SELECT syscolumns.name,systypes.name,syscolumns.isnullable,syscolumns.length
FROM syscolumns, systypes
WHERE syscolumns.xusertype = systypes.xusertype AND syscolumns.id = object_id('表名');
-- 与上相似,使用左连接
select syscolumns.name, systypes.name, syscolumns.length from syscolumns
left join systypes on syscolumns.xusertype=systypes.xusertype
where id=(select id from sysobjects where name='表名');
-- 获取字段名
Select name FROM SysColumns Where id=Object_Id('表名')
14.存储过程
-- 带默认参数的存储过程调用
create procedure test_pro
@sno char(10) = '1208',@cno varchar(12)
as select * from sc_61 where sno=@sno and cno=@cno;
-- 执行存储过程
-- 第一个参数使用默认值
exec test_pro default,'002';
-- 带输出参数的存储过程
create procedure stu_avg @dept char(18),@avg_grade int output as
select @avg_grade=avg(grade) from sc_61 join student_61 s on sc_61.sno=s.sno where s.sdept=@dept;
-- 调用存储过程
declare @x int exec stu_avg '计算机',@x output print @x;
-- 判断存储过程是否存在
if exists (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'stu_avg')) select '不存在';
-- 查看所有存储过程( 'p'表示类型)
select * from sys.objects where type='P'
select * from sysobjects where xtype='P'
select * from sys.procedures;
-- 查看存储过程 test_procedure 的内容
exec sp_helptext 'test_procedure'
-- 或用
select text from syscomments where id=object_id('test_procedure')
-- 存在则删除存储过程再创建
USE db_61
if exists (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[myProc]'))
DROP PROCEDURE myProc
GO
CREATE PROCEDURE myProc
@inparam int
AS
SELECT sno,cno,grade FROM sc_61 where grade>@inparam;
-- 执行
exec myProc 90;
15.规则创建与绑定
-- 创建规则
create rule sex_rule
as @sex in ('男','女')
-- 绑定规则(参数sex_rule为规则名,test为表名,sex为字段名)
EXEC sp_bindrule 'sex_rule','test.sex'
-- 取消绑定
EXEC sp_unbindrule 'test.sex';
-- 删除规则
drop rule sex_rule;
16.约束创建与删除
-- 创建不指定约束名时
alter table sc_61 add check(grade>=0 and grade<=100);
sp_help 'sc_61';
-- 查看 结果 7 中列 constraint_name 即为约束名
-- 可以发现不指定约束名将随机生成的约束名如下:CK__sc_61__grade__662B2B3B
-- 删除约束(知道约束名才可以直接删除)
alter table sc_61 drop CK__sc_61__grade__662B2B3B;
-- 创建约束时指定约束名 grade_limit
alter table sc_61 add constraint grade_limit check(grade>=0 and grade<=100);
-- 删除约束
alter table sc_61 drop grade_limit;
17.触发器
以下几个和触发器的函数,这是查看官网得出的解释:
UPDATE ( column )
UPDATE()
COLUMNS_UPDATED()
测试在多列上执行的UPDATE或INSERT操作。
返回从左到右排序的一个或多个字节。每个字节的最右位是最低有效位。最左边的字节的最右边的位表示表中的第一列,左边的下一位表示第二列,依此类推。
对于INSERT操作中的所有列,返回TRUE,因为这些列插入了显式值或隐式(NULL)值。 在Transact-SQL
INSERT或UPDATE触发器内的任何位置使用。
如果存在则删除触发器
if exists (select name from sys.objects where name='tri_grade' and type='TR')
drop trigger tri_grade;
创建触发器
create trigger tri_grade on sc_61 for update,delete as
-- 如果更新了成绩列
if update(grade)
begin
select inserted.sno as 学号,deleted.grade as 原成绩,inserted.grade as 新成绩
from deleted join inserted on deleted.sno=inserted.sno
end
-- 如果是删除操作
else if columns_updated()=0
begin
select 被删学号=sno,被删课号=cno,被删成绩=grade from deleted
end
else
print '更新了其他列!';
提示:如需了解更多用法,可参考官方文档SQL Server教程