本文章目的:力求清晰明瞭講解SQL語句的內連接的各種應用,沒有深奧的理解! 前奏:這篇文章和下篇文章會將內連接和外連接講解清楚SQL語句的多表查詢常用的有以下幾種:兩表聯合查詢(1)內連接(2)外連接(分左外連接、右外連接)(3)全外連接(4)自連接三表查詢(1)三表查詢本片講解兩表聯合查詢的內連接 ...
本文章目的:力求清晰明瞭講解SQL語句的內連接的各種應用,沒有深奧的理解!
前奏:這篇文章和下篇文章會將內連接和外連接講解清楚
SQL語句的多表查詢常用的有以下幾種:
兩表聯合查詢
(1)內連接
(2)外連接(分左外連接、右外連接)
(3)全外連接
(4)自連接
三表查詢
(1)三表查詢
本片講解兩表聯合查詢的內連接:
第一步:準備表,員工表emp,部門表dept
關聯關係:員工表的“deptno”欄位關聯部門表的“deptno”
建表語句如下:
create table DEPT ( DEPTNO int(2) not null, DNAME VARCHAR(14), LOC VARCHAR(13) ); alter table DEPT add constraint PK_DEPT primary key (DEPTNO); create table EMP ( EMPNO int(4) primary key, ENAME VARCHAR(10), JOB VARCHAR(9), MGR int(4), HIREDATE DATE, SAL double(7,2), COMM double(7,2), DEPTNO int(2) ); alter table EMP add constraint FK_DEPTNO foreign key (DEPTNO) references DEPT (DEPTNO);
表結構如下:
插入數據:
insert into DEPT (DEPTNO, DNAME, LOC)values (10, 'ACCOUNTING', 'NEW YORK'); insert into DEPT (DEPTNO, DNAME, LOC)values (20, 'RESEARCH', 'DALLAS'); insert into DEPT (DEPTNO, DNAME, LOC)values (30, 'SALES', 'CHICAGO'); insert into DEPT (DEPTNO, DNAME, LOC)values (40, 'OPERATIONS', 'BOSTON');
insert into DEPT (DEPTNO, DNAME, LOC)values (10, 'ACCOUNTING', 'NEW YORK'); insert into DEPT (DEPTNO, DNAME, LOC)values (20, 'RESEARCH', 'DALLAS'); insert into DEPT (DEPTNO, DNAME, LOC)values (30, 'SALES', 'CHICAGO'); insert into DEPT (DEPTNO, DNAME, LOC)values (40, 'OPERATIONS', 'BOSTON'); commit; insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
第二步:講解內連接
(1)笛卡爾積現象:(什麼是笛卡爾積,在此不在講解,如果有需要,可以留言,我再補充)
通過關鍵字:CROSS JOIN
優點:有助於理解多表查詢
缺點:交叉連接會產生笛卡爾積,產生多條無用結果
解決方案:(1)使用natural子句,即自然連接
(2)使用using子句
(3)使用on 子句
方案一:使用自然連接
優點:會自動的按照所有的同名列進行匹配,並且同名列只顯示一次,簡便
缺點:會自動的按照“所有的”同名列進行匹配,如果希望按照某一個同名列進行匹配,自然連接無能為力
解決方案:使用using
方案(2):使用using子句
優點:只顯示指定的同名欄位
缺點:如果兩張表的關聯欄位不同名怎麼辦?
解決方案:使用on
方案(3):使用on子句
優點:不管是否有同名列,都可以使用;雖然稍顯複雜,但是可讀性高,很好的解決了自然連接和using子句的缺陷
因此,在開發中,推薦使用on子句
至此,多表查詢的內連接講解完畢,總結一下:
交叉連接(cross join):會產生笛卡爾積,產生大量無用數據,無用
自然連接(natural):會自動的按照所有的同名列進行匹配,並且同名列只顯示一次,顯示繁瑣
使用(using):按照某一個同名列進行匹配,指定了同名列,一定程度減少了自然連接的顯示量
使用(on):如果兩張表的關聯欄位不同名,自然連接和using無能為力,只有通過on子句。推薦使用on子句
完結!
註:下篇文章,講解外連接,有問題要交流的歡迎留言,有則改之無則加勉。