共計 3098 個字符,預計需要花費 8 分鐘才能閱讀完成。
這篇文章給大家介紹 SqlServer 中怎么實現表單查詢,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
SELECT 語句的元素
2.1 常規查詢子句和邏輯處理順序
對數據表進行檢索查詢時,查詢語句一般包括 FROM,WHERE,GROUP BY,HAVING,SELECT,ORDER BY,TOP,OVER 等子句,請考慮如下例子的邏輯處理順序。
USE TSQLFundamentals2008SELECT empid,YEAR(orderdate) AS orderyear,COUNT(*) numordersFROM Sales.OrdersWHERE custid=71GROUP BY empid,YEAR(orderdate)HAVING COUNT(*) 1ORDER BY empid,orderyear
如上代碼,在 SQL 中邏輯處理順序如下:
USE TSQLFundamentals2008FROM Sales.OrdersWHERE custid=71GROUP BY empid,YEAR(orderdate)HAVING COUNT(*) 1SELECT empid,YEAR(orderdate) AS orderyear,COUNT(*) numordersORDER 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.2.1 FROM 子句
a. 用數據庫架構在限定代碼中的對象名稱,即使不用數據庫架構限定,Sql Server 也會隱式解析它,代價更高,初次之外,如果對象名相同,沒有架構限定,會產生歧義;
b.FROM * 性能比 FROM conum_name 性能低;
c.FROM 查詢得到的結果集順序是隨機的;
2.2.2 WHERE 子句
a. 過濾 FROM 階段返回的行;
b.WHERE 謂詞或邏輯表達式;
c.WHERE 子句對查詢性能有重要影響,在過濾表達式基礎上,Sql Server 會計算使用什么索引來訪問請求的數據;
d. 掃描整張表,返回所有可能的行,在客戶端過濾,開銷比較大,如產生大量的網絡傳輸流量;
e.T-SQL 使用三值謂詞邏輯(true,false,unknown);
2.2.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.2.4 HAVING 子句
a.HAVING 子句用于指定對組進行過濾的謂詞或邏輯表達式,這與 WHERE 階段對單獨的行進行過濾相對應;
b. 因為 HAVING 子句是在對行進行分組后處理的,所以可以在邏輯表達式中引用聚合函數,如 HAVING COUNT(*) 1,意味著 HAVING 階段過濾器只保留包含多行的組;
2.2.5 SELECT 子句
a.SELECT 子句用于指定需要在查詢返回的結果集中包含的屬性(列);
b.SELECT 子句返回列的名稱類型:
直接基于正在查詢的表的各個列三種方式定義別名,推薦使用 AS。表達式 AS 別名;別名 = 表達式 (別名 等號 表達式);表達式 別名 (表達式 空格 別名)沒有名字的列
c. 在關系模型中,所有操作和關系都基于關系代數和關系 (集合) 中的結果,但在 SQL 中,情況略有不同,因 SELECT 查詢并不保證返回一個真正的集合 (即,由唯一行組成的無序集合)。首先,SQL 不要求表必須符合集合條件。SQL 表可以沒有鍵,行也不一定具有唯一性,在這些情況下表都不是集合,而是多集(multiset) 或包(bag)。但即使正在查詢的表具有主鍵、也符合集合的條件,針對這個表的 SELECT 查詢任然可能返回包含重復的結果。在描述 SELECT 查詢的輸出時,經常會使用結果集這個屬于,不過,結果集并不一定非得嚴格滿足數學意義上的集合條件;
d.DISTINCT 約束,確保行的唯一性,刪除重復的行;
e. 盡量不用 SELECT * 形式查詢所有列,而盡量用列明;
2.2.6 ORDER BY
a. 理解 SQL 最重要的一點就是要明白表不保證是有序的,因為表是為了代表一個集合(如果有重復項,則是多集),而集合是無序的。這意味著,如果在查詢表時不指定一個 ORDER BY 子句,那么雖然查詢可以返回一個結果表,但 SQL Server 可以自由地按任意順序對結果張的行進行排序;
b. 在 ORDRTB BY 中使用 ASC 代表升序,DESC 代表降序,默認情況是升序;
c. 帶有 ORDER BY 子句的查詢會生成一種 ANSI 稱之為游標 (cursor) 的結果(一種非關系結果,其中的行具有固定的順序)。在 SQL 中的某些語言元素和運算預期只對查詢的表結果進行處理,而不能處理游標,如表表達式和集合運算;
3 問題答案
Q1:KEY
-- 方法 1select distinct studentName from StudentScoreswhere studentName not in (select distinct studentName from StudentScores where courseGrades =80)-- 方法 2select studentName from StudentScores group by studentName having min(courseGrades) 80
Q2:KEY
DELETE DEMO_DELTE WHERE ID NOT IN( SELECT min(ID) FROM DEMO_DELTE_2 GROUP BY xuehao,XM,kcbh,kcmc,fs)
Q3:KEY
SELECT team1.TeamName,team2.TeamName FROM Team team1,Team team2 WHERE team1.TeamName team2.TeamName
關于 SqlServer 中怎么實現表單查詢就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。