最近在複習mysql查詢操作,課本上有兩個例子感覺理解起來略顯晦澀,特記錄下來:
查詢選修了全部課程的學生姓名
查詢至少選秀了學生201215122選修的全部課程的學生號碼
對於第乙個問題,它可以等價於不存在一門課程是該學生沒有選的。
那麼首先,我們可以分析到開始一定是查詢學生的姓名:
select sname
from student
where + 條件
那麼條件是什麼呢?「不存在一門課他沒有選」
not exists + 有課程他沒有選修,也就是要把course中的所有課程拿出來找,找到他沒有選修過的。
select * from course
where + 條件
這個條件又是什麼呢?
只要在最後乙個select 中
select * from sc
where sno= student.sno
and cno= course.cno
將這個同學通過 sc 表 和 crouse的 課程連線一遍,找到連線不上的,即: 沒有選修的, 這樣就找到了一門課這個學生沒有選修, 存在沒有選修的課,那麼該學生被pass掉了。
最後我們可以構造以下sql語句:
select sname
from student
where not exists
(select *
from course
where not exists
(select *
from sc
where sno = student.sno
and cno = course.cno))
第二個問題,變換後,它等價於:不存在這樣的課程y,學生201215122選修了y,而學生x沒有選
select distinct sno
from sc s1
where not exists // 不存在
( select *
from sc s2
where s2.sno='201215122' and not exists // 201215122選了,y學生沒有選(對於被20121522選了的cno)
( select * //這門課在x中沒被選擇
from sc s3
where s1.sno=s3.sno and s3.cno=s2.cno //在x的選課列表中搜尋這門課
) );
mysql查詢總結
sql語句並不是按照 的順序來執行的 下面是 的執行順序 先找錶 然後找錶的關聯條件 然後進行關聯 關聯之後進行where處理 然後在進行字段選取,然後進行分組,排序,最後進行顯示limit 子查詢 就是一組巢狀的select查詢 缺點 子查詢執行效率非常低下,疑問子查詢比普通的關聯查詢 join ...
MySQL 總結MySQL模糊查詢
create table student id char 36 primary key,name varchar 8 not null age int 3 default0,mobile char 11 address varchar 150 insert into student values 9...
MySql模糊查詢總結
在mysql中如何使用模糊查詢呢?在where子句中,可以對datetime char varchar欄位型別的列用like子句配合萬用字元選取那些 很像.的資料記錄,以下是可使用的萬用字元 零或者多個字元 單一任何字元 下劃線 特殊字元 在某一範圍內的字元,如 0 9 或者 aeth 不在某範圍內...