博主在工作中,常常需要使用sql語句來進行查詢,總結髮現,靈活使用這幾個要點,就可以應付大部分簡單情況。 一.連接:根據兩個或多個表中的列之間的關係,從這些表中查詢數據。 JOIN或INNER JOIN: 返回左表和右表中相互匹配的行 LEFT JOIN: 返回左表和右表中相互匹配的行,及左表中不相 ...
博主在工作中,常常需要使用sql語句來進行查詢,總結髮現,靈活使用這幾個要點,就可以應付大部分簡單情況。
一.連接:根據兩個或多個表中的列之間的關係,從這些表中查詢數據。
- JOIN或INNER JOIN: 返回左表和右表中相互匹配的行
- LEFT JOIN: 返回左表和右表中相互匹配的行,及左表中不相匹配的行
- RIGHT JOIN: 返回左表和右表中相互匹配的行,及右表中不相匹配的行
- FULL JOIN或FULL OUTER JOIN: 返回左表和右表中相互匹配的行,及不相匹配的行
- 應用舉例
- 在一些題目中沒有明確的暗示情況下,使用哪一種連接方式都可以;
- 也有一些情況,只能使用特定的連接方式。
1.join/inner join
必須使用inner join的情況
1 --查詢所有未講課的教師的Tname和Depart. 2 select TNAME,DEPART 3 from TEACHER 4 where TNO not in(select TEACHER.TNO from COURSE inner join 5 TEACHER on COURSE.TNO=TEACHER.TNO) 6 --或者使用 Except 7 select TNAME,DEPART from TEACHER 8 except 9 select TNAME,DEPART from COURSE join TEACHER on COURSE.TNO=TEACHER.TNO
上面的sql語句中的“select TEACHER.TNO from COURSE inner join TEACHER on COURSE.TNO=TEACHER.TNO”中,只能使用inner join,使用left join、right join、full join都是錯誤的。
2.left join和right join
使用了left join 的情況,調換一下表的位置,就可以用right join替換;反之亦然。
1 --查詢所有學生的Sname、Cname和Degree列。 2 select SNAME,CNAME,DEGREE 3 from STUDENT left join SCORE on STUDENT.SNO=SCORE.SNO 4 left join COURSE on SCORE.CNO=COURSE.CNO
也可以寫成
1 select SNAME,CNAME,DEGREE 2 from score right join STUDENT on STUDENT.SNO=SCORE.SNO 3 right join COURSE on SCORE.CNO=COURSE.CNO
3.使用full join的情況較少,暫時還沒有用到。
二、嵌套
在sql語言中,一個select-from-where語句成為一個查詢塊。
將一個查詢塊嵌套在另一個查詢塊的where子句或having短語的條件中的查詢成為嵌套查詢。
SQL語言允許多層嵌套查詢,但要註意的是,子查詢的select語句中不能使用order 不要子句,order by子句只能對最終查詢結果排序。
當掌握了sql語句的執行順序後,就會對這個限制的原因有更深刻的理解。
舉例
子查詢在where子句中
1 --查詢成績高於學號為“109”、課程號為“3-105”的成績的所有記錄。 2 select * from SCORE where DEGREE>(select DEGREE from SCORE where SNO='109' and CNO='3-105')
三、子查詢
上層的查詢塊稱為外層查詢或者父查詢,下層查詢塊稱為內層查詢或者子查詢。
子查詢的位置可以很靈活,掌握這一點,感覺sql學習就有了很大的進展。
1.子查詢可以放到where子句或having短語的條件中,這就是我們上面所介紹的嵌套查詢
2.子查詢可以出現在from子句中,這時子查詢生成的臨時派生表,稱為主查詢的查詢對象
1 --查詢所有選修了1號課程的學生姓名 (當然也可以使用嵌套查詢) 2 select Sname from Student,(select * from SC where cno='1') SC1 where Student.sno=SC1.sno
3.子查詢可以嵌套在INSERT語句中用以生成要插入的批量數據
1 --對每個系,求學生的平均年齡,再把結果插入Dept_age(Sdept,Avg_age)中 2 insert into Dept_age(Sdept,Avg_age) 3 select Sdept.AVG(Sage) 4 from Student 5 group by Sdept
要點總結
1.連接:inner join、right join、left join 、full join
2.嵌套:將一個查詢塊嵌套在另一個查詢塊的where子句或having短語的條件中
3.子查詢的位置可以很靈活