主頁(yè) > 知識(shí)庫(kù) > SqlServer 表單查詢(xún)問(wèn)題及解決方法

SqlServer 表單查詢(xún)問(wèn)題及解決方法

熱門(mén)標(biāo)簽:智能語(yǔ)音外呼系統(tǒng)選哪家 奧威地圖標(biāo)注多個(gè)地方 百度地圖標(biāo)注不同路線(xiàn) 武漢長(zhǎng)沙外呼系統(tǒng)方法和技巧 千呼電銷(xiāo)機(jī)器人價(jià)格 優(yōu)質(zhì)地圖標(biāo)注 外呼系統(tǒng)電銷(xiāo)專(zhuān)用 京華物流公司地圖標(biāo)注 怎樣在地圖上標(biāo)注路線(xiàn)圖標(biāo)

Q1:表StudentScores如下,用一條SQL語(yǔ)句查詢(xún)出每門(mén)課都大于80分的學(xué)生姓名

Q2:表DEMO_DELTE如下,刪除除了自動(dòng)編號(hào)不同,其他都相同的學(xué)生冗余信息

Q3:Team表如下,甲乙丙丁為四個(gè)球隊(duì),現(xiàn)在四個(gè)球?qū)M(jìn)行比賽,用一條sql語(yǔ)句顯示所有可能的比賽組合

Q4:請(qǐng)考慮如下SQL語(yǔ)句在Microsoft SQL Server 引擎中的邏輯處理順序

USE TSQLFundamentals2008

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

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

2 SELECT語(yǔ)句的元素

2.1 常規(guī)查詢(xún)子句和邏輯處理順序

對(duì)數(shù)據(jù)表進(jìn)行檢索查詢(xún)時(shí),查詢(xún)語(yǔ)句一般包括FROM,WHERE,GROUP BY,HAVING,SELECT,ORDER BY,TOP,OVER等子句,請(qǐng)考慮如下例子的邏輯處理順序。

USE TSQLFundamentals2008

SELECT empid,YEAR(orderdate) AS orderyear,COUNT(*) numorders
FROM Sales.Orders
WHERE custid=71
GROUP BY empid,YEAR(orderdate)
HAVING COUNT(*)>1
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

邏輯處理順序可歸結(jié)為如下:

注釋?zhuān)?/p>

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

b.邏輯處理順序的每一步返回的結(jié)果集均是緊接著該步語(yǔ)句的下一步語(yǔ)句要執(zhí)行的結(jié)果集;

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

2.2 部分查詢(xún)子句講解

2.2.1 FROM子句

a.用數(shù)據(jù)庫(kù)架構(gòu)在限定代碼中的對(duì)象名稱(chēng),即使不用數(shù)據(jù)庫(kù)架構(gòu)限定,Sql Server也會(huì)隱式解析它,代價(jià)更高,初次之外,如果對(duì)象名相同,沒(méi)有架構(gòu)限定,會(huì)產(chǎn)生歧義;

b.FROM * 性能比 FROM conum_name性能低;

c.FROM查詢(xún)得到的結(jié)果集順序是隨機(jī)的;

2.2.2 WHERE子句

a.過(guò)濾FROM階段返回的行;

b.WHERE 謂詞或邏輯表達(dá)式;

c.WHERE子句對(duì)查詢(xún)性能有重要影響,在過(guò)濾表達(dá)式基礎(chǔ)上,Sql Server會(huì)計(jì)算使用什么索引來(lái)訪(fǎng)問(wèn)請(qǐng)求的數(shù)據(jù);

d.掃描整張表,返回所有可能的行,在客戶(hù)端過(guò)濾,開(kāi)銷(xiāo)比較大,如產(chǎn)生大量的網(wǎng)絡(luò)傳輸流量;

e.T-SQL使用三值謂詞邏輯(true,false,unknown);

2.2.3 GROUP BY子句

a.GROUP BY階段將上一階段邏輯查詢(xún)處理返回的行按“組”進(jìn)行組合,每個(gè)組由在GROUP BY子句中指定的個(gè)元素決定;

b.如果查詢(xún)語(yǔ)句中涉及到分組,那么GROUP BY階段之后測(cè)所有階段(包括HAVING、SELECT以及ORDER BY)的操作對(duì)象將是組,而不是單獨(dú)的行。每個(gè)組最終表示為查詢(xún)結(jié)果集中的一行;

c.GROUP BY階段之后處理的子句中指定的所有表達(dá)式務(wù)必保證為每個(gè)組只返回一個(gè)標(biāo)量(單值)。以GROUP BY列表中的元素為基礎(chǔ)的表達(dá)式滿(mǎn)足這一要求,因?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來(lái)處理非重復(fù)數(shù),如count(distinct vary);

2.2.4 HAVING子句

a.HAVING子句用于指定對(duì)組進(jìn)行過(guò)濾的謂詞或邏輯表達(dá)式,這與WHERE階段對(duì)單獨(dú)的行進(jìn)行過(guò)濾相對(duì)應(yīng);

b.因?yàn)镠AVING子句是在對(duì)行進(jìn)行分組后處理的,所以可以在邏輯表達(dá)式中引用聚合函數(shù),如 HAVING COUNT(*)>1,意味著HAVING階段過(guò)濾器只保留包含多行的組;

2.2.5 SELECT 子句

a.SELECT子句用于指定需要在查詢(xún)返回的結(jié)果集中包含的屬性(列);

b.SELECT子句返回列的名稱(chēng)類(lèi)型:

直接基于正在查詢(xún)的表的各個(gè)列三種方式定義別名,推薦使用AS。表達(dá)式>AS別名>;別名>=表達(dá)式>(別名 等號(hào) 表達(dá)式);表達(dá)式> 別名>(表達(dá)式 空格 別名)沒(méi)有名字的列

c.在關(guān)系模型中,所有操作和關(guān)系都基于關(guān)系代數(shù)和關(guān)系(集合)中的結(jié)果,但在SQL中,情況略有不同,因SELECT查詢(xún)并不保證返回一個(gè)真正的集合(即,由唯一行組成的無(wú)序集合)。首先,SQL不要求表必須符合集合條件。SQL表可以沒(méi)有鍵,行也不一定具有唯一性,在這些情況下表都不是集合,而是多集(multiset)或包(bag)。但即使正在查詢(xún)的表具有主鍵、也符合集合的條件,針對(duì)這個(gè)表的SELECT查詢(xún)?nèi)稳豢赡芊祷匕貜?fù)的結(jié)果。在描述SELECT查詢(xún)的輸出時(shí),經(jīng)常會(huì)使用結(jié)果集這個(gè)屬于,不過(guò),結(jié)果集并不一定非得嚴(yán)格滿(mǎn)足數(shù)學(xué)意義上的集合條件;

d.DISTINCT約束,確保行的唯一性,刪除重復(fù)的行;

e.盡量不用SELECT * 形式查詢(xún)所有列,而盡量用列明;

2.2.6 ORDER BY

a.理解SQL最重要的一點(diǎn)就是要明白表不保證是有序的,因?yàn)楸硎菫榱舜硪粋€(gè)集合(如果有重復(fù)項(xiàng),則是多集),而集合是無(wú)序的。這意味著,如果在查詢(xún)表時(shí)不指定一個(gè)ORDER BY子句,那么雖然查詢(xún)可以返回一個(gè)結(jié)果表,但SQL Server可以自由地按任意順序?qū)Y(jié)果張的行進(jìn)行排序;

b.在ORDRTB BY中使用ASC代表升序,DESC代表降序,默認(rèn)情況是升序;

c.帶有ORDER BY子句的查詢(xún)會(huì)生成一種ANSI稱(chēng)之為游標(biāo)(cursor)的結(jié)果(一種非關(guān)系結(jié)果,其中的行具有固定的順序)。在SQL中的某些語(yǔ)言元素和運(yùn)算預(yù)期只對(duì)查詢(xún)的表結(jié)果進(jìn)行處理,而不能處理游標(biāo),如表表達(dá)式和集合運(yùn)算;

3 問(wèn)題答案

Q1:KEY

--方法1
select distinct studentName 
from StudentScores
where studentName not in 
(
select distinct studentName 
from StudentScores 
where courseGrades=80
)

--方法2
select 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.TeamNameteam2.TeamName

Q4:KEY

參照第2章分析。

4 參考文獻(xiàn)

【01】Microsoft SqlServer 2008技術(shù)內(nèi)幕:T-SQL語(yǔ)言基礎(chǔ)

【02】Microsoft SqlServer 2008技術(shù)內(nèi)幕:T-SQL查詢(xún)

【03】程序員的SQL經(jīng)典

PS:下面給大家分享一段代碼

sqlserver查詢(xún)數(shù)據(jù)的所有表名和行數(shù)

//查詢(xún)所有表明select name from sysobjects where xtype='u'
select * from sys.tables//查詢(xún)數(shù)據(jù)庫(kù)中所有的表名及行數(shù)
SELECT a.name, b.rows
FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id
WHERE (a.type = 'u') AND (b.indid IN (0, 1))
ORDER BY a.name,b.rows DESC
//查詢(xún)所有的標(biāo)明及空間占用量\行數(shù)
select
object_name(id) tablename,
8*reserved/1024 reserved,
rtrim(8*dpages)+'kb' used,
8*(reserved-dpages)/1024 unused,
8*dpages/1024-rows/1024*minlen/1024 free,
rows
--,*
from sysindexes
where indid=1
order by tablename,reserved desc

總結(jié)

以上所述是小編給大家介紹的SqlServer 表單查詢(xún)問(wèn)題及解決方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

您可能感興趣的文章:
  • SqlServer 按時(shí)間段查詢(xún)問(wèn)題
  • SqlServer查詢(xún)和Kill進(jìn)程死鎖的語(yǔ)句
  • SqlServer使用 case when 解決多條件模糊查詢(xún)問(wèn)題
  • JavaScript生成SQL查詢(xún)表單的方法

標(biāo)簽:防疫戰(zhàn)設(shè) 來(lái)賓 威海 益陽(yáng) 七臺(tái)河 宿州 銅仁 天水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SqlServer 表單查詢(xún)問(wèn)題及解決方法》,本文關(guān)鍵詞  SqlServer,表單,查詢(xún),問(wèn)題,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SqlServer 表單查詢(xún)問(wèn)題及解決方法》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于SqlServer 表單查詢(xún)問(wèn)題及解決方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章