sql server 学习记录-个人学习

常用判断

sa/Cortland1234

库是否存在
if exists(select * from master..sysdatabases where name=N'库名')
print 'exists'
else
print 'not exists'
---------------
-- 判断要创建的表名是否存在
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[表名]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
print 'exists'
-- 删除表
--drop table [dbo].[表名]
GO
---------------
-----列是否存在
IF COL_LENGTH( '表名','列名') IS NULL
 PRINT 'not exists'
ELSE
 PRINT 'exists'
alter table 表名 drop constraint 默认值名称
go
alter table 表名 drop column 列名
go
-----
--判断要创建临时表是否存在
If Object_Id('Tempdb.dbo.#Test') Is Not Null
Begin
print '存在'
End
Else
Begin
print '不存在'
End
---------------
-- 判断要创建的存储过程名是否存在
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
-- 删除存储过程
drop procedure [dbo].[存储过程名]
GO
---------------
-- 判断要创建的视图名是否存在
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[视图名]') and OBJECTPROPERTY(id, N'IsView') = 1)
-- 删除视图
drop view [dbo].[视图名]
GO
---------------
-- 判断要创建的函数名是否存在
if exists (select * from sysobjects where xtype='fn' and name='函数名')
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[函数名]') and xtype in (N'FN', N'IF', N'TF'))
-- 删除函数
drop function [dbo].[函数名]
GO
if col_length('表名', '列名') is null
print '不存在'
select 1 from sysobjects where id in (select id from syscolumns where name='列名') and name='表名'




1、判断是否存在addOneArticle这个存储过程 
if Exists(select name from sysobjects where NAME = 'addOneArticle' and type='P') 
    drop procedure addOneArticle 

2、判断是否存在countAr这个触发器 
if exists(select * from dbo.sysobjects where id = object_id(N'[dbo].[countAr]') and OBJECTPROPERTY(id, N'IsTrigger') = 1) 
   drop trigger countAr 

3、判断是否存在View_1这个视图 
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = N'View_1') 
    DROP View View_1 

4、判断是否存在USER_Fun这个用户函数

(注意此处的type 有两种,分别是'TF'-Table-valued Function 表值函数 或'FN'-Scalar-valued Function 标量值函数) 
if exists(select * from dbo.sysobjects where id = object_id(N'[dbo].[USER_Fun]') and (type = 'FN' or type = 'TF')) 
    DROP FUNCTION USER_Fun 

5、判断表'Tb'是否存在 
if (exists (SELECT * FROM dbo.sysobjects where id = object_id(N'Tb')and OBJECTPROPERTY(id, N'IsUserTable') = 1)) 
DROP TABLE Tb

6、判断数据库是否存在


if exists( select * from master.dbo.sysdatabases where dbid=db_ID( 'scbjdb' ) )

drop database scbjdb

else

print 'no exist scbjdb'

 

 

在SQL Server Management Studio 用WINDOWS连接的情况下改实列的“属性”中“安全性”
选中WINDOWS及SQL验证,再重起SQL服务器后,新建查询,执行下面代码 
一、 
ALTER LOGIN sa ENABLE  
GO 
ALTER LOGIN sa WITH PASSWORD = 'password' 
GO
 
二、 
ALTER LOGIN [sa] 
WITH PASSWORD = N'NewPassword' --不用提供旧密码

 

 

 

 

 

泛型存储过程(分页):

--创建通用分页存储过程,默认asc
 create PROCEDURE [dbo].[sp_All_Pager]  

     @tblName nvarchar(255),--表名,不可空  
     @fldOrderName nvarchar(255),--主键字段(排序用),,不可空
     @fldNames nvarchar(1000)='*',--字段列表(默认所有字段)  
     @orderType bit =0,--排序类型,非0则降序(默认升序)  
     @pageIndex int=1,--页码  
     @pageSize int =20,--页大小  
     @strWhere nvarchar(1500)='',--查询条件,不带where  
     @limitCount int =5000000, --限制最多取5000000条数据  
     @totalCount int output --总记录数  
AS 

 BEGIN 

     SET NOCOUNT ON;  

     DECLARE @strSQL NVARCHAR(4000)--主语句  

     DECLARE @strTable NVARCHAR(500)--主查询临时表  

     DECLARE @strOrderSQL NVARCHAR(1000)--总数查询语句  

     DECLARE @strOutParam NVARCHAR(500)--输出参数  

     DECLARE @strTmp NVARCHAR(255)--临时分页字句 max 和min  

     DECLARE @strOrder NVARCHAR(255)--排序参数  

     --设置排序  

    IF(@orderType != 0)  
		 BEGIN 
			SET @strTmp = ' <(SELECT MIN ' 
			SET @strOrder = ' ORDER BY [' + @fldOrderName +'] DESC' 
		 END 
     ELSE 
		 BEGIN 
			 SET @strTmp = ' >(select max ' 
			 SET @strOrder = ' ORDER BY [' + @fldOrderName +'] ASC' 
		 END 
     --设置主查询临时表  

    IF(@strWhere!='')  
         SET @strTable='(SELECT TOP '+STR(@limitCount)+' '+@fldNames+' FROM ['+@tblName+'] WHERE '+@strWhere+') AS tmpTable' 
ELSE 
         SET @strTable='(SELECT TOP '+STR(@limitCount)+' '+@fldNames+' FROM ['+@tblName+']) AS tmpTable' 
     --设置总数查询语句和主语句  

     SET @strOrderSQL=N'SELECT @totalCountOut=COUNT(1) FROM '+@strTable  
     SET @strOutParam=N'@totalCountOut INT OUTPUT' 
     IF (@pageIndex = 1)  
         SET @strSQL = 'SELECT TOP ' + str(@pageSize) +' '+@fldNames+ ' FROM ' + @strTable + @strOrder  
     ELSE 
        SET @strSQL = 'SELECT TOP ' + str(@PageSize) +' '+@fldNames+ ' FROM ' + @strTable + ' WHERE [' + @fldOrderName + ']' + @strTmp + '(['+ @fldOrderName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldOrderName + '] from ' + @strTable + @strOrder + ') as tblTmp) ' + @strOrder  
     EXEC sp_executesql @strOrderSQL,@strOutParam,@totalCountOut=@totalCount OUTPUT 
     EXEC sp_executesql @strSQL  
 END 


 

 

 

安装SQL问题:

 

在安装sql server2008 时,检查是否需要挂起计算机重新启动。挂起重新启动会导致安装程序失败。并且尝试了重新启动;在"开始"-"运行"中输入regedit,进入注册表编辑器,依次查找 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager,但是找不到“PendingFileRenameOperations”值,不过在其他地方找到该值,并删除。

 

 

 

 

主键:实体完整性约束

外键:参照完整性约束

check:用户定义完整性约束

 

/*用户定义完整性约束*/

create table Student

(

Sno char(9),

Sname varchar(8) not null,

Ssex char(2) check( Ssex in ('男','女')),

Sage smallint

);

 

/*删除表*/

drop table test;

/*创建表*/
create table test
(
testid int identity(1,1),
testyname varchar(20),
constraint PK_test primary key clustered(testid desc)
)


/*删除主键*/
alter table test drop constraint PK_test;
/*新增主键*/
alter table test add constraint PK_test primary key clustered(testid desc);
/*新增列*/
alter table test add testtt nvarchar(20) not null;
/*修改列*/
alter table test alter column testtt nvarchar(10) not null;
/*删除列*/
alter table test drop column testtt;

 

create table test2
(
test2id int identity(1,1),
test2name varchar(20),
constraint PK_test2 primary key clustered(test2id desc)
)
alter table test2 add testid int not null;
/*新增外键*/
alter table test2 add constraint FK_test_test2 foreign key(testid) references test(testid)
 on delete cascade
 on update cascade;

/*删除外键*/
alter table test2 drop constraint FK_test_test2;

 

/*创建索引*/

unique--标明次此索引的每一个索引值只对应唯一的数据记录

cluster--表示要建立的索引是聚簇索引。聚簇索引指索引项的顺序与表中记录的物理顺序一致的索引组织。经常更新的列不宜建立聚簇索引。

在一个基本表中最多只能建立一个聚簇索引。

create index unique Stestname on test(testname);

/*删除索引*/

删除索引必须加上表明,不然报错。记得我们上学那会的书中就是错误的。O(∩_∩)O哈哈~

drop index test.Stestname;

 

--查询数据库中表数量 

select   count(xtype)   as   自建表数量   from   sysobjects   where   xtype= 'u '
select   count(xtype)   AS   系统表数量   from   sysobjects   where   xtype= 's '

--查询数据库中表名称 


select   NAME   as   自建表   from   sysobjects   where   xtype= 'u '
select   NAME   AS   系统表   from   sysobjects   where   xtype= 's ' 

 

 

1、查询SQL中的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' 执行之后,就可以看到数据库中所有属于自己建的表的名称2、查询SQL中所有表及列: Select dbo.sysobjects.name as Table_name, dbo.syscolumns.name AS Column_nameFROM dbo.syscolumns INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.idWhere (dbo.sysobjects.xtype = 'u') AND (NOT (dbo.sysobjects.name LIKE 'dtproperties'))3、在Sql查询分析器,还有一个简单的查询方法: EXEC sp_MSforeachtable @command1="sp_spaceused '?'"执行完之后,就可以看到数据库中所有用户表的信息

 

 

 

SQL利用Case When Then多条件判断(转自菜菜)

CASE
    WHEN 条件1 THEN 结果1
    WHEN 条件2 THEN 结果2
    WHEN 条件3 THEN 结果3
    WHEN 条件4 THEN 结果4
.........
    WHEN 条件N THEN 结果N
    ELSE 结果X
END

Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
         WHEN '1' THEN '男'
         WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
         WHEN sex = '2' THEN '女'
ELSE '其他' END

例如:

SELECT     id, name, cj, (CASE WHEN cj < 60 THEN '不及格' WHEN cj BETWEEN 60 AND 90 THEN '良好' WHEN cj > 90 THEN '优秀' END) AS 状态
FROM   stud

 


这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
--比如说,下面这段SQL,你永远无法得到“第二类”这个结果
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'
         WHEN col_1 IN ('a')       THEN '第二类'
ELSE'其他' END

下面我们来看一下,使用Case函数都能做些什么事情。

一,已知数据按照另外一种方式进行分组,分析。

有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key)
国家(country) 人口(population)
中国 600
美国 100
加拿大 100
英国 200
法国 300
日本 250
德国 200
墨西哥 50
印度 250

根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
洲 人口
亚洲 1100
北美洲 250
其他 700

想要解决这个问题,你会怎么做?生成一个带有洲Code的View,是一个解决方法,但是这样很难动态的改变统计的方式。
如果使用Case函数,SQL代码如下:
SELECT  SUM(population),
        CASE country
                WHEN '中国'     THEN '亚洲'
                WHEN '印度'     THEN '亚洲'
                WHEN '日本'     THEN '亚洲'
                WHEN '美国'     THEN '北美洲'
                WHEN '加拿大'  THEN '北美洲'
                WHEN '墨西哥'  THEN '北美洲'
        ELSE '其他' END
FROM    Table_A
GROUP BY CASE country
                WHEN '中国'     THEN '亚洲'
                WHEN '印度'     THEN '亚洲'
                WHEN '日本'     THEN '亚洲'
                WHEN '美国'     THEN '北美洲'
                WHEN '加拿大'  THEN '北美洲'
                WHEN '墨西哥'  THEN '北美洲'
        ELSE '其他' END;

同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下;
SELECT
        CASE WHEN salary <= 500 THEN '1'
             WHEN salary > 500 AND salary <= 600  THEN '2'
             WHEN salary > 600 AND salary <= 800  THEN '3'
             WHEN salary > 800 AND salary <= 1000 THEN '4'
        ELSE NULL END salary_class,
        COUNT(*)
FROM    Table_A
GROUP BY
        CASE WHEN salary <= 500 THEN '1'
             WHEN salary > 500 AND salary <= 600  THEN '2'
             WHEN salary > 600 AND salary <= 800  THEN '3'
             WHEN salary > 800 AND salary <= 1000 THEN '4'
        ELSE NULL END;

二,用一个SQL语句完成不同条件的分组。

有如下数据
国家(country) 性别(sex) 人口(population)
中国 1 340
中国 2 260
美国 1 45
美国 2 55
加拿大 1 51
加拿大 2 49
英国 1 40
英国 2 60

按照国家和性别进行分组,得出结果如下
国家 男 女
中国 340 260
美国 45 55
加拿大 51 49
英国 40 60

普通情况下,用UNION也可以实现用一条语句进行查询。但是那样增加消耗(两个Select部分),而且SQL语句会比较长。
下面是一个是用Case函数来完成这个功能的例子
SELECT country,
       SUM( CASE WHEN sex = '1' THEN
                      population ELSE 0 END),  --男性人口
       SUM( CASE WHEN sex = '2' THEN
                      population ELSE 0 END)   --女性人口
FROM  Table_A
GROUP BY country;

这样我们使用Select,完成对二维表的输出形式,充分显示了Case函数的强大。

三,在Check中使用Case函数。

在Check中使用Case函数在很多情况下都是非常不错的解决方法。可能有很多人根本就不用Check,那么我建议你在看过下面的例子之后也尝试一下在SQL中使用Check。
下面我们来举个例子
公司A,这个公司有个规定,女职员的工资必须高于1000块。如果用Check和Case来表现的话,如下所示
CONSTRAINT check_salary CHECK
           ( CASE WHEN sex = '2'
                  THEN CASE WHEN salary > 1000
                        THEN 1 ELSE 0 END
                  ELSE 1 END = 1 )

如果单纯使用Check,如下所示
CONSTRAINT check_salary CHECK
           ( sex = '2' AND salary > 1000 )

女职员的条件倒是符合了,男职员就无法输入了。

 

Select top 100 State,JoinState, 

SQL利用Case <wbr>When <wbr>Then多条件判断(case when State=1 and Joinstate=0 then 2 when State=1 and JoinState=1 then 1 else 0 end) as usestate from UserInfo

(2)

select      ID,Username,namer=(case when(score<='50')    then '实习'

                                    when(score>'50'  and  score<='500' )   then '赤脚医生'    

                                    when(score>'500'  and score<='1000' )   then '村卫生员' 

                                    when(score>'1000'  and score<='1500' )   then '乡卫生员' 

                                    when(score>'1500'  and score<='2000' )   then '镇卫生员'

                                    when(score>'2000'  and score<='3000' )   then '医师'

                                    when(score>'3000'  and score<='5000' )   then '主治医师'

                                    when(score>'5000'  and score<='10000' )   then '副主任医师'

                                    when(score>'10000'  and score<='20000' )   then '主任医师'

                                    when(score>'20000'  and score<='50000' )   then '健康大使'

                                    else   '健康大使'  end ), (SELECT count(id)

         FROM  jk01_YiWen_Question 

         WHERE  UserID =  dbo.jk01_Member.ID)  as  questionnum 

   from  jk01_Member

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值