Oracle的表的联结类型(内连接,外连接(左外连接,右外连接),自连接)
2013-04-02 23:24
337 查看
查询语句
去掉重复行DISTINCT
条件查询
SELECT ename,job FROM emp WHERE comm IS NOT NULL;
SELECT * FROM emp WHERE ename LIKE '%AM%';
SELECT ename,job FROM emp WHERE deptno=30 AND sal>1500;
SELECT * FROM emp WHERE job='SALESMAN' OR job='PRESIDENT' AND sal>1500;
SELECT * FROM emp WHERE (job='SALESMAN' OR job='PRESIDENT') AND sal>1500;
多表查询
内连接:
等值连接:n张表要有n-1对关系字段相等。
conn scott/tiger
SELECT ename,dname FROM emp,dept WHERE emp.deptno=dept.deptno;
等效于
SELECT ename,dname FROM emp [INNER] JOIN dept ON emp.deptno=dept.deptno;
conn hr/abc123
SELECT first_name||' '||last_name AS "姓名",department_name AS "部门名",city AS "城市"
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id AND d.location_id=l.location_id
外连接:左外连接和右外连接
外连接连接的表有主次之分。
如果是左外连接的话,那么左边的表为主表,右边的表为从表;
如果是右外连接的话,那么左边的表为从表,右边的表为主表。
主表中选用的字段信息要求无条件列出,从表中选用的字段信息要满足连接条件才能列出(关系字段相等条件)
例:tom/zyx987
左外
SELECT last_name,d_name FROM employee e LEFT [OUTER] JOIN department d ON e.dept_id=d.dept_id ;
等效于(只在Oracle中好使)
SELECT last_name,d_name FROM employee e,department d WHERE e.dept_id=d.dept_id(+);
运行结果:
LAST_NAME D_NAME
---------- ----------
赵柳 研发部
捞钱 研发部
王 财务部
张三 研发部
Jonney
Cleck 实训部
右外
SELECT last_name,d_name FROM employee e RIGHT [OUTER] JOIN department d ON e.dept_id=d.dept_id;
等效于(只在Oracle中好使)
SELECT last_name,d_name FROM employee e,department d WHERE e.dept_id(+)=d.dept_id;
运行结果:
LAST_NAME D_NAME
---------- ----------
赵柳 研发部
捞钱 研发部
张三 研发部
王 财务部
Cleck 实训部
市场部
经理室
原表:
SQL> SELECT * FROM employee;
EMPLOYEE_ID LAST_NAME SALARY COMMISSION_PCT HIRE_DATE SE EMAIL DEPT_ID
----------- ---------- ---------- -------------- -------------- -- ------------------------------ ----------
3 赵柳 2500 .1 28-8月 -09 女
zhaoliu@gmail.com 1
4 捞钱 2500 .1 28-8月 -09 男
laoqian@sohu.com 1
2 王 1234.23 28-8月 -09 女
wangnvshi@yahoo.com 2
1 张三 1500 .1 28-8月 -09 男
zhangsan@163.com 1
5 Jonney 3000 31-8月 -09 男
6 Cleck 4000 .2 31-8月 -09 男
cleck@gmail.com 3
QL> SELECT * FROM department;
DEPT_ID D_NAME D_INFO
---------- ---------- --------------------------------------------------
1 研发部 软件研发工作
2 财务部 发送工资工作
3 实训部 学生培训工作
4 市场部 负责市场调研和软件工程竞标
5 经理室 管理部门
自连接:
连接的多表都是同一张表。
连接关键:要给同一张表起不同的别名
conn scott/tiger
例:查询员工姓名、工作岗位及上司姓名。
SELECT employees.ename AS "员工姓名",employees.job AS "工作岗位",managers.ename AS "上司姓名"
FROM emp employees,emp managers
WHERE employees.mgr=managers.empno
employees
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 3000 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1760 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1375 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1375 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 3135 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 1200 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1650 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 1045 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
managers
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 3000 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1760 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1375 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1375 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 3135 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 1200 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1650 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 1045 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
作业:
CREATE TABLE testdept(
dept_id INTEGER PRIMARY KEY,
d_name VARCHAR2(20),
parent_id INTEGER
);
ALTER TABLE testdept ADD CONSTRAINT fk_self_testdept FOREIGN KEY (parent_id) REFERENCES testdept(dept_id);
INSERT INTO testdept VALUES(1,'资源部',null);
INSERT INTO testdept VALUES(2,'市场部',null);
INSERT INTO testdept VALUES(3,'人力资源部',1);
INSERT INTO testdept VALUES(4,'社会资源部',1);
INSERT INTO testdept VALUES(5,'市场宣传部',2);
INSERT INTO testdept VALUES(6,'市场策划部',2);
去掉重复行DISTINCT
条件查询
SELECT ename,job FROM emp WHERE comm IS NOT NULL;
SELECT * FROM emp WHERE ename LIKE '%AM%';
SELECT ename,job FROM emp WHERE deptno=30 AND sal>1500;
SELECT * FROM emp WHERE job='SALESMAN' OR job='PRESIDENT' AND sal>1500;
SELECT * FROM emp WHERE (job='SALESMAN' OR job='PRESIDENT') AND sal>1500;
多表查询
内连接:
等值连接:n张表要有n-1对关系字段相等。
conn scott/tiger
SELECT ename,dname FROM emp,dept WHERE emp.deptno=dept.deptno;
等效于
SELECT ename,dname FROM emp [INNER] JOIN dept ON emp.deptno=dept.deptno;
conn hr/abc123
SELECT first_name||' '||last_name AS "姓名",department_name AS "部门名",city AS "城市"
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id AND d.location_id=l.location_id
外连接:左外连接和右外连接
外连接连接的表有主次之分。
如果是左外连接的话,那么左边的表为主表,右边的表为从表;
如果是右外连接的话,那么左边的表为从表,右边的表为主表。
主表中选用的字段信息要求无条件列出,从表中选用的字段信息要满足连接条件才能列出(关系字段相等条件)
例:tom/zyx987
左外
SELECT last_name,d_name FROM employee e LEFT [OUTER] JOIN department d ON e.dept_id=d.dept_id ;
等效于(只在Oracle中好使)
SELECT last_name,d_name FROM employee e,department d WHERE e.dept_id=d.dept_id(+);
运行结果:
LAST_NAME D_NAME
---------- ----------
赵柳 研发部
捞钱 研发部
王 财务部
张三 研发部
Jonney
Cleck 实训部
右外
SELECT last_name,d_name FROM employee e RIGHT [OUTER] JOIN department d ON e.dept_id=d.dept_id;
等效于(只在Oracle中好使)
SELECT last_name,d_name FROM employee e,department d WHERE e.dept_id(+)=d.dept_id;
运行结果:
LAST_NAME D_NAME
---------- ----------
赵柳 研发部
捞钱 研发部
张三 研发部
王 财务部
Cleck 实训部
市场部
经理室
原表:
SQL> SELECT * FROM employee;
EMPLOYEE_ID LAST_NAME SALARY COMMISSION_PCT HIRE_DATE SE EMAIL DEPT_ID
----------- ---------- ---------- -------------- -------------- -- ------------------------------ ----------
3 赵柳 2500 .1 28-8月 -09 女
zhaoliu@gmail.com 1
4 捞钱 2500 .1 28-8月 -09 男
laoqian@sohu.com 1
2 王 1234.23 28-8月 -09 女
wangnvshi@yahoo.com 2
1 张三 1500 .1 28-8月 -09 男
zhangsan@163.com 1
5 Jonney 3000 31-8月 -09 男
6 Cleck 4000 .2 31-8月 -09 男
cleck@gmail.com 3
QL> SELECT * FROM department;
DEPT_ID D_NAME D_INFO
---------- ---------- --------------------------------------------------
1 研发部 软件研发工作
2 财务部 发送工资工作
3 实训部 学生培训工作
4 市场部 负责市场调研和软件工程竞标
5 经理室 管理部门
自连接:
连接的多表都是同一张表。
连接关键:要给同一张表起不同的别名
conn scott/tiger
例:查询员工姓名、工作岗位及上司姓名。
SELECT employees.ename AS "员工姓名",employees.job AS "工作岗位",managers.ename AS "上司姓名"
FROM emp employees,emp managers
WHERE employees.mgr=managers.empno
employees
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 3000 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1760 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1375 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1375 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 3135 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 1200 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1650 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 1045 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
managers
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 3000 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1760 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1375 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1375 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 3135 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 1200 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1650 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 1045 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
作业:
CREATE TABLE testdept(
dept_id INTEGER PRIMARY KEY,
d_name VARCHAR2(20),
parent_id INTEGER
);
ALTER TABLE testdept ADD CONSTRAINT fk_self_testdept FOREIGN KEY (parent_id) REFERENCES testdept(dept_id);
INSERT INTO testdept VALUES(1,'资源部',null);
INSERT INTO testdept VALUES(2,'市场部',null);
INSERT INTO testdept VALUES(3,'人力资源部',1);
INSERT INTO testdept VALUES(4,'社会资源部',1);
INSERT INTO testdept VALUES(5,'市场宣传部',2);
INSERT INTO testdept VALUES(6,'市场策划部',2);
相关文章推荐
- Oracle 表连接方式(内连接/外连接/自连接) 详解
- C#连接4种类型数据库(Access、SQL Server、Oracle、MySQL)
- C# 不安装oracle客户端使用DLL连接数据库,初始化类型错误
- Oracle 表连接方式(内连接/外连接/自连接) 详解
- IT忍者神龟之sql回顾Oracle 表连接方式(内连接/外连接/自连接) 详解
- 《基于ORACLE SQL优化》读书笔记-表的连接类型
- Oracle中内连接查询(inner join),自然连接查询(natural join),自连接查询,外连接查询(outer join),左外连接(left join),右外连接(right joi
- C#连接4种类型数据库(Access、SQL Server、Oracle、MySQL)
- Oracle 表连接方式(内连接/外连接/自连接) 详解
- oracle 网络连接类型(二)
- oracle多表查询(外连接,自连接)
- Oracle 表连接方式(内连接/外连接/自连接) 详解
- Oracle连接类型
- C#连接4种类型数据库(Access、SQL Server、Oracle、MySQL)
- 104----oracle基本概念,启动,连接, 数据类型,常见案例,集合操作符
- mybatis连接oracle,为什么要设置字段默认类型
- Oracle 表连接方式(内连接/外连接/自连接) 详解
- oracle sql 中不同类型的表连接
- ORACLE数据库SQL优化--->Oracle表连接类型
- Oracle 表连接方式详解(外链接、内连接、自连接)