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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL基础操作_2_操作多个表

發布時間:2024/9/27 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL基础操作_2_操作多个表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

操作多個表

7.3.1 記錄集的疊加

7.3.2 組合相關的行

7.3.3 查詢兩個表共同的行

7.3.4 從一個表中查詢另外一個表里沒有的值

7.3.5 在一個表中查詢與其它表不匹配的記錄

7.3.6 笛卡爾積生成數據

7.3.7 基于截取子串的連接

7.3.8 不等值連接


操作多個表

注:數據集和表結構見?SQL基礎操作_1_檢索數據

7.3.1 記錄集的疊加

需求:

查詢雇員表里部門編號是10的員工名和部門編號以及部門表里的部門名稱和部門編號。

解決方法:

這里需要用到unionall關鍵詞,因為是兩個結果集的疊加。首先查詢出emp表的empno,deptno再union all dept表里的deptname,deptno。

Mysql、Sql server、Oracle:

SELECT ename as ename_dname,deptno FROM emp WHERE deptno=10 UNION SELECT dname as ename_dname,deptno FROM dept

執行結果:

ename_dname

deptno

ACCOUNTING

10

CLARK

10

KING

10

MILLER

10

OPERATIONS

40

RESEARCH

20

SALES

30

注:這里記錄集疊加時主要對應字段類型要一致。比如這里的ename和dname是一致的都是字符串類型,如果類型不一致需要做轉換。

7.3.2 組合相關的行

需求:

查詢雇員表里部門編號是10的員工名和部門名稱。

解決方法:

這里需要用到inner join或則等值連接,因為是對兩張表進行關聯,按照deptno去emp和dept表里關聯得到ename和dname。

Mysql、Sql server、Oracle:

SELECT ename,dname FROM emp,dept WHERE emp.deptno= dept.deptno AND emp.deptno= 10;

或:

SELECT ename,dname FROM emp INNER JOIN dept ON emp.deptno= dept.deptno WHERE emp.deptno= 10

執行結果:

?

ename

dname

CLARK

ACCOUNTING

KING

ACCOUNTING

MILLER

ACCOUNTING

延展閱讀:

這里是emp表里相同的deptno和dept里相同的deptno關聯,見下:

SELECT ename,dname,emp.deptno AS emp_deptno,dept.deptno AS dept_deptno FROM emp INNER JOIN dept ON emp.deptno= dept.deptno WHERE emp.deptno= 10;

執行結果:

ename

dname

emp_deptno

dept_deptno

CLARK

ACCOUNTING

10

10

KING

ACCOUNTING

10

10

MILLER

ACCOUNTING

10

10

7.3.3 查詢兩個表共同的行

需求:

查詢雇員表里部門編號是10的員工編號、員工名稱、職位和雇員表的公共行。

解決方法:

這里需要用到intersect關鍵字,注意這里為了演示,顯然返回的還是部門編號為10的員工編號、員工名稱、職位。當然部分數據庫不支持,我們可以通過關聯的方式達到同樣的效果。

Sql server、Oracle:

SELECT empno,ename,job FROM emp WHERE deptno=10 INTERSECT SELECT empno,ename,job FROM emp

Mysql、Sql server、Oracle:

SELECT A.empno,A.ename,A.job FROM (SELECT empno,ename,job FROM emp WHERE deptno=10)A JOIN emp B ON A.empno = B.empnoAND A.ename = B.enameAND A.job = B.job

執行結果:

empno

ename

job

7782

CLARK

MANAGER

7839

KING

PRESIDENT

7934

MILLER

CLERK

7.3.4 從一個表中查詢另外一個表里沒有的值

需求:

查詢部門表雇員表里的部門編號,即未分配員工的部門。

解決方法:

這里需要用到minus關鍵字,當然部分數據庫不支持,我們可以通過not exists關鍵詞解決。

Oracle:

SELECT deptno FROM dept minus SELECT deptno FROM emp

Sql server:

SELECT deptno FROM dept EXCEPT SELECT deptno FROM emp

Mysql、Sql server、Oracle:

SELECT deptno FROM dept WHERE deptno NOT IN (SELECT deptnoFROM emp)

或者:

SELECT dept.deptno FROM dept LEFT JOIN emp ON emp.deptno= dept.deptno WHERE emp.deptno IS NULL

執行結果:

deptno

40

延展閱讀:

SELECT dept.deptno,emp.deptno FROM dept LEFT JOIN emp ON emp.deptno= dept.deptno -- WHERE emp.deptno IS NULL

?執行結果:

dept_deptno

emp_deptno

10

10

10

10

10

10

20

20

20

20

20

20

20

20

20

20

30

30

30

30

30

30

30

30

30

30

30

30

40

NULL

注:這里dept表里的deptno40并沒有在emp表里關聯到,所以更加left join的特性,emp_deptno這列為null,所以我們加個WHERE emp.deptno IS NULL即可取出該條記錄。

7.3.5 在一個表中查詢與其它表不匹配的記錄

需求:

查詢沒有部門員工的部門的信息。

解決方法:

這里需要用到left join解決思路類似上一章,也可以通過not exists、notin這些關鍵詞解決。

Mysql、Sql server、Oracle:

SELECT dept.* FROM dept LEFT JOIN emp ON emp.deptno= dept.deptno WHERE emp.deptno IS NULLSELECT dept.* FROM dept WHERE not exists (SELECT deptno FROM emp WHERE emp.deptno= dept.deptno)SELECT dept.* FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp)

執行結果:

deptno

dname

loc

40

OPERATIONS

BOSTON

7.3.6 笛卡爾積生成數據

需求:

查詢雇員表里部門編號是10的員工可能會待的所有部門的組合,這里要取得字段有員工編號、部門編號、部門名稱。

解決方法:

這里需要用到cross join解決。生成一個A×B的結果集,即如果A表里有3條,B條里有4條則會有3*4=12條記錄。

Mysql、Sql server、Oracle:

SELECT empno,deptno,dname FROM(SELECT empno FROM emp WHERE deptno=10)ACROSS JOIN dept

執行結果:

empno

deptno

dname

7782

10

ACCOUNTING

7782

20

RESEARCH

7782

30

SALES

7782

40

OPERATIONS

7839

10

ACCOUNTING

7839

20

RESEARCH

7839

30

SALES

7839

40

OPERATIONS

7934

10

ACCOUNTING

7934

20

RESEARCH

7934

30

SALES

7934

40

OPERATIONS

7.3.7 基于截取子串的連接

需求:

查詢雇員表里部門編號是10的部門編號、部門名稱、員工名,注這里需要emp表和tmp_v關聯。

解決方法:

這里需要用到對tmp_v里的字段data進行字符串截取后再跟dept表的關聯。

這里tmp_v的數據見下:

SELECT * FROM tmp_v;

data

SMITH 20

ALLEN 30

WARD 30

JONES 20

MARTIN 30

BLAKE 30

CLARK 10

SCOTT 20

KING 10

TURNER 30

ADAMS 20

JAMES 30

FORD 20

MILLER 10

?

Mysql、Sql server、Oracle:

SELECT B.deptno,B.dname,A.ename FROM (SELECTSUBSTRING(data,1,CHARINDEX(' ',data,1)-1) as ename, SUBSTRING(data,CHARINDEX(' ',data,1)+1,LEN(data)) as deptno FROM tmp_v )A INNER JOIN dept B ON A.deptno= B.deptno WHERE A.deptno=10-- 或:(這里oralce,sql server,mysql里相關字符串函數不盡相同)SELECT B.deptno,B.dname,SUBSTRING(data,1,CHARINDEX(' ',data,1)-1) as ename FROM tmp_v A INNER JOIN dept B ON SUBSTRING(A.data,CHARINDEX(' ',A.data,1)+1,LEN(A.data))= B.deptno WHERE B.deptno=10

執行結果:

deptno

dname

ename

10

ACCOUNTING

CLARK

10

ACCOUNTING

KING

10

ACCOUNTING

MILLER

7.3.8 不等值連接

需求:

查詢雇員表里部門編號大于20的部門編號、部門名稱、員工名,注這里需要emp表和tmp_v關聯。

解決方法:

這里需要用到對tmp_v里的字段data進行字符串截取后再跟dept表的關聯。

SELECT B.deptno,B.dname,SUBSTRING(data,1,CHARINDEX(' ',data,1)-1) as ename FROM tmp_v A INNER JOIN dept B ON SUBSTRING(A.data,CHARINDEX(' ',A.data,1)+1,LEN(A.data))= B.deptno ANDB.deptno>20

執行結果:

deptno

dname

ename

30

SALES

ALLEN

30

SALES

WARD

30

SALES

MARTIN

30

SALES

BLAKE

30

SALES

TURNER

30

SALES

JAMES

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的SQL基础操作_2_操作多个表的全部內容,希望文章能夠幫你解決所遇到的問題。

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