1. 程式人生 > >SQL基礎5——多表查詢

SQL基礎5——多表查詢

/*

一、多表查詢

簡言之,根據特定的連線條件從不同的表中獲取所需的資料

笛卡爾集的產生條件:

省略連線條件

連線條件無效

第一個表中的所有行與第二個表中的所有行相連線

二、多表查詢語法:*/

    SELECT table1.column, table2.column

    FROM table1, table2

    WHERE table1.column1 = table2.column2;

    /*

但要注意where 不要省了,省略where 即為笛卡爾集,而且where 條件要有效,

兩張表間有一個相同的欄位,才好進行有效的多表查詢

查詢時列名前,加表名或表別名前輟(如果欄位在兩個表中是唯一的可以不加)

為了簡化SQL書寫,可為表名定義別名,格式:from 表名別名

如:from emp e,dept d

建議使用表的別名及表字首,使用表別名可以簡化查詢,而使用表字首則可以提高查詢效能

例:查詢每個員工的工號,姓名,工資,部門名和工作地點*/

    select empno,ename,sal,dname,loc from emp,dept

    where emp.deptno=dept.deptno;

/*

三、多表連線型別:

從資料顯示方式來講有:內連線和外連線。

內連線:只返回滿足連線條件的資料。

外連線:除了返回滿足連線條的行以外,還返回左(右)表中,不滿足條件的行,

稱為左(右)連線

內連線*/

    select empno,ename,sal,dname,loc from emp,dept

    where emp.deptno=dept.deptno;  --(Oracle 8i 及以前的寫法)

    --內連線的另一種寫法:

    select empno,ename,job,sal,dept.deptno,dname,loc

    from emp join dept on (emp.deptno=dept.deptno); -- (SQL 99的寫法)

    /*

外連線:

兩個表的查詢中,使用外連線可以查詢另一個表或者兩個中不滿足連線條件的資料。

外連線的符號是(+),(+)要放在欄位名後。(+)對面的那個表,會全部顯示。

外連線語法*/

        SELECT table1.column, table2.column   --右外連線

       FROM table1, table2

       WHERE table1.column(+) = table2.column;

       SELECT table1.column, table2.column   --左外連線

       FROM table1, table2

       WHERE table1.column = table2.column(+);

    --例:

    select empno,ename,job,sal,dept.deptno,dname,loc

    from emp,dept

    where emp.deptno(+)=dept.deptno; -- (Oracle 8i 及以前的寫法)

    --另一種寫法(右連線):     -- (SQL 99的寫法)

    select empno,ename,job,sal,dept.deptno,dname,loc

    from emp right join dept on (emp.deptno=dept.deptno);

    --左連線:                    (SQL 99的寫法)

    select empno,ename,job,sal,dept.deptno,dname,loc

    from emp left join dept on (emp.deptno=dept.deptno);

    --全連線(滿連線)            (SQL 99的寫法)

   select empno,ename,job,sal,d.deptno,dname,loc

    from emp e full join dept d on (e.deptno=d.deptno);

    /*

自然連線                    (SQL 99的寫法)

以兩個表具有相同的欄位的所有列為基礎,可採用自然連線(natural join)

它將選擇兩個表中那些在所有匹配的列中值相等的行。

如果列具有相同的名稱,但資料型別能夠不同,則會報錯*/

    select empno,ename,job,sal,deptno,dname,loc

    from emp natural join dept;

    /*

自連線:

將自身表的一個映象當另一個表來對待。*/

    select ... from emp e,emp d  ...

    --下面列出SQL 99的語法供參考

    SELECT table1.column, table2.column

    FROM table1

    [CROSS JOIN table2] |

    [NATURAL JOIN table2] |

    [JOIN table2 USING (column_name)] |

    [JOIN table2

    ON(table1.column_name = table2.column_name)] |

    [LEFT|RIGHT|FULL OUTER JOIN table2

    ON (table1.column_name = table2.column_name)];

    --在下面的語法中

    table1.column     --指明從中檢索資料的表和列

    CROSS JOIN        --返回兩個表的笛卡爾集

    NATURAL JOIN      --根據相同的列名連線兩個表

    JOIN table

    USING column_name --根據列名執行等值連線

    JOIN table ON

    table1.column_name   --根據ON 子句中的條件執行等值連線

    = table2.column_name

    LEFT/RIGHT/FULL OUTER

    /*

使用using子句建立連線

如果幾個列具有相同的名稱,但是資料型別不匹配,那麼可以使用using子句來修改natural join

子句以指定要用於等值連線的列

在多個列匹配時,使用using 子句只匹配一個列

在引用列中不要使用表名或別名

       natural join using 子句是互不相容的 */

        --例:

       SELECT l.city, d.department_name

       FROM locations l JOIN departments d USING (location_id)

       WHERE location_id = 1400;

       --下面的語句無效,因為where 子句中限定了location_id

       SELECT l.city, d.department_name

       FROM locations l JOIN departments d USING (location_id)

       WHERE d.location_id = 1400;

       ORA-25154: column part of USING clause cannot have qualifier

       --注意:

       --   兩個表中名稱相同的列在使用時不能有任何限定符,這一限制同樣適用於natural join

/*

四、演示:      */ 

--笛卡爾集

    SQL> select empno,ename,dname from emp,dept;

        EMPNO ENAME      DNAME

    ---------- ---------- --------------

         7369 SMITH      ACCOUNTING

         7499 ALLEN      ACCOUNTING

         7521 WARD       ACCOUNTING

         7566 JONES      ACCOUNTING

         7654 MARTIN     ACCOUNTING

         7698 BLAKE      ACCOUNTING

         7782 CLARK      ACCOUNTING

         7788 SCOTT      ACCOUNTING

         7839 KING       ACCOUNTING

         7844 TURNER     ACCOUNTING

         7876 ADAMS      ACCOUNTING

         --中間結果省略

         56 rows selected.    

--使用cross join 實現交叉連線,即笛卡爾集

    SQL> select empno,ename,dname from emp

      2  cross join dept;

        EMPNO ENAME      DNAME

    ---------- ---------- --------------

         7369 SMITH      ACCOUNTING

         7499 ALLEN      ACCOUNTING

         7521 WARD       ACCOUNTING

         7566 JONES      ACCOUNTING

         7654 MARTIN     ACCOUNTING

         7698 BLAKE      ACCOUNTING

         7782 CLARK      ACCOUNTING

         7788 SCOTT      ACCOUNTING

         7839 KING       ACCOUNTING

         7844 TURNER     ACCOUNTING

         7876 ADAMS      ACCOUNTING

--等值連線(Oracle 寫法)

    SQL> select empno,ename,dname from emp,dept where emp.deptno = dept.deptno;

        EMPNO ENAME      DNAME

    ---------- ---------- --------------

         7369 SMITH      RESEARCH

         7499 ALLEN      SALES

         7876 ADAMS      RESEARCH

         --部分結果省略

         7902 FORD       RESEARCH

         7934 MILLER     ACCOUNTING

    14 rows selected.

--等值連線(SQL 99 寫法)

    SQL> select e.empno,e.ename,d.dname from emp  e

      2  inner join dept  d

      3  on e.deptno = d.deptno;

        EMPNO ENAME      DNAME

    ---------- ---------- --------------

         7369 SMITH      RESEARCH

         7499 ALLEN      SALES

         7876 ADAMS      RESEARCH

           --部分結果省略

         7902 FORD       RESEARCH

         7934 MILLER     ACCOUNTING

    14 rows selected.

--注意:表別名不支援as 用法

    SQL> select e.empno,e.ename,d.dname from emp as e

      2  inner join dept  d

      3  on e.deptno = d.deptno;

    select e.empno,e.ename,d.dname from emp as e

                                       *

    ERROR at line 1:

    ORA-00933: SQL command not properly ended

--等值連線並增加條件

    SQL> select e.empno,e.ename,d.dname from emp  e,

      2  dept d

      3  where d.deptno = e.deptno

      4    and e.ename = 'SCOTT';

        EMPNO ENAME      DNAME

    ---------- ---------- --------------

         7788 SCOTT      RESEARCH

--非等值連線

--查詢僱員的姓名、薪水、級別且部門為的記錄

    SQL> select ename,sal,grade

      2  from emp,salgrade

      3  where sal between losal and hisal

      4    and emp.deptno = 20;

    ENAME             SAL      GRADE

    ---------- ---------- ----------

    SCOTT            3000          4

    FORD             3000          4

    JONES            2975          4

    ADAMS            1100          1

    SMITH             800          1 

--使用SQL 99寫法實現上述功能

    SQL> select e.ename,e.sal,s.grade

      2  from emp e

      3    join salgrade s

      4      on e.sal between losal and hisal

      5      and e.deptno = 20;

    ENAME             SAL      GRADE

    ---------- ---------- ----------

    SCOTT            3000          4

    FORD             3000          4

    JONES            2975          4

    ADAMS            1100          1

    SMITH             800          1

--右外連線

--注意:右外連線時,加號在等號的左邊

--可以看到,左表emp中的列有為空值的

    SQL> select e.ename,e.deptno,d.dname  

      2  from emp e,dept d

      3  where e.deptno(+) = d.deptno;

    ENAME          DEPTNO DNAME

    ---------- ---------- --------------

    CLARK              10 ACCOUNTING

    KING               10 ACCOUNTING

    MILLER             10 ACCOUNTING

    JONES              20 RESEARCH

    FORD               20 RESEARCH

    ADAMS              20 RESEARCH

    SMITH              20 RESEARCH

    SCOTT              20 RESEARCH

    WARD               30 SALES

    TURNER             30 SALES

    ALLEN              30 SALES

    ENAME          DEPTNO DNAME

    ---------- ---------- --------------

    JAMES              30 SALES

    BLAKE              30 SALES

    MARTIN             30 SALES

                       OPERATIONS

    15 rows selected.

--使用SQL 99寫法實現右外連線

    SQL> select e.ename,e.deptno,d.dname

      2  from emp e      

      3    right join dept d

      4      on e.deptno = d.deptno ;

    ENAME          DEPTNO DNAME

    ---------- ---------- --------------

    CLARK              10 ACCOUNTING

    KING               10 ACCOUNTING

    MILLER             10 ACCOUNTING

    JONES              20 RESEARCH

    FORD               20 RESEARCH

    ADAMS              20 RESEARCH

    SMITH              20 RESEARCH

    SCOTT              20 RESEARCH

    WARD               30 SALES

    TURNER             30 SALES

    ALLEN              30 SALES

    ENAME          DEPTNO DNAME

    ---------- ---------- --------------

    JAMES              30 SALES

    BLAKE              30 SALES

    MARTIN             30 SALES

                       OPERATIONS

--左外連線

--注意:左外連線時,加號在等號的右邊

    SQL> select d.dname,e.ename,e.deptno

      2  from dept d,emp e

      3  where d.deptno = e.deptno(+)

      4  order by d.deptno;

    DNAME          ENAME          DEPTNO

    -------------- ---------- ----------

    ACCOUNTING     CLARK              10

    ACCOUNTING     KING               10

    ACCOUNTING     MILLER             10

    RESEARCH       JONES              20

    RESEARCH       FORD               20

    RESEARCH       ADAMS              20

    RESEARCH       SMITH              20

    RESEARCH       SCOTT              20

    SALES          WARD               30

    SALES          TURNER             30

    SALES          ALLEN              30

    DNAME          ENAME          DEPTNO

    -------------- ---------- ----------

    SALES          JAMES              30

    SALES          BLAKE              30

    SALES          MARTIN             30

    OPERATIONS

    15 rows selected.

--使用SQL 99寫法實現左外連線

    SQL> select d.dname,e.ename,e.deptno

      2  from dept d

      3    left join emp e

      4      on d.deptno = e.deptno

      5  order by d.deptno;

    DNAME          ENAME          DEPTNO

    -------------- ---------- ----------

    ACCOUNTING     CLARK              10

    ACCOUNTING     KING               10

    ACCOUNTING     MILLER             10

    RESEARCH       JONES              20

    RESEARCH       FORD               20

    RESEARCH       ADAMS              20

    RESEARCH       SMITH              20

    RESEARCH       SCOTT              20

    SALES          WARD               30

    SALES          TURNER             30

    SALES          ALLEN              30

    DNAME          ENAME          DEPTNO

    -------------- ---------- ----------

    SALES          JAMES              30

    SALES          BLAKE              30

    SALES          MARTIN             30

    OPERATIONS

    15 rows selected.                

--自連線

    SQL> select e.ename || ' works for ' || m.ename

      2  from emp e,emp m

      3  where e.empno = m.mgr;

    E.ENAME||'WORKSFOR'||M.ENAME

    -------------------------------

    FORD works for SMITH

    BLAKE works for ALLEN

    BLAKE works for WARD

    KING works for JONES

    BLAKE works for MARTIN

    KING works for BLAKE

    KING works for CLARK

相關推薦

SQL基礎5——查詢

/* 一、多表查詢 簡言之,根據特定的連線條件從不同的表中獲取所需的資料 笛卡爾集的產生條件: 省略連線條件 連線條件無效 第一個表中的所有行與第二個表中的所有行相連線 二、多表查詢語法:*/     SELECT table1.column, tab

四、sql基礎關聯查詢--【Oracle資料庫】

####四、多表關聯查詢 #####4.1聯合查詢–等於連結–示例 員工表(員工id, 員工姓名,部門id) 部門表(部門id, 部門名稱) 要查詢員工id、姓名、部門名稱: select 員工表.員工id, 員工表.員工姓名, 部門表.部門姓名 from 員

Oracle作業5——查詢、子查詢

一、基礎練習: 1.查詢和scott相同部門的員工姓名ename和僱用日期hiredate SELECT ENAME,HIREDATE FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM EMP WHERE ENAME='SCOTT'); 2.查詢在部門的l

Sql基礎聯查

現構造多個數據表以供查詢表 表a id name  1  張三 2  李四 3  王五 4  小趙 表b ID userid jqnumber 1  1       2張 2  2       4張 表c ID  userid  wcj 1   1       2人 2  

MySQL 筆記5 -- 查詢

MySQL 筆記5 – 多表查詢 MySQL 系列筆記是筆者學習、實踐MySQL資料庫的筆記 一、表之間關係 1、一對一 單獨的一張表 與其它表沒有關係 2、一對多 一條資訊和其它多條

MySql基礎查詢

連線查詢 交叉查詢 等值連線 內連線 交叉查詢 格式 SELECT * FROM TABLE_A CROSS JOIN TABLE_B [WHERE 條件] SELECT * FROM TABLE_A JOIN TABLE_B[WHERE 條件] SELE

SQL 語句的查詢方式

例如:按照 department_id 查詢 employees(員工表)和 departments(部門表) 的資訊。 方式一(通用型):SELECT ... FROM ... WHERE SELECT e.last_name,e.department_id,d.department_name FROM e

select語句(5)--查詢

第四章:多表查詢 多表查詢,又稱表聯合查詢,即一條sql語句涉及到的表有多張,資料通過特定的連線進行聯合顯示.   一、笛卡爾積         在數學中,兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X × Y.         

Oracle總結【SQL細節、查詢、分組查詢、分頁】

前言 在之前已經大概瞭解過Mysql資料庫和學過相關的Oracle知識點,但是太久沒用過Oracle了,就基本忘了…印象中就只有基本的SQL語句和相關一些概念….寫下本博文的原因就是記載著Oracle一些以前沒注意到的知識點…以後或許會有用… 例項與資料

SQL中的查詢

1、笛卡爾積:舉例 2、根據連線條件的不同: (*)等值連線 (*)不等值連線 (*)外連線 (*)自連線 二、多表查詢:等值連線 查詢員工資訊:部門名稱   員工姓名 select d.dname,e.ename from emp e,dept d where e.d

查詢sql語句(5

關聯表 多表查詢 HERE from join eal where sso sql語句 學生表student(id,name)老師表teacher(id,name)課程表lesson(id,name)老師和課程關聯表(id,teacher_id,lesson_id)學生和課

SQL學習筆記_04_查詢

table cross fff 集中 數據 out clas -s 返回 一.概念: 1.多表連接有以下幾種分法: (1)內連接 vs 外連接 (左、右、滿)

spring boot 學習心得 使用JpaRepository註解自定義SQL查詢數據庫查詢

自定義 net http entity onetomany tom pri 查詢語句 重點 一. 首先在@Entity註解的類裏面要寫好外鍵關系. 這個 @ManyToOne 註解可以建立外鍵關系, 不要在自己傻傻的寫一個 private int grades_id;

查詢sql語句

多表 join 返回 選擇 new change 合並 技術 ima 多表查詢sql語句 1 --解鎖SCOTT用戶 2 alter user scott account unlock 3 --檢索指定的列 4 select job,ename,empno fro

sql-查詢JOIN與分組GROUP BY

group 邊表 AS inner left join sdn AR full join ner 一、內部連接:兩個表的關系是平等的,可以從兩個表中獲取數據。用ON表示連接條件 SELECT A.a,B.b FROM At AS A INNER JOINT Bt AS B

sql 查詢結果驗證

插入數據 create reat sql語句 ont creat 卡爾 nbsp 總結 1.笛卡爾積 定義: 設A,B為集合,用A中元素為第一元素,B中元素為第二元素構成的有序對,所有這樣的有序對組成的集合 ,叫做A與B的笛卡爾積,記作AxB. 上面有一個很關鍵的詞為“有序

Java框架-mybatis連線池、動態sql查詢

1. mybatis連線池 通過SqlMapConfig.xml設定dataSource type實現連線池的配置 1.1 dataSource標籤type屬性值含義 type=”POOLED”: MyBatis 會建立 PooledDataSource 例項

dedecms sql 自定義模型 查詢

 副表:wl_addon18,wl_addon17; 主表:wl_archives {dede:sql sql="select wl_archives.*,wl_archives.litpic, wl_archives.title,wl_addon18.style,wl_addon

sql常用操作(三)查詢

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

Sql語句查詢和更新

//多表查詢 select 表1.表1欄位, 表2.表2欄位 from 表1 inner join 表2 on 表1.Id=表2.Id //多表更新。讓A表的某欄位和B表的某欄位相同 update 表A set 表A.表A 欄位=表B.表B欄位 from 表B WHERE 表A