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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL基础操作_2_操作多个表

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

目錄

操作多個表

7.3.1 記錄集的疊加

7.3.2 組合相關(guān)的行

7.3.3 查詢兩個表共同的行

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

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

7.3.6 笛卡爾積生成數(shù)據(jù)

7.3.7 基于截取子串的連接

7.3.8 不等值連接


操作多個表

注:數(shù)據(jù)集和表結(jié)構(gòu)見?SQL基礎(chǔ)操作_1_檢索數(shù)據(jù)

7.3.1 記錄集的疊加

需求:

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

解決方法:

這里需要用到unionall關(guān)鍵詞,因為是兩個結(jié)果集的疊加。首先查詢出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

執(zhí)行結(jié)果:

ename_dname

deptno

ACCOUNTING

10

CLARK

10

KING

10

MILLER

10

OPERATIONS

40

RESEARCH

20

SALES

30

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

7.3.2 組合相關(guān)的行

需求:

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

解決方法:

這里需要用到inner join或則等值連接,因為是對兩張表進行關(guān)聯(lián),按照deptno去emp和dept表里關(guān)聯(lián)得到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

執(zhí)行結(jié)果:

?

ename

dname

CLARK

ACCOUNTING

KING

ACCOUNTING

MILLER

ACCOUNTING

延展閱讀:

這里是emp表里相同的deptno和dept里相同的deptno關(guān)聯(lián),見下:

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;

執(zhí)行結(jié)果:

ename

dname

emp_deptno

dept_deptno

CLARK

ACCOUNTING

10

10

KING

ACCOUNTING

10

10

MILLER

ACCOUNTING

10

10

7.3.3 查詢兩個表共同的行

需求:

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

解決方法:

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

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

執(zhí)行結(jié)果:

empno

ename

job

7782

CLARK

MANAGER

7839

KING

PRESIDENT

7934

MILLER

CLERK

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

需求:

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

解決方法:

這里需要用到minus關(guān)鍵字,當(dāng)然部分數(shù)據(jù)庫不支持,我們可以通過not exists關(guān)鍵詞解決。

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

執(zhí)行結(jié)果:

deptno

40

延展閱讀:

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

?執(zhí)行結(jié)果:

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表里關(guān)聯(lián)到,所以更加left join的特性,emp_deptno這列為null,所以我們加個WHERE emp.deptno IS NULL即可取出該條記錄。

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

需求:

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

解決方法:

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

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)

執(zhí)行結(jié)果:

deptno

dname

loc

40

OPERATIONS

BOSTON

7.3.6 笛卡爾積生成數(shù)據(jù)

需求:

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

解決方法:

這里需要用到cross join解決。生成一個A×B的結(jié)果集,即如果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

執(zhí)行結(jié)果:

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關(guān)聯(lián)。

解決方法:

這里需要用到對tmp_v里的字段data進行字符串截取后再跟dept表的關(guān)聯(lián)。

這里tmp_v的數(shù)據(jù)見下:

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里相關(guān)字符串函數(shù)不盡相同)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

執(zhí)行結(jié)果:

deptno

dname

ename

10

ACCOUNTING

CLARK

10

ACCOUNTING

KING

10

ACCOUNTING

MILLER

7.3.8 不等值連接

需求:

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

解決方法:

這里需要用到對tmp_v里的字段data進行字符串截取后再跟dept表的關(guān)聯(lián)。

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

執(zhí)行結(jié)果:

deptno

dname

ename

30

SALES

ALLEN

30

SALES

WARD

30

SALES

MARTIN

30

SALES

BLAKE

30

SALES

TURNER

30

SALES

JAMES

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。