SQL基础操作_2_操作多个表
目錄
操作多個表
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 empMysql、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 empSql server:
SELECT deptno FROM dept EXCEPT SELECT deptno FROM empMysql、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 |
總結(jié)
以上是生活随笔為你收集整理的SQL基础操作_2_操作多个表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow安装手册
- 下一篇: linux cmake编译源码,linu