最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

sql連接查詢中,where關鍵字的位置講解

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

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

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

復制代碼 代碼如下:

--醫(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ī)生編碼對應
      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ī)生的相關信息,以及該醫(yī)生所擁有的號源數(shù)量。

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

復制代碼 代碼如下:

--簡單的分組查詢即可搞定
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

確實簡單啊。一個小小的分組就能搞定的。還賣什么關子呢。

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

復制代碼 代碼如下:

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"關鍵字,會過濾連接查詢的結果集中的數(shù)據(jù)。由于右表(號源表)的條件不匹配,也會導致左表(醫(yī)生表)的數(shù)據(jù)被過濾掉。

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

其實,正確的寫法應該是這樣的:

復制代碼 代碼如下:

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,是滿足要求的結果。思路就是:只需要過濾右表,就將(使用子查詢)過濾后的結果集作為連接查詢的右表,然后再去連接,分組......

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

復制代碼 代碼如下:

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

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

相關文章

  • SQL語句實例說明 方便學習mysql的朋友

    SQL語句實例說明 方便學習mysql的朋友

    我是在MySQL數(shù)據(jù)庫中做的測試,不同的數(shù)據(jù)庫有一定的差別方便學習mysql的朋友
    2012-09-09
  • SQL Server 開窗函數(shù) Over()代替游標的使用詳解

    SQL Server 開窗函數(shù) Over()代替游標的使用詳解

    這篇文章主要介紹了SQL Server 開窗函數(shù) Over()代替游標的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Godaddy 導入導出MSSQL數(shù)據(jù)庫的實現(xiàn)步驟

    Godaddy 導入導出MSSQL數(shù)據(jù)庫的實現(xiàn)步驟

    可以從限制文件中導入SQL共享服務器數(shù)據(jù)庫。如果想把存放在其他地方的數(shù)據(jù)導入,需要先把其內(nèi)容拷到限制文件中。(
    2010-02-02
  • sqlserver 2000中每個服務器角色的解釋

    sqlserver 2000中每個服務器角色的解釋

    sqlserver 2000中每個服務器角色的解釋,方便大家以后對于數(shù)據(jù)庫權限有所了解。
    2011-03-03
  • SQL?Server數(shù)據(jù)庫連接查詢和子查詢實戰(zhàn)案例

    SQL?Server數(shù)據(jù)庫連接查詢和子查詢實戰(zhàn)案例

    子查詢(嵌套查詢)子查詢也稱嵌套查詢,是指一個SELECT查詢語句可以嵌入另一個SELECT查詢語句之中,下面這篇文章主要給大家介紹了關于SQL?Server數(shù)據(jù)庫連接查詢和子查詢的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • CMD命令操作MSSQL2005數(shù)據(jù)庫(命令整理)

    CMD命令操作MSSQL2005數(shù)據(jù)庫(命令整理)

    創(chuàng)建數(shù)據(jù)庫、創(chuàng)建用戶、修改數(shù)據(jù)的所有者、設置READ_COMMITTED_SNAPSHOT以及備份、日志扥等等,感興趣的朋友可以參考下
    2013-05-05
  • SQL Server實現(xiàn)split函數(shù)分割字符串功能及用法示例

    SQL Server實現(xiàn)split函數(shù)分割字符串功能及用法示例

    這篇文章主要介紹了SQL Server實現(xiàn)split函數(shù)分割字符串功能及用法,結合實例形式分析了SQL Server實現(xiàn)split分割字符串的相關技巧與使用方法,需要的朋友可以參考下
    2016-08-08
  • 通過SQL語句直接把表導出為XML格式

    通過SQL語句直接把表導出為XML格式

    有時候我們需要把從數(shù)據(jù)庫里讀出的數(shù)據(jù)直接保存為XML的形式,這里我們通過SQL語句就可以達到這種效果。
    2010-09-09
  • 一文講懂SQL執(zhí)行順序

    一文講懂SQL執(zhí)行順序

    開發(fā)人員需要應用SQL語句來構建數(shù)據(jù)庫模型,測試人員需要用SQL語句來操作數(shù)據(jù)庫數(shù)據(jù),到底SQL語句的查詢執(zhí)行順序是怎樣的呢,本文就來介紹一下
    2023-09-09
  • SQLSERVER 臨時表和表變量的區(qū)別匯總

    SQLSERVER 臨時表和表變量的區(qū)別匯總

    不管臨時表還是表變量都帶了表這個詞,既然提到表 ,按推理自然會落到某數(shù)據(jù)庫中,如果真在一個數(shù)據(jù)庫中,那自然就有它的存儲文件 .mdf和.ldf,那是不是如我推理的那樣呢,這篇文章主要介紹了SQLSERVER 臨時表和表變量到底有什么區(qū)別,需要的朋友可以參考下
    2023-02-02

最新評論

滁州市| 凤山县| 镇原县| 岳阳市| 新津县| 明星| 遵化市| 赣州市| 始兴县| 筠连县| 蓝田县| 开鲁县| 和政县| 固原市| 达孜县| 长沙市| 望江县| 屯留县| 弥勒县| 营山县| 苍南县| 平陆县| 渝中区| 定南县| 塘沽区| 汉川市| 邢台县| 永州市| 唐山市| 宜阳县| 融水| 衡南县| 玛纳斯县| 平武县| 天镇县| 垦利县| 临西县| 潜山县| 西华县| 习水县| 金塔县|