纵观项目的开发,当项目框架搭建起来之后,更多的功能是无非是根据业务来操控SQL语句,针对每个开发来说SQL语句是个基本功,是避不开的。
当然SQL语句也挺有意思,通过它也能尽情的展示我们的才华,今天小编梳理一下最近项目中对SQL一些应用,在此与大家共享。
小编最近在做的是一个维护类型的项目,基本框架已经成型,主要工作是业务变化后来修改相应功能的SQL语句来满足新提出的需求,数据库是用的SQLServer;
(一)用户登录后显示上次登录信息
1、场景再现:
(1)系统用户登录后会在系统主页上显示上次登录的相关信息,如下图:
(2)But在我们系统验收的时候出现一个Bug用演示的账号登录进去一直显示的是2016年10月1号09:14这个时间,难道系统也在玩超越?追踪下去最后定位到问题出在SQL语句上!
(3)登录相关的实现:用户登录后将记录记录到数据库的登录相关表中,当跳转到主界面后会去视图(登录表和其他一些表构成)中根据当前登录的用户查找上次登录的信息;
2、实现SQL语句:
(1)先根据用户查看下视图中的内容:
SELECT *
FROM PermissionDB.dbo.V_UP_LOGININFO
WHERE userid = 'liupu'
ORDER BY logintime DESC
执行后的效果图:
(2)查看功能实现的SQL语句:
SELECT *
FROM V_UP_LOGININFO v
WHERE v.logintime IN (
SELECT TOP 1000
MAX(logintime) AS logintime
FROM V_UP_LOGININFO
WHERE logintime NOT IN ( SELECT TOP 1000
MAX(logintime) AS logintime
FROM V_UP_LOGININFO
GROUP BY userid
ORDER BY MAX(logintime) DESC )
GROUP BY userid
ORDER BY MAX(logintime) DESC )
AND v.userid = 'liupu'
ORDER BY logintime DESC
执行后的结果:
3、分析:通过上面查询不难看出实现的是从登录的视图中找到次最新时间(最新时间为本次登录),可是现在还不到10月1号那?后来经过确认是有人做测试;那么如何改进那?思路:在查询的时候加上限制条件,时间不能大于当前时间。
4、最终改正后的SQL语句:
SELECT TOP 1
*
FROM ( SELECT TOP 2
*
FROM V_UP_LOGININFO
WHERE userid = 'liupu'
AND logintime < GETDATE()
ORDER BY logintime DESC
) AS a
ORDER BY a.logintime ASC
执行后的结果:
5、最终的效果图:
(二) 数据库表太多,请问如何查询一个字段在哪张表中那?
1、场景再现:由于是半路接手项目,主要是维护项目,对项目中很多表不是太熟悉,而且由于项目比较大,数据库表的个数比较多,有时候做一个功能或修改一个功能时需要根据表的某个字段去关联其他表来满足需求,这时候痛苦就来了,一个一个点表会崩溃的;淘到一个十分不错的SQL语句。
2、SQL语句:
SELECT b.name '表名称'
FROM syscolumns a
INNER JOIN sysobjects b ON a.id = b.id
AND b.xtype = 'U'
AND a.name = '字段名称'
3、实际应用:
(1)首先在SQLServerManager中定位好你需要查找的库:
(2)执行该SQL语句:
SELECT b.name '表名称'
FROM syscolumns a
INNER JOIN sysobjects b ON a.id = b.id
AND b.xtype = 'U'
AND a.name = 'CompanyCode'
4、最终的效果图:
(三)Order By按正序排序时,如何把NULL值排到后面去?
1、场景再现:在修改一个功能的时候按照其中的一个字段从小到大排序,但是该字段中有NULL值;需求是NULL值放最后;具体项目功能在此不便透漏在此自己模拟一个表。
2、实现SQL语句:
(1)查询模拟表中的所有内容:
SELECT *
FROM [test].[dbo].[Test_Order]
执行效果图:
(2)利用Order By对字段Score从小到大排序:
SELECT *
FROM [test].[dbo].[Test_Order]
ORDER BY Score
执行效果图:
3、最终改正后的SQL语句:
SELECT *
FROM [test].[dbo].[Test_Order]
ORDER BY CASE WHEN Score IS NULL THEN 2
ELSE 1
END ,
Score
4、最终的效果图:
1、在项目整体框架定下后,接下来主要的工作是灵活运用SQL语句来实现功能,SQL语句能充分调动大脑去达到目的;
2、兴趣是靠后天的努力与激励获得的,刚开始学的时候对SQL语句接触比较少,用的也比较少,所谓的不感兴趣占主导,随着接触项目越来越多,应用的越来越多,用它实现的功能越来越复杂越精妙时,便有了兴趣;其实不仅仅是SQL语句,基本上所有的事物都是这样;大概一万小时定律也是基于这么个理念。