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; --獲取時間的秒