1.關(guān)系模型的表達(dá)方式:二維表。
2.數(shù)據(jù)庫中存儲(chǔ)的基本對(duì)象是數(shù)據(jù)略步。
3.數(shù)據(jù)庫系統(tǒng)的核心是DBMS描扯。
4.DBMS的主要功能?
1)數(shù)據(jù)庫的定義功能( DDL 趟薄,數(shù)據(jù)庫三級(jí)結(jié)構(gòu)绽诚、兩級(jí)映象)
2)數(shù)據(jù)庫的操縱功能( DML ,過程性 DML (層次和網(wǎng)狀)和非過程性 DML (關(guān)系型) )
3)數(shù)據(jù)庫的保護(hù)功能(恢復(fù)杭煎、并發(fā)恩够、完整性、安全性)
4)數(shù)據(jù)庫的維護(hù)功能( DB 的載入岔帽、轉(zhuǎn)換玫鸟、轉(zhuǎn)儲(chǔ)等)
5)數(shù)據(jù)字典(存放三級(jí)結(jié)構(gòu)定義的數(shù)據(jù)庫)
5.SQL
例:查詢需要使用的學(xué)生表student和班級(jí)表classes。
SELECT FROM 查詢
INSERT INTO 新增
UPDATE 修改
DELETE 刪除
ALTER TABLE 修改表結(jié)構(gòu)
條件查詢
WHERE AND 與條件 OR 或條件 () 表示條件的組合
LIKE
IS NULL
IS NOT NULL
分組條件
GROUP BY 分組條件 HAVING 對(duì)分組后的數(shù)據(jù)進(jìn)行篩選
排序
ORDER BY ASC(升序),DESC(降序)
統(tǒng)計(jì)函數(shù):SUM,AVG,COUNT,MIN,MAX
多表關(guān)聯(lián)
INNER JOIN = JOIN
LEFT JOIN = LEFT OUTER JOIN
RIGHT JOIN = RIGHT OUTER JOIN
例:以學(xué)生表和學(xué)校表進(jìn)行關(guān)聯(lián)查詢犀勒。
子查詢:將查詢語句A的查詢結(jié)果作為查詢語句B的查詢條件使用
單行子查詢:子查詢的結(jié)果必定只有一個(gè)值屎飘,查詢的過程中使用了統(tǒng)計(jì)函SUM/AVG/COUNT/MIN/MAX。
多行子查詢:
①IN條件判斷
SELECT fields FROM table WHERE field1 in (SELECT field2 FROM table WHERE ...);
注:field1 與 field2的字段類型相同
②ANY運(yùn)算符 > < = >= <= !=
接條件判斷贾费,只要條件滿足期中一個(gè)就可
field > any(子查詢):查詢條件是 field 大于 子查詢結(jié)果的任意一個(gè)值就行
③all 運(yùn)算符
關(guān)聯(lián)子查詢:將主查詢語句的某些字段拿到子查詢內(nèi)作為子查詢的查詢條件钦购。
盡量避免使用,當(dāng)數(shù)據(jù)量過大時(shí)會(huì)影響數(shù)據(jù)性能褂萧。
6.表的創(chuàng)建
數(shù)據(jù)類型:NUMBER,VARCHAR,CHAR,BLOB,DATE
數(shù)據(jù)表的約束:外鍵約束押桃、主鍵約束、非空約束导犹、唯一約束
索引類型:
①B樹索引(默認(rèn)索引唱凯,保存講過排序過的索引列和對(duì)應(yīng)的rowid值)
②位圖索引:用于被創(chuàng)建字段的變化偏少羡忘,少于基數(shù)的1%
③反向鍵索引:用于被創(chuàng)建字段是遞增的情況,讓新增的數(shù)據(jù)平均分配給各分支
④基于函數(shù)的索引
序列:序列(SEQUENCE)是序列號(hào)生成器磕昼,可以為表中的行自動(dòng)生成序列號(hào)卷雕,產(chǎn)生一組等間隔的數(shù)值(類型為數(shù)字)。不占用磁盤空間票从,占用內(nèi)存漫雕。
創(chuàng)建序列需要CREATE SEQUENCE系統(tǒng)權(quán)限。
調(diào)用NEXTVAL將生成序列中的下一個(gè)序列號(hào)峰鄙,調(diào)用時(shí)要指出序列名浸间,即用以下方式調(diào)用:序列名.NEXTVAL。
CURRVAL用于產(chǎn)生序列的當(dāng)前值吟榴,無論調(diào)用多少次都不會(huì)產(chǎn)生序列的下一個(gè)值魁蒜。如果序列還沒有通過調(diào)用NEXTVAL產(chǎn)生過序列的下一個(gè)值,先引用CURRVAL沒有意義煤墙。調(diào)用CURRVAL的方法同上梅惯,要指出序列名,即用以下方式調(diào)用:序列名.CURRVAL仿野。
表和視圖的差異:
①視圖是已經(jīng)編譯好的sql語句铣减。而表不是。
②視圖沒有實(shí)際的物理記錄脚作。而表有葫哗。
③表是內(nèi)容,視圖是窗口球涛。
④表只用物理空間而視圖不占用物理空間劣针,視圖只是邏輯概念的存在,表可以及時(shí)對(duì)它進(jìn)行修改亿扁,但視圖只能有創(chuàng)建的語句來修改捺典。
⑤表是內(nèi)模式,視圖是外模式从祝。
⑥視圖是查看數(shù)據(jù)表的一種方法襟己,可以查詢數(shù)據(jù)表中某些字段構(gòu)成的數(shù)據(jù),只是一些SQL語句的集合牍陌。從安全的角度說擎浴,視圖可以不給用戶接觸數(shù)據(jù)表,從而不知道表結(jié)構(gòu)毒涧。
⑦表屬于全局模式中的表贮预,是實(shí)表;視圖屬于局部模式的表,是虛表仿吞。
⑧視圖的建立和刪除只影響視圖本身滑频,不影響對(duì)應(yīng)的基本表。
7.PL/SQL 編程
%type
record
變量的定義
游標(biāo)的使用
游標(biāo):
DECLARE
-- 聲明游標(biāo)
CURSOR cursor_emp(var_job in VARCHAR2:='MANAGER',var_deptno in int:=10)
IS SELECT empno,ename,sal FROM emp WHERE deptno=var_deptno and job=var_job;
-- 定義record數(shù)據(jù)類型
type record_emp is record(
var_empno emp.empno%type,
var_ename emp.ename%type,
var_sal emp.sal%type
);
-- 指定變量的類型
emp_row record_emp;
BEGIN
-- 打開|執(zhí)行游標(biāo)
OPEN cursor_emp();
-- 讀取游標(biāo) 不可改變
LOOP
-- 讀取一行數(shù)據(jù)
FETCH cursor_emp INTO emp_row;
-- 判斷是否為空
EXIT WHEN NOT cursor_emp%found;
-- 執(zhí)行具體的語句
dbms_output.put_line(emp_row.var_empno||'--'||emp_row.var_ename||'--'||emp_row.var_sal);
-- 主動(dòng)拋出異常
dbms_output.put_line(32/0);
END LOOP;
CLOSE cursor_emp; -- 關(guān)閉游標(biāo)
EXCEPTION
when ZERO_DIVIDE then
dbms_output.put_line('捕獲到了異常');
CLOSE cursor_emp; -- 關(guān)閉游標(biāo)
when others
CLOSE cursor_emp; -- 關(guān)閉游標(biāo)
END;
8.用戶模式
模式:創(chuàng)建一個(gè)用戶茫藏,就相應(yīng)的創(chuàng)建了 一個(gè)模式误趴。模式是指數(shù)據(jù)庫對(duì)象,是對(duì)用戶所創(chuàng)建的數(shù)據(jù)對(duì)象的總稱务傲。
模式對(duì)象包括表、視圖枣申、索引售葡、同義詞、序列忠藤、過程和程序包等 挟伙。
授權(quán)語句:
GRANT TO
ROVEKE FROM
CREATE TABLE--只能在自己擁有得模式下建立表
CREATE ANY TABLE--可以在任何模式下建立表
權(quán)限查詢的相關(guān)表:USER_TAB_PRIVS,DBA_SYS_PRIVS
創(chuàng)建角色
CREATE ROLE roleName INDETIFIED BY password;
刪除角色
DROP ROLE roleName;
為用戶賦予角色
GRANT roleName TO userName;
賦予角色權(quán)限
GRANT [權(quán)限列表] TO roleName;
回收角色權(quán)限
REVOKE [權(quán)限列表] FROM roleName;
激活角色
SET ROLL
9.日志系統(tǒng)
1)數(shù)據(jù)文件:數(shù)據(jù)文件當(dāng)然是用來存儲(chǔ)實(shí)際數(shù)據(jù)的啦,數(shù)據(jù)文件是存儲(chǔ)數(shù)據(jù)的物理概念模孩,我們還有一個(gè)更大的邏輯概念尖阔,叫做表空間,表空間跟數(shù)據(jù)文件又是一個(gè)什么樣的關(guān)系呢榨咐?簡單的說就是一個(gè)表空間至少包含可一個(gè)數(shù)據(jù)文件介却,創(chuàng)建數(shù)據(jù)庫對(duì)象的時(shí)候指定的是使用的表空間,所以就不難理解為什么一個(gè)對(duì)象(比如一張大表)可以跨越多個(gè)數(shù)據(jù)文件了块茁。
2)控制文件:控制文件在Oracle數(shù)據(jù)庫中扮演著很重要的角色齿坷,沒有控制文件(或者控制文件損壞了),運(yùn)行著的實(shí)例立即崩潰数焊,關(guān)閉著的死活打不開永淌,你以為你是誰,可以說佩耳,控制文件一旦損壞遂蛀,數(shù)據(jù)庫必然down了。Oracle數(shù)據(jù)庫實(shí)例啟動(dòng)過程中干厚,當(dāng)啟動(dòng)到unmount時(shí)李滴,此時(shí)只是在內(nèi)存中為Oracle實(shí)例分配了實(shí)例空間,然后如果繼續(xù)要啟動(dòng)到mount狀態(tài)萍诱,這個(gè)時(shí)候控制文件就閃亮登場了悬嗓,因?yàn)镺racle要依據(jù)控制文件找到數(shù)據(jù)文件跟重做日志文件的路徑,確定找到了再進(jìn)去mount狀態(tài)裕坊,至于打開數(shù)據(jù)庫就是確定這些文件都一致包竹,沒有問題的話就能打開了。
3)日志文件:
不對(duì)日志文件進(jìn)行歸檔。這種模式可以大大減少數(shù)據(jù)庫備份的開銷周瞎,但可能回導(dǎo)致數(shù)據(jù)的不可恢復(fù)苗缩。
歸檔日志文件:這是指為避免聯(lián)機(jī)日志文件重寫時(shí)丟失重復(fù)數(shù)據(jù)而對(duì)聯(lián)機(jī)日志文件所做的備份,當(dāng)Oracle轉(zhuǎn)向一個(gè)新的日志文件時(shí)声诸,將以前的日志文件進(jìn)行歸檔酱讶。為了防止出現(xiàn)歷史“缺口”的情況,一個(gè)給定的日志文件在它成功歸檔之前是不能重新使用的彼乌。歸檔的日志文件泻肯,加上聯(lián)機(jī)日志文件,為數(shù)據(jù)庫的所有改變提供了完整的歷史信息慰照。
上述學(xué)生表和班級(jí)表的查詢練習(xí):
①從學(xué)生表當(dāng)中查詢所有數(shù)據(jù)
SELECT * FROM student;
②從學(xué)生表當(dāng)中查詢學(xué)生的姓名灶挟、學(xué)號(hào)、年齡毒租、性別
SELECT stu_name,stu_code,stu_age,stu_gender FROM student;
③從學(xué)生表中查詢年齡大于18歲的學(xué)生
SELECT * FROM student WHERE stu_age > 18;
④從學(xué)生表中查詢年齡大于18歲的女學(xué)生
SELECT * FROM student WHERE stu_age > 18 AND student_gender = ‘女’;
⑤從學(xué)生表中查詢年齡大于18歲的女學(xué)生并且按照年齡降序稚铣,班級(jí)升序的條件排序
SELECT * FROM student
WHERE stu_age > 18 AND student_gender = ‘女’
ORDER BY stu_age DESC,class_id ASC;
⑥從學(xué)生表中查詢年齡大于18歲的女學(xué)生或者是年齡小于18的男學(xué)生;
SELECT * FROM student
WHERE (stu_age > 18 AND student_gender = ‘女’) OR (stu_age < 18 AND student_gender = ‘男’);
⑦從學(xué)生表中查詢學(xué)生最大墅垮、最小的年齡和學(xué)生總數(shù)惕医,學(xué)生平均年齡
SELECT max(age), min(age), count(*), avg(age) FROM student;
⑧從學(xué)生表中查詢每個(gè)班學(xué)生最大、最小的年齡和學(xué)生總數(shù)算色,學(xué)生平均年齡
SELECT class_id,max(age), min(age), count(*), avg(age) FROM student
GROUP BY class_id;
⑨從學(xué)生表中查詢每個(gè)班學(xué)生最大抬伺、最小的年齡和學(xué)生總數(shù),學(xué)生平均年齡,篩選出班級(jí)學(xué)生總數(shù)大于5的數(shù)據(jù)結(jié)果
SELECT class_id,max(age), min(age), count(*) as total, avg(age) FROM student
GROUP BY class_id
HAVING total > 5;
⑩從學(xué)生表中查詢每個(gè)班學(xué)生最大剃允、最小的年齡和學(xué)生總數(shù)沛简,學(xué)生平均年齡,并且查詢結(jié)果按照班級(jí)排序。
SELECT class_id,max(age), min(age), count(*), avg(age) FROM student
GROUP BY class_id
ORDER BY class_id ASC;
?從學(xué)生表中查詢班級(jí)名稱和每個(gè)班學(xué)生最大斥废、最小的年齡和學(xué)生總數(shù)椒楣,學(xué)生平均年齡,并且查詢結(jié)果按照班級(jí)排序。
SELECT class_name, max(age), min(age), count(*), avg(age) FROM student
INNER JOIN classes ON classes.class_id = student.class_id
GROUP BY student.class_id
ORDER BY student.class_id ASC;
?羅列出每個(gè)班級(jí)的學(xué)生信息牡肉,按班級(jí)排序
SELECT student.class_id, classes.class_name, student.code, student.name
FROM student
INNER JOIN classes ON classes.class_id = student.class_id
ORDER BY student.class_id ASC;
SELECT student.class_id, classes.class_name, student.code, student.name
FROM classes
LEFT JOIN student ON classes.class_id = student.class_id
ORDER BY student.class_id ASC;
?查詢學(xué)生人數(shù)大于5個(gè)的班級(jí)信息捧灰,并且按照班級(jí)排序
SELECT class_id,class_name FROM classes
WHERE (SELECT count(*) FROM student WHERE student.class_id = classes.class_id)>5
ORDER BY class_id ASC;