1 前期准备
1.1 创建表
/*==============================================================*//* Table: departments部门表 *//*==============================================================*/create table departments ( department_id NUMBER(10) not null, location_id NUMBER, department_name VARCHAR2(100), constraint PK_DEPARTMENTS primary key (department_id));/*==============================================================*//* Table: employees 员工表 *//*==============================================================*/create table employees ( employees_id NUMBER(10) not null, department_id NUMBER(10), last_name VARCHAR2(100), salary NUMBER(10), manager_id NUMBER(10), constraint PK_EMPLOYEES primary key (employees_id));/*==============================================================*//* Table: job_grades 薪资等级 *//*==============================================================*/create table job_grades ( gra VARCHAR2(10), lowest_sal NUMBER, highest_sal NUMBER);/*==============================================================*//* Table: locations 城市表 *//*==============================================================*/create table locations ( location_id NUMBER not null, city VARCHAR2(100), constraint PK_LOCATIONS primary key (location_id));--外键alter table departments add constraint FK_DEPARTME_REFERENCE_LOCATION foreign key (location_id) references locations (location_id);--外键alter table employees add constraint FK_EMPLOYEE_REFERENCE_DEPARTME foreign key (department_id) references departments (department_id);
1.2 初始化数据
城市表
INSERT INTO LOCATIONS VALUES (1, '重庆');INSERT INTO LOCATIONS VALUES (2, '北京');INSERT INTO LOCATIONS VALUES (3, '上海');INSERT INTO LOCATIONS VALUES (4, '大连');
部门表
INSERT INTO DEPARTMENTS VALUES (1, 1, '技术部');INSERT INTO DEPARTMENTS VALUES (2, 2, '人事部');INSERT INTO DEPARTMENTS VALUES (3, 3, '后勤部');INSERT INTO DEPARTMENTS VALUES (4, 4, '研发部');INSERT INTO DEPARTMENTS VALUES (5, 2, '销售不');INSERT INTO DEPARTMENTS VALUES (6, 3, '人事部');
员工表
INSERT INTO EMPLOYEES VALUES (1, 1, '张三', 4500, NULL);INSERT INTO EMPLOYEES VALUES (2, 3, '李四', 3500, 2);INSERT INTO EMPLOYEES VALUES (3, 4, '王五', 8400, 2);INSERT INTO EMPLOYEES VALUES (4, 5, '赵六', 15000, 3);
薪资等级表
INSERT INTO JOB_GRADES VALUES ('A', 20000, 100000);INSERT INTO JOB_GRADES VALUES ('B', 12000, 20000);INSERT INTO JOB_GRADES VALUES ('C', 8000, 12000);INSERT INTO JOB_GRADES VALUES ('D', 5000, 8000);INSERT INTO JOB_GRADES VALUES ('E', 4000, 5000);INSERT INTO JOB_GRADES VALUES ('F', 2000, 4000);
2 笛卡尔集
笛卡尔集会在下面条件下产生:
–省略连接条件
–连接条件无效
–所有表中的所有行互相连接
为了避免笛卡尔集,可以在WHERE加入有效的连接条件
3 Oracle 连接
使用连接在多个表中查询数据。
- 在WHERE字句中写入连接条件。
- 在表中有相同列时,在列名之前加上表名前缀。
SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column1 =table2.column2;
4 等值连接
5 连接多个表
6 非等值连接
select a.*,b.GRA from EMPLOYEES a,JOB_GRADES b where a.SALARY BETWEEN b.LOWEST_SAL and b.HIGHEST_SAL
7 外链接
外连接语法
使用外连接可以查询不满足连接条件的数据
外连接的符号是(+)。
8 自连接
9 使用连接从多个表中查询数据
10 叉集
11 自然连接
NATURAL JOIN子句,会以两个表中具有相同名字的列为条件创建等值连接。
•在表中查询满足等值条件的数据。
•如果只是列名相同而数据类型不同,则会产生错误。
12 使用ON子句创建连接
自然连接中是以具有相同名字的列为连接条件的。
可以使用ON子句指定额外的连接条件。
这个连接条件是与其它条件分开的。
ON子句使语句具有更高的易读性。
13 使用ON子句创建多表连接
14 内连接与外连接
•内连接只返回满足连接条件的数据。
•两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右)外联接。
•两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行,这种连接称为满外联接。