亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

sql連接查詢中,where關(guān)鍵字的位置講解

 更新時(shí)間:2013年10月30日 09:12:51   作者:  
最近遇到一個(gè)覺得很有趣的sql題,可能對初學(xué)者和我這種菜鳥會有幫助,所以小編決定分享給大家

由于筆者天生笨拙,且思維不嚴(yán)謹(jǐn),也實(shí)在不擅長寫sql語句,高手請勿見笑,就請直接跳過本文吧。

背景就不多介紹了,先建表,插入測試數(shù)據(jù)吧。字段那些都有注釋

復(fù)制代碼 代碼如下:

--醫(yī)生表
CREATE TABLE doctor
    (
      id INT IDENTITY(1, 1) , --ID 自增長
      docNumber NVARCHAR(50) NOT NULL , --醫(yī)生編碼
      NAME NVARCHAR(50) NOT NULL   --醫(yī)生姓名
    )
go

--插入測試數(shù)據(jù)
INSERT  INTO doctor
VALUES  ( '007', 'Tom' )
INSERT  INTO doctor
VALUES  ( '008', 'John' )
INSERT  INTO doctor
VALUES  ( '009', 'Jim' )


--號源表(掛號表)
CREATE TABLE Nosource
    (
      id INT IDENTITY(1, 1) ,
      docNumber NVARCHAR(50) NOT NULL , --和醫(yī)生表中的醫(yī)生編碼對應(yīng)
      workTime DATETIME NOT NULL
    )

go
--插入測試數(shù)據(jù)
INSERT  INTO Nosource
VALUES  ( '007', '20120819' )
INSERT  INTO Nosource
VALUES  ( '007', '20120820' )
INSERT  INTO Nosource
VALUES  ( '007', '20120821' )
INSERT  INTO Nosource
VALUES  ( '008', '20120821' )


表建好之后,測試數(shù)據(jù)也OK。下面開始說需求啦。

1.查出每位醫(yī)生的相關(guān)信息,以及該醫(yī)生所擁有的號源數(shù)量。

這簡直太簡單了,可能連剛學(xué)會helloWorld和一點(diǎn)點(diǎn)數(shù)據(jù)庫基礎(chǔ)的朋友都會嚴(yán)重真心BS。不過代碼還是寫出來。

復(fù)制代碼 代碼如下:

--簡單的分組查詢即可搞定
SELECT  COUNT(nos.id) AS PersonNumSounceCOUNT , --總數(shù)
        dct.ID AS docID ,
        dct.NAME ,
        dct.docNumber ,
        nos.workTime
FROM    doctor AS dct
        LEFT JOIN Nosource AS nos ON dct.docNumber = nos.docNumber
GROUP BY dct.ID ,
        dct.NAME ,
        dct.docNumber ,
        nos.workTime

確實(shí)簡單啊。一個(gè)小小的分組就能搞定的。還賣什么關(guān)子呢。

那現(xiàn)在需求改變,需要按條件去匹配:要求號源表的workTime大于當(dāng)前日期才算有效的,否則就不匹配。
如果workTime條件不匹配的醫(yī)生,對應(yīng)的PersonNumSounceCOUNT字段的值應(yīng)為0 ;例如:Jim醫(yī)生沒有匹配和符合條件的號源,其PersonNumSounceCOUNT字段值應(yīng)為0。抬頭仰望天空40度,想想能夠用where關(guān)鍵字過濾,然后一次性查詢出來嗎?試試吧。

復(fù)制代碼 代碼如下:

SELECT  COUNT(nos.id) AS PersonNumSounceCOUNT , --總數(shù)
        dct.ID ,
        dct.NAME ,
        dct.docNumber ,
        nos.workTime
FROM    doctor AS dct
        LEFT JOIN Nosource AS nos ON dct.docNumber = nos.docNumber
WHERE   DATEDIFF(day, GETDATE(), nos.workTime) > 0
GROUP BY dct.ID ,
        dct.NAME ,
        dct.docNumber ,
        nos.workTime

相信有人會寫出上面的代碼來??墒菆?zhí)行查詢后,發(fā)現(xiàn)完全不符合要求啊。連Jim醫(yī)生的基本信息和表記錄也都被過濾掉了,不見了。咋回事???

原因很簡單嘛。在連接查詢的后面使用"where"關(guān)鍵字,會過濾連接查詢的結(jié)果集中的數(shù)據(jù)。由于右表(號源表)的條件不匹配,也會導(dǎo)致左表(醫(yī)生表)的數(shù)據(jù)被過濾掉。

所以,會出現(xiàn)以上的現(xiàn)象(Jim醫(yī)生的信息和記錄都不見了)。要想一次性查出來可能嗎?到底該如何去實(shí)現(xiàn)呢?

其實(shí),正確的寫法應(yīng)該是這樣的:

復(fù)制代碼 代碼如下:

SELECT  COUNT(nos.id) AS PersonNumSounceCOUNT , --總數(shù)
        dct.ID ,
        dct.NAME ,
        dct.docNumber ,
        nos.workTime
FROM    doctor AS dct
        LEFT JOIN ( SELECT  *
                    FROM    Nosource
                    WHERE   DATEDIFF(day, GETDATE(), workTime) > 0
                  ) AS nos ON dct.docNumber = nos.docNumber
GROUP BY dct.ID ,
        dct.NAME ,
        dct.docNumber ,
        nos.workTime

再執(zhí)行一下,果然OK,是滿足要求的結(jié)果。思路就是:只需要過濾右表,就將(使用子查詢)過濾后的結(jié)果集作為連接查詢的右表,然后再去連接,分組......

其實(shí)編寫簡潔而高性能的sql語句,是需要很強(qiáng)的邏輯思維能力(和數(shù)學(xué)分不開)和經(jīng)驗(yàn)的。還有種更簡單的寫法:

復(fù)制代碼 代碼如下:

SELECT  sum(case when nos.workTime>getdate then 1 else 0 end) AS PersonNumSounceCOUNT , --總數(shù)
dct.ID AS docID ,
dct.NAME ,
dct.docNumber
FROM    doctor AS dct
LEFT JOIN Nosource AS nos ON dct.docNumber = nos.docNumber
GROUP BY dct.ID ,
dct.NAME ,
dct.docNumber

這樣去解釋,不知道大家是否能夠理解,反正大致意思就是這樣的。筆者的表達(dá)能力和水平確實(shí)有限,難免有偏差,望讀者諒解!

相關(guān)文章

  • SQL寫法--行行比較

    SQL寫法--行行比較

    行行比較是 SQL 規(guī)范,關(guān)系型數(shù)據(jù)庫都應(yīng)該支持這種寫法,本文通過代碼以及與其他寫法進(jìn)行比較來具體講解這一規(guī)范,大家跟隨小編一起來學(xué)習(xí)吧
    2021-08-08
  • 盤點(diǎn)SqlServer?分頁方式和拉姆達(dá)表達(dá)式分頁

    盤點(diǎn)SqlServer?分頁方式和拉姆達(dá)表達(dá)式分頁

    這篇文章主要介紹了SqlServer?5種分頁方式和拉姆達(dá)表達(dá)式分頁,進(jìn)來看看吧,本文結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • SqlServer觸發(fā)器詳解

    SqlServer觸發(fā)器詳解

    觸發(fā)器是特殊的一個(gè)存儲過程,在程序開發(fā)中經(jīng)常會用到,觸發(fā)器和存儲過程唯一的區(qū)別就是觸發(fā)器不能執(zhí)行execute語句調(diào)用,而是在用戶執(zhí)行Transact-SQL語句時(shí)自動觸發(fā)執(zhí)行,下面小編給大家詳解sqlserver觸發(fā)器,需要的朋友可以參考下
    2015-08-08
  • SQLServer RANK() 排名函數(shù)的使用

    SQLServer RANK() 排名函數(shù)的使用

    本文主要介紹了SQLServer RANK() 排名函數(shù)的使用,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • union組合結(jié)果集時(shí)的order問題

    union組合結(jié)果集時(shí)的order問題

    如果能確定各查詢結(jié)果不會有重復(fù)的項(xiàng),最好就帶上all,因?yàn)檫@樣還是可以提高一些效率的。
    2009-09-09
  • sqlserver建立新用戶及關(guān)聯(lián)數(shù)據(jù)庫教程

    sqlserver建立新用戶及關(guān)聯(lián)數(shù)據(jù)庫教程

    本文講的是SQLserver數(shù)據(jù)庫創(chuàng)建新用戶方法以及賦予此用戶特定權(quán)限的方法,非常的簡單實(shí)用,有需要的小伙伴可以參考下
    2018-01-01
  • 使用用SQL語句從電腦導(dǎo)入圖片到數(shù)據(jù)庫的方法

    使用用SQL語句從電腦導(dǎo)入圖片到數(shù)據(jù)庫的方法

    這篇文章主要介紹了用SQL語句從電腦導(dǎo)入圖片到數(shù)據(jù)庫的方法,文中給大家提到了從MySQL數(shù)據(jù)庫讀取圖片和向數(shù)據(jù)庫插入圖片的代碼,需要的朋友可以參考下
    2019-09-09
  • SQL查詢?nèi)腴T(中篇)

    SQL查詢?nèi)腴T(中篇)

    SQL查詢?nèi)腴T(中篇)
    2011-09-09
  • SqlServer中tempdb的日志機(jī)制原理解析及示例分享

    SqlServer中tempdb的日志機(jī)制原理解析及示例分享

    tempdb為什么比其他數(shù)據(jù)庫快?估計(jì)95%以上的程序員們都一臉茫然.Tempdb作為Sqlserver的重要特征,一直以來大家對它可能即熟悉又陌生.熟悉是我們時(shí)時(shí)刻刻都在用,陌生可能是很少有人關(guān)注它的運(yùn)行機(jī)制.這次我將通過實(shí)例給大家介紹下tempdb的日志機(jī)制.
    2014-08-08
  • 在SQL Server中備份和恢復(fù)數(shù)據(jù)庫的四種方法

    在SQL Server中備份和恢復(fù)數(shù)據(jù)庫的四種方法

    在SQL Server中,創(chuàng)建備份和執(zhí)行還原操作對于確保數(shù)據(jù)完整性、災(zāi)難恢復(fù)和數(shù)據(jù)庫維護(hù)至關(guān)重要,本文給大家介紹了備份和恢復(fù)數(shù)據(jù)庫的最佳方法,需要的朋友可以參考下
    2023-12-12

最新評論