【SqlServer系列】表單查詢

来源:http://www.cnblogs.com/wangjiming/archive/2017/07/10/7142203.html
-Advertisement-
Play Games

系列關聯文章 系列關聯文章 此系列文章歸屬於:ASP.NET MVC+Bootstrap+JQuery+SqlServer,其他幾篇文章請參照如下: 詳解google Chrome瀏覽器(理論篇) 詳解Google Chrome瀏覽器(操作篇)(上) 詳解Google Chrome瀏覽器(操作篇)( ...


系列關聯文章

此系列文章歸屬於:ASP.NET MVC+Bootstrap+JQuery+SqlServer,其他幾篇文章請參照如下:

接下來的文章系列會在如上範圍跳動。

1   概述

如下幾個問題,如果你能解決,請繼續往下看,若不能解決,請先複習SQL基礎知識,再來閱讀本篇文章。本篇文章深度中等左右。

Q1:表StudentScores如下,用一條SQL語句查詢出每門課都大於80 分的學生姓名

Q2:表DEMO_DELTE如下,刪除除了自動編號不同, 其他都相同的學生冗餘信息

Q3:Team表如下,甲乙丙丁為四個球隊,現在四個球對進行比賽,用一條sql 語句顯示所有可能的比賽組合

Q4:請考慮如下SQL語句在Microsoft SQL Server 引擎中的邏輯處理順序

1 USE TSQLFundamentals2008
2 
3 SELECT empid,YEAR(orderdate) AS orderyear,COUNT(*) numorders
4 FROM Sales.Orders
5 WHERE custid=71
6 GROUP BY empid,YEAR(orderdate)
7 HAVING  COUNT(*)>1
8 ORDER BY empid,orderyear

本篇文章將剖析一般查詢過程中,涉及到的處理邏輯子句,主要包括FROM,WHERE,GROUP BY,HAVING,SELECT,ORDER BY,TOP,OVER等子句。

2   SELECT語句的元素

2.1 常規查詢子句和邏輯處理順序

對數據表進行檢索查詢時,查詢語句一般包括FROM,WHERE,GROUP BY,HAVING,SELECT,ORDER BY,TOP,OVER等子句,請考慮如下例子的邏輯處理順序。

1 USE TSQLFundamentals2008
2 
3 SELECT empid,YEAR(orderdate) AS orderyear,COUNT(*) numorders
4 FROM Sales.Orders
5 WHERE custid=71
6 GROUP BY empid,YEAR(orderdate)
7 HAVING  COUNT(*)>1
8 ORDER BY empid,orderyear

如上代碼,在SQL中邏輯處理順序如下:

USE TSQLFundamentals2008

FROM Sales.Orders
WHERE custid=71
GROUP BY empid,YEAR(orderdate)
HAVING  COUNT(*)>1
SELECT empid,YEAR(orderdate) AS orderyear,COUNT(*) numorders
ORDER BY empid,orderyear

 邏輯處理順序可歸結為如下:

註釋:

a.在常規編程語言中,如c++,java,c#等,程式按照“從上往下”的順序一步一步地執行,然而在SQL中,SELECT語句所處位置雖然在最開始,卻不是在最先執行的;

b.邏輯處理順序的每一步返回的結果集均是緊接著該步語句的下一步語句要執行的結果集;

c.FROM獲取數據源(或者數據表),WHERE在FROM基礎上過濾條件,GROUP BY在WHERE的基礎上按照至少一列對集合進行分組,HAVING在GROUP BY基礎上,對已經分組的集合進行過濾,SELECT語句在HAVING基礎上檢索,ORDER BY在SELECT基礎上按照一定條件進行排序;

2.2  部分查詢子句講解

2.1.1   FROM子句

a.用資料庫架構在限定代碼中的對象名稱,即使不用資料庫架構限定,Sql Server也會隱式解析它,代價更高,初次之外,如果對象名相同,沒有架構限定,會產生歧義;
b.FROM * 性能比 FROM conum_name性能低;
c.FROM查詢得到的結果集順序是隨機的;
2.1.2  WHERE子句

a.過濾FROM階段返回的行;
b.WHERE 謂詞或邏輯表達式;
c.WHERE子句對查詢性能有重要影響,在過濾表達式基礎上,Sql Server會計算使用什麼索引來訪問請求的數據;
d.掃描整張表,返回所有可能的行,在客戶端過濾,開銷比較大,如產生大量的網路傳輸流量;
e.T-SQL使用三值謂詞邏輯(true,false,unknown);

2.1.3  GROUP BY子句

a.GROUP BY階段將上一階段邏輯查詢處理返回的行按“組”進行組合,每個組由在GROUP BY子句中指定的個元素決定;
b.如果查詢語句中涉及到分組,那麼GROUP BY階段之後測所有階段(包括HAVING、SELECT以及ORDER BY)的操作對象將是組,而不是單獨的行。每個組最終表示為查詢結果集中的一行;
c.GROUP BY階段之後處理的子句中指定的所有表達式務必保證為每個組只返回一個標量(單值)。以GROUP BY列表中的元素為基礎的表達式滿足這一要求,因為按照定義,在每個組中GROUP BY元素只唯一齣現一次;
d.聚合函數只為每個組返回一個值,所以一個元素如果不再GROUP BY列表中出現,就只能作為聚合函數(COUNT、SUM、AVG、MIN和MAX)的輸入。(註意:若有GROUP BY子句,聚合函數只操作具體的每組,而非所有組);
e.所有聚合函數都會忽略NULL,但COUNT(*)除外;
f.在聚合函數中,可以使用distinct來處理非重覆數,如count(distinct vary);

2.1.4  HAVING子句

a.HAVING子句用於指定對組進行過濾的謂詞或邏輯表達式,這與WHERE階段對單獨的行進行過濾相對應;
b.因為HAVING子句是在對行進行分組後處理的,所以可以在邏輯表達式中引用聚合函數,如 HAVING COUNT(*)>1,意味著HAVING階段過濾器只保留包含多行的組;

2.1.5  SELECT 子句

a.SELECT子句用於指定需要在查詢返回的結果集中包含的屬性(列);
b.SELECT子句返回列的名稱類型:

  • 直接基於正在查詢的表的各個列
  • 三種方式定義別名,推薦使用AS。<表達式>AS<別名>;<別名>=<表達式>(別名 等號 表達式);<表達式> <別名>(表達式 空格 別名)
  • 沒有名字的列

c.在關係模型中,所有操作和關係都基於關係代數和關係(集合)中的結果,但在SQL中,情況略有不同,因SELECT查詢並不保證返回一個真正的集合(即,由唯一行組成的無序集合)。首先,SQL不要求表必須符合集合條件。SQL表可以沒有鍵,行也不一定具有唯一性,在這些情況下表都不是集合,而是多集(multiset)或包(bag)。但即使正在查詢的表具有主鍵、也符合集合的條件,針對這個表的SELECT查詢任然可能返回包含重覆的結果。在描述SELECT查詢的輸出時,經常會使用結果集這個屬於,不過,結果集並不一定非得嚴格滿足數學意義上的集合條件;
d.DISTINCT約束,確保行的唯一性,刪除重覆的行;
e.儘量不用SELECT * 形式查詢所有列,而儘量用列明;

2.1.6  ORDER BY

a.理解SQL最重要的一點就是要明白表不保證是有序的,因為表是為了代表一個集合(如果有重覆項,則是多集),而集合是無序的。這意味著,如果在查詢表時不指定一個ORDER BY子句,那麼雖然查詢可以返回一個結果表,但SQL Server可以自由地按任意順序對結果張的行進行排序;
b.在ORDRTB BY中使用ASC代表升序,DESC代表降序,預設情況是升序;
c.帶有ORDER BY子句的查詢會生成一種ANSI稱之為游標(cursor)的結果(一種非關係結果,其中的行具有固定的順序)。在SQL中的某些語言元素和運算預期只對查詢的表結果進行處理,而不能處理游標,如表表達式和集合運算;

3    問題答案

 Q1:KEY

 1 --方法1
 2 select distinct studentName 
 3 from StudentScores
 4 where studentName not in 
 5 (
 6 select distinct studentName 
 7 from StudentScores 
 8 where courseGrades<=80
 9 )
10 
11 --方法2
12 select studentName 
13 from StudentScores 
14 group by studentName 
15 having min(courseGrades)>80

 Q2:KEY

1 DELETE DEMO_DELTE
2 WHERE ID 
3 NOT IN(
4 SELECT min(ID) 
5 FROM DEMO_DELTE_2 
6 GROUP BY xuehao,XM,kcbh,kcmc,fs)

Q3:KEY

1 SELECT team1.TeamName,team2.TeamName
2 FROM Team team1,Team team2
3 WHERE team1.TeamName<team2.TeamName

 Q4:KEY

參照第2章分析。

4  參考文獻

【01】Microsoft  SqlServer 2008技術內幕:T-SQL 語言基礎

【02】Microsoft  SqlServer 2008技術內幕:T-SQL 查詢

【03】程式員的SQL經典

5  版權

 

  • 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
  • 博主網址:http://www.cnblogs.com/wangjiming/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分為原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]
  • 可以轉載該博客,但必須著名博客來源。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 概述 1.Comparable與Comparator使用背景 數值型數據(byte int short long float double)天生可對比大小,可排序,String實現了Comparable介面也可以對比大小與排序,而自定義類多種多樣,沒有一個共有的可以用作排序的指標,因此需要在自定 ...
  • 線程概述 首先先理解下什麼是進程和線程? 進程: 進程是指一個正在運行中的程式。 每個進程執行都有一個或多個執行順序,這個順序就是一個控制單元(或者叫一個執行路徑),控製程序的運行。 舉例: 大家使用過的迅雷下載,當你啟動迅雷開始下載後,你可以選擇下載單個或者同時下載多個文件。每一個下載任務就是一個 ...
  • 題目描述 The N cows (2 <= N <= 1,000) conveniently numbered 1..N are grazing among the N pastures also conveniently numbered 1..N. Most conveniently of al ...
  • 一、繼承並實現自己的屬性文件配置器類 二、Spring中配置以自定義的屬性文件配置器類來載入加密後的配置文件 三、將配置文件中的特殊屬性用相同的演算法和密鑰加密 ...
  • 配置1:-Xms64m -Xmx512m 配置2:-c default -b 0.0.0.0-Xmx1024M -Xms512M -XX:MaxPermSize=256m ...
  • vue vue.js 是用於構建互動式的 Web 界面的庫。它提供了 MVVM 數據綁定和一個可組合的組件系統,具有簡單、靈活的 API。從技術上講, Vue.js 集中在 MVVM 模式上的視圖模型層,並通過雙向數據綁定連接視圖和模型。實際的 DOM 操作和輸出格式被抽象出來成指令和過濾器。相比其 ...
  • js中滑鼠事件主要有onclick,onmousedown,onmouseup,oncontextmenu,ondblclick,所有的這些事件都包含有一個事件對象event,當然在IE低版本下,event對象是掛在window底下的。這個我們另行討論。 1.通過html添加事件 2.通過DOM0級 ...
  • 轉載註明來自: http://www.cnblogs.com/wujiancheng/ 一、正常情況下Activity的生命周期: Activity的生命周期大概可以歸為三部分 整個的生命周期:onCreate()可以設置所有的“全局”狀態, onDestory()可以釋放所有的資源 可見的生命周期 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...