您好,登錄后才能下訂單哦!
這篇文章給大家介紹SqlServer中怎么實(shí)現(xiàn)表單查詢,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
SELECT語句的元素
2.1 常規(guī)查詢子句和邏輯處理順序
對(duì)數(shù)據(jù)表進(jìn)行檢索查詢時(shí),查詢語句一般包括FROM,WHERE,GROUP BY,HAVING,SELECT,ORDER BY,TOP,OVER等子句,請(qǐng)考慮如下例子的邏輯處理順序。
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
邏輯處理順序可歸結(jié)為如下:
注釋:
a.在常規(guī)編程語言中,如c++,java,c#等,程序按照“從上往下”的順序一步一步地執(zhí)行,然而在SQL中,SELECT語句所處位置雖然在最開始,卻不是在最先執(zhí)行的;
b.邏輯處理順序的每一步返回的結(jié)果集均是緊接著該步語句的下一步語句要執(zhí)行的結(jié)果集;
c.FROM獲取數(shù)據(jù)源(或者數(shù)據(jù)表),WHERE在FROM基礎(chǔ)上過濾條件,GROUP BY在WHERE的基礎(chǔ)上按照至少一列對(duì)集合進(jìn)行分組,HAVING在GROUP BY基礎(chǔ)上,對(duì)已經(jīng)分組的集合進(jìn)行過濾,SELECT語句在HAVING基礎(chǔ)上檢索,ORDER BY在SELECT基礎(chǔ)上按照一定條件進(jìn)行排序;
2.2 部分查詢子句講解
2.2.1 FROM子句
a.用數(shù)據(jù)庫架構(gòu)在限定代碼中的對(duì)象名稱,即使不用數(shù)據(jù)庫架構(gòu)限定,Sql Server也會(huì)隱式解析它,代價(jià)更高,初次之外,如果對(duì)象名相同,沒有架構(gòu)限定,會(huì)產(chǎn)生歧義;
b.FROM * 性能比 FROM conum_name性能低;
c.FROM查詢得到的結(jié)果集順序是隨機(jī)的;
2.2.2 WHERE子句
a.過濾FROM階段返回的行;
b.WHERE 謂詞或邏輯表達(dá)式;
c.WHERE子句對(duì)查詢性能有重要影響,在過濾表達(dá)式基礎(chǔ)上,Sql Server會(huì)計(jì)算使用什么索引來訪問請(qǐng)求的數(shù)據(jù);
d.掃描整張表,返回所有可能的行,在客戶端過濾,開銷比較大,如產(chǎn)生大量的網(wǎng)絡(luò)傳輸流量;
e.T-SQL使用三值謂詞邏輯(true,false,unknown);
2.2.3 GROUP BY子句
a.GROUP BY階段將上一階段邏輯查詢處理返回的行按“組”進(jìn)行組合,每個(gè)組由在GROUP BY子句中指定的個(gè)元素決定;
b.如果查詢語句中涉及到分組,那么GROUP BY階段之后測(cè)所有階段(包括HAVING、SELECT以及ORDER BY)的操作對(duì)象將是組,而不是單獨(dú)的行。每個(gè)組最終表示為查詢結(jié)果集中的一行;
c.GROUP BY階段之后處理的子句中指定的所有表達(dá)式務(wù)必保證為每個(gè)組只返回一個(gè)標(biāo)量(單值)。以GROUP BY列表中的元素為基礎(chǔ)的表達(dá)式滿足這一要求,因?yàn)榘凑斩x,在每個(gè)組中GROUP BY元素只唯一出現(xiàn)一次;
d.聚合函數(shù)只為每個(gè)組返回一個(gè)值,所以一個(gè)元素如果不再GROUP BY列表中出現(xiàn),就只能作為聚合函數(shù)(COUNT、SUM、AVG、MIN和MAX)的輸入。(注意:若有GROUP BY子句,聚合函數(shù)只操作具體的每組,而非所有組);
e.所有聚合函數(shù)都會(huì)忽略NULL,但COUNT(*)除外;
f.在聚合函數(shù)中,可以使用distinct來處理非重復(fù)數(shù),如count(distinct vary);
2.2.4 HAVING子句
a.HAVING子句用于指定對(duì)組進(jìn)行過濾的謂詞或邏輯表達(dá)式,這與WHERE階段對(duì)單獨(dú)的行進(jìn)行過濾相對(duì)應(yīng);
b.因?yàn)镠AVING子句是在對(duì)行進(jìn)行分組后處理的,所以可以在邏輯表達(dá)式中引用聚合函數(shù),如 HAVING COUNT(*)>1,意味著HAVING階段過濾器只保留包含多行的組;
2.2.5 SELECT 子句
a.SELECT子句用于指定需要在查詢返回的結(jié)果集中包含的屬性(列);
b.SELECT子句返回列的名稱類型:
直接基于正在查詢的表的各個(gè)列三種方式定義別名,推薦使用AS。<表達(dá)式>AS<別名>;<別名>=<表達(dá)式>(別名 等號(hào) 表達(dá)式);<表達(dá)式> <別名>(表達(dá)式 空格 別名)沒有名字的列
c.在關(guān)系模型中,所有操作和關(guān)系都基于關(guān)系代數(shù)和關(guān)系(集合)中的結(jié)果,但在SQL中,情況略有不同,因SELECT查詢并不保證返回一個(gè)真正的集合(即,由唯一行組成的無序集合)。首先,SQL不要求表必須符合集合條件。SQL表可以沒有鍵,行也不一定具有唯一性,在這些情況下表都不是集合,而是多集(multiset)或包(bag)。但即使正在查詢的表具有主鍵、也符合集合的條件,針對(duì)這個(gè)表的SELECT查詢?nèi)稳豢赡芊祷匕貜?fù)的結(jié)果。在描述SELECT查詢的輸出時(shí),經(jīng)常會(huì)使用結(jié)果集這個(gè)屬于,不過,結(jié)果集并不一定非得嚴(yán)格滿足數(shù)學(xué)意義上的集合條件;
d.DISTINCT約束,確保行的唯一性,刪除重復(fù)的行;
e.盡量不用SELECT * 形式查詢所有列,而盡量用列明;
2.2.6 ORDER BY
a.理解SQL最重要的一點(diǎn)就是要明白表不保證是有序的,因?yàn)楸硎菫榱舜硪粋€(gè)集合(如果有重復(fù)項(xiàng),則是多集),而集合是無序的。這意味著,如果在查詢表時(shí)不指定一個(gè)ORDER BY子句,那么雖然查詢可以返回一個(gè)結(jié)果表,但SQL Server可以自由地按任意順序?qū)Y(jié)果張的行進(jìn)行排序;
b.在ORDRTB BY中使用ASC代表升序,DESC代表降序,默認(rèn)情況是升序;
c.帶有ORDER BY子句的查詢會(huì)生成一種ANSI稱之為游標(biāo)(cursor)的結(jié)果(一種非關(guān)系結(jié)果,其中的行具有固定的順序)。在SQL中的某些語言元素和運(yùn)算預(yù)期只對(duì)查詢的表結(jié)果進(jìn)行處理,而不能處理游標(biāo),如表表達(dá)式和集合運(yùn)算;
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
關(guān)于SqlServer中怎么實(shí)現(xiàn)表單查詢就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。