Oracle基礎知識(一)
1. 資料庫原理
1.1. 資料庫簡介
1.1.1. 檔案儲存
對資料的儲存需求一直存在。儲存資料的方式,經歷了手工管理、檔案管理等階段,直至資料庫管理階段。
檔案儲存方式儲存資料的弊端:
- 缺乏對資料的整體管理,資料不便修改;
- 不利於資料分析和共享;
- 資料量急劇增長,大量資料不可能長期儲存在檔案中。
資料庫應運而生,是人們存放資料、訪問資料、操作資料的儲存倉庫。
1.1.2. 資料庫簡介
主流資料庫產品:
- Oracle(Oracle)
- DB2(IBM)
- SQL Server(MS)
- MySQL(Oracle)
1.1.3. 表的概念
在資料庫中,資料被存放於二維資料表(Table)中。
一個數據庫由多個數據表組成,資料表是資料庫的基本儲存結構,由行和列組成,行(Row)也就是橫排資料,也經常被稱作記錄(Record),列(Column)就是縱列資料,也被稱作欄位(Field)。表和表之間是存在關聯關係的。
1.2. 主流資料庫
1.2.1. Oracle資料庫概述
Oracle是當今著名的Oracle(甲骨文)公司的資料庫產品,它是世界上第一個商品化的關係型資料庫管理系統,也是第一個推出和資料庫結合的第四代語言開發工具的資料庫產品。
Oracle採用標準的SQL結構化查詢語言,支援多種資料型別,提供面向物件的資料支援,具有第四代語言開發工具,支援UNIX、WINDOWS、OS/2等多種平臺。Oracle公司的軟體產品豐富,包括Oracle伺服器產品,Oracle開發工具和Oracle應用軟體。其中最著名的就是Oracle資料庫,目前最新的版本是Oracle 12c。
1.2.2. DB2資料庫概述
DB2是IBM的關係型資料庫管理系統,DB2有很多不同的版本,可以執行在從掌上產品到大型機不同的終端機器上。DB2 Universal Database Personal Edition和DB2 Universal Database Workgroup Edition分別是為OS/2和Windows系統的單使用者和多使用者提供的資料庫管理系統。
DB2在高階資料庫的主要競爭對手是Oracle。
1.2.3. Sybase資料庫
Sybase是美國Sybase公司研製的一種關係型資料庫系統,是較早採用C/S技術的資料庫廠商,是一種典型的UNIX或Windows NT平臺上客戶機/伺服器環境下的大型資料庫系統。 Sybase通常與Sybase SQL Anywhere用於客戶機/伺服器環境,前者作為伺服器資料庫,後者為客戶機資料庫,採用該公司研製的PowerBuilder為開發工具,在國內大中型系統中具有廣泛的應用。
SYBASE主要有三種版本,一是UNIX作業系統下執行的版本,二是Novell Netware環境下執行的版本,三是Windows NT環境下執行的版本。對UNIX作業系統目前廣泛應用的為SYBASE 10 及SYABSE 11 for SCO UNIX。
2010年Sybase被SAP收購。
1.2.4. SQL Server資料庫概述
Microsoft SQL Server是執行在Windows NT伺服器上,支援C/S結構的資料庫管理系統。它採用標準SQL語言,微軟公司對它進行了部分擴充而成為事務SQL(Transact-SQL)。
SQL Server最早是微軟為了要和IBM競爭時,與Sybase合作所產生的,其最早的發展者是Sybase,和Sybase資料庫完全相容。在與Sybase終止合作關係後,微軟自主開發出SQL Server 6.0版,往後的SQL Server即均由微軟自行研發。最新的版本是SQL Server 2012,上一版本是2008。
Microsoft SQL Server幾個初始版本適用於中小企業的資料庫管理,但是後來它的應用範圍有所擴充套件,已經觸及到大型、跨國企業的資料庫管理。
1.2.5. MySQL資料庫概述
MySQL是一個開放原始碼的小型關係型資料庫管理系統,開發者為瑞典MySQL AB公司。目前MySQL被廣泛地應用在Internet上的中小型網站中。
與其它的大型資料庫例如Oracle、IBM DB2等相比,MySQL自有它的不足之處,如規模小、功能有限等,但對於一般個人使用者和中小型企業來說,MySQL提供的功能已經綽綽有餘,而且由於MySQL是開放原始碼軟體,因此可以大大降低總體擁有成本,許多中小型網站為了降低網站總體擁有成本而選擇了MySQL作為網站資料庫。
2008年1月16日,Sun正式收購MySQL。2009年4月20日,SUN被Oracle公司收購。目前的最新版本是MySQL5.6.
1.3 Oracle資料庫安裝及訪問
1.3.1.oracle資料庫安裝:略
1.3.2. 使用SQL PLUS訪問資料庫
首先,登入到資料庫所在的機器上,輸入機器作業系統的帳號和密碼:
然後在%提示符下,輸入SQLPlus命令,並輸入資料庫的帳號和密碼:
如果出現SQL提示符,則表示登入成功:
退出時,在SQL>後輸入exit即可:
再輸入exit,即退出遠端伺服器。
1.3.3. 使用Oracle SQL Developer 訪問據庫
第一次進入SQL Developer,需要設定連線引數。首先在視窗左邊的Connection上按右鍵,開啟一個新的連線,輸入遠端資料庫的引數
1.3.4.表空間
查看錶空間:
select * from v$tablespace;
建立表空間:
create tablespace jt12
datafile 'F:\app\Administrator\oradata\orcl\jt12.dbf'
size 100m
autoextend on next 32m maxsize unlimited;
檢視所有表空間資訊:
select * from dba_data_files;
刪除表空間(包括表空間內的檔案):
drop tablespace jt12 including contents and datafiles;
1.3.5.建立使用者:
create user jt12 identified by jt12 default tablespace jt12;
1.3.6.給使用者授權:
grant connect,resource to jt12;
13.7.回收使用者許可權:
revoke connect,resource from jt12;
13.8.刪除使用者: d
drop user 使用者名稱;
13.9.設定表空間:
alter user 使用者名稱 default tablespace jt13;
1.4. SQL概述
1.4.1. 結構化查詢語言
SQL(Structured Query Language) 是結構化查詢語言的縮寫。
SQL是在資料庫上執行資料操作、檢索及維護所使用的標準語言,可以用來查詢資料,操縱資料,定義資料,控制資料,所有資料庫都使用相同或者相似的語言。
SQL可分為:
- 資料定義語言(DDL) : Data Definition Language
- 資料操縱語言(DML) : Data Manipulation Language
- 事務控制語言(TCL):Transaction Control Language)
- 資料查詢語言(DQL):Data Query Language
- 資料控制語言(DCL) : Data Control Language
執行SQL語句時,使用者只需要知道其邏輯含義,而不需要知道SQL語句的具體執行步驟。
1.4.2. 資料定義語言(DDL)
用於建立、修改、刪除資料庫物件,包括建立語句(CREATE)、修改語句(ALTER)、刪除語句(DROP)。這類語言不需要事務的參與,自動提交。
1.4.3. 資料操作語言(DML)
用於改變資料庫資料,包括INSERT、UPDATE、DELETE三條語句。其中,INSERT語句用於將資料插入到資料庫中,UPDATE語句用於更新資料庫中已存在的資料,DELETE用於刪除資料庫中已存在的資料。DML語言和事務是相關的,執行完DML操作後必須經過事務控制語句提交後才真正的將改變應用到資料庫中。
1.4.4. 事務控制語言(TCL)
用來維護資料一致性的語句,包括提交(COMMIT)、回滾(ROLLBACK)、儲存點(SAVEPOINT)三條語句,其中COMMIT用來確認已經進行的資料庫改變, ROLLBACK語句用來取消已經進行的資料庫改變,當執行DML操作後(也就是上面說的增加、修改、刪除等動作),可以使用COMMIT語句來確認這種改變,或者使用ROLLBACK取消這種改變。SAVEPOINT語句用來設定儲存點,使當前的事務可以回退到指定的儲存點,便於取消部分改變。
1.4.5. 資料查詢語言(DQL)
用來查詢所需要的資料。使用最廣泛,語法靈活複雜。
1.4.6. 資料控制語言(DCL)
用於執行許可權的授予和收回操作、建立使用者等,包括授予許可權(GRANT)語句,收回(REVOKE)語句,CREATE USER語句。DCL語句也不需要事務的參與,是自動提交的。
2.1. Oracle資料型別
2.1.1. NUMBER
NUMBER表示數字型別,經常被定義成NUMBER(P,S)形式,其中:
- P表示數字的總位數
- S表示小數點後面的位數
例如在表Emp中的Sal列的定義如下:
Sal NUMBER(6,2)
表示Sal列中的資料,整數位最大為4位,小數位最大位數是2位,也就是最大取值:9999.99。
2.1.2. CHAR
CHAR表示固定長度的字元型別,經常被定義成CHAR(N)形式, N表示佔用的位元組數,N的最大取值是2000。
例如在表Emp中的Ename列的定義如下:
Ename CHAR(20);
表示Ename列中最多可儲存20個位元組的字串,並且佔用的空間是固定的20個位元組。
2.1.3. VARCHAR2
VARCHAR2表示變長的字元型別,定義格式是VARCHAR2(N), N表示最多可佔用的位元組數,最大長度是4000位元組。
例如在表Emp中的JOB列的定義如下:
JOB VARCHAR2(100);
表示JOB列中最多可儲存長度為100個位元組的字串。根據其中儲存的資料長度,佔用的空間是變化的,最大佔用空間為100個位元組。
2.1.4. DATE和TIMESTAMP
DATE用於定義日期時間的資料,長度是7個位元組,預設格式是:DD-MON-RR, 例如:“11-APR-71”。如果是中文環境,是“11-4月-71”這種形式。
TIMESTAMP這也是ORACLE常用的日期型別,它與date的區別是不僅可以儲存日期和時間,還能儲存小數秒,小數位數可以指定為0-9,預設為6位,所以最高精度可以到ns(納秒)
例如在表Emp中的Hiredate列的定義如下:
Hiredate DATE;
表示Hiredate列中存放的是日期資料。
2.1.5. LONG和CLOB型別
LONG型別可以認為是VARCHAR2的加長版,用來儲存變長字串,最多達2GB的字串資料,但是LONG型別有諸多限制,所以不建議使用:
- 每個表只能有一個LONG型別列;
- 不能作為主鍵;
- 不能建立索引;
- 不能出現在查詢條件中等
CLOB用來儲存定長或變長字串,最多達4GB的字串資料,ORACLE建議開發中使用CLOB替代LONG型別
2.2. 建立表
2.2.1. CREATE語句
建立表的語法是:
CREATE TABLE table_name(
column_name datatype[DEFAULT expr][,…]
);
建立職員表的例子:
--建立表emp
CREATE TABLE emp(
id NUMBER(10),
name VARCHAR2(20),
gender CHAR(1),
birth DATE,
salary NUMBER(6,2),
job VARCHAR2(30),
deptid NUMBER(2)
);
2.2.2. DESC語句
DESC是查看錶的資料結構,語法是:
DESC table_name;
檢視emp表的結構,將會得到的結果如圖-14所示:
圖-14檢視資料表的結構
2.2.3. DEFAULT
可以通過DEFAULT子句給列指定預設值,例如,在emp表中給gender列賦預設值‘M’,如果插入資料時沒有指定性別的員工,則預設是男性。
建立表emp1:
CREATE TABLE emp1(
id NUMBER(10),
name VARCHAR2(20),
gender CHAR(1) DEFAULT ‘M’,
birth DATE,
salary NUMBER(6,2),
job VARCHAR2(30),
deptid NUMBER(2)
);
2.2.4. NOT NULL
預設情況下,任何列都允許有空值。非空(Not Null)是一種約束條件,用於確保欄位值不為空,當某個欄位被設定了非空約束條件,這個欄位中必須存在有效值,也就是說,當執行插入資料的操作時,必須提供這個列的資料,當執行更新操作時,不能給這個列的值設定為NULL。
建立表emp2,設定name欄位為非空,也即是表emp2中的每條記錄,name列都必須有值。
CREATE TABLE emp2(
id NUMBER(10),
name VARCHAR2(20) NOT NULL,
gender CHAR(1),
birth DATE,
salary NUMBER(6,2),
job VARCHAR2(30),
deptid NUMBER(2)
);
2.3. 修改表
2.3.1. 修改表名
在建表後如果希望修改表名,可以使用RENAME語句實現,語法如下,將改變表名old_name為new_name:
RENAME old_name TO new_name;
舉例說明,如果要將表名emp修改為employee,使用如下語法:
RENAME emp TO employee;
2.3.2. 增加列
在建表之後,要給表增加列可以使用ALTER TABLE的ADD子句實現。語法如下:
ALTER TABLE table_name ADD
(column datatype [DEFAULT expr] [, column datatype…])
注意一點,列只能增加在最後,不能插入到現有的列中。下例給表employee增加一列hiredate,並設定預設值為當前日期。
ALTER TABLE employee ADD (hiredate DATE DEFAULT sysdate);
2.3.3. 刪除列
在建表之後,使用ALTER TABLE的DROP子句刪除不需要的列。語法如下:
ALTER TABLE table_name DROP (column);
刪除欄位需要從每行中刪掉該欄位佔據的長度和資料,並釋放在資料塊中佔據的空間,如果表記錄比較大,刪除欄位可能需要比較長的時間。
下例刪除表employee的列hiredate:
ALTER TABLE employee DROP (hiredate);
2.3.4. 修改列
建表之後,可以改變表中列的資料型別、長度和預設值,注意這種修改僅對以後插入的資料有效,另外如果表中已經有資料的情況下,把長度由大改小,有可能不成功,比如原來的型別是VARCHAR2(100),其中已經存放了100個位元組長度的資料,如果要改為VARCHAR2(80),則不會修改成功。
語法如下:
ALTER TABLE table_name MODIFY
(column datatype [DEFAULT expr] [, column datatype…])
下例修改表employee的列job,並增加預設值的設定:
ALTER TABLE employee
MODIFY(job VARCHAR2(40) DEFAULT 'CLERK' );
2.4. DML語句
在做後續練習之前,先熟悉本部分使用的樣例表emp和dept的結構和資料:
DROP TABLE dept;
CREATE TABLE dept
(deptno NUMBER(2),
dname VARCHAR2(14) ,
loc VARCHAR2(13) ) ;
DROP TABLE emp;
CREATE TABLE emp
(empno NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(15),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2));
INSERT INTO dept VALUES
(10,'ACCOUNTING','NEW YORK');
INSERT INTO dept VALUES
(20,'RESEARCH','DALLAS');
INSERT INTO dept VALUES
(30,'SALES','CHICAGO');
INSERT INTO dept VALUES
(40,'OPERATIONS','BOSTON');
SELECT * FROM dept;
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,to_date('19-4-1987','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,to_date('23-5-1987','dd-mm-yyyy'),1100,NULL,20);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
2.4.1. INSERT語句
INSERT語句用來給資料表增加記錄,每次增加一條記錄。語法如下:
INSERT INTO table_name[(column[, column…])]
VALUES(value[, value…]);
需要注意的一點,所有的DML操作,都需要再執行事務提交語句commit,才算真正確認了此操作。
向employee表插入一條記錄的例子如下:
INSERT INTO employee(id, name, job, salary)
VALUES(1001, 'rose', 'PROGRAMMER', 5500);
Oracle中的日期資料比較特殊,如果插入的列有日期欄位,需要考慮日期的格式。Oracle的預設的日期格式‘DD-MON-RR,你或者按照預設格式插入資料,或者自定義日期格式,用TO_DATE函式轉換為日期型別的資料。
--使用預設日期格式插入記錄
INSERT INTO employee(id, name, job,birth)
VALUES(1002, 'martha', 'ANALYST', '01-9月-89');
--使用自定義日期格式插入記錄
INSERT INTO employee(id, name, job, birth)
VALUES(1003, 'donna', 'MANAGER',
TO_DATE('1978-09-01', 'YYYY-MM-DD'));
2.4.2. UPDATE語句
UPDATE語句用來更新表中的記錄,語法如下:
UPDATE table_name
SET column = value [, column = value]…
[WHERE condition];
其中WHERE子句是可選的,但是如果沒有WHERE子句,則全表的資料都會被更新,務必小心。
下例更改職員ROSE的薪水為8500:
UPDATE employee SET salary = 8500 WHERE name = 'ROSE';
2.4.3. DELETE語句
DELETE語句用來刪除表中的記錄,語法如下:
DELETE [FROM] table_name [WHERE condition];
和UPDATE語句一樣,WHERE子句是可選的,但是如果沒有WHERE子句,則全表的資料都會被刪除,務必確認後再予以刪除。
下例將刪除職位是空的員工記錄:
DELETE FROM employee WHERE job is null;