• 常用的一些SQL语句


    1、case条件语句

     1 --查询语句的原理是  一条一条查询
     2 --1.case...end 会得到一列值
     3 --2.当case后面接有表达式或者字段的时候,它是做等值判断
     4 --3.then和when后面的数据类型需要一致(可以互换)
     5 --4.做等值判断的时候不能判断null值
     6 select StudentName,Sex,
     7 case
     8  when ClassId is null then '班级不知道'
     9  when BornDate>'2000-1-1' then '小孩子'
    10  when BornDate>'1990-1-1' then '少年'
    11  when BornDate>'1980-1-1' then '中年' 
    12  when Sex='' then '小姑娘' 
    13  else '老年人' 
    14 end
    15  from Student

     2、if else条件语句

    1 select QuestionDescription,
    2 case 
    3 when BadCodeID<4 then QuestionType
    4 else '没有数据类型'
    5 end
    6 from MES_Base_BadCode

    3、在select中使用case

    1 --根据条件查询数据的数量,然后用10除以数量,当数量为0时,默认被除数是1,不然就就是10除以数量
    2 select 10/(case when count(*) =0 then 1 else COUNT(*) end) AS qty
    3 from MES_Base_Factory where FactoryCode='PDD'

    4、在存储过程中,使用while一次存储大量的数据

     1 create proc MES_T_InsertTestResultData
     2 @OrderID int, 
     3 @LineRefID int, 
     4 @StationRefID int, 
     5 @TestResult int, 
     6 @CreatedByUserID int,
     7 @i int,
     8 @count int
     9 as
    10 while(@i<@count)
    11 begin
    12 insert into MES_T_TestResult(OrderID, LineRefID, StationRefID, TestResult, CreatedByUserID)
    13 values(@OrderID, @LineRefID, @StationRefID, @TestResult, @CreatedByUserID)
    14 set @i+=1
    15 end

    5、查询过程中,相除,然后保留两位小数,最后求和

    1 SELECT   ROUND( SUM(CAST(DATEDIFF(SECOND,  CreatedOnDate,  LastModifiedOnDate) as float)/3600),2)                   
    2 FROM         MES_E_ProdNormalTime
    3 WHERE     (OrderID = 171) and DeleteFlag=0

    6、嵌套查询语句

    1 --获取借出员工的姓名
    2 --嵌套语句,如果子语句是一个结果,那么WHERE条件后面可以使用=号,如果是一个集合,那么就要用IN
    3 SELECT     UserID, NameCN, LoginName
    4 FROM         USER_T_User WHERE UserID IN
    5 (SELECT UserID 
    6 FROM  MES_E_EmployeerMobilize
    7 WHERE  (CONVERT(nvarchar(10), CreatedOnDate, 120) = '2015-08-21')
    8 AND (DeleteFlag = 0) AND JobDescriptionID=3 AND BorrowOutOrIn=0)

    7、把日期格式化为'yyyy-MM-dd'比较

     1 CONVERT(nvarchar(10),ReadCardDateTime,120)='2015-09-19' 

    8、根据某个查询条件把查询的数据全部一次更新

    1 --根据条件更新数据
    2 UPDATE   MES_T_TestResultTemp set DeleteFlag=1 where ID in (
    3 SELECT TOP(10) ID from MES_T_TestResultTemp
    4 WHERE     (LineRefID = 16) AND (OrderID = 13) AND (StationRefID = 607) AND DeleteFlag=0
    5 AND TestResult=1  order by ID desc)

    9、类型转换

     1 --把int转变为float型,然后相除,最后保留两位小数点
     2 --求转拉工时
     3 --第一种转法:
     4 SELECT   ROUND(CAST(SUM(TurnPullTime)AS float)/3600,2) AS Expr1
     5 FROM         MES_E_EmployeerTurnPull
     6 WHERE     (TurnPullStatus = 1) AND (DeleteFlag = 0) AND (OrderID = 968)
     7 --第二种转法:
     8 SELECT    ROUND(convert(float,SUM(TurnPullTime))/3600,2) AS Expr1
     9 FROM         MES_E_EmployeerTurnPull
    10 WHERE     (TurnPullStatus = 1) AND (DeleteFlag = 0) AND (OrderID = 98)

    10、union使用

     1 --union: 可以合并多个结果集
     2 --1.列的类型一致
     3 --2.列的数量需要对应
     4 --3如果需要排序,只能将排序写在最后一句,同时是在union得到结果集之后,所以只能排序第一条select语句的字段
     5 select cast(Result.StudentNo as CHAR(3)) 学号,Result.StudentResult from Result where SubjectId=3
     6 union --默认去除重复值 Union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用UNION ALL
     7 select cast(Result.StudentNo as CHAR(3)) 学号,Result.StudentResult from Result where SubjectId=3
     8 
     9 select cast(Result.StudentNo as CHAR(3)) 学号,Result.StudentResult from Result where SubjectId=3
    10 union all--不去除重复值
    11 select cast(Result.StudentNo as CHAR(3)) 学号,Result.StudentResult from Result where SubjectId=3

    11、日期的使用

     1 select  GETDATE() --获取当前服务器日期
     2 --DATEADD
     3 select DATEADD(MM,1,GETDATE())
     4 select DATEADD(YY,-1,GETDATE())
     5 --DATEDIFF
     6 select DATEDIFF(YY,'1990-1-1',GETDATE()) --用后面的日期值减前面的日期值
     7 --显示学员的年龄
     8 select StudentNo,StudentName,DATEDIFF(yyyy,borndate,getdate()) from student
     9 select round(DATEDIFF(DD,'1990-12-31','1991-7-5')/365.0,0)
    10 
    11 --DATENAME 获取日期部分的字符串表现形式
    12 select DATENAME(dw,getdate())
    13 --DATEPART 获取指定的日期部分
    14 --2013-12-27
    15 select DATEPART(YYYY,GETDATE())
    16 select DATEPART(mm,GETDATE())
    17 select DATEPART(dd,GETDATE())
    18 
    19 select cast(DATEPART(YYYY,GETDATE()) as CHAR(4))+'-'+cast(DATEPART(mm,GETDATE()) as CHAR(2))+'-'+cast(DATEPART(dd,GETDATE()) as CHAR(2))
    20 
    21 ----查询年龄超过20周岁的6期班的学生信息。
    22 select * from Student where ClassId=6 and DATEDIFF(yyyy,borndate,getdate())>20
    23 ----查询1月份过生日的学生信息
    24 select * from Student where DATEPART(mm,borndate)=1
    25 ----查询今天过生日的学生姓名及所在班级
    26 select StudentName,ClassId from Student where DATEPART(MM,borndate)=DATEPART(mm,getdate()) and DATEPART(dd,borndate)=DATEPART(dd,getdate())
    27 ----查询学号为“10”的学生Email的域名。
    28 select substring(Email,CHARINDEX('@',email)+1,LEN(Email)) from Student where StudentNo=10
    29 ----新生入学,为其分配一个Email地址,规则如下:GZ+当前日期+4位随机数+@itcast.com
    30 select 'GZ'+CAST(DATEPART(yyyy,getdate()) as CHAR(4))+CAST(DATEPART(mm,getdate()) as CHAR(2))+CAST(DATEPART(dd,getdate()) as CHAR(2))+cast(RIGHT(RAND(),4) as CHAR(4))+'@itcast.com'

    12、表的创建约束

     1 --使用代码创建约束:
     2 --语法: alter table 表名  add constraint 约束名称(PK UQ FK CK DF) 约束类型(primary key     unique   default   check  foreign key)  约束说明(字段  表达式  值)
     3 --为grade表创建主键
     4 if exists (select * from sysobjects where name='PK_GradeId')
     5    alter table  Grade drop constraint PK_GradeId
     6 alter table Grade
     7 add constraint PK_GradeId primary key (GradeId)
     8 --为年级名称添加唯一约束
     9 alter table Grade
    10 add Constraint UQ_GradeName unique(GradeName)
    11 --为地址添加默认约束
    12 alter table Student
    13 add constraint DF_Address default('我在广州') for address, --也可以一次添加多条约束,每一条使用 ,  分隔
    14 constraint CK_LoginPwd check(len(loginPwd)>=6) --从第二条约束开始不需要再使用add关键字了
    15 
    16 --为表的年级字段添加键约束
    17 if exists (select * from sysobjects where name='FK_Student_Grade_GradeId')
    18    alter table  Student drop constraint FK_Student_Grade_GradeId
    19 alter table student --选择外键表来创建主外键
    20 add constraint FK_Student_Grade_GradeId foreign key(GId) references Grade(GradeId)
    21 on delete cascade
    22 
    23 --增加外键约束时,设置级联更新、级联删除:
    24 --[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
    25 --[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
    26 --ON DELETE:在删除的时候    
    27 --ON UPDATE:在修改的时候
    28 --NO ACTION:不做任何操作,该报错报错,该操作操作
    29 --CASCADE:级联,删除主表数据,从表对应的记录也删除
    30 --SET NULL:将从表的记录的对应字段值设置为null值,前提是这个字段可以允许为null
    31 --SET DEFAULT:将从表的记录的对应字段值设置为默认值,前提是你设置了默认值,且默认值也符合主外键约束

    13、查询表中某个字段同样的数据存在的数量,无列名使用having

    1 SELECT    SdCard_Number ,count(SdCard_Number) AS kk
    2 FROM     SR120_Raspberry_Battery_HighLevel_SdCard_Link
    3 group by     SdCard_Number
    4 having  count(SdCard_Number)>1

    14、创建分页查询存储过程

     1 create proc MES_E_proc
     2 @pageIndex int,
     3 @pageSize int,
     4 @pageTotal int out
     5 AS
     6 begin
     7  SELECT * FROM 
     8  (SELECT ROW_NUMBER() OVER (ORDER BY CreateDate DESC)AS RowNum,
     9  ProcessCode,ProcessName,Active,Remark,CreateDate FROM MES_Route_Process WHERE IsDelete=0)AS PageData
    10  WHERE RowNum BETWEEN @pageSize*(@pageIndex-1)+1 AND @pageIndex*@pageSize
    11  
    12 SELECT @pageTotal=COUNT(*) FROM MES_Route_Process WHERE IsDelete=0
    13 end

    15、查询函数

    1 select CONVERT(decimal(10,2),'123.456789123')
    2 select CONVERT(varchar(10),getdate(),103)
    3 select ROUND(cast(2 as float)/3,2)

    16、开窗函数

     1 --开窗函数over
     2 --排序
     3 SELECT * FROM MyTestPass
     4 
     5 select * ,RANK() over(order by id desc) from MyTestPass
     6 
     7 select Name,sum(Salary) from MyTestPass group by Name
     8 
     9 select Name,sum(Salary) over(partition by Name) from MyTestPass
    10 
    11 select *,row_number() over(order by oprice desc) from TblOrders
    12 
    13 select *, row_number() over(order by id desc) from MyTestPass

     17、自连接

     1 insert into CompanyTable values('北京总部',0)
     2 insert into CompanyTable values('深圳分公司',1)
     3 insert into CompanyTable values('广州分公司',1)
     4 insert into CompanyTable values('.Net部门',2)
     5 insert into CompanyTable values('.Net部门',3)
     6 insert into CompanyTable values('Java部门',2)
     7 insert into CompanyTable values('Java部门',3)
     8 insert into CompanyTable values('C++部门',2)
     9 insert into CompanyTable values('C++部门',3)
    10 
    11 --使用内连接把相关的数据连接起来
    12 --第一级分类为:总部,第二级分类为:分公司,第三级分类为:部门
    13 --思路1:查询部门名称
    14 select CompanyName from CompanyTable as department
    15 --思路2:查询公司名称
    16 select CompanyName from CompanyTable as company
    17 
    18 --自连接思路:把部门ID=主键ID
    19 select * from CompanyTable as department
    20 inner join CompanyTable as company
    21 on department.CompanyID=company.ID
    22 
    23 select company.CompanyName,department.CompanyName
    24 from CompanyTable as department
    25 inner join CompanyTable as company
    26 on department.CompanyID=company.ID
    27 order by company.CompanyName

     18、根据字段名查询数据库的哪些表包含这个字段

     1 SELECT table_name FROM DBA_TAB_COLUMNS WHERE COLUMN_NAME='ALARM_ID';  

  • 相关阅读:
    spring mvc 源码简要分析
    tomcat 开启远程debug
    jdk1.5-jdk1.9的主要区别
    关于elasticsearch 6.x及其插件head安装(单机与集群)5分钟解决
    mysql主从配置(5分钟解决问题)
    内部类总结
    Colored Sticks
    vim 将tab转为空格
    shell编程
    vim -- 查找和替换
  • 原文地址:https://www.cnblogs.com/LiGengMing/p/5304879.html
Copyright © 2020-2023  润新知