關(guān)于做網(wǎng)站電話銷售深圳排名seo
目錄
統(tǒng)計(jì)出一張數(shù)據(jù)表中的數(shù)據(jù)量
查詢 dept 表中的數(shù)據(jù)量
查詢 emp 表中的數(shù)據(jù)量
實(shí)現(xiàn) emp 與 dept 的多表查詢
笛卡爾積
消除笛卡爾積
把數(shù)據(jù)表 emp 的別名定為 e,數(shù)據(jù)表 dept 的別名定為 d,然后在查詢中分別使用 e 和 d 代替這兩個(gè)表
Oracle從入門到總裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
所謂的多表查詢指的就是同時(shí)從多張數(shù)據(jù)表中取出數(shù)據(jù)并且顯示的一種操作
select [distinct] * | 列 [ 別名 ] , 列 [ 別名 ] ...
from 表名稱 [ 別名 ], 表名稱 [ 別名 ],...
[where 限定條件 (s)]
[order by 排序字段 [asc | desc], 排序字段 [asc | desc],...]
上面語法中,
第一行表示確定要顯示的數(shù)據(jù)列;
第二行確定數(shù)據(jù)來源;
第三行對(duì)數(shù)據(jù)行進(jìn)行篩選;
第四行對(duì)選定數(shù)據(jù)的行與列排序。
和前面唯一的不同之處在于 FROM 后面增加了更多的表
下面按照這樣的語法結(jié)構(gòu)實(shí)現(xiàn)多表查詢。本次將利用 emp 與 dept 兩張表進(jìn)行多表查詢操作。在查詢之前,先介紹一個(gè)函數(shù)
統(tǒng)計(jì)出一張數(shù)據(jù)表中的數(shù)據(jù)量
關(guān)鍵詞是count()
查詢 dept 表中的數(shù)據(jù)量
SQL> select count(*)2 from dept;COUNT(*)
----------4
可以看出這個(gè)數(shù)據(jù)表有 4 行記錄
查詢 emp 表中的數(shù)據(jù)量
SQL> select count(*)2 from emp;COUNT(*)
----------13
運(yùn)行后可以看出這個(gè)數(shù)據(jù)表有 13?行記錄
有些同學(xué)會(huì)發(fā)現(xiàn)記錄數(shù)不一樣,這個(gè)沒有關(guān)系的
也就是說,這兩張表加起來,總共有 17?行記錄
實(shí)現(xiàn) emp 與 dept 的多表查詢
SQL> select *2 from emp,dept;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAMELOC
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------7369 SMITH CLERK 7902 17-12月-80 800 20 10 ACCOUNTINGNEW YORK7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 10 ACCOUNTINGNEW YORK7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 10 ACCOUNTINGNEW YORK7566 JONES MANAGER 7839 02-4月 -81 2975 20 10 ACCOUNTINGNEW YORK7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 10 ACCOUNTINGNEW YORK7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 10 ACCOUNTINGNEW YORK7782 CLARK MANAGER 7839 09-6月 -81 2450 10 10 ACCOUNTINGNEW YORK7839 KING PRESIDENT 17-11月-81 5000 10 10 ACCOUNTINGNEW YORK7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 10 ACCOUNTINGNEW YORK7900 JAMES CLERK 7698 03-12月-81 950 30 10 ACCOUNTINGNEW YORK7902 FORD ANALYST 7566 03-12月-81 3000 20 10 ACCOUNTINGNEW YORK7934 MILLER CLERK 7782 23-1月 -82 1300 10 10 ACCOUNTINGNEW YORK8989 HELLO 10 ACCOUNTINGNEW YORK7369 SMITH CLERK 7902 17-12月-80 800 20 20 RESEARCHDALLAS7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 20 RESEARCHDALLAS7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 20 RESEARCHDALLAS7566 JONES MANAGER 7839 02-4月 -81 2975 20 20 RESEARCHDALLAS7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 20 RESEARCHDALLAS7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 20 RESEARCHDALLAS7782 CLARK MANAGER 7839 09-6月 -81 2450 10 20 RESEARCHDALLAS7839 KING PRESIDENT 17-11月-81 5000 10 20 RESEARCHDALLAS7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 20 RESEARCHDALLAS7900 JAMES CLERK 7698 03-12月-81 950 30 20 RESEARCHDALLAS7902 FORD ANALYST 7566 03-12月-81 3000 20 20 RESEARCHDALLAS7934 MILLER CLERK 7782 23-1月 -82 1300 10 20 RESEARCHDALLAS8989 HELLO 20 RESEARCHDALLAS7369 SMITH CLERK 7902 17-12月-80 800 20 30 SALESCHICAGOEMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAMELOC
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 30 SALESCHICAGO7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 30 SALESCHICAGO7566 JONES MANAGER 7839 02-4月 -81 2975 20 30 SALESCHICAGO7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 30 SALESCHICAGO7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 30 SALESCHICAGO7782 CLARK MANAGER 7839 09-6月 -81 2450 10 30 SALESCHICAGO7839 KING PRESIDENT 17-11月-81 5000 10 30 SALESCHICAGO7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 30 SALESCHICAGO7900 JAMES CLERK 7698 03-12月-81 950 30 30 SALESCHICAGO7902 FORD ANALYST 7566 03-12月-81 3000 20 30 SALESCHICAGO7934 MILLER CLERK 7782 23-1月 -82 1300 10 30 SALESCHICAGO8989 HELLO 30 SALESCHICAGO7369 SMITH CLERK 7902 17-12月-80 800 20 40 OPERATIONSBOSTON7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 40 OPERATIONSBOSTON7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 40 OPERATIONSBOSTON7566 JONES MANAGER 7839 02-4月 -81 2975 20 40 OPERATIONSBOSTON7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 40 OPERATIONSBOSTON7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 40 OPERATIONSBOSTON7782 CLARK MANAGER 7839 09-6月 -81 2450 10 40 OPERATIONSBOSTON7839 KING PRESIDENT 17-11月-81 5000 10 40 OPERATIONSBOSTON7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 40 OPERATIONSBOSTON7900 JAMES CLERK 7698 03-12月-81 950 30 40 OPERATIONSBOSTON7902 FORD ANALYST 7566 03-12月-81 3000 20 40 OPERATIONSBOSTON7934 MILLER CLERK 7782 23-1月 -82 1300 10 40 OPERATIONSBOSTON8989 HELLO 40 OPERATIONSBOSTON已選擇 52 行。
發(fā)現(xiàn)每一行 emp 表中的記錄出現(xiàn)了 4 次,而 4 次是 dept 表中的數(shù)據(jù)量,所以最終產(chǎn)生了 emp 表 13?行 *dept 表 4 行 =52?行記錄
在查詢顯示的時(shí)候,emp 表每行記錄同時(shí)顯示了 dept 表的 4 行記錄,而實(shí)際上只有 1 行記錄是對(duì)應(yīng)的,即數(shù)據(jù)表 emp 中字段 deptno 與數(shù)據(jù)表 dept 中 字段 deptno 相等
笛卡爾積
之所以會(huì)出現(xiàn)這樣的情況,主要與數(shù)據(jù)庫(kù)的產(chǎn)生原理有關(guān)數(shù)學(xué)的集合。這樣的集合操作,會(huì) 將兩個(gè)集合(數(shù)據(jù)表)的統(tǒng)一查詢,作為乘法的形式出現(xiàn)。結(jié)果一定會(huì)產(chǎn)生積笛卡爾積
在任何情況下,進(jìn)行多表查詢都會(huì)存在笛卡爾積的問題。但是事實(shí)上這些積的產(chǎn)生對(duì)用戶而言是沒有任何實(shí)質(zhì)上的用處的,所以需要想辦法進(jìn)行消除。如果要想消除積,那么必須有關(guān)聯(lián)字段?
很明顯,現(xiàn)在 emp 與 dept 數(shù)據(jù)表中都存在關(guān)聯(lián)字段(大部分情況下,都習(xí)慣將關(guān)聯(lián)字段設(shè)置為同名) 。此時(shí)就可以利用關(guān)聯(lián)字段消除笛卡爾積
消除笛卡爾積
SQL> select *2 from emp,dept3 where emp.deptno=dept.deptno;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAMELOC
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------7839 KING PRESIDENT 17-11月-81 5000 10 10 ACCOUNTINGNEW YORK7782 CLARK MANAGER 7839 09-6月 -81 2450 10 10 ACCOUNTINGNEW YORK7934 MILLER CLERK 7782 23-1月 -82 1300 10 10 ACCOUNTINGNEW YORK7902 FORD ANALYST 7566 03-12月-81 3000 20 20 RESEARCHDALLAS7369 SMITH CLERK 7902 17-12月-80 800 20 20 RESEARCHDALLAS7566 JONES MANAGER 7839 02-4月 -81 2975 20 20 RESEARCHDALLAS7900 JAMES CLERK 7698 03-12月-81 950 30 30 SALESCHICAGO7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 30 SALESCHICAGO7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 30 SALESCHICAGO7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 30 SALESCHICAGO7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 30 SALESCHICAGO7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 30 SALESCHICAGO已選擇 12 行。
對(duì)應(yīng)顯示的是 emp 數(shù)據(jù)表中 deptno 字段和 dept 數(shù)據(jù)表中 deptno 字段相等的數(shù)據(jù)行。顯示的列是兩個(gè)數(shù)據(jù)表的所有列。這時(shí)候只顯示 emp 表中的 13?行記錄,同時(shí)每個(gè)記錄所 對(duì)應(yīng)的 dept 中字段的信息也顯示在后面
只要是多表查詢,在多張表之間一定要存在關(guān)聯(lián)關(guān)系,沒有關(guān)聯(lián)關(guān)系的表是不可能進(jìn)行多表查詢的
但是現(xiàn)在的代碼還存在一個(gè)問題,此時(shí)進(jìn)行字段訪問的時(shí)候采用的是“表名稱 . 字段名稱” ,表名稱短沒什么問題,而如果表名稱長(zhǎng)了就比較麻煩,例如“yuzhou_yinhexi_diqiu_yazhou_beijing_zhongyang_ren” 。所以在進(jìn)行多表查詢的時(shí)候強(qiáng)烈建議使用別名?
把數(shù)據(jù)表 emp 的別名定為 e,數(shù)據(jù)表 dept 的別名定為 d,然后在查詢中分別使用 e 和 d 代替這兩個(gè)表
SQL> select e.*,d.dname2 from emp e,dept d3 where e.deptno=d.deptno;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DNAME
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ----------------------------7839 KING PRESIDENT 17-11月-81 5000 10 ACCOUNTING7782 CLARK MANAGER 7839 09-6月 -81 2450 10 ACCOUNTING7934 MILLER CLERK 7782 23-1月 -82 1300 10 ACCOUNTING7902 FORD ANALYST 7566 03-12月-81 3000 20 RESEARCH7369 SMITH CLERK 7902 17-12月-80 800 20 RESEARCH7566 JONES MANAGER 7839 02-4月 -81 2975 20 RESEARCH7900 JAMES CLERK 7698 03-12月-81 950 30 SALES7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 SALES7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 SALES7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 SALES7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 SALES7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 SALES已選擇 12 行。
這次顯示的數(shù)據(jù)列和上一個(gè)查詢不完全一樣,因?yàn)椴樵兊臄?shù)據(jù)列是 e.* 和 d.name,所以顯示的列應(yīng)該是數(shù)據(jù)表 emp 的全部字段和 dept 的 dname 字段
實(shí)際上,笛卡爾積的存在對(duì)整個(gè)程序影響是相當(dāng)巨大的,即便可以消除掉顯示的笛卡爾積,但是從本質(zhì)上來說,永遠(yuǎn)無法避免笛卡爾積