oracle的一些练习

版权声明:JAVA https://blog.csdn.net/weixin_43190126/article/details/85257146

需要将这些表导入Oracle

prompt PL/SQL Developer import file
prompt Created on 20151022日 星期四 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='成都'
										)

猜你喜欢

转载自blog.csdn.net/weixin_43190126/article/details/85257146