天天看点

数据库的一些操作(Sql)

      对于最近做的项目(教务系统),我想收获最大之一就是对sql语句的学习吧!这里,我总结一下我在项目中用到的一些SQL语句:

1,获取时间:getdate()     方法convert(varchar(10),getdate(),120)是获取当前时间的一个格式化方法,其中varchar(10)定义的是你要的字段的长度,当然长度的不同返回的也会不同的,如果我们只要日期部分,设成10正好为日期长度,如果设成19则正好可以读到时间部分。最后那个参数是返回不同的格式

参数 结果
100 05 8 2006 9:27PM
101 05/08/2006
102 2006.05.08
103 08/05/2006
104 08.05.2006
105 08-05-2006
106 08 05 2006
107 05 08, 2006
108 21:30:51
109 05 8 2006 9:31:11
110 05-08-2006
111 2006/05/08
112 20060508
113 08 05 2006 21:31:59
114 21:33:06:503
120 2006-05-08 21:33:38

2,获取当前时间是星期几:

set datefirst 1 SELECT datepart(weekday, getdate())

其中 set datefirst 1设置开始算的时间 1代表星期一 这里返回的是数字

3.获取年月日: 

年:select year(getdate())  返回当前年份 比如2014

月:select month(getdate()) 返回当前月份 比如 3

日:select day(getdate()) 返回当前日期 比如 30   这三个函数参数都是传入的是时间 我这里是当前时间为例 用时可以灵活运用

4.函数 datediff(参数一,时间2,时间2)  这个函数是计算两个时间的差  参数一以什么单位计算常用的一般是 天(day)月(month)年(year)。。。当然还有其他参数,有兴趣可以百度百度  如 select datediff (day,'20014-3-29','2014-3-30')  返回的是 1 

下面看几个例子

【1】     SELECT (SELECT

 CAST (

  (datediff(DAY ,(SELECT sem.StartTime

FROM

Semester AS sem

WHERE

sem.StartTime < convert(varchar(10),getdate(),120) AND

sem.EndTime > convert(varchar(10),getdate(),120) ), getdate())) AS INT

 )+7)/7 as week

说明:这个sql语句业务是:在学期表中找出以当前学期的开始时间和当前时间的差算出当前是第几周 返回 数字 如 5 表示第五周

【2】SELECT

sem.SemesterName,

sch.SchoolYearName,

sem.SchoolYearID,

sem.SemesterID

FROM

Semester AS sem ,

SchoolYear AS sch

WHERE

sem.StartTime < convert(varchar(10),getdate(),120) AND

sem.EndTime > convert(varchar(10),getdate(),120) AND

sem.SchoolYearID = sch.SchoolYearID

说明:这个sql业务很简单 就是查找学年学期表当前的学期学年

【3】   set datefirst 1 

SELECT DISTINCT cla.ClassroomName,clad.StartWeeks,clad.EndWeeks,clad.[Section],clad.Location,clad.Week,tea.TeacherName

FROM Classroom AS cla ,ClassroomDetail AS clad ,Semester AS sem ,SchoolYear AS sch ,CourseChooseDetail AS chod ,CourseChoose AS cho ,Teacher AS tea ,Student AS stu,Operator AS opr

WHERE

(SELECT datepart(weekday, getdate())) = clad.Week AND

clad.StartWeeks < (SELECT CAST ((datediff(DAY,(SELECT sem.StartTime FROM Semester AS sem,SchoolYear AS sch WHERE sem.StartTime < CONVERT (VARCHAR(10), getdate(), 120) AND sem.EndTime >CONVERT (VARCHAR(10), getdate(), 120) AND sem.SchoolYearID = sch.SchoolYearID),getdate())) AS INT) + 7) / 7 AND

clad.EndWeeks > (SELECT CAST ((datediff(DAY,(SELECT sem.StartTime FROM Semester AS sem,SchoolYear AS sch WHERE sem.StartTime < CONVERT (VARCHAR(10), getdate(), 120) AND sem.EndTime >CONVERT (VARCHAR(10), getdate(), 120) AND sem.SchoolYearID = sch.SchoolYearID),getdate())) AS INT) + 7) / 7 AND

cla.SchoolYearID = sch.SchoolYearID AND

sem.SemesterID = cla.SemesterID AND

cla.ClassroomID = cho.ClassroomID AND

clad.TeacherID = tea.TeacherID AND

opr.OperatorID = stu.OperatorID AND

stu.StudentID = chod.StudentID AND

opr.OperatorID = :operatorID AND

chod.CourseChooseID = chod.CourseChooseID

说明:这个sql业务是:先找到当前是当前学期的第几周 和 是星期几  然后再 找到满足当前周次大于课堂详情表开始周,小于结束周  然后连表查询几个表  传入参数就只有OperatorID一个   主要是找学生的今日课表

5.左连接和右连接:左右查询主要是连表查询时有一边的值为空时用,当有一边为空数据时,也会返回这一列

左:FROM 表一 LEFT JOIN 表二 ON 列1=列2    右类同  

【4】SELECT stu.StudentID,res.ReStudyID,cla.ClassroomName,stu.GradeMajorAssignID,stu.StudentName, stu.PassportCode, stu.StudentCode,

    maj.MajorName,maj.MajorID,cou.CourseID,cou.CourseName,res.isPaid,res.isPass FROM Student stu,

    Major maj ,Course cou,Classroom cla2,(ReStudy res LEFT JOIN Classroom cla ON cla.ClassroomID = res.ClassroomID)  WHERE res.StudentID = stu.StudentID AND res.MajorID = maj.MajorID  AND res.PreClassroomID = cla2.ClassroomID AND stu.StudentName like :StudentName

    AND stu.PassportCode like :PassportCode AND stu.StudentCode like :StudentCode AND

    maj.MajorID =:MajorID

说明:这个sql主要是左查询重修表中的课堂ID 当课堂表的课堂ID为空时  还是要返回当前这一列

6.当一个表有两个字段都是连同一个id表时,可以直接在from后面多加一次  用as重新名一个名字即可

7.case... when语句在sql中的运用

SELECT

sch.SchoolYearName,

sch.StartYear

FROM

dbo.SchoolYear AS sch

WHERE (sch.StartYear =case (select MONTH(GETDATE()))

             when 1 then (select year(GETDATE())-1)

             when 2 then (select year(GETDATE())-1)

             when 3 then (select year(GETDATE())-1)

             when 4 then (select year(GETDATE())-1)

             when 5 then (select year(GETDATE())-1)

             when 6 then (select year(GETDATE())-1)

             when 7 then (select year(GETDATE())-1)

             when 8 then (select year(GETDATE())-1)

             when 9 then (select year(GETDATE()))

             when 10 then (select year(GETDATE()))

             when 11 then (select year(GETDATE()))

             when 12 then (select year(GETDATE()))

end)

当然这个项目用的最多的还是连表查询,最多的时候接近10个表的连表查询   项目快结束了,现在还在改bug,不过还是学到了很多,给大家分享一下,就当总结下