日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多表数据记录查询

發布時間:2023/12/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多表数据记录查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、學習任務1:內連接查詢

第10章詳細介紹了單表查詢,即在關鍵字where子句中只涉及一張表。在具體應用中,經常需要實現在一個查詢語句中顯示多張表的數據,這就是所謂的多表數據記錄連接查詢,簡稱連接查詢。

MySQL軟件也支持連接查詢,在具體實現連接查詢操作時,首先將兩個或兩個以上的表按照某個條件連接起來,然后再查詢到所要求的數據記錄,查看幫助文檔可以發現,連接查詢分為內連接查詢和外連接查詢

在具體應用中,如果需要實現多表數據記錄查詢,一般不使用連接查詢,因為該操作效率比較低。于是MySQL軟件又提供了連接查詢的替代操作——子查詢操作。

本章將詳細介紹內連接查詢、外連接查詢和子查詢。為了便于講解,本章只講解兩個表間的連接查詢。

可以通過兩種語法形式來實現連接查詢,一種方式在FROM子句中利用逗號?(,)區分多個表,在WHERE于句中通過邏輯表達式來實現匹配條件,從而實現表的連接,這是早期MySQL軟件連接的語法形式;另一種是ANSI(美國國家標準協會)連接語法形式,在FROM子句中使用“JOIN…ON關鍵字,而連接條件寫在關鍵字ON子句中,MySQL軟件推薦使用ANSI語法形式的連接。

MySQL內連接數據査詢通過SQL語句INNER JOIN...ON來實現?語法形式如下

SELECT field1 field2…fieldn?FROM join_tablename1 INNER JOIN join_tablename2 lNNER JOIN join_tablenamenON join_condition 【WHERE】condition;

在上述語句中參數fieldn表示所要查詢的字段名字來源于所連接的表join_tablename1?join_tablename2關鍵字INNER?JOIN表示表進行內連接參數join_condition表示進行匹配的條件。?按照匹配情況,內連接査詢可以分為如下兩類:

  • 等值連接。
  • 不等連接。

為了便于講解本節所涉及的內關聯查詢數據記錄操作都是針對于數據庫company中表示部門信息的表t_dept和雇員信息的表t_employee,關于部門表t_dept的所有數據記錄和雇員表t_employee的所有數據記錄如下圖所示。

?

?

1.1?自連接

內連接査詢中存在一種特殊的等值連接——自連接,所謂自連接就是指表與其自身進行連接,下面將通過一個具體的實例來說明如何實現自連接。

【實例11-1】執行SQL語句“INNER?JOIN...ON在數據庫company查詢每個雇員的姓名、職位、領導姓名。

【實例分析】

為了實現上述要求,需要經過如下步驟來分析。

(1)確定需要查詢的表和所査詢字段的來源

根據需求需要査詢兩張表雇員表t_employee和領導表t_employee),前者需要查詢出雇員的姓名和職位;后者需要査詢出領導的姓名。

注意由于表t_employee綜合了雇員和領導的信息所以表t_employee既是雇員表也是領導表。

(2)確定關聯匹配條件

t_employee.mgr 雇員表的領導編號=t_employee.empno (領導表的雇員編號

【實現步驟】

SELECT e.ename employeename,e.job,L.ename ?loadername FROM t_employee e INNER JOIN t_employee L ?ON e.mgr=L.empno;

(3)上述SQL語句采用ANSI連接語法形式通過SELECT FROM WHERE"關鍵字也可以實現具體SQL語句如下

SELECT e.ename employeename,e.job,L.ename loadername FROM t_employee e , t_employee L?WHERE e.mgr=L.empno;

【代碼說明】在上述語句中,為WHERE關鍵字設置匹配條件?e.mgr=L.empno”。?

【運行效果】執行上面的SQL語句,其結果如下圖所示。

執行結果顯示,雖然SQL語句內容不同,但是執行結果卻一致,即在MySQL軟件中兩種方式的SQL語句執行效果是一致。

當表的名稱特別長時,直接使用表名很不方便,或者在實現表自連操作時,直接使用表名沒辦法區分表。為了解決這些問題,在MySQL軟件中,提供了一種機制來為表取別名機制,具體語法形式如下:

SELECT field1,field2,…fieldn [AS] otherfieldn

FROM table_name1 [AS] other_table_name1,…table_namen [AS] other_table namen

在上述語句中參數table_name為表原來的名字參數other_table_name為表新的名字。之所以要為表設置新的名字,是為了讓SQL語句代碼更加直觀,更加人性化,和實現更加復雜的功能。

?

?

1.2?等值連接

內連接査詢中的等值連接就是在關鍵字ON后的四配條件中通過等于關系運算符=)來實現等值條件。

下面將通過一個具體的實例來說明如何實現等值連接。

【實例11-2】執行SQL語句INNER JOIN...ON,在數據庫company査詢每個雇員的編號、姓名、職位、部門名稱、位置。

【實例分析】為了實現上述要求,需要經過如下步驟來分析。

(1)確定需要查洵的表和所査詢字段的來源

根據要求需要査詢兩張表:部門表t_dept和雇員表t_employee,前者需要査詢出部門的名稱和位置,后者需要查詢出雇員的編號、姓名和職位。

(2)確定關聯匹配條件

t_dept.deptno=t_employee.deptno

【實現步驟】

SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM t_employee e INNER JOIN t_dept d ON e.deptno=d.deptno;

(3)上述SQL語句采用ANSI連接語法形式通過SELECT FROM WHERE關鍵字也可以實現具體SQL語句如下

SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM t_employee e,t_dept d WHERE e.deptno=d.deptno;

【運行效果】執行上面的SQL語句,其結果如閣丨丨.25所示。

?

?

執行結果顯示,雖然SQL語句內容不同,但是執行結果卻一致。

上述實例中,連接的表都是2個,下面將通過一個旯體的實例來說明如何實現多表(三張表)?等值連接。

【實例11-3】執行SQL語句INNER JOIN...ON在數據庫company中,查洵每個雇員的編號、姓名、基本工資、職位、領導的姓名、部門名稱和位置。

【實例分析】為了實現上述要求,需要經過如下步驟來分析。

(1)確定需要查詢的表和所査詢字段的來源

根據耍求需要查詢3張表部門表t_dept)雇員表t_employee)和領導表t_cmployee), 分別査詢如下字段。

?雇員表:雇員的編號、姓名、基本工資和職位。

?領導表:領導的姓名。

?部門表:部門的名稱和位置。

(2)確定關聯匹配條件

領導表連接部門表匹配條件t_employee.deptno=t_dept.deptno;

雇員表連接領導表匹配條件t_employee.mgr=t_employee.empno

【實現步驟】

SELECT e.empno,e.ename employeename,e.sal,e.job, L.ename loadername,d.dname,d.loc FROM t_employee e INNER JOIN t_employee L?ON e.mgr=L.empno INNER JOIN t_dept d ON e.deptno=d.deptno;

【運行效果】執行上面的SQL語句其結果如圖所示。

?

執行結果成功顯示出關于雇員的編號、姓名、基本工資、職位、職位領導的姓名、部門名稱和

位置。

(3)SQL語句采用ANSI連接語法形式通過SELECT FROM WHERE關鍵字也可以

實現,具體SQL語句如下:

SELECT e. empno, e. ename employeename, e. sal, e .job, L. ename loadername,?d. dname, d. loc FROM t_employee e,t_employee L,?t_dept d WHERE e.mgr=L.empno AND e.deptno=d.deptno;

【運行效果】執行上面的SQL語句其結果與上圖所示一致。

1.3?不等連接

內連接查詢中的不等連接,就是在關鍵字ON后的匹配條件中通過除了等于關系運算符來實現不等條件外,可以使用的關系運算符包含>>=”<<=!=等運算符號。下面將通過一個具體的實例來說明如何實現不等連接。

【實例11-4】執行SQL語句INNER?JOINON”,在數據庫company查詢雇員編號大于其領導編號的每個雇員的姓名、職位、領導姓名。

【實例分析】為了實現上述要求,需要經過如下步驟來分析。

(1)確定需要查詢的表和所查詢字段的來源

根據要求需要査詢兩張表雇員表t_employee)和領導表t_employee),前者需要査詢出雇員的姓名和職位;后者需要査詢到領導的姓名。

(2)確定關聯匹配條件

t_employee.empno (雇員表的雇員編號)=t_employee.empno (領導表的領導編號

t_employee.empno (雇員表的雇員編號>t_employee.empno (領導表的領導編號

【實現步驟】

SELECT e.ename employeename,e.job,L.ename loadername FROM t_employee e?INNER JOIN t_employee L?ON e.mgr=L.empno AND e.empno>l.empno;

(3)上述SQL語句采用ANSI連接語法形式通過SELECT FROM WHERE關鍵字也可以實現具體SQL語句如下

SELECT e.ename employeename,e.job,L.ename loadername FROM t_employee e , t_employee L?WHERE e.empno=l.empno AND e.empno>l.mgr;

【運行效果】執行上面的SQL語句,其結果如上圖所示。

?

雖然SQL語句內容不同,但是執行結果卻一致。

二、學習任務2:外連接查詢

MySQL軟件中外連接查詢會返回所操作表中至少一個表的所有數據記錄,在MySQL屮數據查詢通過SQL語句OUTER JOIN...ON來實現,外連接數椐査詢語法形式如下:

SELECT field1 field2…fieldn?FROM join_tablename1 LEFT|RIGHT|FULL OUTER?JOIN join_tablename2 ON join_condition;

在上述語句中參數filedn表示所要杳詢的字段名字來源于所連接的表join_tablename1join_tablename?2關鍵OUTER?JOIN表示表進行外連接join_condition表示進行匹配的條件。

按照外連接關鍵字,外連接査詢可以分為如下三類:

? 左外連接。

? 右外連接。

? 全外連接。

為了便于講解本節所涉及的外關聯查詢數據記錄操作都是針對于數據庫company中表示部門信息的表t_dept和表示雇員信息的表t_employee。

2.1?左外連接

外連接査詢中的左外連接,就是指新關系中執行匹配條件時,以關鍵字LEFT?JOIN左邊的表為參考表。

下面將通過一個具體的實例來說明如何實現左外連接。

【實例11-5】執行SQL語句LEFT JOIN...ON在數據庫company査詢每個雇員的姓名、?職位、領導姓名。由于名為king的雇員位于公司最高位,所以沒有領導信息,本實例中要顯示出名為king雇員的信息。

【實例分析】為了實現上述要求,需要經過如下步驟來分析。

(1)確定需要査詢的表和所査詢字段的來源

根據要求需要查詢兩張表雇員表t_employee)和領導表t_employee),前者需要查詢出雇員的姓名和職位;后者需要查詢到領導的姓名。

(2)確定關聯匹配條件

t_employee.mgr (雇員表的領導編號=t_employee.empno (領導表的領導編號

【實現步驟】

SELECT e.ename employeename,e.job,L.ename loadername FROM t_employee e LEFT JOIN t_employee L ON e.mgr=L.empno;

(3)修改上述SQL語句為等值連接的內連接,具SQL語句如下:

SELECT e.ename employeename,e.job,L.ename loadername FROM t_employee e INNER JOIN t_employee L?ON e.mgr=L.empno;

【運行效果】執行上面的SQL語句,其結果如下圖所示。

?

?

2.2 右外連接

外連接査詢中的右外連接,就是指新關系中執行匹配條件時,以關鍵字RIGHT?JOIN右邊的表為參考表。

下面將通過一個具體的實例來說明如何實現右外連接。

【實例11-6】執行SQL語句RIGHT JOIN...ON在數據庫company中,查詢每個雇員的編號、姓名、職位、部門名稱、位置。新插入一名雇員信息,名為cjgong雇員所存在的部門編號50在部門表中不存在,所以該雇員信息沒有部門信息,本實例中要顯示出名為cjgong雇員的信息。

?

【實例分析】為了實現上述要求,需要經過如下步驟來分析。

(1)確定需要査詢的表和所查詢字段的來源

根據耍求需要查詢兩張表:部門表t_dept和雇員表t_employee),前者需要査詢出部門的名稱和位置;后者需要査詢出雇員的編號、姓名、職位。

(2)確定關聯匹配條件

t_dept.deptno=t_employee.deptno

【實現步驟】

SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM t_dept d RIGHT JOIN t_employee e ON e.deptno=d.deptno;

【運行效果】執行上面的SQL語句,其結果如圖所示。

?

執行結果成功顯示出關于雇員的編號、姓名、職位和其部門名稱和地址,同時還顯示出姓名為cjgong雇員的相應信息。由于雇員cjgong所在部門在部門表中沒有相應信息,所以該記錄中部門名稱(字段dname和部門地址(字段loc)的值為NULL。

(3)修改上述SQL語句為等值連接的內連接,具體SQL語句如下:

SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM t_employee e,t_dept d WHERE e.deptno=d.deptno;

【運行效果】執行上面的SQL語句其結果如圖所示。

?

三、學習任務3:合并查詢數據記錄

MySQL軟件中通過關鍵字UNION來實現并操作,即可以通過其將多個SELECT語句的査詢結果合并在一起組成新的關系。MySQL軟件中實現查詢數據記錄合并通過SQL語句union來實現,具體語法形式如下:

SELECT field1 field2 ...fieldn FROM tablename1 UNION | UNION ALL SELECT field1 field2 ...fieldn FROM tablename2 UNION | UNION ALL SELECT field1 field2 ...fieldn FROM tablename3……

上述語句中存在多個查詢數據記錄語句,每個査詢數據記錄語句之間使用關鍵字UNION?UNION ALL進行連接。

為了便于講解本節所涉及的并操作都是針對于數據庫company中計算機系學生的表t_cstudent和表示音樂系學生的表t_mstudent關于計算機系學生表t_cstudent的所有數據記錄如圖所示關于音樂系學生的表t_mstudent的所有數據記錄如圖所示。

?

1.帶有關鍵字union的合并操作

關鍵字UNION會把查詢結果集直接合并在一起,同時將會去掉重復數據記錄,下面將通過一個具體的實例來說明如何使用關鍵字UNION

【實例11-7】執行SQL語句SELECT,在數據庫company中,合并計算機系學生和音樂系學生?的數據記錄信息,具體步驟如下:

SELECT *?FROM t_cstudent UNION SELECT *?FROM t_mstudent;

【運行效果】執行上面的SQL語句其結果如圖所示。

?

2.帶關鍵字union?all的合并操作

關鍵字union?all會把査詢結果集直接合并在一起,下面將通過一個具體的實例來說明如何使用關鍵宇UNION

【實例11-8】執行SQL語句SELECT,在數據庫company中,合并計算機系學生和音樂系學生的數據記錄信息,具體步驟如下:

SELECT?*?FROM t_cstudent UNION ALL SELECT * from?t_mstudent;

【運行效果】執行上面的SQL語句,其結果如圖所示。

?

四、學習任務4:子查詢

MySQL軟件中雖然可以通過連接査詢實現多表查詢數據記錄,但是卻不建議使用。這是因為連接査詢的性能很差。因此出現了連接査詢的替代者子査詢。在具體開發應用中,MySQL軟件推薦使用子查詢來實現多表査詢數據記錄。

4.1?為什么使用子查詢

為了講解清楚為什么使用子査詢這個問題,需要從多表查詢數據記錄操作的開發經驗開始。在日常開發中,用戶經常會接觸到查詢多表數據記錄操作,例如,需要查詢部門表t_dept和雇員表?t_employee的數據記錄。

對于新手,直接會執行如下SQL語句進行査詢:

SELECT *?FROM t_dept t,t_employee L WHERE t.deptno=L.deptno;

上述SQL語句在執行過程中,首先會對兩個表進行笛卡兒積操作,然后再選取符合匹配條件的數據記錄。進行笛卡兒積操作時,會生成兩個數表數據記錄數的乘積條數據記錄,如果這兩張表的數據記錄比較大,則在進行笛卡兒積操作時就會造成死機。

笛卡爾積查詢如下所示:

?

于是對于有經驗的用戶,首先會通過統計函數査看所操作表笛卡兒積后的數據記錄數,然后才會進行多表查詢。因此多表查詢一般會經過如下步驟:

(1)通過統計函數COUNT()査詢所關聯表笛卡兒積后的數據記錄數,具體SQL語句如下

SELECT COUNT(*)?FROM t_dept t,t_employee L;

(2)如果査詢到的數據記錄數MySQL軟件可以接受,然后才進行多表連接査詢,否則就應該考慮通過其他方式來實現。

那么如果查詢到笛卡兒積后的數據記錄數遠遠大于MySQL軟件可以接受的范圍,則如何實現多表査詢呢?為了解決該問題,MySQL軟件提供了子查詢來實現多表査詢。

所謂子查詢就是指在一個查詢之中嵌套了其他的若干查詢即在一個SELECT査詢語句的?WHEREFROM句中包含另一個SELECT査詢語句。在査詢語句中,外層SELECT查詢語句稱為主查詢,WHERE子句中的SELECT査詢語句被稱為子查詢,也被稱為嵌套査詢。

通過子査詢可以實現多表査詢,該査詢語句中可能包含IN、ANY、ALL和EXISTS等關鍵字,除此之外還可能包含比較運算符。理論上子查詢可以出現在査詢語句的任意位置,佴是在實際開發中子査詢經常出現在WHEREFROM子句中。

  • WHERE子句中的子査詢該位置處的子査詢一般返回單行單列、多行單列、單行多列數據記錄。
  • FROM子句中的子查詢:該位置處的子査詢一般返回多行多列數據記錄,可以作一張臨時表。
  • 單行單列和單行多列子查詢

當子查詢的返回結果為單行單列數據記錄時,該子查詢語句一般在主查詢語句的WHERE子句里,通

常會包含比較運算符號(><=!=)

1.單行單列子査詢

下面將通過一個具體的實例來說明如何實現返回結果為單行單列子查詢。

【實例11-9】執行SQL語句select,在數據庫company查詢雇員表t_employee中工資比smith還要高的全部雇員信息具體如下

SELECT *?FROM t_employee WHERE sal>(SELECT sal?FROM t_employee WHERE ename='SMITH');

?

執行結果成功顯示出工資比SMITH還要高的全部雇員信息。

2.單行多列子査詢

WHERE子句中的子査詢除了是返回單行單列的數據記錄外,還可以是返回單行多列的數據記錄,不過這種子査詢很少出現。

下面將通過一個具體的實例來說明如何實現返回結果為單行多列子査詢。?

【實例11-10】執行SQL語句select,在數據庫company中,查詢雇員表t_employee中工資和職位與SMITH樣的全部雇員信息,具體如下:

SELECT ename,sal, job FROM t_employee WHERE (sal,job)=(SELECT sal,job

FROM t_employee WHERE ename='SMITH’);

?

4.3?多行單列子查詢

當子查詢的返回結果為多行單列數據記錄時,該子査詢語句一般(不是絕對)會在主査詢語句的WHERE子句里出現,通常會包含IN、ANYALL、EXISTS等關鍵字。

1.帶有關鍵字IN的子查詢

當主查詢的條件是子査詢的査詢結果中時,就可以通過關鍵字IN來進行判斷。相反如果想實現主查詢的條件不是子查詢的查詢結果中時,就可以通過關鍵字NOT IN來進行判斷。下面將通過一個具體的實例來說明如何實現帶有關鍵字INNOT IN的子查詢。?

【實例11-11】在數據庫company中,査詢雇員表t_employee中的數據記錄,這些數據記錄的部門編號(字段deptno)必須在部門表t_deptno)中出現,具體如下:

SELECT *?FROM t_employee WHERE deptno IN (SELECT deptno FROM t__dept);

執行結果成功顯示出各個部門中關于雇員的詳細信息,但是由于雇員cjgong所在的部門(字段?deptno的值為50)不在部門表中,所以沒有顯示出該雇員的詳細信息。

?

如果想通過子査詢來查詢關于雇員cjgong的詳細信息,可以通過如下SQL語句來實現:

SELECT *?FROM t_employee WHERE deptno NOT IN (SELECT deptno FROM t_dept);

執行結果成功顯示出關于雇員cjgong的詳細信息。

?

2.帶有關鍵字ANY的子査詢

關鍵字ANY用來表示主查詢的條件為滿足子査詢返回査詢結果中任意一條數據記錄,該關鍵字有三種匹配方式,分別如下。

  • =ANY:其功能與關鍵字IN一樣:
  • >ANY (>=ANY)比子査詢中返回數據記錄中最小的還要大于大于等于數據記錄
  • <ANY (<=ANY)比子査詢中返回數據記錄中最大的還要小于小于等于數據記錄。?

下面將通過一個具體的實例來說明如何實現帶打關鍵字ANY的子查詢。

【實例11-12】執行SQL語句SELECT,在數據庫company査詢雇員表t_employee中的雇員的姓名字段ename和工資字段sal),這些雇員的工資不低于職位字段job)MANAGER的工資具體如下

SELECT ename,sal?FROM t_employee WHERE sal>=ANY(SELECT sal?FROM t_employee WHERE job='MANAGER')

?

執行結果成功顯示工資不低于職位為MANAGER工資的雇員的姓名和工資,通過上圖可以發現職位為MANAGER的最低工資為2450,所以只要工資高于等于該值的雇員都符合要求。

3.帶有關鍵字ALL的子查詢

關鍵字ALL用來表示主查詢的條件為滿足子查詢返回査詢結果中所有數據記錄,該關鍵字有以下兩種匹配方式。

  • >ALL (>=ALL):比子查詢中返回數據記錄中最大的還要大于(大于等于)數據記錄;
  • <ALL (<=ALL)比子查詢中返回數據記錄中最小的還要小于大于等于數據記錄。

下面將通過一個具體的實例來說明如何實現帶有關鍵宇ALL的子査詢。

【實例11-13】執行SQL語句select,于數據庫company査詢雇員表t_employee中的雇員的姓名字段ename)和工資字段sal),這些雇員的工資高于職位字段job)MANAGER 的工資具體如下

SELECT ename,sal?FROM t_employee WHERE sal>ALL(SELECT sal?FROM t_employee WHERE job='MANAGER')

【運行效果】執行上面的SQL語句,其結果如圖所示。

?

執行結果成功顯示:?工資高于職位為MANAGER工資的雇員的姓名和工資,只要工資高于該值的雇員都符合要求。

4.帶有關鍵字EXISTS的子查詢

關鍵字EXISTS是一個布爾類型,當返回結果集時為TRUE,不能返回結果集時為FALSE查詢時EXISTS對外表采用遍歷方式逐條査詢,每次杳詢都會比較EXlSTS的條件語句,當EXISTS的條件語句返回記錄行時則條件為真,此時返冋當前遍歷到的記錄;反之,如果exists里的條件語句不能返回記錄行,則丟棄當前遍歷到的記錄。

下面將通過一個具體的實例來說明如何實現帶有關鍵字EXlSTSNOT EXlSTS的子查詢。?

【實例11-14】在數據庫company中查詢部門表t_dept中的字段部門編號deptno)和部門名字dname),如該部門沒有員工,則顯示該部門,具體如下:

SELECT *?FROM t_dept c WHERE NOT EXISTS(SELECT *?FROM t_employee WHERE deptno=c.deptno);

?

執行上面的SQL語句,其結果如圖所示,成功顯示出沒有雇員的部門編號和名稱。

如需顯示出冇雇員的部門編號和名稱,則可以使用以下SQL語句杳詢:

SELECT *?FROM t_dept C WHERE EXISTS(SELECT *?FROM t_employee WHERE deptno=c.deptno);

?

該查詢首先遍歷部門表t_dept中的記錄,如遍歷到第條記錄,然后把部門編號(t_dept)傳給子查詢,當子查詢有返回結果時,條件為真,此時打印出遍歷的第一條記錄,然后依次遍歷其他記錄,判斷方法類似。

4.4?多行多列子查詢

當子查詢的返回結果為多行多列數據記錄時,該子査詢語句一般會在主查詢語句的from子句里,被當作一張臨時表的方式來處理。

下面將通過一個具體的實例來說明如何實現返回結果為多行多列子査詢,同時理解子查詢的優勢。

【實例11-15】在數據庫company中,查詢雇員表t_employee中各部門的部門號、部門名稱、部門地址、雇員人數和平均工資,具體步驟如下:

通過內連接來實現本實例需求,具體語句如下:

SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) number,AVG(e.sal) average

FROM t_employee e INNER JOIN t_dept d ON e.deptno=d.deptno

GROUP BY d.deptno DESC;

?

執行結果成功顯示出各部門的部門號、部門名稱、部門地址、雇員人數和平均工資。在具體運行過程中,關于笛卡兒積的數據記錄數,可以通過如下SQL語句來實現:

SELECT COUNT(*) number?FROM t_employee e, t_dept d ;

執行上而的SQL語句,其結果如圖所示。

?

通過子連接來實現本實例需求由于子査詢返回的結果為多行多列所以該子查詢在主査詢FROM關鍵字子句里具體SQL語句如下:

SELECT d.deptno,d.dname,d.loc,number,average FROM t_dept d Inner JOIN (

SELECT deptno,COUNT(empno) as number,AVG(sal) as average FROM t_employee?GROUP BY deptno DESC) as employee ON d.deptno=employee.deptno;

【運行效果】執行上面的語句,其結果如圖所示。

?

執行結果成功顯示出各部門的部門號、部門名稱、部門地址、雇員人數和平均工資。在具體運行過程中,關于笛卡兒積的數據記錄數,可以通過如下語句來實現:

SELECT COUNT(*) number FROM t_dept d ,(SELECT deptno,COUNT(empno) number,AVG(sal) average FROM t_employee GROUP BY deptno) employee;

【運行效果】執行上面的語句,其結果如圖所示。

?

與內連接方式査詢相比,子查詢方式所操作的數據記錄數目為31=15 (子查詢中統計的數據記錄)+16(笛卡兒積的數據記錄數),遠遠小于前者的60,因此子査詢的執行效率高。

總結

以上是生活随笔為你收集整理的多表数据记录查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。