資料庫 查詢語句

2021-07-04 03:09:56 字數 2354 閱讀 5265

隱式連線:

select coursename, teachername

from courses 

inner join teachers

on courses.teacherid = teahcer.teacherid

等價於顯式連線

select coursename, teachername

from courses, teachers

where courses.teacherid = teahcer.teacherid

很明顯顯式連線更好用

規範化資料庫的設計目標是將冗餘降到最低,而非規範化資料庫則是為了優化讀取時間。

例如courses和teachers的資料,courses可能含有teacherid列,只是指向teachers的外來鍵。這麼做的好處之一是,關於教師的資訊(姓名,住址等)在資料庫中只有乙份。缺點是大量常用的查詢需要執行開銷很大的鏈結操作。

那麼我們可以儲存冗餘資料,是資料庫非規範化。例如,如果預計到這類查詢會頻繁執行,可以將教師姓名存到courses表中,非規範化通常用於構建高可擴充套件性系統。

乙個資料庫的簡單結構如下:

courses:courseid, coursename, teacherid

teachers:teacherid,teachername

students:studentid, studentname

studentcourses:courseid, studentid

問題1:

實現乙個查詢,列出所有學生,以及每個學生選修了幾門課程

select students.studentname,students.studentid

count(studentcourses.courseid

) as [cnt]

from students 

left join studentcourses

on students.studentid = studentcourses.studentid 

group by students.

studentid, students.

studentname

1. 有可能有學生一門課都沒有選,所以要用left join而不是inner join。

left join 關鍵字會從左表 (table_name1) 那裡返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。

select column_name(s)

from table_name1

left join table_name2

on table_name1.column_name=table_name2.column_name

2. 如果只按照

studentid分組,資料庫不知道該返回哪個studentname,所以還要將studentname也加入到group by字句裡

問題2: 教師班級規模

實現乙個查詢,取得乙份所有教師的列表,以及每位教師要教多少學生。如果一位教師給某個學生教授兩門課程,那麼這個學生就要計入兩次。

根據教師教授的學生人數,將列表結果從大到小排列。

先取得乙份teahcerid列表,以及有多少學生跟各個teacherid有關聯:

select courses.teacherid, count( studentcourses.studentid 

) as [number]

from courses, studentcourses

where courses.courseid = studentcourses.courseid

gourp by courses.teacherid

然後將上面的結果與包含所有教師的列表相連線

select teachername, isnull(studentsize.number, 0)

from teachers left join

( select courses.teacherid, count( studentcourses.studentid ) as [number]

from courses, studentcourses

where courses.courseid = studentcourses.courseid

gourp by courses.teacherid )

on teachers.teacherid = studentsize.teacherid

orderby studentsize.teacherid desc

資料庫查詢語句

表示要查詢所有列 select from t student 查詢所有人的姓名資訊 select stu name from t student 查詢張乾的手機號和位址 select stu mobile,stu address from t student where stu name 張乾 查詢...

資料庫高階查詢語句

巢狀子查詢 子查詢的優勢和特點 使用靈活,可以成為sql語句的多個部分 子查詢作為查詢條件使用 子查詢作為臨時表使用 降低sql語句的複雜度,提高sql語句的可讀性 作為臨時表使用 例 select stuname subject,score from select from stuinfo whe...

資料庫SQL語句查詢

新手小白菜一枚,求知 查詢所有同學的學號 姓名 選課數 總成績 select t1.stuid,t1.stuname,count t2.courseid sum score from tblstudent t1,tblscore t2 where t1.stuid t2.stuid group by...