oracle数据处理(增加、删除、修改更新)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/czh500/article/details/82827185
/*

数据处理

*/

/*
插入数据
*/
--
CREATE TABLE emp666
AS
SELECT emp.employee_id, emp.last_name, emp.hire_date, emp.salary 
FROM employees emp
WHERE 666 = 888
--

/*
DROP TABLE emp666
*/

--
SELECT * 
FROM emp666

--字符和日期类型的数据应包含在单引号中
--插入数据的时候,列和值要一一对应,注意:不允许为空的列,必须要插入值,否则会报错

--插入一条数据 (SYSDATE表示当前系统的日期和时间)
INSERT INTO emp666
VALUES(1001, '令狐冲', SYSDATE, 16855.69)

--插入一条数据
INSERT INTO emp666
VALUES(1002, '杨过', to_date('2018-09-23', 'yyyy-mm-dd'), 22600.56)

--插入一条数据(插入空值可以使用null关键字) 显式插入空值
INSERT INTO emp666
VALUES(1003, '韦小宝', to_date('2018-10-01', 'yyyy-mm-dd'), NULL)

--插入一条数据(插入空值) 隐式插入空值
INSERT INTO emp666(employee_id, last_name, hire_date)
VALUES(1004, '张无忌', to_date('2018-12-03', 'yyyy-mm-dd'))

--插入一条数据
INSERT INTO emp666(last_name, employee_id, hire_date)
VALUES('郭靖', 1005, to_date('2018-12-06', 'yyyy-mm-dd'))

/*
--注意:不允许为空的列,必须要插入值,否则会报错
--插入一条数据
INSERT INTO emp666(last_name, employee_id)
VALUES('郭靖', 1005)
*/

--借助于已有的表来向表中插入数据 (即,从其他表中拷贝数据)
INSERT INTO emp666(hire_date, employee_id, last_name)
SELECT hire_date, employee_id, last_name 
FROM employees emp
WHERE emp.department_id = 80
--通过创建脚本&变量的方式插入数据,了解一下即可
INSERT INTO emp666(hire_date, employee_id, last_name)
VALUES('&empdate', &empid, '&lastname')
--
SELECT * 
FROM emp666
--创建一张新表,并且把其他表中的数据插入到新表中
CREATE TABLE testEmp 
AS
SELECT emp.* 
FROM employees emp 
WHERE emp.department_id = 40 
--
SELECT * 
FROM testEmp
--

/*

更新数据

*/
--
UPDATE emp666
SET salary = 26950.88 
WHERE employee_id = 1006

--commit提交
COMMIT

--注意:UPDATE更新数据的时候,如果不写WHERE条件的话,就会更新表中所有的记录,所以这点要特别注意
UPDATE emp666
SET salary = 26000

--rollback回滚,相当于撤销/撤回刚才的操作
ROLLBACK

--
SELECT * 
FROM emp666
--题目(更新114号员工的工作和工资,使其与205号员工相同)
--查询下更新前的数据
SELECT emp.employee_id, emp.job_id, emp.salary 
FROM employees emp
WHERE emp.employee_id IN (114, 205)

--更新操作
UPDATE employees
SET job_id = (
SELECT emp.job_id 
FROM employees emp
WHERE emp.employee_id = 205
),
salary = (
SELECT emp.salary
FROM employees emp
WHERE emp.employee_id = 205
)
WHERE employee_id = 114

--提交
COMMIT

--查询下更新后的数据
SELECT emp.employee_id, emp.job_id, emp.salary 
FROM employees emp
WHERE emp.employee_id IN (114, 205)

/*
题目,题目有点绕,审题时,可以先用语文来断句
(
调整与employee_id 为200的员工job_id相同的员工的department_id为employee_id为100的员工的department_id
)
*/
--
UPDATE employees 
SET department_id = (
SELECT department_id 
FROM employees emp
WHERE emp.employee_id = 100
)
WHERE employees.job_id 
IN (
SELECT emp.job_id
FROM employees emp
WHERE emp.employee_id = 200
)
--

/*
删除数据
*/
--
SELECT *
FROM myemployees7

--
UPDATE myemployees7
SET department_id = 70
WHERE employee_id = 145
--

--题目:从emp1表中删除部门名称中含Public字符的数据
DELETE FROM myemployees7
WHERE department_id = (
SELECT dep.department_id
FROM departments dep
WHERE dep.department_name LIKE '%Public%'
)
--
SELECT *
FROM myemployees3


/*
删除表中的数据
(
注意:
DELETE后面的from可以省略,但是不建议省略掉from,最好是加上from,这样比较规范,也不容易造成各种未知的错误
一般习惯用 delete from ,这样写更让人容易理解!
)
*/
--DELETE后面的from可以省略,但是不建议省略掉from
DELETE myemployees3

--最好是加上from,这样比较规范,也不容易造成各种未知的错误,一般习惯用 delete from ,这样写更让人容易理解!
DELETE FROM myemployees3



--删除整张表的数据(可回滚的)
--不加where条件的话,表中的全部数据将被删除
DELETE FROM myemployees3
/*
--ROLLBACK回滚 

DELETE 删除表中的数据,可回滚的
TRUNCATE 清空表数据,不可回滚的

delete和truncate表区别

delete 	                                                                               truncate
delete逐条删除 	                                                                truncate 先摧毁表再重建
delete语言是DML语言 	                                                            truncate是DDL
DML语言可以闪回 做错的并且提交了.可通过闪回,撤销操作 	                          DDL语言不可以闪回 flashback
具有行移动功能: 要开启闪回功能,必须要开启行移动功能 	                           没有行移动功能
delete是逐条删除,会产生碎片, 	                                                   truncate不会产生碎片
delete不会释放空间 	                                                             truncate会
delete可以回滚 	                                                                truncate不可以
oracle delete快 	                                                               mysql truncate快

*/

/*

数据库事务

*/

/*

回滚到保留/保存点

*/

--
SELECT * 
FROM emp666
--
DELETE FROM emp666
WHERE employee_id = 179

--设置保存点
SAVEPOINT mydelete

UPDATE emp666
SET last_name = '乔峰666'
WHERE employee_id = 177
--设置保存点
SAVEPOINT myupdate

UPDATE emp666
SET last_name = '段誉666'
WHERE employee_id = 176
--设置保存点
SAVEPOINT myupdate2
--
SELECT * 
FROM emp666


/*
回滚到保存点
*/
--以下这种写法,我试了一下,也可以
ROLLBACK TO mydelete
ROLLBACK TO myupdate

--我个人觉得,这种写法比较规范一点,一目了然,别人一看就知道是回滚到某个保存点
ROLLBACK TO SAVEPOINT myupdate2


--提交
COMMIT
--回滚
ROLLBACK
--
COMMIT
--
UPDATE emp666
SET last_name = '虚竹'
WHERE employee_id = 176
--
SELECT * 
FROM emp666

/*
练习题:

更改 108 员工的信息: 使其工资变为所在部门中的最高工资, job变为公司中平均工资最低的 job
*/
--
SELECT * 
FROM employees
WHERE employees.employee_id = 108
--更新
UPDATE employees
SET salary = (
SELECT MAX(salary)
FROM employees
WHERE department_id = (
SELECT department_id 
FROM employees
WHERE employee_id = 108
)
--GROUP BY department_id
),
job_id = (
SELECT job_id
FROM employees
HAVING AVG(salary) = (
SELECT MIN(AVG(salary))
FROM employees
GROUP BY job_id
)
GROUP BY job_id
)
WHERE employee_id = 108
--
SELECT * 
FROM employees
WHERE employees.employee_id = 108

--题目:删除 108 号员工所在部门中工资最低的那个员工
--方式1
DELETE FROM employees
WHERE employee_id IN (
SELECT employee_id
FROM employees
WHERE salary = (
SELECT MIN(salary) 
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
WHERE employee_id = 108
)
)
)
AND 
department_id = (
SELECT department_id
FROM employees
WHERE employee_id = 108
)

--方式2优化前
delete from employees
		where department_id = (
      			select department_id
      			from employees
      			where employee_id = 108
		) and salary = (
      			select min(salary)
      			from employees
      			where department_id = (
                  select department_id
      			      from employees
      			      where employee_id = 108
            )
		)

--sql优化
--方式2优化后
delete from employees e
		where department_id = (
      			select department_id
      			from employees e
      			where employee_id = 108
		) and salary = (
      			select min(salary)
      			from employees
      			where department_id = e.department_id
		)	
    
--优化前
SELECT * 
from employees
		where department_id = (
      			select department_id
      			from employees
      			where employee_id = 108
		) and salary = (
      			select min(salary)
      			from employees
      			where department_id = (
                  select department_id
      			      from employees
      			      where employee_id = 108
            )
		)    

--优化后
SELECT * 
from employees e
		where department_id = (
      			select department_id
      			from employees e
      			where employee_id = 108
		) and salary = (
      			select min(salary)
      			from employees
      			where department_id = e.department_id
		)
--优化后
SELECT * 
from employees e
		where salary = (
      			select min(salary)
      			from employees
      			where department_id = e.department_id
		)
    AND
    department_id = (
      			select department_id
      			from employees e
      			where employee_id = 108
		) 
--
SELECT *
 FROM employees
WHERE employee_id IN (
SELECT employee_id
FROM employees
WHERE salary = (
SELECT MIN(salary) 
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
WHERE employee_id = 108
)
)
) 
AND
department_id = (
SELECT department_id
FROM employees
WHERE employee_id = 108
)

--
SELECT *
FROM emp666
--
SELECT * 
FROM emp666
WHERE employee_id = emp666.employee_id
--
SELECT * 
FROM emp666 emp
WHERE employee_id = emp.employee_id
--
SELECT * 
FROM emp666 emp
WHERE employee_id = emp.employee_id
AND
employee_id = (
SELECT employee_id 
FROM emp666
WHERE last_name = '令狐冲'
)
--
SELECT * 
FROM emp666 emp
WHERE employee_id IN( emp.employee_id )
AND
employee_id IN (
SELECT employee_id 
FROM emp666
WHERE last_name = '令狐冲' OR last_name = '杨过'
)
--
SELECT * 
FROM emp666 emp
WHERE employee_id = ( emp.employee_id )
AND
employee_id IN (
SELECT employee_id 
FROM emp666
WHERE last_name = '令狐冲' OR last_name = '杨过'
)
--
SELECT * 
FROM emp666 emp
WHERE employee_id = emp.employee_id
AND
employee_id IN (
SELECT employee_id 
FROM emp666
WHERE last_name = '令狐冲' OR last_name = '杨过'
)

/*

练习题

*/
--1.运行以下脚本创建表my_employees
CREATE TABLE my_employee (  
ID number(3),
first_name varchar2(10),
Last_name varchar2(10),
User_id varchar2(10),
Salary number(5)
)
--
SELECT * 
FROM my_employee

--向my_employee表中插入数据
INSERT INTO my_employee
VALUES(127, '令狐冲', '华山派', '666888', 3688.55)

--插入多行数据
INSERT ALL 
INTO my_employee
VALUES(128, '杨过', '测试', '789', 6659)
INTO my_employee
VALUES(129, '段誉', '大理', '632', 1529)
SELECT *
FROM dual

--插入多行数据
INSERT ALL 
INTO my_employee
VALUES(130, '虚竹', '测试', '556', 8589)
INTO my_employee
VALUES(131, '张无忌', '光明顶', '589', 7824.89)
SELECT 1
FROM dual

--
SELECT *
FROM my_employee
--
SELECT *
FROM employees
--
TRUNCATE TABLE my_employee
--插入多行数据
INSERT ALL 
INTO my_employee
VALUES(132, '双儿', '测试', '779', 3565)
INTO my_employee
VALUES(133, '建宁公主', '鹿鼎记', '826', 5804.56)
SELECT SYSDATE
FROM dual
--插入多行数据
insert into my_employee
select 134,'沐剑屏','测试','5692', 8900.66 from dual
union
select 135,'方怡','测试','2865', 6950.29 from dual
--插入多行数据(多了单引号)
insert into my_employee
select '136','曾柔','测试','3579', 1560.33 from dual
union
select '137','阿珂','测试','2690', 3715.22 from dual
--插入多行数据(多了单引号)
insert into my_employee
select '138','苏筌','测试','3166', '2377.56' from dual
union
select '139','建宁','测试','2735', '4689.19' from dual


--提交
COMMIT
--将127号员工的last_name修改为韦小宝
UPDATE my_employee
SET last_name = '韦小宝'
WHERE ID = 127
--将所有工资少于900的员工的工资修改为1000
UPDATE my_employee
SET Salary = 1000
WHERE Salary < 900
--检查所作的修正
SELECT * 
FROM my_employee

--提交
COMMIT
--删除所有的数据
DELETE 
FROM my_employee
--
--检查所作的修正
SELECT * 
FROM my_employee
--回滚
ROLLBACK
--
/*

清空表(TRUNCATE关键字是不可回滚的,TRUNCATE是属于DDL,TRUNCATE是会自动提交的,所
以不可以回滚,DML才可以回滚,DDL是不可回滚的)
*/

TRUNCATE TABLE my_employee
/*
dual可以理解成是一张虚拟表
*/
--
select * from dual;
--
select 1 from dual;
--
select SYSDATE from dual;
--
select 'aaa' from dual;
--
select 'aaa' AS "测试" from dual;
--
select 'aaa' AS ok from dual;
--
select 'aaa' okok from dual;
--||符号是连接符号,意思是把一个字符和另一个字符连接起来,类似于java中的 String a = "2" + "5";变量a的结果是25
select 'aaa' || 'bbb' gogogo from dual;
--
select '江西省' || '赣州市' || '于都县' || '渡江大道' || 66666 || '号!!!!' hometown from dual;
--
select '5' || '600' AS 计算结果 from dual;
--
select '8' || '350' AS "结果" from dual;
--
select '9' || '500' AS "ReSulT" from dual;
--
select '7' || '2600' AS result from dual;
--
select '4' || '300' result from dual;
--
select '6' || '999' "rEsult" from dual;
/*
       复习和回顾以前的知识

这里的+号是加法运算的意思,虽然10和8这2个数字都加了单引号,但是仍
然会把10和8这2个数字相加,原因就是系统会进行数据类型自动转换(隐式转换)

字符类型和数字类型之间会自动转换/隐式转换
字符类型和日期类型之间也会自动转换/隐式转换

注意:字符类型和日期类型的数据要包含在单引号中,数字类型的数据不需要包含在单引号中

*/
--这里字符类型的10会自动转换/隐式转换成数字类型的10,这里字符类型的8会自动转换/隐式转换成数字类型的8
select '10' + '8' "RESult" from dual;
--如下这样写不会报错
select 'abc' || 'def' "RESult" from dual;

--如下这样写会报错(报错提示:无效数字)
--select 'abc' + 'def' "RESult" from dual;
--
select '55.68' + '2' "RESult" from dual;
--
select '55.68' + '20.21' "RESult" from dual;
--日期类型是可以加减的
select SYSDATE + '2' "RESult" from dual;
--日期类型是可以加减的
select SYSDATE - '2' "RESult" from dual;
--
select to_char(SYSDATE, 'yyyy') - '2' "RESult" from dual;
--
select to_date('2018-09-24', 'yyyy-mm-dd') - to_date('2018-09-20', 'yyyy-mm-dd') "RESult" from dual;
--
select to_date('2018-09-24', 'yyyy-mm-dd') - to_date('2018-09-20 21:40:55', 'yyyy-mm-dd hh24:mi:ss') "RESult" from dual;
--
select to_date('2018-09-24', 'yyyy-mm-dd') - to_date('2018-09-20 08:40:55', 'yyyy-mm-dd hh:mi:ss') "RESult" from dual;
--
select SYSDATE - to_date('2018-09-20', 'yyyy-mm-dd') "RESult" from dual;

--如下这样写会报错(因为小时hh是12小时制,13为非法输入,不能匹配)
select to_date('2018-12-25,13:25:59','yyyy-mm-dd,hh:mi:ss') from dual

--如下这样写才是正确的(把小时hh改成24小时制)
select to_date('2018-12-25,13:25:59','yyyy-mm-dd,hh24:mi:ss') from dual


--当前时间减去7分钟的时间 
select sysdate,sysdate - interval '7' MINUTE from dual 
--当前时间减去7小时的时间 
select sysdate - interval '7' hour from dual 
--当前时间减去7天的时间 
select sysdate - interval '7' day from dual 
--当前时间减去7月的时间 
select sysdate,sysdate - interval '7' month from dual 
--当前时间减去7年的时间 
select sysdate,sysdate - interval '7' year from dual 
--时间间隔乘以一个数字 
select sysdate,sysdate - 8 * interval '7' HOUR from dual
/*
日期和字符转换函数用法(to_date,to_char)
Oracle日期格式详解和知识点,具体可以参考网页https://blog.csdn.net/czh500/article/details/82826872
*/

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual;   --日期转化为字符串   
select to_char(sysdate,'yyyy') as nowYear   from dual;   --获取时间的年   
select to_char(sysdate,'mm')    as nowMonth from dual;   --获取时间的月   
select to_char(sysdate,'dd')    as nowDay    from dual;   --获取时间的日   
select to_char(sysdate,'hh24') as nowHour   from dual;   --获取时间的时   
select to_char(sysdate,'mi')    as nowMinute from dual;   --获取时间的分   
select to_char(sysdate,'ss')    as nowSecond from dual;   --获取时间的秒

/*

数据处理

*/

/*
插入数据
*/
--
CREATE TABLE emp666
AS
SELECT emp.employee_id, emp.last_name, emp.hire_date, emp.salary
FROM employees emp
WHERE 666 = 888
--

/*
DROP TABLE emp666
*/

--
SELECT *
FROM emp666

--字符和日期类型的数据应包含在单引号中
--插入数据的时候,列和值要一一对应,注意:不允许为空的列,必须要插入值,否则会报错

--插入一条数据 (SYSDATE表示当前系统的日期和时间)
INSERT INTO emp666
VALUES(1001, '令狐冲', SYSDATE, 16855.69)

--插入一条数据
INSERT INTO emp666
VALUES(1002, '杨过', to_date('2018-09-23', 'yyyy-mm-dd'), 22600.56)

--插入一条数据(插入空值可以使用null关键字) 显式插入空值
INSERT INTO emp666
VALUES(1003, '韦小宝', to_date('2018-10-01', 'yyyy-mm-dd'), NULL)

--插入一条数据(插入空值) 隐式插入空值
INSERT INTO emp666(employee_id, last_name, hire_date)
VALUES(1004, '张无忌', to_date('2018-12-03', 'yyyy-mm-dd'))

--插入一条数据
INSERT INTO emp666(last_name, employee_id, hire_date)
VALUES('郭靖', 1005, to_date('2018-12-06', 'yyyy-mm-dd'))

/*
--注意:不允许为空的列,必须要插入值,否则会报错
--插入一条数据
INSERT INTO emp666(last_name, employee_id)
VALUES('郭靖', 1005)
*/

--借助于已有的表来向表中插入数据 (即,从其他表中拷贝数据)
INSERT INTO emp666(hire_date, employee_id, last_name)
SELECT hire_date, employee_id, last_name
FROM employees emp
WHERE emp.department_id = 80
--通过创建脚本&变量的方式插入数据,了解一下即可
INSERT INTO emp666(hire_date, employee_id, last_name)
VALUES('&empdate', &empid, '&lastname')
--
SELECT *
FROM emp666
--创建一张新表,并且把其他表中的数据插入到新表中
CREATE TABLE testEmp
AS
SELECT emp.*
FROM employees emp
WHERE emp.department_id = 40
--
SELECT *
FROM testEmp
--

/*

更新数据

*/
--
UPDATE emp666
SET salary = 26950.88
WHERE employee_id = 1006

--commit提交
COMMIT

--注意:UPDATE更新数据的时候,如果不写WHERE条件的话,就会更新表中所有的记录,所以这点要特别注意
UPDATE emp666
SET salary = 26000

--rollback回滚,相当于撤销/撤回刚才的操作
ROLLBACK

--
SELECT *
FROM emp666
--题目(更新114号员工的工作和工资,使其与205号员工相同)
--查询下更新前的数据
SELECT emp.employee_id, emp.job_id, emp.salary
FROM employees emp
WHERE emp.employee_id IN (114, 205)

--更新操作
UPDATE employees
SET job_id = (
SELECT emp.job_id
FROM employees emp
WHERE emp.employee_id = 205
),
salary = (
SELECT emp.salary
FROM employees emp
WHERE emp.employee_id = 205
)
WHERE employee_id = 114

--提交
COMMIT

--查询下更新后的数据
SELECT emp.employee_id, emp.job_id, emp.salary
FROM employees emp
WHERE emp.employee_id IN (114, 205)

/*
题目,题目有点绕,审题时,可以先用语文来断句
(
调整与employee_id 为200的员工job_id相同的员工的department_id为employee_id为100的员工的department_id
)
*/
--
UPDATE employees
SET department_id = (
SELECT department_id
FROM employees emp
WHERE emp.employee_id = 100
)
WHERE employees.job_id
IN (
SELECT emp.job_id
FROM employees emp
WHERE emp.employee_id = 200
)
--

/*
删除数据
*/
--
SELECT *
FROM myemployees7

--
UPDATE myemployees7
SET department_id = 70
WHERE employee_id = 145
--

--题目:从emp1表中删除部门名称中含Public字符的数据
DELETE FROM myemployees7
WHERE department_id = (
SELECT dep.department_id
FROM departments dep
WHERE dep.department_name LIKE '%Public%'
)
--
SELECT *
FROM myemployees3


/*
删除表中的数据
(
注意:
DELETE后面的from可以省略,但是不建议省略掉from,最好是加上from,这样比较规范,也不容易造成各种未知的错误
一般习惯用 delete from ,这样写更让人容易理解!
)
*/
--DELETE后面的from可以省略,但是不建议省略掉from
DELETE myemployees3

--最好是加上from,这样比较规范,也不容易造成各种未知的错误,一般习惯用 delete from ,这样写更让人容易理解!
DELETE FROM myemployees3

--删除整张表的数据(可回滚的)
--不加where条件的话,表中的全部数据将被删除
DELETE FROM myemployees3
/*
--ROLLBACK回滚

DELETE 删除表中的数据,可回滚的
TRUNCATE 清空表数据,不可回滚的

delete和truncate表区别

delete                                                                                    truncate
delete逐条删除                                                                     truncate 先摧毁表再重建
delete语言是DML语言                                                                 truncate是DDL
DML语言可以闪回 做错的并且提交了.可通过闪回,撤销操作                               DDL语言不可以闪回 flashback
具有行移动功能: 要开启闪回功能,必须要开启行移动功能                                没有行移动功能
delete是逐条删除,会产生碎片,                                                        truncate不会产生碎片
delete不会释放空间                                                                  truncate会
delete可以回滚                                                                     truncate不可以
oracle delete快                                                                    mysql truncate快

*/

/*

数据库事务

*/

/*

回滚到保留/保存点

*/

--
SELECT *
FROM emp666
--
DELETE FROM emp666
WHERE employee_id = 179

--设置保存点
SAVEPOINT mydelete

UPDATE emp666
SET last_name = '乔峰666'
WHERE employee_id = 177
--设置保存点
SAVEPOINT myupdate

UPDATE emp666
SET last_name = '段誉666'
WHERE employee_id = 176
--设置保存点
SAVEPOINT myupdate2
--
SELECT *
FROM emp666


/*
回滚到保存点
*/
--以下这种写法,我试了一下,也可以
ROLLBACK TO mydelete
ROLLBACK TO myupdate

--我个人觉得,这种写法比较规范一点,一目了然,别人一看就知道是回滚到某个保存点
ROLLBACK TO SAVEPOINT myupdate2


--提交
COMMIT
--回滚
ROLLBACK
--
COMMIT
--
UPDATE emp666
SET last_name = '虚竹'
WHERE employee_id = 176
--
SELECT *
FROM emp666

/*
练习题:

更改 108 员工的信息: 使其工资变为所在部门中的最高工资, job变为公司中平均工资最低的 job
*/
--
SELECT *
FROM employees
WHERE employees.employee_id = 108
--更新
UPDATE employees
SET salary = (
SELECT MAX(salary)
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
WHERE employee_id = 108
)
--GROUP BY department_id
),
job_id = (
SELECT job_id
FROM employees
HAVING AVG(salary) = (
SELECT MIN(AVG(salary))
FROM employees
GROUP BY job_id
)
GROUP BY job_id
)
WHERE employee_id = 108
--
SELECT *
FROM employees
WHERE employees.employee_id = 108

--题目:删除 108 号员工所在部门中工资最低的那个员工
--方式1
DELETE FROM employees
WHERE employee_id IN (
SELECT employee_id
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
WHERE employee_id = 108
)
)
)
AND
department_id = (
SELECT department_id
FROM employees
WHERE employee_id = 108
)

--方式2优化前
delete from employees
        where department_id = (
                  select department_id
                  from employees
                  where employee_id = 108
        ) and salary = (
                  select min(salary)
                  from employees
                  where department_id = (
                  select department_id
                        from employees
                        where employee_id = 108
            )
        )

--sql优化
--方式2优化后
delete from employees e
        where department_id = (
                  select department_id
                  from employees e
                  where employee_id = 108
        ) and salary = (
                  select min(salary)
                  from employees
                  where department_id = e.department_id
        )    
    
--优化前
SELECT *
from employees
        where department_id = (
                  select department_id
                  from employees
                  where employee_id = 108
        ) and salary = (
                  select min(salary)
                  from employees
                  where department_id = (
                  select department_id
                        from employees
                        where employee_id = 108
            )
        )    

--优化后
SELECT *
from employees e
        where department_id = (
                  select department_id
                  from employees e
                  where employee_id = 108
        ) and salary = (
                  select min(salary)
                  from employees
                  where department_id = e.department_id
        )
--优化后
SELECT *
from employees e
        where salary = (
                  select min(salary)
                  from employees
                  where department_id = e.department_id
        )
    AND
    department_id = (
                  select department_id
                  from employees e
                  where employee_id = 108
        )
--
SELECT *
 FROM employees
WHERE employee_id IN (
SELECT employee_id
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
WHERE employee_id = 108
)
)
)
AND
department_id = (
SELECT department_id
FROM employees
WHERE employee_id = 108
)

--
SELECT *
FROM emp666
--
SELECT *
FROM emp666
WHERE employee_id = emp666.employee_id
--
SELECT *
FROM emp666 emp
WHERE employee_id = emp.employee_id
--
SELECT *
FROM emp666 emp
WHERE employee_id = emp.employee_id
AND
employee_id = (
SELECT employee_id
FROM emp666
WHERE last_name = '令狐冲'
)
--
SELECT *
FROM emp666 emp
WHERE employee_id IN( emp.employee_id )
AND
employee_id IN (
SELECT employee_id
FROM emp666
WHERE last_name = '令狐冲' OR last_name = '杨过'
)
--
SELECT *
FROM emp666 emp
WHERE employee_id = ( emp.employee_id )
AND
employee_id IN (
SELECT employee_id
FROM emp666
WHERE last_name = '令狐冲' OR last_name = '杨过'
)
--
SELECT *
FROM emp666 emp
WHERE employee_id = emp.employee_id
AND
employee_id IN (
SELECT employee_id
FROM emp666
WHERE last_name = '令狐冲' OR last_name = '杨过'
)

/*

练习题

*/
--1.运行以下脚本创建表my_employees
CREATE TABLE my_employee (  
ID number(3),
first_name varchar2(10),
Last_name varchar2(10),
User_id varchar2(10),
Salary number(5)
)
--
SELECT *
FROM my_employee

--向my_employee表中插入数据
INSERT INTO my_employee
VALUES(127, '令狐冲', '华山派', '666888', 3688.55)

--插入多行数据
INSERT ALL
INTO my_employee
VALUES(128, '杨过', '测试', '789', 6659)
INTO my_employee
VALUES(129, '段誉', '大理', '632', 1529)
SELECT *
FROM dual

--插入多行数据
INSERT ALL
INTO my_employee
VALUES(130, '虚竹', '测试', '556', 8589)
INTO my_employee
VALUES(131, '张无忌', '光明顶', '589', 7824.89)
SELECT 1
FROM dual

--
SELECT *
FROM my_employee
--
SELECT *
FROM employees
--
TRUNCATE TABLE my_employee
--插入多行数据
INSERT ALL
INTO my_employee
VALUES(132, '双儿', '测试', '779', 3565)
INTO my_employee
VALUES(133, '建宁公主', '鹿鼎记', '826', 5804.56)
SELECT SYSDATE
FROM dual
--插入多行数据
insert into my_employee
select 134,'沐剑屏','测试','5692', 8900.66 from dual
union
select 135,'方怡','测试','2865', 6950.29 from dual
--插入多行数据(多了单引号)
insert into my_employee
select '136','曾柔','测试','3579', 1560.33 from dual
union
select '137','阿珂','测试','2690', 3715.22 from dual
--插入多行数据(多了单引号)
insert into my_employee
select '138','苏筌','测试','3166', '2377.56' from dual
union
select '139','建宁','测试','2735', '4689.19' from dual


--提交
COMMIT
--将127号员工的last_name修改为韦小宝
UPDATE my_employee
SET last_name = '韦小宝'
WHERE ID = 127
--将所有工资少于900的员工的工资修改为1000
UPDATE my_employee
SET Salary = 1000
WHERE Salary < 900
--检查所作的修正
SELECT *
FROM my_employee

--提交
COMMIT
--删除所有的数据
DELETE
FROM my_employee
--
--检查所作的修正
SELECT *
FROM my_employee
--回滚
ROLLBACK
--
/*

清空表(TRUNCATE关键字是不可回滚的,TRUNCATE是属于DDL,TRUNCATE是会自动提交的,所
以不可以回滚,DML才可以回滚,DDL是不可回滚的)
*/

TRUNCATE TABLE my_employee
/*
dual可以理解成是一张虚拟表
*/
--
select * from dual;
--
select 1 from dual;
--
select SYSDATE from dual;
--
select 'aaa' from dual;
--
select 'aaa' AS "测试" from dual;
--
select 'aaa' AS ok from dual;
--
select 'aaa' okok from dual;
--||符号是连接符号,意思是把一个字符和另一个字符连接起来,类似于java中的 String a = "2" + "5";变量a的结果是25
select 'aaa' || 'bbb' gogogo from dual;
--
select '江西省' || '赣州市' || '于都县' || '渡江大道' || 66666 || '号!!!!' hometown from dual;
--
select '5' || '600' AS 计算结果 from dual;
--
select '8' || '350' AS "结果" from dual;
--
select '9' || '500' AS "ReSulT" from dual;
--
select '7' || '2600' AS result from dual;
--
select '4' || '300' result from dual;
--
select '6' || '999' "rEsult" from dual;
/*
       复习和回顾以前的知识

这里的+号是加法运算的意思,虽然10和8这2个数字都加了单引号,但是仍
然会把10和8这2个数字相加,原因就是系统会进行数据类型自动转换(隐式转换)

字符类型和数字类型之间会自动转换/隐式转换
字符类型和日期类型之间也会自动转换/隐式转换

注意:字符类型和日期类型的数据要包含在单引号中,数字类型的数据不需要包含在单引号中

*/
--这里字符类型的10会自动转换/隐式转换成数字类型的10,这里字符类型的8会自动转换/隐式转换成数字类型的8
select '10' + '8' "RESult" from dual;
--如下这样写不会报错
select 'abc' || 'def' "RESult" from dual;

--如下这样写会报错(报错提示:无效数字)
--select 'abc' + 'def' "RESult" from dual;
--
select '55.68' + '2' "RESult" from dual;
--
select '55.68' + '20.21' "RESult" from dual;
--日期类型是可以加减的
select SYSDATE + '2' "RESult" from dual;
--日期类型是可以加减的
select SYSDATE - '2' "RESult" from dual;
--
select to_char(SYSDATE, 'yyyy') - '2' "RESult" from dual;
--
select to_date('2018-09-24', 'yyyy-mm-dd') - to_date('2018-09-20', 'yyyy-mm-dd') "RESult" from dual;
--
select to_date('2018-09-24', 'yyyy-mm-dd') - to_date('2018-09-20 21:40:55', 'yyyy-mm-dd hh24:mi:ss') "RESult" from dual;
--
select to_date('2018-09-24', 'yyyy-mm-dd') - to_date('2018-09-20 08:40:55', 'yyyy-mm-dd hh:mi:ss') "RESult" from dual;
--
select SYSDATE - to_date('2018-09-20', 'yyyy-mm-dd') "RESult" from dual;

--如下这样写会报错(因为小时hh是12小时制,13为非法输入,不能匹配)
select to_date('2018-12-25,13:25:59','yyyy-mm-dd,hh:mi:ss') from dual

--如下这样写才是正确的(把小时hh改成24小时制)
select to_date('2018-12-25,13:25:59','yyyy-mm-dd,hh24:mi:ss') from dual


--当前时间减去7分钟的时间
select sysdate,sysdate - interval '7' MINUTE from dual
--当前时间减去7小时的时间
select sysdate - interval '7' hour from dual
--当前时间减去7天的时间
select sysdate - interval '7' day from dual
--当前时间减去7月的时间
select sysdate,sysdate - interval '7' month from dual
--当前时间减去7年的时间
select sysdate,sysdate - interval '7' year from dual
--时间间隔乘以一个数字
select sysdate,sysdate - 8 * interval '7' HOUR from dual
/*
日期和字符转换函数用法(to_date,to_char)
Oracle日期格式详解和知识点,具体可以参考网页https://blog.csdn.net/czh500/article/details/82826872
*/

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual;   --日期转化为字符串   
select to_char(sysdate,'yyyy') as nowYear   from dual;   --获取时间的年   
select to_char(sysdate,'mm')    as nowMonth from dual;   --获取时间的月   
select to_char(sysdate,'dd')    as nowDay    from dual;   --获取时间的日   
select to_char(sysdate,'hh24') as nowHour   from dual;   --获取时间的时   
select to_char(sysdate,'mi')    as nowMinute from dual;   --获取时间的分   
select to_char(sysdate,'ss')    as nowSecond from dual;   --获取时间的秒

猜你喜欢

转载自blog.csdn.net/czh500/article/details/82827185