SQLServer 实用语法大全

一、SQLserver篇

1、将表名作为参数的存储过程

eg:

create proc s_Table_SearchInfo  
 @TableName nvarchar(100)  
 AS 
   Begin 
declare @value nvarchar(50), 
                 @sql nvarchar(1000)  
set @sql= ' select * from ' + @TableName  
exec sp_executesql @sql, N'@value   int   output ', @value output    
select @value 
 End 
 GO

调用:存储过程名'表名'

eg:s_Table_SearchInfo'StuInfo'

2、模糊查询(分页)的存储过程

eg: 
 alter proc SA_FuzzySearch 
 @Name Nvarchar(20), 
 @MaximumRows int,   
 @StartRowIndex int, 
 @Type Nvarchar(20) 
 AS  
     Begin 
     declare @temp varchar(500) 
     set @temp = 'Select Top ' + cast(@MaximumRows as varchar(2)) 
     set @temp = @temp + ' * From SA Where SA_ID Not In (Select Top ' +cast(@StartRowIndex as varchar(2))+ ' SA_ID From SA Where SA_Name Like ' 
     set @temp = @temp + '(''%'+ @Name +'%'') or SA_IsAdministrator like (''%'+ @Type +'%'') Order By SA_ID Desc) and SA_Name Like (''%'+ @Name +'%'') or SA_IsAdministrator like (''%'+ @Type +'%'') Order By SA_ID Desc' 
     exec (@temp) 
     End 
 Go

3、判断一个数据库是否offline

If EXISTS(select * From master.dbo.sysdatabases where name='dd' and status<>512) 
     print '是' 
  else 
     print '否'

4、SQL Server中判断数据库对象是否存在:

if EXISTS(select * from sys.databases where Name = 'ZHyry') 
       BEGIN  
         print '存在' 
       END 
    ELSE 
       BEGIN 
         print '不存在' 
       END

5、SQL Server中判断表中字段是否存在:

 

if exists(select * from syscolumns where name='colname1' and id=object_id('数据库名.Owner.表名')) 
   
   print '存在' 
   
   else 
   
   print '不存在'

6、Access中判断表对象是否存在:

Select Count(*) AS Qty FROM MSysObjects Where ((MSysObjects.Name) Like '表名');
    
   SQLServer中判断表是否存在:
        if EXISTS(select TOP 1 * from sys.objects o where o.type=N'U' AND o.name =N'ZHNews')          print '存在'       else          print '不存在'        --或者           if EXISTS(SELECT TOP 1 * FROM sys.tables t WHERE t.type =N'U' AND t.name =N'Trade')           print '存在'       else          print '不存在'

 

7、事务

--建立添加新信息的存储过程(s_DataDict) 
 alter proc s_DataDict_InsertInfo 
 @Name nvarchar(30), 
 @CName nvarchar(30), 
 @Time datetime 
 AS 
   Begin 
     --开始事务 
Begin transaction 
     --判断表是否存在 
if exists(select * from sysobjects where Name = @Name) 
         Begin 
         --捕获错误信息 
         raiserror('该表已创建!',1,1) 
         --回滚事务 
   rollback transaction 
         End 
     else 
         Begin       
         insert into s_DataDict values(newID(),@Name,@CName,@Time) 
   --建立相应的子表 
         exec(' create table ' + @Name + '( 
   Pid uniqueidentifier not null , 
         DataDictpid uniqueidentifier not null, 
   Name nvarchar(30) not null, 
   OrderMark int not null 
   )')  
         --以及相应的主外键 
         exec(' alter table ' + @Name + 
         ' add constraint constraint_' + @Name +  
         ' Foreign key (DataDictpid) 
         references s_DataDict(Pid) 
         ') 
         --提交事务 
         commit transaction  
         End   
   End 
 GO 
 (

附加:查询赋值        

declare @TName nvarchar(50) 
       select @TName = TableName from s_DataDict where Pid = @ID     
 )

8、重命名数据库、表、列

a:alter database 数据库名

  modify name = 新数据库名

b:exec sp_rename '旧表名','新表名'

c:exec sp_rename '旧表名.旧列名','新表名.新列名'

9、删除字段值相同的ID大的数据

/* 
 * distinct: 函数指如有多项相同只显示一项 
 * select * from 表 where 字段 in(select 字段 from 表 group by 字段 having count(1)>1):查询出项多次的数据 
 */ 
 Declare @num int ,@i int 
 select @num = Count(s_Name) from s_Info group by s_Name having count(1)>1 
 set @i = 0 
 while @i <= @num 
 Begin 
 delete from s_Info where s_ID in(select Max(s_ID) from s_Info where s_Name in (select s_Name from s_Info group by s_Name having count(1) > 1)) 
 set @i = @i + 1 
 End 
 Go

10、查询重复的数据

select id,[name],次数 = count(*) from D  
        group by id,[name] having count(*) >= 2 
 /* 
  * 查询不重复的信息 
    select id,[name],次数 = count(*) from D  
        group by id,[name] having count(*) = 1 
  */

11、查询数据库的所有表信息(包括系统表)

select * from sysobjects  
 /* 
  * 查询数据库的所有表信息(不包括系统表) 
  * select * from sysobjects  
  *     where xtype = 'u'  
  */

12、--复制表(已经存在,新表的结构必须和旧表结构相同)

    insert into OlerdTable select * from NewTable

    --复制表(不存在)

    select * into NewTable from OldTable

13、--本月第一天:

   select dateadd(dd,-day(getdate())+1,getdate())

   

   --本月最后一天:

   select dateadd(dd,-day(getdate()),dateadd(m,1,getdate()))

   --获取当前的星期数

   select 星期 = datepart(WeekDay,getdate()-1)

   select 星期 = DateName(dw,getDate()) 

   --时间函数大全

   年 = DateName(year,GetDate())

   月 = DateName(month,GetDate())

   日 = DateName(day,GetDate())

   星期 = DateName(dw,GetDate())

   周 = DateName(week,GetDate())

   时 = DateName(hour,GetDate()

   分 = DateName(minute,GetDate())

   秒 = DateName(second,GetDate()) 

   毫秒 = DateName(millisecond,GetDate())

    1.一个月第一天的

  SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

  2.本周的星期一

  SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

   

    扩展:

        SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 1)--周二

        ……

        SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 6)--周末

  3.一年的第一天

  SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

  4.季度的第一天

  SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

  5.当天的半夜

  SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

  6.上个月的最后一天

  SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

  7.去年的最后一天

  SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

  8.本月的最后一天

  SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

  9.本年的最后一天

  SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

  10.本月的第一个星期一

  select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

14、游标

/* 
  * 声明游标: 
  * DECLARE 游标名 CURSOR FOR T_SQL; 
  * 
  *打开游标: 
  *OPEN 游标名 
  * 
  *关闭游标: 
  *CLOSE 游标名 
  * 
  *删除游标: 
  *DEALLOCATE 游标名 
  * 
  *游标读取数据: 
  *FETCH NEXT FROM 游标名 
  *(或者)Fetch FIRST from 游标名 
  */ 
 --声明游标 
 DECLARE deleteTable CURSOR FOR  
 SELECT ltrim(rtrim(NAME)) FROM Sysobjects WHERE NAME LIKE '%000079' 
 --打开游标 
 OPEN deleteTable 
 --关闭游标 
 CLOSE deleteTable 
 --删除游标 
 DEALLOCATE deleteTable 
 --读取数据 
 FETCH NEXT FROM deleteTable INTO @Value1,@Value2 
 --或则 Fetch first from mycursor 
 --判断游标是否存在 deleteTable:游标名 
 if cursor_status('global','deleteTable')=-3 and cursor_status('local','deleteTable')=-3 
    print '不存在' 
 else 
    print '存在' 
 CREATE PROC PROC_EA 
 AS 
   BEGIN 
        DECLARE EAMCMT4 CURSOR FOR 
        SELECT TOP 545 UserId,CreateTime FROM EA_MCMT4 ORDER BY CreateTime DESC 
         
        DECLARE @UserId nchar(50), @DateTime smallDatetime, @Id int 
        SET @Id = 560 
        OPEN EAMCMT4 
        WHILE @@FETCH_STATUS = 0 
        BEGIn 
  FETCH NEXT FROM EAMCMT4 INTO @UserId,@DateTime 
  UPDATE EA SET userId=@UserId,[DateTime]= @DateTime WHERE Id=@Id  
  SET @Id = @Id + 1 
        END 
        CLOSE EAMCMT4 
        DEALLOCATE EAMCMT4 
   END 
 GO   
 --清空日志 
 DUMP TRANSACTION DBName WITH NO_LOG 
 --收缩数据库文件 
 DBCC SHRINKFILE('dazhou_Log',1) 
 /* 
  *由此推导出SQLserver分页语句 
  *pageSize:  每页显示数据条数 
  *TableName:查询表名 
  *pageIndex:分页索引(默认为1,即首页) 
  *pageCount: 总页数 
  */ 
 IF pageIndex > 0 AND pageIndex <= pageCount 
    BEGIN 
SELECT TOP pageSize * FROM TableName tn WHERE tn.ID NOT IN( 
  SELECT TOP (pageIndex-1)*pageSize tn.ID FROM TableName tn ORDER BY tn.ID ASC) 
  ORDER BY tn.ID ASC 
    END 
 ELSE 
    BEGIN 
        SELECT TOP pageSize * FROM TableName 
    END

二、Mysql篇

纯CMD的方式操作MySql

启动MySql服务

命令行 > net start mysql

如果是Win7系统需要使用管理员身份运行

关闭服务

net stop mysql

进入MySql命令行界面

登录 mysql -u 用户名 -p 回车,然后输入密码

mysql -u root -p

welcome

修改密码

update mysql.user set password = '新密码'

where user = '用户名'

update mysql.user set password = 'heshang'

where user = 'root'

修改完毕后需要重启服务才能生效

查看表结构

describe 表名

查看表:

show tables;

在mysql中默认情况下不显示bit类型,需要通过输出格式化来进行显示。

两种主要方式:

进制转换:二进制、八进制、十六进制。

编码转换:ASCII

十六进制:hex(字段名)

ASCII:ord(字段名)

查看字段值的长度

length(字段名)

MySql中没有identity标识列,只有自动生成auto_increment。

MySql中如果表中有自动生成列,则Insert时不能够省略字段名。

自动生成列必须和主键一起使用。

自动生成列和标识列的区别

标识列是只读的,不允许添加。

自动生成列在值为空的时候会自动生成值,在值不为空的时候不会自动生成。

导出数据库

mysqldump -u root -p 数据库名>文件名.sql;

该命令必须在MySql安装目录中的bin目录下执行。

导入数据库

source 路径/文件名.sql

导入数据库时,必须在mysql中建立相应数据库

返回数据库最上级

use mysql;

show

修改表结构中的字段

alter table 表名

change column 字段名 新字段名 新类型 新约束...;

重命名一张表

alter table 表名 rename 新表名;

删除字段

alter table 表名

drop 字段名;

删除主键

alter table 表名

drop primary key;

备注:很多是网上搜集而来,正确性还有待验证。

           疏漏之处还请多多指正,谢谢!