頻道欄目
首頁 > 資訊 > 其他綜合 > 正文

SCPPO:項目中SQL語句的一些應用總結

16-09-19        來源:[db:作者]  
收藏   我要投稿

【前言】

縱觀項目的開發,當項目框架搭建起來之后,更多的功能是無非是根據業務來操控SQL語句,針對每個開發來說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  *
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
                                   WHERE    logintime < GETDATE()
                                   GROUP BY userid
                                   ORDER BY MAX(logintime) DESC )
                AND logintime < GETDATE()
        GROUP BY userid
        ORDER BY MAX(logintime) DESC )
        AND v.userid = 'liupu'
執行后的結果:

 

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語句,基本上所有的事物都是這樣;大概十萬小時定律也是基于這么個理念。

相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片