SQL92語法
連接查詢:也可以叫跨表查詢,需要關聯多個表進行查詢。
● 顯示每個員工信息,并顯示所屬的部門名稱
select ename, dname from emp, dept; |
SQL> select ename, dname from emp, dept;
ENAME DNAME ---------- -------------- SMITH ACCOUNTING ALLEN ACCOUNTING WARD ACCOUNTING JONES ACCOUNTING MARTIN ACCOUNTING BLAKE ACCOUNTING CLARK ACCOUNTING SCOTT ACCOUNTING KING ACCOUNTING TURNER ACCOUNTING ADAMS ACCOUNTING JAMES ACCOUNTING FORD ACCOUNTING MILLER ACCOUNTING SMITH RESEARCH ALLEN RESEARCH WARD RESEARCH JONES RESEARCH MARTIN RESEARCH BLAKE RESEARCH CLARK RESEARCH SCOTT RESEARCH KING RESEARCH TURNER RESEARCH ADAMS RESEARCH JAMES RESEARCH FORD RESEARCH MILLER RESEARCH SMITH SALES ALLEN SALES WARD SALES JONES SALES MARTIN SALES BLAKE SALES CLARK SALES SCOTT SALES KING SALES TURNER SALES ADAMS SALES JAMES SALES FORD SALES MILLER SALES SMITH OPERATIONS ALLEN OPERATIONS WARD OPERATIONS JONES OPERATIONS MARTIN OPERATIONS BLAKE OPERATIONS CLARK OPERATIONS SCOTT OPERATIONS KING OPERATIONS TURNER OPERATIONS ADAMS OPERATIONS JAMES OPERATIONS FORD OPERATIONS MILLER OPERATIONS
已選擇56行。 |
以上輸出,不正確,輸出了56條數據,其實就是兩個表記錄的成績,這種情況我們稱為:“笛卡兒乘積”,出現錯誤的原因是:沒有指定連接條件。
指定連接條件
select emp.ename, dept.dname from emp, dept where
emp.deptno=dept.deptno;
也可以使用別名
select e.ename, d.dname from emp e, dept d where e.deptno=d.deptno;
以上結果輸出正確,因為加入了正確的連接條件;
以上查詢也稱為 “內連接”,只查詢相等的數據(連接條件相等的數據)。
● 取得員工和所屬的領導的姓名
select e.ename, m.ename from emp e, emp m where e.mgr=m.empno; |
SQL> select * from emp;(普通員工)
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-12月-80 800 20 7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 7566 JONES MANAGER 7839 02-4月 -81 2975 20 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 7782 CLARK MANAGER 7839 09-6月 -81 2450 10 7788 SCOTT ANALYST 7566 19-4月 -87 3000 20 7839 KING PRESIDENT 17-11月-81 5000 10 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 7876 ADAMS CLERK 7788 23-5月 -87 1100 20 7900 JAMES CLERK 7698 03-12月-81 950 30 7902 FORD ANALYST 7566 03-12月-81 3000 20 7934 MILLER CLERK 7782 23-1月 -82 1300 10
已選擇14行。
SQL> select * from emp;(管理者)
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-12月-80 800 20 7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 7566 JONES MANAGER 7839 02-4月 -81 2975 20 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 7782 CLARK MANAGER 7839 09-6月 -81 2450 10 7788 SCOTT ANALYST 7566 19-4月 -87 3000 20 7839 KING PRESIDENT 17-11月-81 5000 10 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 7876 ADAMS CLERK 7788 23-5月 -87 1100 20 7900 JAMES CLERK 7698 03-12月-81 950 30 7902 FORD ANALYST 7566 03-12月-81 3000 20 7934 MILLER CLERK 7782 23-1月 -82 1300 10
已選擇14行。
SQL> select e.ename, m.ename from emp e, emp m where e.mgr=m.empno;
ENAME ENAME ---------- ---------- SMITH FORD ALLEN BLAKE WARD BLAKE JONES KING MARTIN BLAKE BLAKE KING CLARK KING SCOTT JONES TURNER BLAKE ADAMS SCOTT JAMES BLAKE FORD JONES MILLER CLARK
已選擇13行。 |
以上稱為“自連接”,只有一張表連接,具體的查詢方法,把一張表看作兩張表即可,如以上示例:第一個表emp e代碼了員工表,emp m代表了領導表,相當于員工表和部門表一樣。
● (內連接)顯示薪水大于2000的員工信息,并顯示所屬的部門名稱
采用SQL92語法:
采用SQL92語法:
select e.ename, e.sal, d.dname from emp e, dept d where e.deptno=d.deptno and e.sal > 2000;
采用SQL99語法:
select e.ename, e.sal, d.dname from emp e join dept d on e.deptno=d.deptno where e.sal>2000;
或
select e.ename, e.sal, d.dname from emp e inner join dept d on e.deptno=d.deptno where e.sal>2000;
在實際中一般不加inner關鍵字
Sql92語法和sql99語法的區別:99語法可以做到表的連接和查詢條件分離,特別是多個表進行連接的時候,會比sql92更清晰。
●(外連接)顯示員工信息,并顯示所屬的部門名稱,如果某一個部門沒有員工,那么該部門也必須顯示出來
右連接:
select e.ename, e.sal, d.dname from emp e right join dept d on e.deptno=d.deptno;
左連接:
select e.ename, e.sal, d.dname from dept d left join emp e on e.deptno=d.deptno;
以上兩個查詢效果相同
連接分類:
1、內鏈接
* 表1 inner join 表2 on 關聯條件
* 做連接查詢的時候一定要寫上關聯條件
* inner 可以省略
2、外連接
● 左外連接
* 表1 left outer join 表2 on 關聯條件
* 做連接查詢的時候一定要寫上關聯條件
* outer 可以省略*
● 右外連接
* 表1 right outer join 表2 on 關聯條件
* 做連接查詢的時候一定要寫上關聯條件
* outer 可以省略
*左外連接(左連接)和右外連接(右連接)的區別:
*左連接以左面的表為準和右邊的表比較,和左表相等的不相等都會顯示出來,右表符合條件的顯示,不符合條件的不顯示
*右連接恰恰相反,以上左連接和右連接也可以加入outer關鍵字,但一般不建議這種寫法,如:
select e.ename, e.sal, d.dname from emp e right outer join dept d on e.deptno=d.deptno;
select e.ename, e.sal, d.dname from dept d left outer join emp e on e.deptno=d.deptno;
左連接能完成的功能右連接一定可以完成。