版权声明:JAVA https://blog.csdn.net/weixin_43190126/article/details/85257146
需要将这些表导入Oracle
prompt PL/SQL Developer import file
prompt Created on 2015年10月22日 星期四 by Administrator
set feedback off
set define off
prompt Dropping DEPARTMENTS...
drop table DEPARTMENTS cascade constraints;
prompt Dropping EMPLOYEES...
drop table EMPLOYEES cascade constraints;
prompt Dropping JOB_GRADES...
drop table JOB_GRADES cascade constraints;
prompt Dropping LOCATIONS...
drop table LOCATIONS cascade constraints;
prompt Creating DEPARTMENTS...
create table DEPARTMENTS
(
DEPARTMENT_ID NUMBER(4),
DEPARTMENT_NAME VARCHAR2(30),
MANAGER_ID NUMBER(6),
LOCATION_ID NUMBER(4)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
prompt Creating EMPLOYEES...
create table EMPLOYEES
(
EMPLOYEE_ID NUMBER(6),
FIRST_NAME VARCHAR2(20),
LAST_NAME VARCHAR2(25),
EMAIL VARCHAR2(25),
PHONE_NUMBER VARCHAR2(20),
HIRE_DATE DATE,
JOB_ID VARCHAR2(20),
SALARY NUMBER(8,2),
COMMISSION_PCT NUMBER(2,2),
MANAGER_ID NUMBER(6),
DEPARTMENT_ID NUMBER(4)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
prompt Creating JOB_GRADES...
create table JOB_GRADES
(
GRADE_LEVEL CHAR(2),
LOWEST_SAL NUMBER(8,2),
HIGHEST_SAL NUMBER(10,2)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
prompt Creating LOCATIONS...
create table LOCATIONS
(
LOCATION_ID NUMBER(4),
STREET_ADDRESS VARCHAR2(40),
POSTAL_CODE VARCHAR2(12),
CITY VARCHAR2(30),
STATE_PROVINCE VARCHAR2(25),
COUNTRY_ID CHAR(2)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
prompt Disabling triggers for DEPARTMENTS...
alter table DEPARTMENTS disable all triggers;
prompt Disabling triggers for EMPLOYEES...
alter table EMPLOYEES disable all triggers;
prompt Disabling triggers for JOB_GRADES...
alter table JOB_GRADES disable all triggers;
prompt Disabling triggers for LOCATIONS...
alter table LOCATIONS disable all triggers;
prompt Loading DEPARTMENTS...
insert into DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (10, '人力资源', 10001, 10);
insert into DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (20, '办公室', 10006, 20);
insert into DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (30, '人力资源', null, null);
insert into DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (40, '技术支持', null, null);
insert into DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (50, '总裁办公司', null, null);
commit;
prompt 5 records loaded
prompt Loading EMPLOYEES...
insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (10001, '张', '无忌', null, null, to_date('28-09-2015', 'dd-mm-yyyy'), '副总经理', 5000, null, 100011, 10);
insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (10002, '杨', '逍', null, null, to_date('27-02-2000', 'dd-mm-yyyy'), '人力经理', 4000, .2, 10001, 10);
insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (10003, '谢', '逊', null, null, to_date('25-02-2001', 'dd-mm-yyyy'), '办公室主任', 3800, null, 10001, 10);
insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (10004, '韦', '一笑', null, null, null, '员工', 3000, .3, 10001, 10);
insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (10005, '布袋', '和尚', null, null, null, '员工', 3000, null, 10001, 10);
insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (10006, '赵', '敏', null, null, to_date('29-02-2000', 'dd-mm-yyyy'), '总经理', 6000, .4, 100011, 20);
insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (10007, '阿', '大', null, null, to_date('23-10-2010', 'dd-mm-yyyy'), '办公室主任', 4900, null, 10006, 20);
insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (10008, '阿', '二', null, null, null, '人力经理', 3700, null, 10006, 20);
insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (10009, '鹿', '杖客', null, null, to_date('30-09-2015', 'dd-mm-yyyy'), '员工', 3500, null, 10006, 20);
insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (100010, '笔', '管翁', null, null, to_date('21-10-2010', 'dd-mm-yyyy'), '员工', 3500, null, 10006, 20);
insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (100011, '张', '三丰', null, null, to_date('22-10-2010', 'dd-mm-yyyy'), '老板', 8000, null, null, 30);
commit;
prompt 11 records loaded
prompt Loading JOB_GRADES...
prompt Table is empty
prompt Loading LOCATIONS...
insert into LOCATIONS (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (10, null, null, '成都', null, null);
insert into LOCATIONS (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (20, null, null, '广州', null, null);
commit;
prompt 2 records loaded
prompt Enabling triggers for DEPARTMENTS...
alter table DEPARTMENTS enable all triggers;
prompt Enabling triggers for EMPLOYEES...
alter table EMPLOYEES enable all triggers;
prompt Enabling triggers for JOB_GRADES...
alter table JOB_GRADES enable all triggers;
prompt Enabling triggers for LOCATIONS...
alter table LOCATIONS enable all triggers;
set feedback on
set define on
prompt Done.
下面就是一些练习
UPDATE EMPLOYEES SET COMMISSION_PCT = NULL WHERE COMMISSION_PCT = 0;
SELECT SALARY, COMMISSION_PCT, SALARY*(1+nvl(COMMISSION_PCT,0))FROM EMPLOYEES;
SELECT SALARY, COMMISSION_PCT, SALARY*(1+nvl2(COMMISSION_PCT,COMMISSION_PCT*1.2,0))FROM EMPLOYEES;
SELECT * FORM EMPLOYEES WHERE LENGTH(FIRST_NAME) = LENGTH(LAST_NAME);
SELECT * FROM EMPLOYEES WHERE nullif(LENGTH(FIRST_NAME),LENGTH(LAST_NAME)) IS NULL
SELECT JOB_ID, SALARY,
CASE JOB_ID
WHEN '员工' THEN SALARY*1.5
WHEN '人力经理' THEN SALARY*1.2
ELSE SALARY
END
FROM EMPLOYEES;
SELECT JOB_ID, SALARY,
CASE
WHEN SALARY> 6000 THEN 'A'
WHEN SALARY> 4000 THEN 'B'
ELSE'C'
END
FROM EMPLOYEES;
SELECT DEPARTMENT_ID, AVG(SALARY), COUNT(*) FROM EMPLOYEES GROUP BY DEPARTMENT_ID;
SELECT DEPARTMENT_ID, AVG(SALARY) FROM EMPLOYEES GROUP BY DEPARTMENT_ID HAVING AVG(SALARY) > 4000;
--笛卡尔积
SELECT e.*,d.* FROM EMPLOYEES e,DEPARTMENTS d WHERE e.DEPARTMENT_ID=d.DEPARTMENT_ID;
--非等值条件
SELECT FIRST_NAME||LAST_NAME, GRADE_LEVEL FROM EMPLOYEES e, JOB_GRADES j WHERE SALARY BETWEEN j.LOWEST_SAL and j.HIGHEST_SAL;
--非等值条件
SELECT FIRST_NAME||LAST_NAME,SALARY ,GRADE_LEVEL FROM EMPLOYEES e,JOB_GRADES j WHERE SALARY>=j.LOWEST_SAL AND SALARY<=j.HIGHEST_SAL;
--非等值条件
SELECT FIRST_NAME||LAST_NAME,SALARY,GRADE_LEVEL FROM EMPLOYEES e JOIN JOB_GRADES j
ON SALARY BETWEEN j.LOWEST_SAL and j.HIGHEST_SAL;
--等值连接:10条记录
SELECT e.*,d.* FROM EMPLOYEES e,DEPARTMENTS d WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID;
--内连接:10条记录
SELECT e.* ,d.* FROM EMPLOYEES e INNER JOIN DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID;
SELECT e.*,d.* FROM EMPLOYEES e join DEPARTMENTS d on e.DEPARTMENT_ID = d.DEPARTMENT_ID;
--外连接(左外链接)
SELECT e.*,d.* FROM EMPLOYEES e LEFT JOIN DEPARTMENTS d on e.DEPARTMENT_ID = d.DEPARTMENT_ID;
--Oracle特有的左外连接
SELECT e.*,d.* FROM EMPLOYEES e, DEPARTMENTS d WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID(+);
--右外连接
SELECT e.*,d.* FROM EMPLOYEES e RIGHT JOIN DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID;
--全连接
SELECT e.*,d.* FROM EMPLOYEES e FULL outer JOIN DEPARTMENTS d on e.DEPARTMENT_ID = d.DEPARTMENT_ID;
SELECT e.*,d.* FROM EMPLOYEES e FULL JOIN DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID;
--自连接(就是判断在同一张表中谁是领导管着自己,如果自己就是领导没人管自己就不会显现)
SELECT e.FIRST_NAME||e.LAST_NAME,m.FIRST_NAME||m.LAST_NAME FROM EMPLOYEES e,EMPLOYEES m WHERE e.MANAGER_ID = m.EMPLOYEE_ID;
--交叉连接(就是笛卡尔积)
SELECT e.*,d.* FROM EMPLOYEES e cross JOIN DEPARTMENTS d;
--自然查询
SELECT e.FIRST_NAME||e.LAST_NAME, e.SALARY , d.DEPARTMENT_NAME FROM EMPLOYEES e NATURAL JOIN DEPARTMENTS d;
--USING 子句
SELECT e.FIRST_NAME||e.LAST_NAME, e.SALARY,d.DEPARTMENT_NAME FROM EMPLOYEES e JOIN DEPARTMENTS d using(DEPARTMENT_ID,MANAGER_ID);
--单行单列子查询
SELECT e.* FROM EMPLOYEES e WHERE SALARY>(SELECT AVG(SALARY) FROM EMPLOYEES);
--查询工资大于每个部门的平均工资员工(记住,有点难)
SELECT *
FROM EMPLOYEES
WHERE SALARY >
(
SELECT MAX(AVG(SALARY))
FROM EMPLOYEES
WHERE DEPARTMENT_ID IS NOT NULL
GROUP BY DEPARTMENT_ID
);
--多行单列子查询
--All:与子查询返回的每一个值比较 xxx>最小值 and xxx>最大值
SELECT *
FROM EMPLOYEES
WHERE SALARY IN(
SELECT AVG(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
);
--求得每个部门的平均工资
SELECT AVG(SALARY)FROM EMPLOYEES WHERE DEPARTMENT_ID IS NOT NULL GROUP BY DEPARTMENT_ID;
--查询工资大于每个部门的平均工资的员工
--ALL 与子查询返回的每一个值比较
-- <ALL 指大于子查询数据中的最大值
-- >ALL 指小于子查询数据中的最小值
SELECT *
FROM EMPLOYEES
WHERE SALARY > ALL (
SELECT AVG(SALARY)
FROM EMPLOYEES
WHERE DEPARTMENT_ID IS NOT null
GROUP BY DEPARTMENT_ID
);
--查询工资大于任意一个部门平均工资的员工
-- ANY 与子查询返回的任意一个值比较
-- <ANY 小于查询数据中的最大值
-- >ANY 大于子查询数据中的最小值
SELECT *
FROM EMPLOYEES
WHERE SALARY > ANY (
SELECT AVG(SALARY)
FROM EMPLOYEES
WHERE DEPARTMENT_ID IS NOT null
GROUP BY DEPARTMENT_ID
);
--查询每个部门工资最低的员工
--2个查询条件同时满足
IF (部门id = 10 and MIN(SALARY) = 3000)
IF (部门id = 20 AND MIN(SALARY) = 3500)
SELECT *
FROM EMPLOYEES
WHERE (DEPARTMENT_ID , SALARY ) IN (SELECT DEPARTMENT_ID , MIN(SALARY)
FROM EMPLOYEES WHERE DEPARTMENT_ID IS not null GROUP BY DEPARTMENT_ID);
--查询工资最高的三位员工
--查询前的排序
SELECT t.*, rownum FROM EMPLOYEES t ORDER BY SALARY desc
--Oracle的分页查询
--把工资按照从高到低排序
SELECT t.*,ROWNUM r1 FROM EMPLOYEES t ORDER BY SALARY DESC
--查出工资最高的三条信息
SELECT a.* ,ROWNUM r2 FROM (SELECT t.*,ROWNUM r1 FROM EMPLOYEES t ORDER BY SALARY DESC) a WHERE ROWNUM <=3;
--查询工资最高的三条信息(一)
SELECT b.*,ROWNUM r3
FROM
( SELECT a.*,ROWNUM r2
FROM (
SELECT t.*,ROWNUM r1
FROM EMPLOYEES t
ORDER BY SALARY desc
) a
) b
WHERE r2<=6 AND r2>3;
--查询工资最高的三条信息(二,查询更快)
SELECT b.*, ROWNUM r3
FROM
(
SELECT a.*,ROWNUM r2
FROM (
SELECT t.*,ROWNUM r1
FROM EMPLOYEES t
ORDER BY SALARY desc
) a
WHERE ROWNUM <=6
) b
WHERE r2 > 3;
--备份数据库的表(好玩,有意思)
--1.备份employees表到employees_bck
CREATE TABLE EMPLOYEES_bck
AS
SELECT*FROM EMPLOYEES;
--2.创建employees_bck2表,复制employees表结构,不要数据(当where 1=1时才会有数据,其他比值只有结构)
CREATE TABLE EMPLOYEES_bck2
AS
SELECT *FROM EMPLOYEES
WHERE 1=2;
--3.使用employees表中的某几列创建employees_test表
CREATE TABLE EMPLOYEES_test
(id ,fullname, HIRE_DATE , SALARY)
as
SELECT EMPLOYEE_ID ,FIRST_NAME||LAST_NAME ,HIRE_DATE,SALARY
FROM EMPLOYEES;
--4.从其他表拷贝数据
INSERT INTO EMPLOYEES_bck2(EMPLOYEE_ID,FIRST_NAME,LAST_NAME) SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME FROM EMPLOYEES;
--UPDATE
--1,简单的修改语句,在线运行系统注意先备份数据在修改
UPDATE EMPLOYEES_bck SET SALARY = 80000
--2,修改10006号员工的工资和10002号员工相同--注意,在mysql中的对同一张表的更新问题。
UPDATE EMPLOYEES_test SET SALARY =(SELECT SALARY FROM EMPLOYEES_test WHERE ID = 10002) WHERE ID = 10006
--3,将在成都工作的员工的工资涨1000
UPDATE EMPLOYEES_bck
SET SALARY = SALARY+1000
WHERE EMPLOYEE_ID IN(
SELECT e.EMPLOYEE_ID
FROM EMPLOYEES_bck e,
DEPARTMENTS d,
LOCATIONS l
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
and d.location_id = l.LOCATION_ID
AND l.city='成都'
);