學生:學號,姓名,性別,年齡,系別,班級student(s#
char(8),sname char(10),s*** char(2),sage integer,d# char(2),sclass char(6
))院系:系別,系名,系主任
dept(d#
char(2),dname char(10),dean char(10
))課程:課程,課號,教師編號,學時,學分
course(c#
char(3),cname char(12),chours integer,credit float(1),t# char(3
))教師:教師編號,教師姓名,所屬院系,工資
teacher(t#
char(3),tname char(10),d# char(2),salary float(2
))選課:學號,課號,成績
sc(s#
char(8),c# char(3),score float(1))
1.子查詢解決的問題
(1)集合成員資格:某個元素是否是集合的元素
(2)集合之間比較:乙個集合是否包含另乙個集合
(3)集合基數測定:集合是否為空和集合是否有重複元組
2.子查詢
(1)定義:出現在 where 子句中的 select 語句被稱為子查詢 (subquery),子查詢返回了乙個集合,可以通過與這個集合的比較來確定另乙個查詢的集合
(2)分類:(not) in - 子查詢;θ - some/ θ - all 子查詢;(not) exists 子查詢
3.(not) in 子查詢
(1)基本語法:表示式 [not] in (子查詢)
(2)語義:判斷某一表示式的值是否在子查詢的結果中
4.非相關子查詢舉例
(2)列出張三,李四同學的所有資訊
select *
from student
where sname = "張三" or sname = "李四";
select *
from student
where sname in ("張三", "李四"); //直接用列舉的形式給出了子集合
(3)列出了選修了 001 號課程的學生的學號和姓名
select s#, sname
from student
where s# in (select s# from sc where c# = '001');
(4)求既學過 001 號課程,又學過 002 號課程的同學的學號
select s# from sc
where c# = '001' and s# in ( select s# from sc where c# = '002' );
(5)列出沒學過李明老師講授課程的所有同學姓名
select sname from student
where s# not in ( select s# from sc, coures c, teacher t where t.tname = '李明' and sc.c# = c.c# and t.t# = c.t# );
5.相關子查詢舉例
(1)相關子查詢:內層查詢需要依靠外層查詢的某些參量作為限定條件才能進行的子查詢,外層向內層傳遞的參量需要使用外層的表名或表別名來限定
(2)說明:外層查詢能向內層查詢傳遞引數,反之不成立,涉及到作用域原則
(3)求學過 001 號課程的同學的姓名
select sname from student
where s# in ( select s# from sc where student.s# = s# and c# = '001' );
sql複雜查詢
今天在review同事的 的時候,碰到乙個比較頭疼的資料庫查詢。例如,我想查列a的結果,但我要根據b列的值的情況來確定a列的輸出,說白了就是我可以自己控制得到的輸出。這個情況有兩種方法來實現。第一種是decode,這個關鍵字似乎只是oracle支援。而且也沒有解決我的問題,因為我覺得他類似於邏輯中的...
SQL 複雜查詢
近期碰到需要取日期最小的不同條件記錄的問題,請各位xdjm賜教!表a 表a 序號 材料 數量 入庫日期 1 a 8 2009 12 12 a 9 2009 12 53 b 12 2009 11 184 b 10 2009 11 195 c 5 2009 10 96 c 13 2009 11 8 想要...
sql複雜巢狀查詢
最近在做各類小應用,用到了mysql,有時候會用到一些比較複雜的巢狀查詢,在研究怎麼通過sql實現這些。假設下面這張表 stu 描述學生的基本資訊 idname grade 1jim72 tom8 3cake9 另外一張表 sco 描述學生的成績資訊 stu id subject score 1ma...