/*
数据处理
*/
/*
插入数据
*/
--
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; --获取时间的秒