sql 語句 嵌套子查詢 執行順序分析


--創建測試數據
create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))
insert into Student values('01' , N'趙雷' , '1990-01-01' , N'男')
insert into Student values('02' , N'錢電' , '1990-12-21' , N'男')
insert into Student values('03' , N'孫風' , '1990-05-20' , N'男')
insert into Student values('04' , N'李雲' , '1990-08-06' , N'男')
insert into Student values('05' , N'周梅' , '1991-12-01' , N'女')
insert into Student values('06' , N'吳蘭' , '1992-03-01' , N'女')
insert into Student values('07' , N'鄭竹' , '1989-07-01' , N'女')
insert into Student values('08' , N'王菊' , '1990-01-20' , N'女')

create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10))
insert into Course values('01' , N'語文' , '02')
insert into Course values('02' , N'數學' , '01')
insert into Course values('03' , N'英語' , '03')
insert into Course values('04' , N'法語' , '03')

create table Teacher(T# varchar(10),Tname nvarchar(10))
insert into Teacher values('01' , N'張三')
insert into Teacher values('02' , N'李四')
insert into Teacher values('03' , N'王五')

create table SC(S# varchar(10),C# varchar(10),score decimal(18,1))
insert into SC values('01' , '01' , 80)
insert into SC values('01' , '02' , 90)
insert into SC values('01' , '03' , 99)
insert into SC values('02' , '01' , 70)
insert into SC values('02' , '02' , 60)
insert into SC values('02' , '03' , 80)
insert into SC values('03' , '01' , 80)
insert into SC values('03' , '02' , 80)
insert into SC values('03' , '03' , 80)
insert into SC values('04' , '01' , 50)
insert into SC values('04' , '02' , 30)
insert into SC values('04' , '03' , 20)
insert into SC values('05' , '01' , 76)
insert into SC values('05' , '02' , 87)
insert into SC values('06' , '01' , 31)
insert into SC values('06' , '03' , 34)
insert into SC values('07' , '02' , 89)
insert into SC values('07' , '03' , 98)
insert into SC values('07' , '04' , 90)

 

題目:--7.查詢學過“王五”老師所教的所有課的同學的學號、姓名;

答案:select s#,sname from Student where s# in(
select s# from SC,Course,Teacher where SC.C#=Course.C#
and Teacher.T#=Course.T# and Teacher.Tname='王五'
group by S# having COUNT(SC.C#)=(
select COUNT(c#) from Course,Teacher where Teacher.T#=Course.T# and Tname='王五'))

自己的答案:

select a.s#,a.Sname,a.score,b.score2 from (select Student.Sname,Student.S#,SC.score from sc,student where SC.S#=Student.S# and sc.c#='02') a ,
(select Student.Sname,Student.S#,SC.score as score2 from SC,Student where sc.S#=Student.S# and sc.C#='01') b where a.s#=b.s# and score2 <score

對其中的 的部分語句進行分析(是可單獨執行到的)

SELECT Student.s#,Student.Sname,score ,
(SELECT score FROM SC SC_2 WHERE SC_2.s#=Student.s# AND SC_2.c#='01') score2
FROM Student,SC WHERE Student.s#=SC.s# AND c#='02'

通過看執行計划,可知,是先執行的子查詢,然后在執行外面的。

如果細心的去看,你會發現這個語句的查詢與子查詢的表是一樣的,所以我們可以試想一下,如果我把這個語句分開分別得到什么結果:

select Student.Sname,Student.S#,SC.score from sc,student where SC.S#=Student.S# and sc.c#='02'

select Student.Sname,Student.S#,SC.score as score2 from SC,Student where sc.S#=Student.S# and  sc.C#='01'

那么如果我們在通過where 或者left,right連接會有什么不同呢,你會發現,上面的子查詢相當是分別滿足某些條件的數據(兩個基本相同的表的數據)進行left關聯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM