您的位置:首页 > 数据库 > Oracle

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: