Oracle數據庫是相對於其他數據庫來說比較難的一個。Oracle Database,又名Oracle RDBMS,簡稱Oracle。是甲骨文公司推出的一款關系數據庫管理系統。Oracle數據庫系統是目前世界上流行的關系數據庫管理系統,擁有可移植性好、使用方便、功能強等優點,在各類大、中、小、微機環境中都適用。Oracle是一種高效率、可靠性好的、適應高吞吐量的數據庫解決方案。下面我們來具體的學習一下:
首先我們來看什么是Oracle數據,他的組成都有哪些?
Oracle數據庫服務器由一個數據庫和至少一個數據庫實例組成。 數據庫是一組存儲數據的文件,而數據庫實例則是管理數據庫文件 的內存結構。此外,數據庫是由后台進程組成。數據庫和實例是緊密相連的,所以我們一般說的Oracle數據庫,通常指的就是實例和數據庫。
Oracle 11G如何安裝
https://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html這是一個Oracle11g的下載鏈接,大家可以根據自己的電腦系統下載不同的安裝包。大家這里需要注意,會下載一個文件一和文件二。
如圖,下載好后,選中2個壓縮包,解壓到一個文件夾就可以了,這點非常重要。選擇setup.exe 安裝就行。
數據庫的創建
安裝完成后我們在CMD命令窗口中執行sqlplus命令,來打開終端,此時他會提示我們輸入用戶名和密碼,這個時候用戶可以輸入sys,密碼則是你在安裝的時候設置的密碼。
接下來我們創建一個用戶:
CREATE USER user1 IDENTIFIED BY 1234;
我們給user1用戶來授權:
GRANT CONNECT,RESOURCE,DBA TO user1;
上面我們創建了一個用戶,並且授予了登錄和DBA的權限,下面我們用user1來進行登錄看看:
CONNECT user1@orcl;
會提示你輸入密碼,登錄成功。注意,user1用戶僅存在於orcl數據庫中,因此,必須在CONNECT命令中明確指定用戶名為user1@orcl。
Oracle創建數據庫有三種方式:
- 用oracle dbca來創建
- 手工創建數據庫(這個是比較復雜的)
- 使用oracle managed Field來創建
帶着問題去學習
常用的查詢方面的有:
- Select 演示如何查詢單個表中的數據。
排序方面有:
- Order By 按升序或降序對查詢的結果集進行排序。
過濾方面有:
- Distinct 介紹如何消除查詢輸出中的重復行。
- Where 演示如何為查詢返回結果集中的行記錄指定過濾條件。
- And 組合兩個或兩個以上的布爾表達式,如果所有表達式都為true,則返回true。
- Or 組合兩個或兩個以上的布爾表達式,如果其中一個表達式為true,則返回true。
- Fetch 演示如何使用行限制子句限制查詢返回的行數。
- in 演示如何使用行限制子句限制查詢返回的行數。
- Between 基於一系列值(區間值)過濾數據。
- Like 根據特定模式執行匹配。
鏈接表方面有:
- Inner join 演示如何從表中查詢具有與其他表匹配的行記錄。
- Left join 介紹左連接概念,並學習如何使用它選擇左表中具有,但右表中不具有的行記錄。
- Right join 解釋右連接概念,並演示如何從右表查詢具有,但左表中不具有的行記錄。
- Cross join –介紹如何從多個表中構建笛卡爾乘積。
- Self join 演示如何將表連接到自身以查詢分層數據或比較同一個表中的行記錄。
分組方面有:
- Group By 演示如何將行分組為子組,並為每個分組應用聚合函數。
- Having 演示如何過濾分組中的行記錄。
子查詢方面有:
- 子查詢 - 介紹子查詢的概念以及如何使用子查詢來執行高級數據選擇技術。
- 相關子查詢 - 了解相關的子查詢,它是一個依賴於外部查詢返回的值的子查詢。
- EXISTS和NOT EXISTS - 檢查子查詢返回的行是否存在。
- ANY,SOME和ALL - 將值與列表或子查詢進行比較。
設置操作符
- UNION - 演示如何將兩個查詢的結果合並為一個結果。
- INTERSECT - 演示如何實現兩個獨立查詢的結果的交集。
- MINUS - 學習如何從一個結果集中減去另一個結果(也就是求差集)。
修改數據
- INSERT - 學習如何在表中插入一行。
- INSERT INTO SELECT - 從查詢結果中將數據插入到表中。
- INSERT ALL - 討論多重插入語句,將多行插入到一個或多個表中。
- UPDATE - 演示如何更新表的存在的數據值。
- DELETE - 演示如何從表中刪除一行或多行。
- MERGE - 使用單個語句逐步完成插入,更新和刪除操作。
數據定義:
- CREATE TABLE - 演示如何在數據庫中創建新表。
- IDENTITY列 - 了解如何使用IDENTITY子句來定義表的標識列。
- ALTER TABLE - 演示如何改變表的結構。
- ALTER TABLE ADD列 - 顯示如何將一個或多個列添加到現有表
- ALTER TABLE MODIFY列 - 演示如何更改表中現有列的定義。
- DROP COLUMN - 了解如何使用各種語句從表中刪除一列或多列。
- DROP TABLE - 演示如何從數據庫中刪除表。
- TRUNCATE TABLE - 更快,更有效地刪除表中的所有數據。
- RENAME TABLE - 學習如何重命名表和處理其依賴對象的過程。
數據類型:
- Oracle數據類型 - 內置Oracle數據類型的概述。
- NUMBER - 介紹數字數據類型,並展示如何使用它為表定義數字列。
- FLOAT - 通過實例來解釋Oracle中的浮點數據類型。
- CHAR - 了解固定長度的字符串類型。
- NCHAR - 演示如何存儲固定長度的Unicode字符數據,並解釋CHAR和NCHAR數據類型之間的區別
- VARCHAR2 - 向您介紹可變長度字符,並向您展示如何在表中定義可變長度字符列。
- NVARCHAR2 - 了解如何在數據庫中存儲可變長度的Unicode字符。
- DATE - 討論日期和時間數據類型,並說明如何有效地處理日期時間數據。
- TIMESTAMP - 介紹如何以小數秒精度存儲日期和時間。
- INTERVAL - 介紹區間數據類型,主要用來存儲時間段。
- TIMESTAMP WITH TIME ZONE - 了解如何使用時區數據存儲日期時間。
約束:
- 主鍵 - 解釋主鍵概念,並演示如何使用主鍵約束來管理表的主鍵。
- 外鍵 - 解釋介紹外鍵概念,並演示如何使用外鍵約束來強制表之間的關系。
- NOT NULL約束 - 演示如何確保列不接受NULL值。
- UNIQUE約束 - 討論如何確保存儲在一列或一組列中的數據在整個表內的行之間是唯一的。
- CHECK約束 - 在將數據存儲到表中之前添加用於檢查數據的邏輯的過程。
創建表空間
創建臨時表空間
CREATE TEMPORARY TABLESPACE ttf_temp TEMPFILE 'F:\oracledata\ttf_temp.dbf' SIZE 50m AUTOEXTEND on NEXT 50m MAXSIZE 40960m EXTENT MANAGEMENT LOCAL;
創建數據表空間
CREATE TEMPORARY TABLESPACE ttf_data LOGGING DATAFILE 'F:\oracledata\ttf_data.dbf' SIZE 50m AUTOEXTEND on NEXT 50m MAXSIZE 40960m EXTENT MANAGEMENT LOCAL;
創建用戶並指定表空間
CREATE USER USER1 IDENTIFIED BY 1234 DEFAULT TABLESPACE ttf_data TEMPORARY TABLESPACE ttf_temp; //給用戶授予權限 GRANT CONNECT,RESOURCE,DBA to user1
創建表
創建表的一般語法格式如下:
CREATE TABLE <table_name> ( <column_name_1> <data_type_1>, <column_name_2> <data_type_2>, <column_name_N> <data_type_N> ); ==================================== 示例如下: CREATE TABLE authors ( id number(38), name varchar2(100), birth_date date, gender varchar2(30) );
創建表並且指定主鍵等約束:
//創建一個學生表
CREATE TABLE STU( STUID NUMBER(10) PRIMARY KEY, //申明為主鍵 STUNAME VARCHAR2(20) NOT NULL , //不為null STUSEX VARCHAR2(2) DEFAULT '男' CHECK(STUSEX IN('男','女')) ); //創建一個課程表 CREATE TABLE COURSE( COURSEID NUMBER(10) PRIMARY KEY, COURSENAME VARCHAR2(20) NOT NULL, COURSETYPE VARCHAR2(4) ); //創建一個學生和課程的關聯表 CREATE TABLE STU_COURSE( ID NUMBER(10) PRIMARY KEY, STUID NUMBER(10) REFERENCES STU(STUID), //外鍵 COURSEID NUMBER(10), CONSTRAINT FF_COURSEid FOREIGN KEY(COURSEID) REFERENCES COURSE(COURSEID) ON DELETE CASCADE //級聯刪除 )
添加數據--Insert
//插入的格式一般為
INSERT INTO table [(column1,column2,...)] VALUE (value1,value2,...) INSERT INTO STU(id,name) VALUES(1,'張三'); //多表多行插入 INSERT [ALL] [condition_insert_clause] [insert_into_clause values_clause] (subquery) INSERT ALL INTO stu(sid,sname) VALUES(ssid,ssname) INTO tea(tid,tname) VALUES(ttid,ttname) SELECT ssid,ssname,ttid,ttname,state FROM stu_tea WHERE state != 0 //有條件的INSERT INSERT [ALL | FIRST] WHEN condition THEN insert_into_clause values_clause [WHEN condition THEN] [insert_into_clause values_clause] ...... [ELSE] [insert_into_clause values_clause] Subquery; INSERT ALL WHEN id > 5 THEN INTO stu(sid,sname) VALUES(ssid,ssname) WHEN id < 5 THEN INTO tea(tid,tname) VALUES(ttid,ttname) ELSE INTO tt(sid,tid) VALUES(ssid,ttid) SELECT ssid,ssname,ttid,ttname FROM stu_tea; //旋轉Insert(pivoting Insert) create table sales_source_data ( employee_id number(6), week_id number(2), sales_mon number(8,2), sales_tue number(8,2), sales_wed number(8,2), sales_thur number(8,2), sales_fri number(8,2) ); insert into sales_source_data values (176,6,2000,3000,4000,5000,6000); create table sales_info ( employee_id number(6), week number(2), sales number(8,2) ); 看上面的表結構,現在將要sales_source_data表中的數據轉換到sales_info表中,這種情況就需要使用旋轉Insert 示例如下: insert all into sales_info values(employee_id,week_id,sales_mon) into sales_info values(employee_id,week_id,sales_tue) into sales_info values(employee_id,week_id,sales_wed) into sales_info values(employee_id,week_id,sales_thur) into sales_info values(employee_id,week_id,sales_fri) select employee_id,week_id,sales_mon,sales_tue, sales_wed,sales_thur,sales_fri from sales_source_data; 從該例子可以看出,所謂旋轉Insert是無條件 insert all 的一種特殊應用,但這種應用被oracle官方,賦予了一個pivoting insert的名稱,即旋轉insert
更新數據 -- Update
UPDATE 表名稱 SET 列名稱 = 新值 <WHERE 條件> UPDATE stu SET sid = 1,sname = '張三' WHERE state = 0
刪除數據 -- Delete
//語法如下
DELETE FROM <table/view> [WHERE <condition>] //注意事項: //如果有外鍵關聯,則刪除數據之前,需先刪除外鍵關聯數據 DELETE FROM stu WHERE sid = 1; //DELETE 與 TRUNCATE 應用區別: 1、對於刪除整個表的所有數據時,delete並不會釋放表所占用的空間 2、如果用戶確定是 刪除 整表的所有數據,那么使用 truncate table 速度更快 //刪除所有學生信息,使用DELETE DELETE FROM stu //刪除所有部門信息使用 TRUNCATE TRUNCATE TABLE stu
查詢語句 -- Select
//語法如下
SELECT column_1,column_2 FROM table_name; //查詢單個列的數據 SELECT sid FROM stu //查詢多個列 SELECT sid,sname FROM stu //查詢所有列的數據 SELECT * FROM stu //分組查詢 SELECT id,name,age FROM stu GROUP BY age //排序查詢,按照id降序排序 SELECT id,name,age FROM stu ORDER BY id DESC //唯一查詢 語法格式如下 SELECT DISTINCT column_1,column_2 FROM table_name //多個條件查詢 AND SELECT id,name,age,state FROM stu WHERE age = 1 AND state = 0 //多個條件查詢 OR SELECT id,name,age,state FROM stu WHERE age = 1 OR age = 2
鏈接查詢
//內鏈接 inner join
SELECT * FROM stu INNER JOIN course ON cid = ccid ORDER BY ccid DESC //使用USING //1.查詢必須是等值連接。 //2.等值連接中的列必須具有相同的名稱和數據類型。 SELECT * FROM stu INNER JOIN course USING(cid) ORDER BY cid DESC ---------------------------------------------------------------------------- //左鏈接 SELECT * FROM stu LEFT JOIN course ON cid == ccid ORDER BY cid DESC //使用USING ,這里的c1和c2,在stu表和course表中都必須要相同類型的相同字段 SELECT * FROM stu LEFT JOIN course USING(c1,c2) ORDER BY cid ---------------------------------------------------------------------------- //右鏈接 SELECT * FROM stu RIGHT JOIN course ON cid = ccid ORDER BY cid DESC //使用USING SELECT * FROM stu RIGHT JOIN course USING(c1,c2) ORDER BY cid DESC ---------------------------------------------------------------------------- //笛卡爾積 CROSS JOIN SELECT * FROM stu CROSS JOIN course ---------------------------------------------------------------------------- //自身鏈接 SELECT m.id ,c.name FROM stu AS m,LEFT JOIN stu AS c ON c.cid = m.pid
Oracle 常用分頁
//1、通過MINUS分頁
SELECT * FROM STU WHERE ROWNUM < 3 MINUS SELECT * FROM STU WHERE ROWNUM < 2 //2、通過ROWNUM分頁 SELECT * FROM STU WHERE ROWNUM < 10 //查詢前10條 SELECT * FROM (SELECT * FROM STU) WHERE ROWNUM <= 10 //3、通過BETWEEN分頁 (查詢1到10) SELECT * FROM STU WHERE ROWNUM BETWEEN 1 AND 10 SELECT * FROM (SELECT a.*,ROWNUM RN FROM STU) WHERE RN <=10
Oracle 創建視圖
視圖的優點有如下:
- 對數據庫的訪問,因為視圖可以有選擇性的選取數據庫里的一部分。
- 用戶通過簡單的查詢可以從復雜查詢中得到結果。
- 維護數據的獨立性,試圖可從多個表檢索數據。
- 對於相同的數據可產生不同的視圖。
視圖分為簡單視圖和復雜視圖:
- 簡單視圖只從單表里獲取數據,復雜視圖從多表;
- 簡單視圖不包含函數和數據組,復雜視圖包含;
- 簡單視圖可以實現DML操作,復雜視圖不可以。
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY] //創建視圖 CREATE OR REPLACE VIEW SV AS SELECT sid,sname FROM STU WITH READ ONLY //查詢視圖 SELECT * FROM SV; //查詢視圖定義 SELECT SV,text FROM SV; 語法解析: OR REPLACE :若所創建的試圖已經存在,則替換舊視圖; FORCE:不管基表是否存在ORACLE都會自動創建該視圖(即使基表不存在,也可以創建該視圖,但是該視圖不能正常使用,當基表創建成功后,視圖才能正常使用); NOFORCE :如果基表不存在,無法創建視圖,該項是默認選項(只有基表都存在ORACLE才會創建該視圖)。 alias:為視圖產生的列定義的別名; subquery :一條完整的SELECT語句,可以在該語句中定義別名; WITH CHECK OPTION :插入或修改的數據行必須滿足視圖定義的約束; WITH READ ONLY :默認可以通過視圖對基表執行增刪改操作,但是有很多在基表上的限制(比如:基表中某列不能為空,但是該列沒有出現在視圖中,則不能通過視圖執行insert操作),WITH READ ONLY說明視圖是只讀視圖,不能通過該視圖進行增刪改操作。現實開發中,基本上不通過視圖對表中的數據進行增刪改操作。
刪除視圖
DROP VIEW 視圖名稱;
Oracle 中EXISTS 和 NOT EXISTS
- EXISTS (sql 返回結果集為真)
- NOT EXISTS (sql 不返回結果集為真)
//如果有值就返回 EXISTS
SELECT * FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID = B.ID) //如果有值就返回 NOT EXISTS SELECT * FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE A.ID = B.ID)
EXISTS 和 NOT EXISTS 用的也是比較多的,效率相對來收也比較優。
IN、NOT IN的用法
// IN的基本語法如下
SELECT columns FROM tables WHERE column1 in (value1, value2, .... value_n); SELECT * FROM STU WHERE ID IN / NOT IN (SELECT ID FROM B WHERE state = 0)
//舉個例子來說明 “exists” 和 “in” 的效率問題
SELECT * FROM B1 WHERE EXISTS(SELECT * FROM B2 WHERE B1.a = B2.a) //B1數據量小而B2數據量非常大時, B1 << B2 時,查詢效率高 SELECT * FROM B1 WHERE B1.a in (SELECT a FROM B2) //B1的數據量非常大而B2數據量小時, B1 >> B2 時 查詢效率高
自定義函數
//創建語法
create [or replace] function function_name [(parameter_list)] return datatype {is/as} [local_declarations] begin executable_statements; [exception exception_handlers;] end; 說明: function_name:函數名稱。 parameter_list:函數列表,可選。 return 自居:指定函數的返回類型,不能指定大小。 local_declarations:局部變量聲明,可選。 executable_statements:要執行的PL-SQL語句。 exception_handlers:異常處理,可選。 or repalce:是否覆蓋,可選。 參數的模式有3種:(如果沒有注明, 參數默認的類型為 in.) in: 為只讀模式, 在函數中, 參數的值只能被引用, 不能被改變; out: 為只寫模式, 只能被賦值, 不能被引用; in out: 可讀可寫. //注意 1.在Oracle自定義函數中, else if 的正確寫法是 elsif 而不是 else if 2.使用 if 需要加 then "if 條件 then 操作" ///////////////////////////////////////////////////////////// 例如,讀入兩個值,返回比較大的值 create or replace function get_max(para1 in number, para2 in number) return number as begin if para1 > para2 then return para1; else return para2; end if; end get_max; //使用 select get_max(666, 333) from dual; /////////////////////////////////////////////////////////////// CREATE or REPLACE FUNCTION useEasy(a1 in number,a2 in number) RETURN NUMBER IS fres NUMBER; BEGIN fres := a1 + a2; RETURN fres; END useEasy; //調用 select useEasy(1,30) from dual; /////////////////////////////////////////////////////////////// CREATE OR REPLACE FUNCTION get_emp_id(usernameq varchar2) RETURN NUMBER AS sid emp.id%TYPE; BEGIN SELECT id INTO sid FROM emp WHERE name = usernameq; RETURN sid; END get_emp_id; //調用 select get_emp_id('張三') from dual; //注意 在Oracle的存儲過程和函數中,其實IS和AS是同義詞,沒有什么區別。 還有在自定義類型(TPYE)和包(PACKAGE)時,使用IS和AS也並沒有什么區別。 但是在創建視圖(VIEW)時,只能使用AS而不能使用IS。 在聲明游標(CURSOR)時,只能使用IS而不能使用AS。