sql server高级查询,看这篇文章就够了
先選擇一個數據庫
use jobtest go引入:該數據庫jobtest里面有兩張表,Student學生表和Grade年級表,表中的數據如下所示:
學生表Student:
年級Grade表:
接下來我們來看看sql server中的子查詢:
子查詢
1.查詢編號比李太白大的學生信息
--先獲取李太白的編號 declare @sid int ; select @sid = sid from student where sname = '李太白' --再查詢編號比@sid大的信息 select * from student where sid>@sid當然我們也可以改成子查詢:
—可以改成子查詢(將@sid替換成獲取李太白編號的sql語句)
select * from student where sid>(select sid from student where sname = '李太白')其運行結果都是:
以上就是一個最簡單的子查詢。
習慣上,外面的查詢稱為父查詢,括號里面的則是子查詢,返回結果集。因為子查詢作為where條件的一部分,所以還可以和update、insert以及delete一起使用,語法和select的類似。
注意:將子查詢和比較運算符聯合使用,必須保證子查詢返回的值不多于一個。
還有一個就是:
select * from student不如select sid,sname,sphone,spass,sgid from student的效率高,可維護性也比不上,所以一般使用后者。
下面我們再來一個子查詢的案例
需求:查詢青鳥一班的學生信息
我們可以看到思路是這樣的:
(1)先根據年級名稱查詢出年級編號
(2)學生表里面的年級編號讓和查詢出來的年級編號對應起來就可以了
select * from student where sgid = (select gid from grade where gname = '青鳥一班')運行結果:
in和not in查詢
前面我們說過,將子查詢和比較運算符聯合使用,必須保證子查詢返回的值不多于一個。
如果返回多個值的話會怎么樣呢?我們不妨來試試、
查詢學生表中,年級編號是1的年級名稱
select gname from grade where gid =(select sgid from student where sgid = 1)運行結果:
可見,程序給我報異常了,表示子查詢返回了多個結果。
正確寫法應該是這樣的:
select gname from grade where gid in(select sgid from student where sgid = 1)in子查詢適合用在子查詢結果集返回多條記錄的情況下。
反過來not in就是正好與in取反,還是同樣上面給出的例子,我們換成not in看看結果是什么樣的?
select gname from grade where gid not in(select sgid from student where sgid = 1)結果:
很明顯,除了青鳥一班,其余年級名稱均已輸出。
exists和no exists
exists,只注重子查詢是否有返回行,如查有返回行結果為真,否則為假,并不適用子查詢的結果,僅使用測試子查詢是否有返回結果
下面來舉例說明一下:
查詢是否有編號為6的學生信息,如果有,則輸出‘有編號是6的學生’
if exists(select * from student where sid = 6) print '有編號是6的學生'運行結果為:
因為表中并沒有編號是6的學生信息。
而not exists正好與exists相反,還是利用上面的案例
if not exists(select * from student where sid = 6) print '有編號是6的學生'運行結果為:
總結
以上是生活随笔為你收集整理的sql server高级查询,看这篇文章就够了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本电脑怎样配置够用?
- 下一篇: 好多人都说存储过程很难?认真看这篇文章就