常用的一些SQL语句
Posted LiGengMing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用的一些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位随机数[email protected] 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
以上是关于常用的一些SQL语句的主要内容,如果未能解决你的问题,请参考以下文章