//***************************** Day1:基礎操做和數據庫安全 ***********************************數據庫
// 基本操做安全
進入SQL*plus: 併發
SQLPLUS - > user和password函數
查看當看的用戶: 性能
SHOW USER;spa
查看數據庫裏面的數據庫表: .net
SELECT table_name FROM user_tables;設計
修改自身的密碼: htm
PASSW對象
退出/斷開:
EXIT/DISC
切換用戶:
CONN user/password
// 用戶管理
建立用戶:
CREATE USER user IDENTIFIED BY password;
修改用戶密碼:
PASSWORD user;
修改用戶:
ALTER USER user IDENTIFIED BY newpassword
刪除用戶:
DROP USER user [CASCADE]
// 權限管理(系統權限、對象)
授予系統權限(對系統級的操做):
GRANT system_privilege|ALL_PRIVILEGES TO user|role
授予對象權限(對錶、視圖操做):
GRANT object_privilege|ALL ON scheme.object TO user|role
回收授予的系統權限:
REVOKE system_privilege|ALL_PRIVILEGES FROM user|role
回收授予的對象權限:
REVOKE object_privilege|ALL ON schema.object FROM user|role
系統權限傳遞:
GRANT system_privilege|ALL_PRIVILEGES TO user|role [WITH ADMIN OPTION]
1)若是system給zhangsan授予CREATE SESSION時加上了WITH ADMIN OPTION,
此時zhangsan也能夠給其它用戶授予CREATE SESSION的權限,
若是zhangsan又給lisi授予CREATE SESSION權限,
那麼lisi確定是能夠登陸了。
2)若是system回收了zhangsan的權限,那麼lisi還能登陸嗎?仍是能登陸
3)system能夠直接回收lisi的CREATE SESSION權限
對象權限傳遞:
GRANT object_privilege|ALL ON scheme.object TO user|role [WITH GRANT OPTION]
1)若是scott給zhangsan授予SELECT時加上了WITH GRANT OPTION,
此時zhangsan也能夠給其它用戶授予SELECT的權限,
若是zhangsan又給lisi授予SELECT權限,
那麼lisi確定是能夠查詢了:SELECT * FROM scott.emp;
2)若是scott回收了zhangsan的SELECT權限,那麼lisi還能查詢嗎?不能查詢了
3)scott不能夠直接回收lisi的SELECT權限
// 角色管理
角色分爲兩類:
第一類是內置角色(CREATE SSSION、CONNECT、RESOURCE、DBA)
第二類是自定角色:
1)角色建立:
CREATE ROLE role;
2)把角色受權權限
GRANT system_privilege|ALL_PRIVILEGES TO role [WITH ADMIN OPTION]
3)把角色給用戶
GRANT role TO user;
4)角色刪除:
DROP ROLE role;
// PROFILE
專門作口令管理(它只對用戶設置,不能對角色設置)
實例:
指定scott密碼只能嘗試輸入3次,若是超過限制就鎖定2天?
1)建立PROFILE
CREATE PROFILE profile_name LIMIT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;
具體的參數設置,請在網上找一下參數詳解!
2)把建立好的PROFILE指定對scott
ALTER USER scott PROFILE profile_name
3) 如今scott就會使用這個PROFILE的限制(3次事後會鎖2天)
4)若是要解鎖
ALTER USER scott ACCOUNT UNLOCK;
5)刪除PROFILE
DROP PROFILE profile_name [CASCADE];
//***************************** Day2:SQL基礎 ***********************************
一、SQL分類:
DDL、DML、DQL、DCL
二、數據類型:
1)字符型
變長:VARCHAR2(0-4000)、
定長:CHAR(0-2000)
若是咱們在設計數據庫時,已經肯定某些字符串長度是固定的,儘可能使用CHAR,提升效率!
舉例:二代身份證CHAR(18),MD5 CHAR(32)
2)數字型
NUMBER(1) 0-9
NUMBER(5) 0-99999
NUMBER(5, 2) 555.22
3)時間類型
date
timestamp:精確到毫秒,可是咱們在通常的應用裏用不上
注:可直接使用sysdate取得當前時間!
4)其餘類型
blob,最大存儲爲4G,專存二進制
clob,最大存儲爲4G,專存字符串
三、DDL
a)CREATE
CREATE TABLE sys_user (
id NUMBER(10) PRIMARY KEY,
username VARCHAR2(50) NOT NULL,
password CHAR(32) NOT NULL,
birthday date,
salary NUMBER(6,2)
);
b)ALTER
添加列:
ALTER TABLE table_name ADD 列描述
修改列:
ALTER TABLE table_name MODIFY 列描述
注:若是修改時涉及到約束,如非空約束,必需要保證數據庫裏沒有數據纔可成功更改!
刪除列:
ALTER TABLE table_name DROP COLUMN 列名;
修改表名:
ALTER TABLE table_name RENAME TO new_table_name;
修改列名:
ALTER TABLE table_name RENAME COLUMN column_name TO new_column_name
c)DROP
刪除列:
ALTER TABLE table_name DROP COLUMN 列名;
刪除表:
DROP TABLE table_name;
4)五大約束
CREATE TABLE sys_user (
id NUMBER(10) PRIMARY KEY,
username VARCHAR2(50) NOT NULL UNIQUE,
password CHAR(32) NOT NULL,
age NUMBER(3) CHECK(age>=18 AND age=120),
birthday date,
salary NUMBER(6,2)
);
CREATE TABLE sys_user (
id NUMBER(10),
username VARCHAR2(50) NOT NULL,
password CHAR(32) NOT NULL,
age NUMBER(3),
birthday date,
salary NUMBER(6,2),
CONSTRAINTS sys_user_id_pk PRIMARY KEY(id),
CONSTRAINT sys_user_username_unique UNIQUE(username),
CONSTRAINT sys_user_age_check CHECK(age>=18 AND age<=120)
);
CREATE TABLE sys_user (
id NUMBER(10),
username VARCHAR2(50) NOT NULL,
password CHAR(32) NOT NULL,
age NUMBER(3),
birthday date,
salary NUMBER(6,2)
);
ALTER TABLE sys_user ADD CONSTRAINTS sys_user_id_pk PRIMARY KEY(id);
ALTER TABLE sys_user ADD CONSTRAINT sys_user_username_unique UNIQUE(username);
ALTER TABLE sys_user ADD CONSTRAINT sys_user_age_check CHECK(age>=18 AND age<=120);
對後期添加的約束作移除:
ALTER TABLE sys_user DROP CONSTRAINT constraint_name;
特殊(Not null):
NOT NULL沒有Constraint的寫法,它的添加和刪除以下:
添加:
ALTER TABLE table_name MODIFY column_name NOT NULL;
刪除:
ALTER TABLE table_name MODIFY column_name NULL;
建議:直接在列後面追加,這樣更直觀!
5)外鍵約束
主表:
CREATE TABLE sys_role(
id NUMBER(10) PRIMARY KEY,
name VARCHAR2(10) NOT NULL
)
從表:
CREATE TABLE sys_user(
id NUMBER(10) PRIMARY KEY,
name VARCHAR2(10) NOT NULL,
role_id NUMBER(10) REFERENCES sys_role(id) [ON DELETE CASCADE]
)
CREATE TABLE sys_user(
id NUMBER(10) PRIMARY KEY,
name VARCHAR2(10) NOT NULL,
role_id NUMBER(10),
CONSTRAINT sys_user_role_id_fk FOREIGN KEY(role_id) REFERENCES sys_role(id) [ON DELETE CASCADE]
)
ALTER TABLE sys_user ADD CONSTRAINT sys_user_role_id_fk FOREIGN KEY(role_id) REFERENCES sys_role(id) [ON DELETE CASCADE];
注意:
a)建立表:先建主表,再建從表
b)新增數據:先新增主表數據,再新增從表數據
c)刪除數據:
若是直接刪除主表的數據,會提示咱們先去刪除被從表引用的記錄,再刪除主表的記錄
若是在外鍵上指定了ON DELETE
CASCADE,那麼咱們在刪除主表記錄的同時會級聯刪除相應的子表記錄,不建議使用!
注意2:要不要使用外鍵?
1)使用外鍵:
優勢:使用約束,強制保持數據的一致性
缺點:後期難以維護
性能問題
2)不使用外鍵(推薦)
優勢:解決了使用外鍵的缺點
缺點:數據的一致性,須要程序去控制關係,容易出錯!
//*************************** Day3:簡單查詢和條件查詢基礎 ****************************
一、SQL結構(注意順序)
SELECT
[DISTINCT|ALL] select_list
FROM table_list
[where_clause]
[group_by_clause]
[HAVING condition]
[order_by_clause]
二、簡單查詢
1)在數據量大時,必須指定部分字段進行查詢,而不是使用*查詢。
2)使用別名代替表中的字段名
SELECT ename 名稱, job "工做", sal AS 工資, comm AS "補助" FROM emp;
注:
a)使用別名時不能使用單引號
b)若是要給emp(表)給別名,不能使用AS方式!
3)去除重複記錄
SELECT DISTINCT job FROM emp;
SELECT DISTINCT job, sal FROM emp;
4)表達式(||+、-、*、/等等)
SELECT sal*13 + nvl(comm,0)*12 FROM emp;
5)使用函數操做查詢的字段
SELECT max(sal),min(sal),avg(sal),sum(sal) FROM emp;
SELECT sysdate FROM dual;
6)排序
a)遇NULL,指定排前(NULLS FIRST,默認)仍是排後(NULLS LAST)
SELECT comm FROM emp ORDER BY comm DESC NULLS LAST;
b)別名排序同直接使用列名效果同樣,針對長表達式使用別名更簡單!
SELECT sal as "工資" FROM emp ORDER BY "工資";
c)利用多個字段進行排序(若是第一個字段相同,再參考第二個字段)
SELECT ename,sal,empno FROM emp ORDER BY sal ASC, empno DESC;
三、條件查詢
1)WHERE條件操做符
可使用的操做符主要有關係操做符、比較操做符和邏輯操做符:
· 關係操做符:<、<=、>、>=、=、!=、<>
· 比較操做符:IS NULL、LIKE、BETWEEN...AND...、IN
· 邏輯操做符:AND、OR、NOT
2)查詢值大小寫敏感且字符串需用單引號(跟MySQL不一樣)
SELECT * FROM emp WHERE ename='ALLEN'
3)查詢條件中使用函數
SELECT * FROM emp WHERE nvl(comm,0)=0;
4)模糊查詢
_:能夠替代一個字符
%:能夠替代多個字符
SELECT * FROM emp WHERE job LIKE '_A%'
5)專門針對NULL值的查詢
SELECT * FROM emp WHERE comm IS NULL;
6)日期比較
SELECT * FROM emp WHERE hiredate<'01-MAY-1981';
SELECT ename,hiredate FROM emp WHERE hiredate>to_date('1982-01-01', 'yyyy-mm-dd');
注:Oracle日期格式化:yyyy-mm-dd hh24:mi:ss
7)GROUP BY子句和HAVING子句
GROUP BY都是跟在WHERE後面,若是沒有WHERE條件,就直接跟在FROM後面
HAVING,主要就是對GROUP BY的信息再進行篩選,它必需要跟在GROUP BY後面
例:按部門的平均工資分組,而後篩選出平均工資大於等於2000的部門的全部員工信息?
a)使用子查詢
SELECT * FROM emp WHERE deptno in(SELECT deptno FROM emp GROUP BY deptno HAVING AVG( sal)>=2000);
b)把子查詢後結果當作臨時表
SELECT * FROM emp,(SELECT deptno FROM emp GROUP BY deptno HAVING AVG(sal)>=2000) temp WHERE emp.deptno=temp.deptno;
//************************* Day4:子查詢、多表查詢、聯合查詢 ****************************
一、子查詢
1)幾道題?
a)查詢出emp表中工資最高的員工的名字和工做崗位?
SELECT ename,job FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);
b)查詢工資高於平均工資的員工?
SELECT * FROM emp WHERE sal>(SELECT AVG(sal) FROM emp);
c)查詢部門名稱裏有A的員工信息?
多表:
SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno AND d.dname LIKE '%O%';
子查詢:
SELECT * FROM emp WHERE deptno IN(SELECT deptno FROM dept WHERE dname LIKE '%O%');
d)查詢部門名稱裏有A的員工信息和部門名稱?
多表:
SELECT e.*,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno AND d.dname LIKE '%O%';
把子查詢後結果當作臨時表:
SELECT * FROM emp e, (SELECT * FROM dept WHERE dname LIKE '%O%') d WHERE e.deptno=d.deptno;
注:能直接使用多表就直接使用多表,子查詢的使用是要看狀況的!
2)返回單列和返回多列兩種狀況
a)返回單列,用=
b)返回多列,用in
3)分頁
查詢前10條的數據:
SELECT e.*,ROWNUM FROM emp e WHERE ROWNUM <= 10;
查詢5到10條的數據:
SELECT * FROM (SELECT e.*,ROWNUM r FROM emp e WHERE ROWNUM <= 10) temp WHERE r>=5;
擴展:
顯示比本身部門的平均工資還高的員工信息?
SELECT e.*,salary.avg_sal FROM emp e,(SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno) salary WHERE e.deptno=salary.deptno AND e.sal>salary.avg_sal;
二、多表查詢
1)傳統查詢
a)笛卡爾積的產生和消除
注:在消除笛卡爾積時,消除條件至少等於表的個數-1
b)多表查詢時,爲了區別字段,建議使用別名。
2)內鏈接
a)等值鏈接
SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno;
等同於:
SELECT * FROM emp e, dept d WHERE e.deptno=d.deptno;
b)不等值鏈接
SELECT * FROM emp e INNER JOIN dept d ON e.deptno>d.deptno;
考慮:顯示各個員工的姓名工資及其工資的級別?
SELECT e.ename,e.sal,s.grade FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;
等同於:
SELECT e.ename,e.sal,s.grade FROM emp e JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;
注:INNER關鍵字能夠省略!
3)自鏈接
考慮:顯示FORD的上級領導的姓名和工資?
SELECT employee.ename,manager.ename,manager.sal
FROM emp employee JOIN emp manager
ON employee.mgr=manager.empno
WHERE employee.ename='SCOTT';
等同於:
SELECT employee.ename,manager.ename,manager.sal
FROM emp employee, emp manager
WHERE employee.mgr=manager.empno AND employee.ename='SCOTT';
4)外鏈接
a)左外鏈接
使用左外鏈接的查詢,返回的結果不只僅是符合鏈接條件的行記錄,還包 含了左邊表中的所有記錄。也就是說,若是左表的某行記錄在右表中沒有 匹配項,則在返回結果中右表的全部選擇列表列均爲空!
SELECT e.ename,d.dname FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;
b)右外鏈接
右外鏈接跟左外鏈接是相反的,它以右邊的表爲主表。
SELECT e.ename,d.dname FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;
c)全外鏈接(注:使用傳統鏈接代替不了外鏈接)
SELECT e.ename,d.dname FROM emp e FULL JOIN dept d ON e.deptno=d.deptno;
d)(+),Oracle特有用法,它能夠實現左外鏈接和右外鏈接,但不能實現全鏈接,瞭解便可!
5)聯合查詢
合併處理多個查詢語句的結果!
一、UNION
用於取得兩個結果集的並集,並會自動去掉結果集中的重複行。
SELECT * FROM emp e1 WHERE e1.sal>2500 UNION SELECT * FROM emp e2 WHERE e2.job='MANAGER';
二、UION ALL
使用UNION ALL並不會自動去掉結果集中的重複行!
SELECT * FROM emp e1 WHERE e1.sal>2500 UNION ALL SELECT * FROM emp e2 WHERE e2.job='MANAGER';
三、INTERSECT
Oracle特有操做符,用於取得兩個結果集的交集。
SELECT * FROM emp e1 WHERE e1.sal>2500 INTERSECT SELECT * FROM emp e2 WHERE e2.job='MANAGER';
四、MINUS
Oracle特有操做符,用於取得兩個結果集的差集。第一個集合減去第二個集合, 相同集去除。
SELECT * FROM emp e1 WHERE e1.sal>2500 MINUS SELECT * FROM emp e2 WHERE e2.job='MANAGER';
注:讓MySQL支持INTERSECT和MINUS:http://www.jb51.net/article/51411.htm
//************************* Day5:其餘經常使用操做 ****************************
一、序列
a)Oracle提供了Sequence對象,由系統提供自增加的序列號,一般用於生成數 據庫數據記錄的自增加主鍵或序號的地方。
b)建立Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE權限。
CREATE SEQUENCE 序列名
[INCREMENT BY n] // 步長,默認爲1
[START WITH n] // 開始,默認爲1
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] // 最大/小值|沒有最大或最小值
[{CYCLE|NOCYCLE}] // 達到限制是否循環
[{CACHE n|NOCACHE}]; // 存序列的內存塊大小,默認20
例如:
CREATE SEQUENCE sys_user
INCREMENT BY 1
START WITH 1
MINVALUE 0
NOCYCLE
c)獲得Sequence值
· 當前值:序列名.currval
· 下一個值:序列名.nextval
d)刪除Sequence
DROP SEQUENCE 序列名
e)修改Sequence
ALTER SEQUENCE sys_user_seq MAXVALUE 999999;
// 改變序列的初始值只能經過刪除序列以後重建序列的方法實現
// ALTER SEQUENCE sys_user_seq START WITH 1;
二、事務
1)要麼成功,要麼失敗
事務在數據庫中主要用於保證數據的一致性,防止出現錯誤數據。在事務內 的語句都會被當作一個單元,一旦有一個失敗,那麼全部的都會失敗,轉帳 是一個很是典型的例子。
2)事務的常見操做:
SET TRANSACTION:設置事務屬性(併發比較高時可能會用到只讀事務)
SAVEPOINT:設置保存點
ROLLBACK TO SAVEPOINT:回滾至保存點
ROLLBACK:回滾事務
COMMIT:提交事務
3)事務的ACID特性
事務有4個特性,它們分別是原子性、一致性、分離性、持久性。
a)原子性(Atomicity):原子意味着不可分割,無論有多少程序,只要在同 一個事務中,那麼它們就是一個總體
b)一致性(Consistency):事務執行的先後數據庫都必須處於一致性狀態, 只有在事務完成後才能被全部使用都看到,保證了數據的完整性。
c)分離性(Isolation):事務之間不相干擾,一個事務操做的數據不會被其 他事務看到和操做
d)持久性(Durabilily):一旦事務提交完成,那麼這將是對數據永久的修改