sqlserver嵌套查詢
⑴ sqlserver三表聯查sql語句
假設學生表叫student,課程表叫class,選課表叫choose
1.三層嵌套的問題
select student.name from student where student.id IN
(select choose.sid from choose where choose.cid NOT IN
(select class.id from class where class.teacher='李明'))
2.一個內連接,一個嵌套
select student.name,avg(choose.score) from
student inner join choose on student.id=choose.sid
where student.id IN
(select choose.sid from choose
where choose.score<'60'
group by choose.sid
having count(choose.sid)>=2)
gruop by student.id
3.一個聯合查詢,一個嵌套查詢
select student.name from student
where student.id IN
(select c1.sid from choose c1 where choose.cid='1'
union
select c2.sid from choose c2 where choose.cid='2'
on c1.sid=c2.sid
)
4.其實就是自連接查詢和行列交換的問題:
select student.id,
(case choose.id when '1' then choose.score end) as 1號課成績,
(case choose.id when '2' then choose.score end) as 2號課成績,
from student inner join choose on student.id=choose.sid sc1,
student inner join choose on student.id=choose.sid sc2
where sc1.id='1'
and sc2.id='2'
and sc1.score>sc2.score
⑵ sql server多個表統計查詢
不知道你碰到那個知識點的問題了!我就給你說說我對SqlServer多個表查詢的理解!SqlServer
多個表的統計查詢有三種方式1:嵌套查詢
2:連接查詢3:聯合查詢
;(我用表名為student
的表做例子)
嵌套查詢一般使用
Select
*
from
student
where
或者
having
;連接查詢就是將多個表或某些列為條件進行連接,從而查詢數據!連接查詢分:
交叉連接
內連接
外連接
自連接;聯合查詢就是得使用union
關鍵字將兩個select語句聯合起來,進行數據查詢!只要你做過題,你就會明白其中的每種連接方式的優勢!希望對你有所幫助!
⑶ sql server中 in() 嵌套問題
sqlserver嵌套查詢語句中使用in或者exists的場景和原則如下:
如果查詢的兩個表大小相當,那麼用in和exists差別不大。兩者都可以使用。
in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。所以當有多重循環,使用in更合適,效率越高。
如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。
NOT EXISTS,exists的用法跟in不一樣,一般都需要和子表進行關聯,而且關聯時,需要用索引,這樣就可以加快速度。
⑷ SQL Sever子查詢與嵌套查詢的區別
SQLServer子查詢可以分為 相關子查詢 和 嵌套子查詢 兩類。前提,
假設Books表如下:
類編號 圖書名 出版社 價格
--------------------------------------------------------
2 c#高級應用 聖通出版 23.00
2 Jsp開發應用 機械出版社 45.00
3 高等數學 濟南出版社 25.00
3 瘋狂英語 清華大學出版社 32.00
嵌套子查詢的執行不依賴與外部的查詢。
執行過程:
(1)執行子查詢,其結果不被顯示,而是傳遞給外部查詢,作為外部查詢的條件使用。
(2)執行外部查詢,並顯示整個結果。
嵌套子查詢一般可以分為:返回單值的子查詢 和 返回一個列表的子查詢 ,
下面舉例說明:1.返回單值: --查詢所有價格高於平均價格的圖書名,作者,出版社和價格。 USE tempdb
GO
SElECT 圖書名,作者,出版社,價格
FROM Books
WHERE 價格 >
(
SELECT AVG(價格)
FROM Books
)
GO2.返回值列表--查詢所有借閱圖書的讀者信息 SElECT *
FROM Readers
WHERE 讀者編號 IN
(
SELECT 讀者編號
FROM [Borrow History]
)
GO
相關子查詢的執行依賴於外部查詢。多數情況下是子查詢的WHERE子句中引用了外部查詢的表。
執行過程:
(1)從外層查詢中取出一個元組,將元組相關列的值傳給內層查詢。
(2)執行內層查詢,得到子查詢操作的值。
(3)外查詢根據子查詢返回的結果或結果集得到滿足條件的行。
(4)然後外層查詢取出下一個元組重復做步驟1-3,直到外層的元組全部處理完畢。
下面舉例說明:
查詢Booka表中大於該類圖書價格平均值的圖書信息SElECT 圖書名,出版社,類編號,價格
SELECT FROM Books As a
WHERE 價格 >
(
SELECT AVG(價格)
FROM Books AS b
WHERE a.類編號=b.類編號
)
GO
與前面介紹過的子查詢不同,相關子查詢無法獨立於外部查詢而得到解決。該子查詢需要一個「類編號」的值。而這個值是個變數,隨SQLSever檢索Books表中的不同行而改變。下面詳細說明該查詢執行過程:
先將Books表中的第一條記錄的「類編號」的值「2」代入子查詢中,子查詢變為:
SELECT AVG(價格)
FROM Books AS b
WHERE b.類編號=2
子查詢的結果為該類圖書的平均價格,所以外部查詢變為:
SElECT 圖書名,出版社,類編號,價格
FROM Books As a
WHERE 價格 > 34
如果WHERE條件為True,則第一條結果包括在結果集中,則否不包括。對Books表中的所有行運行相同的過程,最後形成的結果集及最後返回結果。
⑸ sql server 嵌套查詢語句中什麼時候用in,什麼時候又用exists!
sqlserver嵌套查詢語句中使用in或者exists的場景和原則如下:
如果查詢的兩個表大小相當,那麼用in和exists差別不大。兩者都可以使用。
in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。所以當有多重循環,使用in更合適,效率越高。
如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。
NOT EXISTS,exists的用法跟in不一樣,一般都需要和子表進行關聯,而且關聯時,需要用索引,這樣就可以加快速度。
⑹ SqlServer嵌套查詢
select * from a where goodsid in (select b.goodsid from b ) and goodsid in (select c.goodsid from c)
或者
select * from a,b,c where a.goodsid=b.goodsid and a.goodsid=c.goodsid;
*號可以寫為a.*,b.*,c.*