1. 程式人生 > >oracle資料處理(增加、刪除、修改更新)

oracle資料處理(增加、刪除、修改更新)

/*

資料處理

*/

/*
插入資料
*/
--
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;   --獲取時間的秒