隱式連線:
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)2. 如果只按照from table_name1
left join table_name2
on table_name1.column_name=table_name2.column_name
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...