1. 程式人生 > >資料庫(4)多表聯合查詢

資料庫(4)多表聯合查詢

二、多表聯合查詢

 1、合併結果集  : 把兩個select語句的查詢結果合併到一起

          union 合併結果集並且去除重複資料。

          union all合併結果集並且不去除重複資料 

要求:被合併的兩個結果集,列數和列型別必須相同

2、連線查詢  :  就是求多個表的乘積

例如   a表連線b 表那麼查詢結果就是a表*b表

連線查詢產生 笛卡爾積(在sql 中實現方式,交叉連線 cross join)

所有的連線方式都會產生笛卡爾積,然後加上限制條件,才會有實際查詢意義

jion 就是把多個表連線成一個表的手段

多表查詢分為 內連線和外連線

select empt .ename,dept .dname,empt .job   from empt as e,dept as d   where empt .deptno=dept .deptno;

select e.ename,d.dname,e.job   from empt as e,dept as d    where e.deptno=d.deptno;

AS 關鍵字可以給表起別名 as 可以省略

內連線 【inner】join...on          inner可省略

【隱式】 select e.ename,d.dname,e.job     from empt as e,dept as d    where e.deptno=d.deptno;

【顯式】select e.ename,d.dname,e.job      from empt as e inner join dept d    on e.deptno=d.deptno;

 特點: 查詢結果必須是滿足條件的

外連線 【outer】join...on             outer可省略

  • 左連線 Left 【outer】join
  • 右連線 right 【outer】join
  • 全外連線 full join(mysql不支援)

左連線 :以左表為主,先查詢出左表,然後查詢右表,右表中滿足條件的顯示,不滿足條件的顯示為null

例如:SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;

右連線:右表為主,先查出右表,在查詢左表,左表中滿足條件的顯示,不滿足條件的顯示為null

SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno;

總結:

1、如果sql用的是Left join 

  •  on後面條件對left 表沒作用,只是對right 表起過濾作用
  • where 語句可以對生成臨時表後起到過濾,相當於過濾了left表

2、如果sql用的是right join 

  •  on後面條件對right 表沒作用,只是對left 表起過濾作用
  • where 語句可以對生成臨時表後起到過濾,相當於過濾了right 表

在使用left join時 on 和where區別如下:

1、on條件條件是否為真,是在 生成臨時表時使用的條件,不管on的為真,都會返回左邊表的資料

2、where條件在生成臨時表後,再對臨時表進行過濾,如果條件不為真,就會全部過濾。

自然連線 :natural join

自然連線 無需你去給出外來鍵關聯等式,它會自動找到這一等式。兩張連線表中,名稱和型別完全一致的列作為條件。

SELECT * FROM emp NATURAL JOIN dept;
SELECT * FROM emp NATURAL LEFT JOIN dept;
 SELECT * FROM emp NATURAL RIGHT JOIN dept;

總結:

連線查詢時,sql查詢的核心,按照實際需求來選擇對應的型別。

如果選擇不當,非但不能提高效率,反而會帶來一系列的邏輯錯誤,甚至效能會下降。

選擇依據:

  • 查兩張表關聯列 相等的資料,用內連線
  • right表時left的子集,用左外連線
  • left表是right的子集,用右外連線
  • right和left 彼此之間的交集,但是互不為子集,使用全外連線

3、子查詢

  一個select語句中 包含另一個完整的select語句,子查詢 就是 巢狀查詢

  1)、單行單列 (用於條件)

   例如 :員工表中 工資高於CLARK的員工都有誰

    分析 :
                1.查詢CLARK的工資        select sal from emp where ename="CLARK"

    2.查詢高於CLARK的員工  select * from emp where sal > 第一步的結果

    3.結論   select * from emp where sal > (select sal from emp where ename="CLARK")

        2)、單行多列 (用於條件)
                  例如 :查詢員工表中 工作 和 工資 與 MARTIN完全相同的員工資訊

                  分析 :

                  1.查詢MARTIN的工作和工資                 select job,sal from emp where ename="MARTIN"
                 2.查詢與MARTIN工作和工資相同的人   select * from emp where (job,sal) in 第一步的結果
                 3.結論             select * from emp where (job,sal) in (select job,sal from emp where ename="MARTIN")

     3).多行單列 (用於條件)

     多行子查詢 返回多行資料

在where 使用多行子查詢時 要用 all any in

 例如 :查詢工資高於30號部門所有人的 員工

  分析 :
                1.查詢30號部門所有人的工資                         select sal from emp where deptno=30;
                2.查詢高於30號部門所有人工資的員工資訊    select * from emp where sal > all 第一步的結果
                3.結論
                    SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30);

                   SELECT * FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE deptno=30);

                /*練習 部門編號為20的員工工資 並且 大於部門編號為30的所有人工資的 員工列表*/
                SELECT * FROM emp WHERE deptno=20 AND sal> ALL(SELECT sal FROM emp WHERE deptno=30)
        4).多行多列 (表)
            例如 :查詢員工編號為7788的員工 姓名 工資 部門名稱 部門地址
            分析 :涉及到 emp dept兩張表
                1.查詢 姓名 和 工資
                    select ename,sal from emp where empno=7788
                2.查詢 部門名稱 和 部門地址
                    select e.ename,e.sal,d.dname,d.loc 
                    from emp e,dept d 
                    where e.deptno = d.deptno and e.empno=7788
                改版:
                    select e.ename,e.sal,d.dname,d.loc 
                    from emp e,(select dname,loc,deptno from dept) d
                    where e.deptno = d.deptno and e.empno=7788

                /*練習 求7369員工 姓名 經理姓名 經理編號 自己連線自己*/
                    SELECT e1.ename,e2.ename,e2.empno 
                    FROM emp e1,(SELECT empno,ename FROM emp) e2 
                    WHERE e1.mgr = e2.empno AND e1.empno = 7369

相關推薦

資料庫4聯合查詢

二、多表聯合查詢  1、合併結果集  : 把兩個select語句的查詢結果合併到一起           union 合併結果集並且去除重複資料。           union all合併結果集並且不去除重複資料  要求:被合併的兩個結果集,列數和列型別必須相同

三十七聯合查詢

包含 查詢語句 使用 mil pan 比較 ... style 嵌套 1.聯合查詢----INNER|LEFT|RIGHT JOIN SELECT 字段1,字段2,.....FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2

MyBatis學習總結——關聯查詢與動態SQL

一、多表關聯查詢 表與表之間有三種常見的關聯關係,分別是一對一,一對多與多對多關係,MyBatis直接提供一對一與一對多的關聯關係,可以通過間接的方式實現多對多關聯。 1.1、一對一關係 1.1.1、執行環境 假定一個員工(emp)擁有一個登入使用者(user),員工與使用者表之間是一對一關係:

Mysql筆記連線查詢

版權宣告:本文為博主原創文章,轉載請附上博文連結! https://blog.csdn.net/csdnluolei/article/details/83410321 資料庫的建立參考我的另一篇部落格 https://blog.csdn.net/csdnluolei/article/d

MFC學習12Access資料庫聯合查詢

1、Access 資料庫多表聯合查詢,每次連線之前須將連線符前面的內容放在括號裡面,示例如下:       select 表a.欄位1,表b.欄位1,表c.欄位1,表d.欄位1 from ((表a inner join 表b on 表a.欄位=表b.欄位) inner join 表c on 表c.欄位=表a.

SQL聯合查詢LEFT JOIN條件差異

logs 技術分享 .cn where 聯合查詢 uid exist 包含 into 查詢A: select a.*,b.* into Bus605115_ON_Where_And --(642 行受影響) from PositionN a left join szt

MyBatis-Plus聯合查詢並且分頁3

這3張表的關係是   模型表Model  ===> 訓練表Training ===》應用表Application(大概的邏輯是:選擇應用,然後訓練,然後成為模型)如有不理解的可加我微信:17625089935 白天問我一般晚上回 首先我們先建立實體Model(我使用的d

MyBatis學習總結---基於XML聯合查詢一對一、一對

1、一對一的關聯  使用association,association元素用於處理“has-one”(一對一)這種型別關係。  作用:針對pojo物件屬性的對映,它的兩個主要引數此時對應的值: javaType對應pojo類名,  property對應pojo的

史上最簡單MySQL教程詳解基礎篇聯合查詢

常用術語 內連線 外連線 左外連線 右外連線 注意事項: 自連線 子查詢 在上篇文章史上最簡單MySQL教程詳解(基礎篇)之資料庫設計正規化及應用舉例我們介紹過,在關係型資料庫中,我們通常為了減少資料的冗餘量將對資料表進行規範,將

mysql常用語句——聯合查詢

學習筆記: 學生選課資料庫SCT 學生表(學號,姓名,性別,年齡,院系編號,班級) Student(S# char(8),Sname char(10),Ssex char(2),Sage integer,D# char(2),Sclass char(6) 院系表(院系編號

【MySQL】聯合查詢新增查詢欄位、引數設定

所羅門王說:沒有智慧解決不了的問題。SELECT * from tb_corporation_and_user      人員所在團隊 (`user_id`, `corporation_id` ,  `role_id` ) SELECT * from tb_corporati

資料庫學習總結——查詢練習題2

這一篇的部落格是基於scott.sql資料庫操作的,備份檔案上傳在我的資源裡 下載後匯入資料庫方法同我的上篇部落格資料庫學習總結(六) scott.sql內包含emp dept salgrde 三個表 僱員表:記錄了一個僱員的基本資訊 EMP(僱員表) NO

MySQL優化系列--查詢優化2外連線、聯合查詢以及查詢注意點

繼續這一系列,上篇的簡單查詢優化並沒講完,第二點還有查詢注意點以及多表查詢優化呢!! 文章結構:(1)多表查詢步步優化;(2)查詢編寫的注意點。 /* 補充說明(往後有博友反饋的話,會繼續補充。) */ 一、2017-7-19: 關於“超大

Oracle筆記 查詢

針對 多人 筆記 padding 工資 cells 找到 mem 概念 Oracle筆記(六) 多表查詢 本次預計講解的知識點 1、 多表查詢的操作、限制、笛卡爾積的問題; 2、 統計函數及分組統計的操作; 3、 子查詢的操作,並且結合限定查詢、數據排序、多表查詢、統計

sql常用操作查詢

1 連線查詢 1.1連線就是指兩個或2個以上的表(資料來源)“連線起來成為一個數據源”。 實際上,兩個表的完全的連線是這樣的一個過程: 左邊的表的每一行,跟右邊的表的每一行,兩兩互相“橫向對接”後所得到的所有資料行的結果。 注意:連線之後,並非形成了一個新的資料表,而只是一種“記憶體形態”。 &nb

oracle高階查詢3——查詢

1.多表查詢的基礎笛卡爾集 多張表查詢產生的表的列數等於所有表的列數之和,行數等於多張表之積 2.多表查詢分等值連線,不等值連線,外連線,自連線 等值連線 select e.empno,e.ename from emp e,dept d where e .deptno

MySQL資料庫操作——之間的關係

主鍵與外來鍵 1、一張表可以有多個外來鍵 2、外來鍵是表的主鍵,可以是別的表,也可以是本身(少見) 3、外來鍵可以為null,可以重複,但是不能不存在,必須要查的到 建立語法 foreign key(

常用SQL命令彙總-查詢

一、多表查詢 1.連線查詢: 連線查詢是將兩個或兩個以上的表按照某個條件連線起來,從中選取需要的資料; t_book表:                                                                          

Oracle 查詢技巧與優化 查詢

前言 上一篇blog介紹了Oracle中的單表查詢和排序的相關技巧(http://blog.csdn.net/wlwlwlwl015/article/details/52083588),本篇blog繼續介紹查詢中用的最多的——多表查詢的技巧與優化方式,下面依舊

python3.5+pymysql學習資料庫4查詢語句學習

資料準備好以後先學習查詢操作。直接開始做題還是太難了,畢竟太多年沒有用過SQL,還是腳踏實地從基礎開始學習比較靠譜。 學習資料地址:https://www.w3cschool.cn/sql/zk9swfor.html # 查詢學生資訊表全部資訊 sql = "SELECT * FROM