常用的一些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';  

posted on 2016-03-22 09:39  LiGengMing  阅读(399)  评论(0编辑  收藏  举报

导航