數據分析sql從入門到精通--sql子查詢和嵌套查詢

到現在為止我們處理的查詢語句都是單條語句查詢,sql允許創建子查詢,即嵌套查詢,一個查詢語句(select-from-where)在另外的查詢語句中使用,子查詢的select查詢總是使用圓括號括起來。子查詢可以返回一個值或者一組值,用於前面查詢計算或者過濾。

一、where in 子查詢

in關鍵字用於where子句中用來判斷查詢的表達式是否在多個值的列表中。返回滿足in列表中的滿足條件的記錄。查詢所有數據庫課程大於80分的學生基本信息;

  1. 查詢數據庫課程的ID
  2. 獲取數據庫課程ID大於80分的學生ID
  3. 根據學生ID獲取相關信息

SELECT NO,NAME FROM course WHERE NAME='數據庫';

返回結果C01;

SELECT sno,grade FROM coursegrade WHERE cno='C01' ANDgrade>80;

返回結果9512101和9512102;

SELECT * FROM student WHERE NO IN(9512101,9512102);

返回所有學生信息;整合所有語句得到結果:

SELECT * FROM student WHERE NO IN(SELECT sno FROMcoursegrade WHERE cno='C01' AND grade>80 );

二、作為計算字段的子查詢

計算所有學生各科成績

SELECT NAME,department, (SELECT SUM(grade) FROM coursegrade WHERE coursegrade.sno=student.no) AS course Total FROM student;

三、whereEXISTS子查詢

EXISTS是sql中的邏輯運算符號,如果子查詢有結果集返回,那麼就為True,EXISTS代表“存在”的意義,它隻查找滿足條件的那些記錄,一旦找到第一個匹配的記錄後,就馬上停止查找。查詢如果存在不及格學生則返回所有學生信息;

SELECT * FROM student WHERE EXISTS (SELECT * FROM coursegrade WHERE grade<60);

EXISTS(包括 NOT EXISTS )子句的返回值是一個BOOL值。將外查詢表的每一行,代入內查詢作為檢驗,如果內查詢返回的結果取非空值,則EXISTS子句返回TRUE,這一行行可作為外查詢的結果行,否則不能作為結果。

四、where all any子查詢

all是sql中的邏輯運算符好,如果一系列的比較都為true,那麼結果才能為true。返回的結果集為多個的子查詢,為多行子查詢,多行子比較符有 IN(等於列中任意一個)、ANY(和子查詢返回的某個值比較),ALL(和子查詢返回的所有值比較)。查詢其他課程中比數據庫課程的所有分數低的學生的學號、姓名、課程名和分數。

獲取數據庫課程的所有分數:

SELECT grade FROM coursegrade WHERE coursegrade.cno = 'C01';

獲取比所有數據庫課程分數低的學生的信息:

SELECT NO, NAME, department, coursegrade.grade FROM student, coursegrade WHERE (student.no=coursegrade.sno) AND coursegrade.grade < ALL(SELECT grade FROM coursegrade WHERE coursegrade.cno= 'C01' );

五、where 運算符子查詢

查詢平均成績比‘吳斌’大的學生id,姓名,平均成績查詢‘吳斌’的平均成績:

SELECT AVG(grade) FROM student s JOIN coursegrade g ON s.no= g.sno WHERE s.name = '吳斌';

查詢平均成績比‘吳斌’大的學生id,姓名,平均成績等信息:

SELECT NO, NAME, AVG(grade) FROM student s, coursegrade c WHERE s.no = c.sno GROUP BY NO HAVING AVG(grade) > (SELECT AVG(grade) FROM student s JOIN coursegrade g ON s.no = g.sno WHERE s.name = '吳斌');

六、多個子查詢聯合使用

查詢數據庫成績比數學成績高的學生的信息和相關分數:

  1. 先找兩門課程成績
  2. 關聯查詢,數據庫成績比數學成績高
  3. 根據Id獲取相關信息和分數

SELECT * FROM Student RIGHT JOIN(SELECTt1.sno,class1,class2

— 關聯查詢,數據庫成績比數學成績高

FROM (SELECT sno,grade AS class1 FROM coursegradeWHERE cno = 'c01') AS t1,

— 兩門課程成績查詢

(SELECT sno,grade AS class2 FROM coursegrade WHERE cno = 'c02') AS t2WHEREt1.sno = t2.sno AND t1.class1 > t2.class2) re ON Student.no =re.sno;

使用子查詢的好處:具體數據改變不需要改語句,容易維護。壞處效率會低,而且隨著語句的增長可讀性不強,不建議經常使用。

赞(0)