sql杂记

Create procedure 存储过程的声明
PIVOT的一般语法是:PIVOT(聚合函数(列) FORin (…) )AS P  通俗简单的说:PIVOT就是行转列,UNPIVOT就是列传行
NEWID() 随机函数  SELECT TOP 2 * FROM ywle order by newid()  

--随机排序SELECT TOP 10 * FROM Northwind..Orders ORDER BY NEWID()  //order by 是按字符串排序,order by newid() 随机排序


decimal(10,2),BAL:BAL值保留两位小数点,Convert(decimal(10,2),字段)强转类型
 decimal(a,b):a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0。
是CAST(xxx AS 类型), CONVERT(xxx,类型)
例如: select convert(decimal(18,3),Fs_JiFen)as jifei from Bill_YeJiCheck

ROUND 函数用于把数值字段舍入为指定的小数位数。语法:ROUND(column_name(必需.要舍入的字段。),decimals(必需。规定要返回的小数位数。))
例如:SELECTProductName,ROUND(UnitPrice,0) as UnitPrice FROM Products

DATEDIFF() 函数返回两个日期之间的天数。SELECT DATEDIFF(day,'2008-12-29','2008-12-30') AS DiffDate

 CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。以下例子用于将文本字符串'12'转换为整型: SELECT CAST('12' AS int)

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 sex
              WHEN '1' THEN ''
              WHEN '2' THEN ''
            ELSE '其他' END
           --Case搜索函数
            CASE WHEN sex = '1' THEN ''
              WHEN sex = '2' THEN ''
            ELSE '其他' END    

其实就是:when if  eles end 的意思
              when Month(Goods_InsertDate) = 1 then 1 else 0 endas 1s
而Access是:
    语法   
IIf(expr,   truepart,   falsepart)   
            IIf   函数的语法含有下面这些命名参数:  
            部分   描述    
            expr   必要参数。用来判断真伪的表达式。  
            truepart   必要参数。如果   expr   为   True,则返回这部分的值或表达式。 
            falsepart   必要参数。如果   expr   为   False,则返回这部分的值或表达式。 
            iif(a1,a2,a3)表示如果a1为真,结果就取a2,如果a1为假,结果就取a3
             例子: Sum(IIF(Month(Goods_InsertDate) = 1, 1, 0)) As 一月,
 row_number over();
        语法:ROW_NUMBER() OVER(PARTITION BY 字段 ORDER BY 字段)

         简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER :      (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后 的每条xlh记录顺序编号.(先排序后排标号) 
     示例: 
               xlh           row_num 
               1700              1 
               1500              2 
               1085              3 
               710               4

数据库删除重复数据:
没有ID的情况  
select   identity(int,1,1as id , *   into #temp   from   pviotandunpviot   
delete   #temp   where id not in  (select  max(id)  from  #temp group by [姓名],[课程])
delete   pviotandunpviot   
insert into pviotandunpviot( [姓名],[课程],[分数]) select [姓名],[课程],[分数] from #temp     
delete   #temp    
查询重复数据
 select * from Base_Jobtitle where job_number  in (select   job_number from   Base_Jobtitle group by   job_number having count(job_number) > 1)
删除重复(重复数据没有保留一条)
Delete Base_Jobtitle where job_number  in (select   job_number from   Base_Jobtitle group by   job_number having count(job_number) > 1)

删除重复(重复数据保留一条)
delete from Table_1  where   name in (select name from Table_1 group by name  having count(name) > 1) and  id not  in (select max(id) from Table_1 group by name  having count(name)>1) 

去除重复
Select distinct name from table1

 
!数据库(a,b)不同
如果还没有创建表table2,可以直接将table1的表结构和记录都复制到数据库中?

use b 
select * into table2 from a.dbo.table1


表不存在的情况下
select 字段1,字段2.....字段n into 数据库名..新表名 from 旧数据库名..旧表 where 条件

表存在的情况下
insert into 数据库名..新表名 (字段1,字段2.....字段n) select 字段1,字段2.....字段n from 旧数据库名..旧表 where 条件


         
having是分组(group by)后的筛选条件,分组后的数据组内再筛选
where则是在分组前筛选

YEARmonth :
     假如考勤时间为'2015-01-05':而单单取时间的年或者月
     select 考勤号,Worker_name,考勤时间, YEAR(考勤时间)=2015 and month(考勤时间)=03 order by 考勤时间 desc

跨数据库之间的拷贝:
         insert into 目的数据库..表(列) selectfrom 源数据库..表  
DateTime.Now.ToString("yyyy-MM-dd 00:00:00") 取当天的时间(C#)
Getdate()取系统的(SQL)
SELECT CONVERT(varchar(8), getdate(), 120)   ;其中varchar(变量自己变化)

DATEDIFF() 函数返回两个日期之间的天数。  还可以做时间提醒,比如日常安排提前五分钟
        语法 
             DATEDIFF(datepart,startdate,enddate)  
             startdate 和 enddate 参数是合法的日期表达式。
             datepart 参数可以是下列的值:年(YY),月(MM),日(dd),时(hh),分(mi),秒(ss)
            例子 1
            使用如下 SELECT 语句:
            SELECT DATEDIFF(day,'2008-12-29','2008-12-30') AS DiffDate  返回:1.
    
DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期。
     语法
      DATEADD(datepart,number,date)
      datepart 参数可以取年月日时分秒 date 参数是合法的日期表达式。number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。
SELECT OrderId,DATEADD(day,2,OrderDate) AS OrderPayDate
FROM Orders


创建临时表加上id(在没有ID的时候)
select identity(int,1,1) as id ,需要的列 into 临时表明名from  指定表
Select * from 临时表明名 
Drop table 临时表明名

  把一个表的数据复制到另外一个表里面
存在的情况
insert into 目标表 select * from 原表;
SQL Server中,,
如果目标表不存在:
select * into 目标表 from 原表;
如果有条件
select * into 目标表 from (select * from biao wehre name=123’)as a;

Oracle中,如果目标表存在:
insert into 目标表 select * from 原表;
commit;
Oracle中,如果目标表不存在:
create table 目标表 as select * from 原表;

增加列
Alter table 表名 add column 列名 类型
删除列
Alter table 表名 drop column 列名
修改列名
Exec sp_rename ‘ 表名.列名’,’新的列名’
修改类型
Alter table 表名 Alter column 列名 类型


数据库查询的时候增加序号
Row_number() over(order by 列名)
  select   ROW_NUMBER() over (order by Gid)as Gid2,  * from Base_FaceCentA001
怎么把NULL转化为0 ?isnull(字段名,0)

replace 替换

 select  replace(字段名, '查找的内容','更改的内容') , * from DangAnCailiao
函数返回字符或者字符串在另一个字符串中的起始位置
CHARINDEX ( expression1 , expression2 [ , start_location ] )
    
expression1  是要到 expression2 中寻找的字符中,start_location是CHARINDEX函数在
expression2 中找 expression1 的开始位置。  
CHARINDEX函数返回一个整数,为要找的字符串
expression1 在被找的字符串 expression2 中的位置。假如CHARINDEX没有找到要找的字符串,那么函数将返回整数“0”。

substring 函数是用来抓出一个栏位资料中的其中一部分
SUBSTRING ( expression, start, length )
expression 字符串、二进制字符串 请勿使用包含聚合函数的表达式。
start 整数或可以隐式转换为 int 的表达式,指定子字符串的开始位置。
length 整数或可以隐式转换为 int 的表达式,指定子字符串的长度。 


判断表是否存在

IF EXISTS(SELECT * FROM sysobjects WHERE id=object_id('表名') AND OBJECTPROPERTY(id,'IsUserTable') = 1) 
    SELECT 'yes'
ELSE
SELECT 'no'
模糊查询表名
Select Name From SysObjects Where Name  Like   '%表名%' 


判断列是否存在不存在则创建 
 if not exists( select name from syscolumns where id=object_id('detail_kqjl') and name='SCtype')
  begin
   alter table detail_kqjl add SCtype int 
  end 
原文地址:https://www.cnblogs.com/panmy/p/5790475.html