Oracle數據庫
標籤(空格分隔): 數據庫
參考書:《SQL入門經典–第五版》《Oracle 11g 權威指南》
作者:美國人 谷長勇
出版社: 人民郵電出版社 電子工業出版社 2008年左右出版
第一部分 Oracle數據庫11g基礎
第1章 數據庫基礎知識
1.1 什麼是SQL
- Structured Query Language:結構化查詢語言(SQL)
1.3數據庫的組成
- 一個數據庫由一組數據表組成
- 表的定義:
- 是一組彼此相關的記錄的組合。
- 由字段(每列)和記錄(表中每行的數據)
- 存在許多表衍生出來的對象,如視圖(view)、索引(index)等。
- 表的構成:
- 字段:字段是表裏的一列,用於保持每條記錄的特量信息。
- 記錄或一行數據:也被稱爲一行數據, 是表裏的各行。
- 列:列是表裏垂直的一項,包含表裏特定字段的全部信息。
- 主鍵:主要用於區分表裏每一條數據行。
- NULL值:沒有值,NULL並不等同於0或空格。
1.5關係數據庫 RMDBS
1.5.1定義:
- RDBMS即關係數據庫管理系統(Relational Database Management System)。
- 一些相關的表和其他數據看對象的集合。
1.5.2組成:
-
信息存放在二維表(table)中。一個關係數據庫包含多個數據表。每一個表包含行(記錄)和列(字段)。
-
表之間相互關聯。主鍵(PrimaryKey)和外鍵(ForeignKey)所體現的參照關係實現。
-
數據庫除了表,還包含:視圖、存儲過程、索引等。
-
相關概念:
-
關鍵字(Key),是關係模型中的邏輯結構,分爲主鍵外鍵。
- 主鍵(Primary Key),唯一非空,該列的唯一標識行。實施實體完整性。
- 外鍵(Foreign Key),表中含有與另外一個表的主關鍵字相對應的列祖,可以是一行或者多行。
- 外鍵優點:
- 提供了表之間的連接;
- 根據主關鍵字的列值來檢查、參照該主鍵字的列值以確定合法性。
- 保證列的每個值都是有效的,實施參照完整性。
1.5.3關係數據庫的特點:
- 數據完整性:所有的RDBMS都使用SQL或其變體控制包含在任意數據庫中的數據。需要保證多張表中的數據被更新,則所有的數據都將更新(事務一致性)。
- 數據存儲和數據安全:把實際數據和業務邏輯區分開,以確保數據庫中的數據可以保持持久狀態。壓縮算法將冗餘的數據刪除的方式存儲數據。
1.5.4關係數據庫的功能:
- SQL(Structured Query Language)是由國際標準化組織(ISO)公佈的,集數據定義(DDL)、數據操縱(DML)、數據定義(DDL)、數據控制(DCL)爲一體的標準數據庫語言。
第2章 數據庫的基本類型
2.1 基本的數據類型
- 基本的數據類型:
- 日期和時間類型
- 數字
- 字符串
- 隱式轉換
- 一些數據類型可以根據其格式自動轉化爲其他數據類型
- 比如:select cast(‘12/27/1994’,as,Datetime) as mydate
- 不同的數據庫有不同的數據類型,但是基本數據類型在不同的數據庫之間還是相同的。
2.2數據類型劃分
2.2.1字符串
2.2.2.1 定長字符串
- 定長字符串通常具有相同的長度,是使用定長數據類型保存的。
- SQL字符串的際準:CHARACTER(n)–n是數字,定義字段能保存的最長字符數。
- 有些SQL使用CHAR(n) 數據類型來保存定長數據。使用空格填充數量不足的字符。
- 注意:
- 不要使用定長數據類型來保存長度不定的數據,比如姓名。如果不恰當地使用定長數據類型,可能浪費空間,影響對不同的數據進行精確比較。
- 用變長的數據類型保存不定長的字符串。
2.2.2.2 變長字符串
- SQL字符串的際準:CHARACTER VARYING(n)–n是數字,定義字段能保存的最長字符數。
- 常見的變長數據類型有VARCHAR, VARINARY和VARCHAR2。
區分:VARCHAR(n)、VARCHAR2(n)和nvarchar(n)、VARYING(n)
-
VARCHAR(n)
- VARCHAR 是ANSIC標準, Microsoft SQL Server 和MySQL 也使用。
- 長度爲 n 個字節的可變長度且非 Unicode 的字符數據。n 必須是一個介於 1 和 8,000 之間的數值。存儲大小爲輸入數據的字節的實際長度,而不是 n 個字節。
-
VARCHAR2(n)
- 1.varchar2把所有字符都佔兩字節處理(一般情況下),varchar只對漢字和全角等字符佔兩字節,數字,英文字符等都是一個字節;
- 2.VARCHAR2把空串等同於null處理,而varchar仍按照空串處理;
- 3.VARCHAR2字符要用幾個字節存儲,要看數據庫使用的字符集;
- 大部分情況下建議使用varchar2類型,可以保證更好的兼容性。
-
NVARCHAR(n)
- 包含 n 個字符的可變長度 Unicode 字符數據。n 的值必須介於 1 與 4,000 之間。字節的存儲大小是所輸入字符個數的兩倍。
- 如字段值只是英文可選擇varchar,而字段值存在較多的雙字節(中文、韓文等)字符時用nvarchar。
- varchar(4) 可以輸入4個字母,也可以輸入兩個漢字。
- nvarchar(4) 可以輸四個漢字,也可以輸4個字母,但最多四個,佔八個字節。
-
VARBINARY
- 類似於VARCHAR和VARCHAR2.只是包含的是不定長的字節。這種數據據類型通常用來保存"數字式"數據,例如圖片文件。
注意:
- 定長字符串去做據類型用空格來填充字段裏的空白, 但變長字符串不這樣做。舉例說明,如果某個變長字段的長度定且爲10, 而輸入的字符長度爲5,那麼這個值的長度也就是5,並不使用空格來填充字段裏的空白。
2.2.2.3 直義字符串
- 直義字符串就是一系列字符,比如姓名或電話號碼,這是由用戶或程序明確指定的。並不需要把字段指定爲直義字符串數據類型,而是指定字符串。
2.2.2數字
-
2.2.2.1 大對象類型 BLOB TEXT
- BLOB:是二進制大對象,它的數據是很長的二進制字符串.數據庫裏存儲二進制媒體文件,比如圖片和MP3。
- TEXT 長字符串類型,可以被看做作一個大VARCHAR 字段,通常用於在
數據庫裏保存大字符集,比如博在站點的HTML輸入。
-
2.2.2.2 數值類型
-
分類:
-
下面是SQL數值的標準.
-
BIT(n)
-
BIT VARYING(n)
-
Decimal(p,s)
-
INTEGER
-
SmallInt
-
BigInt
-
Float(p,s)
-
Double PRECISION(p,s)
-
Real(s)
- p 表示字段的且大長度
- s 表示小數點後面的位數
-
-
2.2.2.2 小數類型
- 標準:DECIMAL(p,s),p 表示有效位數,s表示標度。
- 在數值定義DECIMAL(4,2)裏, 有效位數是4,也就是說數值總位數是4,標度是小數點後面的位數,在前例中是2。
- 如果實際數值的小數位數超出了定義的位數,數值就會被四捨五入。 比如34.33 寫入到定義爲DEClMAL(3,1)的字段時,會被四捨五入爲34.3。
-
2.2.2.3 整數類型
- 不包含小數點的數值〈包括正數和負數)。
-
2.2.2.4 浮點數
- 浮點數是有效位數和標度都可變井且沒有限制的小數數值,任有效位數和標度都是可以的。數據類型REAL代表單精度浮點數值,而DOUBLEPRECISION表示雙精度浮點數值.單精度浮點數值的有效位數爲1~21(包含).雙精度浮點數值的有效位數爲22-53(包含)
######2.2.3日期和時間類型
- 日期和時間類型顯然是用於保存日期和時間信息的. 標準SQL的類型:
- DATE
- TIME
- DATETIME
- TIMESTAMP
- DATETlME 數據類型的元素包括
- YEAR
- MONTH
- DAY
- HOUR
- MINUTE
- Second
######2.2.4NULL數據類型
- NULL:表示沒有值,表示相應的字段不是必須要輸入數據的。NOT NULL代表必須要輸入值。
- 區分:
- NULL:NULL關鍵字,空值本身。
- ‘NULL’:包含NULL的直義字符串
######2.2.5布爾值
- 布爾值取值範圍:TRUE FALSE NULL
#####2.2.6自定義數據類型
- 是由用戶定義的類型,它允許用戶根據已有的數據類型來定製自己的數據類型,從而滿足數據存儲的需要。
- 在MySQL 和Oracle中,可以創建一個下面的類型
CREATE TYPE PERSON AS OBJECT
(NAME VARCHAR(30),
SSN VARCHAR(9));
然後可以像下面這樣引用自定義類型
CREATE TABLE EMP_PAY
(EMPLOYEE PERSON ,
SALARY DECIMAL(10,2) ,
HIRE_OATE DATE);
表EMP_PAY 第一列EMPLOYEE的類型是PERSON,這正是在前面創建的自定義類型。
#####2.2.7域
- 域是能夠被使用的有效數據類型的集合。域與數據相關聯,從而只接受特定的數據,在域創建之後,我們可以向域添加約束。約束與數據類型共同發揮作用,從而進一步限制字段能夠接受的數據。域的使用類似於自定且類型。
像下面這樣就可以創建域
CREATE DOMAIN MONEY_D AS NUMBER(8 ,2);
像下面這樣爲域添加約束
ALTER DOMAIN MONEY_D AS NUMBER(8,2)
ADD CONSTRAINT MONEY_CON1
CHECK (VAlUE>5);
然後像下面這樣引用域
CREATE TABlE EMP_PAY
(EMP_ID NUMBER(9),
EMP_NAME VACHAR2(30),
PAY_RATE MONEY_D):
第3章 管理數據庫對象
3.1 數據庫對象和規劃
- 數據庫對象:是數據庫裏定義的的、用於存儲或引用數據的對象,比如表、視圖、簇、序列、索引和異名。
- 規劃:與數據庫某個用戶名相關聯的數據庫對象集合。相應的用戶名被稱爲規劃所有人,或者是關聯對象組的所有人。數據庫裏可以有一個或多個規劃。
- 用戶默認訪問自己規劃的表,如果要訪問其他規劃的表需要加上規劃名。
user1 訪問 user2.table
3.2表:數據的主要存儲方式
3.2.1 列和行
- 列:字段
- 行:內容(數據庫裏的一條記錄)
3.2.2 建表語句
create table tabelname(
columnName dataType[length] [Not NULL],
columnName dataType [Not NULL],
columnName dataType [Not NULL]
);
3.2.3 ALTER TABLE
- 標準命令
alter table table_name [modify] [column column_name] [datatype | null
not null] [restrict|cascade]
[drop] [constraint_constraint_name]
[add] [column] column definition
- 1、修改表的屬性
屬性:
列的數據類型
列的長度、有效位數或者標度
列是否爲空
ALTER TABLE EMPLOYEE_TBL MODIFY EMP_ID VARCHAR2(10 BYTE);
- 2、添加列
- 如果表已經有數據,新添加的列不能爲NOT NULL;
- 強行添加一列的方法,如下:
- 添加一列,把他定義爲NULL(這一行不一定要包含數據)
- 給新列每條記錄都插入數據
- 把列修改爲NOT NULL
- 刪除表中的字段
格式: alter table 表名 drop column 字段名稱;
需求: 刪除person表格中的name字段
alter table person drop column name;
- 添加表中的字段
格式: alter table 表名 add 字段名 字段類型(長度);
需求: 向person表中 添加一個name字段 ,類型爲varchar2長度爲10
alter table person add name varchar2(10);
- 3、添加自動增長列
- MySQL:提供serial方法生成。
CREATE TABLE TEST_ INC FlEMENT(
ID SERIAL,
TEST_NAME VAACHAR(20));
- 4、增加註釋
comment on column 表名.字段名 is 'XX';
-
Oracle:使用Sequence對象和觸發器來實現類似的效果。22章會講。可以直接插入內容,不爲自動增加的列制定值。
-
4、修改表
比較複雜的情況,可以刪除表重新建。
3.2.4 從一個表新建另一個表
- 注: 默認使用相同的 STORAGE 屬性。新表和原表具有相同的屬性。但是索引可能有不同。
語法:
create table new table name as
select [ *|column1, column2 ]
from table_name
[ where ]
實例:
--原先的表--
SELECT * FROM PRODUCTS_TBL ;
--新生成的表--
CREATE TABLE products_tbl_test AS SELECT * FROM products_tbl ;
-- 新生成的表跟原表一樣的屬性 但是索引可能有不同--
SELECT * FROM products_tbl_test;
3.2.5 刪除表
- 如果有約束限制,直接刪除會報錯,需要加cascade選項。
- 語法
drop table table_name [restrict|cascade]
3.3 完整性約束
- 完整性約束用於確定關係型數據庫裏數據的準確性和一致性。在關係型數據庫裏,數據完整性是通過引用完整性的概念實現的,而在引用完整性裏包含了很多類型。
3.3.1 主鍵約束
- 表裏一個或多個用於實現記錄唯一性的字段。
- 唯一非空。
- 可以是一個字段,也可以是多個字段(聯合主鍵)。
1、隱含約束:建表過程中指定的
create table table_name(
column_name datatype(length) not null primary key,
XXX
);
2、建表語句字段後創建
create table table_name(
column_name datatype(length) not null,
XXX,
primary key(column_name1 [,column_name2])
);
3、修改表結構
ALTER TABLE PRODUCT_TST
ADD CONSTRAINT PRODUCTS_PK PRIMARY KEY (PROD_ID , VEND_ID);
3.3.2 唯一約束 UNION
- 要求表裏某個字段的值在每條記最裏都是唯一的
--唯一約束 UNIQUE--
CREATE TABLE EMPLOYEE_TBL_UNIQUE
(
EMP_ID VARCHAR(9) NOT NULL,
LAST_NAME VARCHAR(15) NOT NULL,
FIRST_NAME VARCHAR(15) NOT NULL,
MIDDLE_NAME VARCHAR(15),
ADDRESS VARCHAR(30) NOT NULL,
CITY VARCHAR(15) NOT NULL,
STATE CHAR(2) NOT NULL,
ZIP INTEGER NOT NULL,
PHONE CHAR(10) UNIQUE, --唯一約束--
PAGER CHAR(10),
CONSTRAINT EMP_PK_UNIQUE PRIMARY KEY (EMP_ID)
);
3.3.3 外鍵約束 FOREIGN KEY
- 定義: 外鍵是子表裏的一個字段,引用父表裏的主鍵。
- 注意:主表和子表的字段的列類型(包括長度)要一致。
- 意義:EMP_ID字段爲EMPLOYEE_PAY_TBL的外鍵,它引用了EMPLOYEE_TBL裏的EMP_ID字段。這個外鍵確保了EMPLOYEE_PAY_TBL裏的每個EMP_ID都在表EMPLOYEE_TBL裏有對應的 EMP_ID。這被稱爲父子關係,其中父表是EMPLOYEE_TBL,子表是EMPLOYEE_PAY_TBL。
-- 外鍵約束--
CREATE TABLE EMPLOYEE_PAY_TST(
EMP_ID VARCHAR(9) NOT NULL,
POSITION VARCHAR2(15) NOT NULL,
DATA_HIRE DATE NULL,
PAY_RATE NUMBER(4,2) NOT NULL,
DATE_LAST_RAISE DATE NULL,
--子表EMPLOYEE_PAY_TST
CONSTRAINT EMP_ID_PK FOREIGN KEY (EMP_ID) REFERENCES EMPLOYEE_TBL (EMP_ID)
);
或者ALTER向表裏添加外鍵
alter table employee_pay_tbl add constraint id_fk foreign key(emp_id) references EMPLOYEE_TBL (EMP_ID);
3.3.4 NOT NULL約束
- 不允許空值
3.3.5 檢查約束
- 檢查(CHK)約束用於檢查輸入到特定字段的數據的有效性,可以提供後端的數據庫編輯。
CREATE TABLE employee_check_tst
(EMP_ID CHAR(9) NOT NULL,
EMP_NAME VARCHAR2(40) NOT NULL,
EMP_ST_ADDR VARCHAR2(20) NOT NULL,
EMP_CITY VARCHAR2(15) NOT NULL,
EMP_ST CHAR(2) NOT NULL,
EMP_ZIP NUMBER(5) NOT NULL,
EMP_PHONE NUMBER(10) NULL,
EMP_PAGER NUMBER(10) NULL,
PRIMARY KEY(EMP_ID),
CONSTRAINT CHE_EMP_ZIP CHECK( (EMP_ZIP = '46234') )
);
--確保了輸入到這個表裏的全部僱員的 EMP_ZIP代碼都是 "46234"
3.3.6 刪除約束
-- 刪除約束
ALTER TABLE TABLE_NAME DROP CONSTRAINT CONSTRAINT_NAME;
第4章 規格化過程(範式)
4.1規格化數據庫
- 規格化/範式:把原始數據庫按照一定的規則拆封成表的過程。
- 開發人員利用規格化過程來設計數據庫,使其便於組織和管理、減少數據冗餘,同時確保數據在整個數據庫裏的正確性。
4.1.1範式形式
參考鏈接: https://www.cnblogs.com/1906859953Lucas/p/8299959.html
- 最常見的三種範式
- 第一範式:確保每列的原子性(不可再分)。
- 如果數據庫表中的所有字段值都是不可分解的原子值,就說明該數據庫滿足第一範式。
- 第二範式:確保表中的每列都和主鍵相關。
- 第二範式在第一範式的基礎上更進一層,第二範式需要確保數據庫表中每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。
- 第三範式:確保每列都和主鍵列直接相關,而不是間接相關。
- 第一範式:確保每列的原子性(不可再分)。
4.1.2範式優點
- 直好的數據庫整體組織性。
- 減少冗餘數據。
- 數據庫內部的數據一致性。
- 更靈活的數據庫設計。
- 更好地處理數據庫安全。
- 加強引用整體性的概念。
4.1.3範式缺點
- 降低了數據庫的性能。
- 性能降低的程度取決於查詢事務或事物被提交給數據庫的時機,其中涉及多個因素,比如CPU使用率、內存使用率和輸入輸出(I/O)。簡單來說,規格化的數據庫比非規格化的數據庫需要更多的CPU、內存和I/O來處理事務和查詢。規格化的數據庫必須找到所需的表,然後把這些表的數據結合合起來,從而得到需要的信息或處理相應的數據。
4.2 去規格化數據庫
- 定義:修改規格化數據庫的表的構成。
- 唯一原因:在可控制的冗餘範圍內提高數據庫性能。
- 去規格化也是有代價的.它增加了數據冗餘,雖然提高了性能,但需要付出更多的精力來處理相關的數據。程序代碼會更加複雜,因爲數據被分散到多個表,而且可能更難於定位。另外,引用完整性更加瑣碎,因爲相關數據存在於多個表裏。規格化與去規格化都有好處,但都需要我們時實際的數據和公司的詳細業務需求布全面的瞭解。
第4章 SQL語句基礎
4.1 SQL語言概述
4.1.2 SQL語言分類
- 主要分類
- DQL(Data Query Language):SELECT語句(數據查詢語言):檢索數據庫數據。
- DML(Data Manipulation Language,數據操縱語言):用於改變數據庫數據。INSERT UPDATE DELETE。需要提交。
- DDL(Date Definition Language數據定義語言):用於建立、修改和刪除數據庫對象。
- Create table用於創建表,
- Alter table語句對錶結構進行修改,
- Drop table刪除表結構。
- DDL表會自動提交事務。
- DCL(Data Control Language 數據控制語言):用於執行權限授予和權限收回操作。
- Grant命令用於給用戶或者角色授予權限。
- Revoke命令用於收回用戶角色或用戶權限。
- 自動提交事務。
- DAC (Data Administration Commands)資數據管理命令
- 允許使用者對使用中的資料庫產生稽覈與分析,共有兩種主要指令:START AUDIT、STOP AUDIT。
- TCL(Transactional Control Language 事務控制語言)。
- commit:提交,確認已經進行的數據庫變更。
- rollback:回滾,取消已經進行的數據庫變更。
- savepoint:用於設置保存點,以取消部分數據庫改變。
- set transaction: 設置事務的名稱.
4.1.3 SQL語言規則
- 不區分大小寫: 關鍵字、對象和列名。
- 區分大小寫: 字符值、日期。
- SQL*Plus中,SQL以分號結束。(命令行模式交互的客戶端工具)
第5章 操作數據
5.1 概述
- DML語句(Data Manipulation Language),數據庫操作語言,對關係型數據庫裏的數據進行修改。
- DML可以和SELECT語句組合使用
- INSERT
- UPDATE
- DELETE
5.2 插入INSERT
5.2.1 簡單插入
1. 全字段添加
INSERT INTO TABLE_NAME VALUES('value1','value2',[NULL]);
格式: insert into 表名 values(數據列表);
數據列表 : 表示的是一個數據組,數據的順序按照創建表格時的字段順序傳入,不同字段的值使用英文逗號隔開,字符串用單引號
2. 選擇字段添加
INSERT INTO TABLE_NAME('COLUMN1','COLUMN2',...) VALUES('value1','value2',...);
格式: insert into 表名(字段列表) values(數據列表);
字段列表可以任意排列 , 多個字段名之間使用英文逗號隔開,數據列表的順序, 參照字段列表
5.2.2 從另一張表插入
- 語法
insert into table_name [('column1','column2')]
select [ *|('column1','column2') ] from table_name
[ where condition[s] ];
insert into table_A select * from table_b; --必須保證A和B表結構一致
- 要滿足條件:
- 1、指定的字段列表具有相同的次序
- 2、要確定SELECT語句返回的數據與要插入數據的表的字段具有兼容的數據類型。
5.2.3 插入NULL
這兩條語句是一樣的
--語句A
INSERT INTO ORDERS_TBL (ORD_NUM, CUST_ID, PROD_ID, QTY, ORD_DATE) VALUES ('23A16','109', '7725',2, NULL);
--語句B
INSERT INTO ORDERS_TBL (ORD_NUM, CUST_ID, PROD_ID, QTY) VALUES ('23A16','109', '7725',2);
5.3 更新UPDATE
5.3.1 更新一列的數據
- 語法
update table_name set colunm_name = 'value' [where conditions];
不加where條件會更新所有的數據。
5.3.2 更新一條或者多記錄裏的多個字段
- 語法
update table_name set colunm_name1 = 'value',
[colunm_name2 = 'value', colunm_name3 = 'value']
[where conditions];
不加where條件會更新所有的數據。
5.4 刪除DELETE
- DELETE 命令用於從表裏刪除整行數據. 它不能刪除某一列的數據, 而是刪除行裏全部字段的數據。
- DELETE要搭配WHERE語句 否則會刪除所有的數據。
- 語法
delete from table_name [where conditions]
第6章 管理數據庫事務
6.1 事務定義:
- 事務:是數據庫管理系統執行過程中的一個邏輯單位,由一個有限的數據庫操作序列構成。
- 意義:
- 一個數據庫事務通常包含了一個序列的對數據庫的讀/寫操作。它的存在包含有以下兩個目的:
- 爲數據庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即使在異常狀態下仍能保持一致性的方法。
- 當多個應用程序在併發訪問數據庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。
6.2 事務控制
- 對關係型數據庫庫管理系統(RDBMS)裏可能發生的各種事務的管理能力。
- 事務控制搭配INSERT、UPDATE、DELETE語句。建表和刪除表默認提交,不能用事務控制。
- 控制事務命令:
- commit
- rollback
- savepoint
6.2.1 commit
- 事務所做的更改保存到數據庫。
- 不同的數據庫對commit的命令的提交有不同。有些數據庫自動提交,不需要commit。
- 語法
commit [work];
6.2.2 rollback
- ROLLBACK 命令用於撤銷還投有被保存到數據庫的命令,它只能用於撤銷上一個
COMMIT或ROLLBACK命令之後的事務。 - ROLLBACK 命令清楚回退區域裏的全部修改。
- 語法
rollback [work];
6.2.3 savePoint
- 保存點是事務過程中的一個邏輯點,我們可以把事務回退到這個點,而不必回退整個事務。
- 保存點的名稱必須唯一,但是可以跟表名相同。
- 語法
savepoint savepoint_name ;
6.2.4 rollback to SavePoint
- 語法
rollback to savepoint_name ;
- 例子
savepoint sp1;
savepoint create;
SQL_X1;
savepoint sp2;
savepoint create;
SQL_X2;
rollback to sp1;
6.2.5 release savePoint
- 刪除保存點
- 語法
release savePoint savepoint_name ;
6.2.6 set transaction
- 這個命令用於初始化數據庫事務, 可以指定事務的特性
- 語法
SET TRANSACTION READ WRITE;--查詢和操作,對數據庫對象加鎖,保證數據完整性。
SET TRANSACTION READ ONLY; --只讀 適合生成報告,速度快。
6.3 事務控制與數據庫性能
- 當出現COMMIT命令時,回退事務信息被寫入到目標表裏,臨時存儲區域裏的回退信息被清除。當出現ROLLBACK命令時,修改不會作用於數據庫,而臨時存儲區域裏的回退信息被清除。如果一直沒有出現COMMIT或ROLLBACK命令,臨時存儲區域裏的回退信息就會不斷增長,直到沒有剩餘空間,導致數據庫停止全部進程。直到空間被釋放。雖然存儲空間的使用實際上是由數據庫管理員(DBA)控制的,但缺少事務控制控制還是會導致數據庫處理停止,有時迫使 DBA 採取行動中止正在運行的用戶進程。
第三部分 從查詢中獲得有效的結果
第7章 數據庫查詢
7.1 什麼是查詢
- 從數據庫獲取數據。
7.2 SELECT語句
- SELECT語句代表了SQL裏的數據查詢語言(DQL),是構成數據庫查詢的基本語句。
- 關鍵字
- select 必要
- from 必要
- where
- order by
7.2.1 SELECT語句
- select和from子句結合,以可讀的有序方式從數據庫讀取數據。
- 語法 常用符號‘ , ’做分割參數
SELECT [ *|ALL|DISTINCT COLUMN1, COLUMN2,]
FROM TABLE1 [, TABLE2 1];
7.2.2 FROM語句
- from語句必須搭配select語句,查詢必要元素。至少指定一張表可以指定多張表。
- 語法
from 表1[,表2]
7.2.3 where語句
- where子句裏面指定了要返回滿足什麼標準的信息。條件值TRUE或者false。
- 語法
SELECT [ *|ALL|DISTINCT COLUMN1, COLUMN2,]
FROM TABLE1 [, TABLE2 1]
[ WHERE CONDITION1|EXPRESSION1 [ AND|OR CONDITION2|EXPRESSION2] ];
7.2.4 ORDER BY語句
- 排序。默認升序ASC。
- SQL排序基於字符的ASCII值。數字0-9按照值排序,在字母A-Z之前。
- 有一些SQL實現,由於數字位在排序時是被當作字符處理的,所以下面這些數字的排序是這樣的1、12、2、255、3。
- 但是我自己用Oracle。 order by number類型可以正常排序。
- 如果出現數字隱氏轉換,可以用TO_CHAR函數轉換補位,將數字轉換成統一格式的字符串比較排序。
SELECT ROWID, TO_CHAR(COST,'999990.000') ,SUBSTR( TO_CHAR(COST,'999990.000'),-4,2) FROM PRODUCTS_TBL ORDER BY SUBSTR( TO_CHAR(COST,'999990.000'),-2,2);
- 語法
SELECT [ *|ALL|DISTINCT COLUMN1, COLUMN2,]
FROM TABLE1 [, TABLE2 1]
[ WHERE CONDITION1|EXPRESSION1 [ AND|OR CONDITION2|EXPRESSION2]
ORDER BY COULMN1|INTEGER [ASC\DESC] ];
- 字段縮寫成整數
--1代表第一個字段 按照prod_desc排序
select prod_desc, prod_id,cost from products_tbl where cost < 200 order by 1;
- 字段順序,先按照A排序,再按照B排序。
ORDER BY A,B
7.2.5 大小寫敏感
- 一般SQL實現,命令和關鍵字不區分大小寫。
- Oracle默認區分大小寫。要注意。
7.3 查詢範例
7.3.1 統計表數量
- 語法
select count(*) from 表名 表裏全部數據行數
select count(非空字段)from 表名 =表全部記錄
select count(可以爲空字段) from 表名 不含有全部表記錄
select count(DISTINCT 字段) from 表名 去重
7.3.1 從另一個表選擇數據
SELECT 字段名 FROM 規劃名|用戶名.表名
7.3.1 別名
- 有時候 ,我們在對錶格進行查詢時, 因爲字段進行了運算, 它的表頭出現了改變, 我們需要指定一個別名, 來更方便的使用它
語法格式:
select 查詢的列或者表達式1 別名,查詢的列或者表達式2 別名 from 表名;
單個列只允許存在一個別名!
需求: 查詢年薪, 並且給年薪字段添加別名:
-- 別名
--select last_name,salary*13 yearly salary from s_emp;--報錯 ORA-00933: ORA-00923: 未找到要求的 FROM 關鍵字 yearly salary改成yearly_salary
--select last_name,salary*13 as '年薪' from s_emp;--不可以 ORA-00923: 未找到要求的 FROM 關鍵字
select last_name,salary*13 yearlySalary from s_emp;--可以
select last_name,salary*13 as yearlySalary from s_emp;--可以
select last_name,salary*13 as 年薪 from s_emp;--可以
- 3.別名中存在空格等特殊字符時 使用雙引號引住, 可以把空格之類的特殊字符 看作一個整體,並且會原樣顯示(大小寫區分顯示)
--查詢員工的id , 並加10000顯示, 給id添加別名 id heheda
select id+10000 "id heheda" from s_emp;
--查詢員工的id , 並加10000顯示, 給id添加別名 as不省略 id heheda
select id+10000 as "id heheda" from s_emp;
第八章 使用操作符進行分類
8.1 定義和分類
- 操作符是個保留字或字符,主要用於SQL語句的WHERE子句來執行操作。
- 比較操作符
- 邏輯操作符
- 求反操作符
- 算術操作符
8.2 比較操作符
- 分爲:
- 等於 = 返回TRUE 或者FALSE
- 不等於 != 或<>
- 小於 < 小於等於<=
- 大於 > 小於等於>=
8.3 邏輯操作符和模糊查詢
- IS NULL:判斷是否爲空, 'null’代表空字符串,不爲空。
- BETWEEN AND: 判斷值是否在一個區間[MIN,MAX]之間。可以是數字,文本或日期。閉區間包含邊界值。
- BETWEEN A AND B:[A-B]包含A和B的值。
- 如果是DATE日期類型:between ‘2010-04-21’ and ‘2010-04-23’ ,這樣’2010-04-23 16:42:39’這條記錄查不到。因爲日期數據類型是左閉右開的區間,它的邊界值是’2010-04-23 00:00:00’。
- IN:把一個值與一個指定列表(點的集合)進行比較,當被比較的值至少與列中的一個值相匹配時,它會返回TRUE。
- EXISTS:搜索指定表裏是否存在滿足特定條件的記錄。
- ALL:ALL用於把個值與另一個集合裏的全部值進行比較。
- SOME、ANY:用於把一個值與另一個列表裏任意值進行比較。
8.3.1模糊查詢
- Like:用於模糊查詢。
- 百分號:%零個、一個或多個字符。
- 下劃線_:一個數字或字符。
第二個字符是大寫S的記錄。
name like '_S%'
8.4 連接操作符
- AND:讓我們可以在一條SQL語句的WHERE子句裏使用多個條件。所有由AND連接的條件都必須爲TRUE。SQL語句纔會實際執行。
- OR:可以在SQL 語句的WHERE 於句裏連接多個條件,這時無論SQL 語句是事
務憚作還是查詢,只要OR 連接的條件裏有至少一個是TRUE. SQL 語句就會執行。 - 多個條件時要善用()
8.5 求反操作符
- NOT
- 不等於<> !=
- NOT BETWEEN 不包含邊界。 BETWEEN包含邊界
- NOT IN
- NOT LIKE
- IS NOT NULL
- NOT EXISTS
- NOT UNIQUE
8.6 算術操作符
- (+) 加 (-)減 (*)乘 (/)除法
- 注意使用括號,否則運算符有優先級的順序。
第10章 數據排序與分組
10.1 group by子句
SELECT COLUMN1,COLUMN2
FROM TABLE1, TABLE2
WHERE CONDITIONS
GROUP BY COLUMN1,COLUMN2
ORDER BY COLUMN1,COLUMN2
默認升序:具體數值在排序時位於NULL 值之前。
10.2 GROUP BY與ORDER BY
- GROUP BY:分組
- ORDER BY:排序
- 所有被選中的、非彙總函數(SUM AVG等)的字段必須列在GROUP BY子句裏
- 除非需要使用匯單函數,否則使用GROUPBY 子句進行排序通常是麼有必要的。
select 字段1,字段2 from 表 group by 字段一;--錯誤 group by 要跟所有的非彙總函數字段
select 字段1,字段2 from 表 group by 字段一,字段2;
10.3 CUBE與ROLLUP語句
參考鏈接: https://blog.csdn.net/liuxiao723846/article/details/49020575
- ROLLUP
GROUP BY ROLLUP(ordered column list 0f grouping set)
- ROLLUP語句可以用來進行小計,即在全部分組數據的基礎上,對其中的一部分進行彙總。
- ROLLUP語句的工作方式是這樣的,在完成了基本的分組數據匯且以後,按照從右向左的順序,每次去掉字段列表中的最後一個字段,再對剩餘的字段進行分組統計,並將獲得的小計結果插入返回表中,被去掉的字段位置使用NULL 填充。最後,再對全表進行一次統計,所有字段位置均使用NULL填充。
1)對比沒有帶rollup的goup by :
Group by A,B產生的分組種數:1種;
group by A,B
返回結果集:也就是這一種分組的結果集。
2)帶rollup但group by與rollup之間沒有任何內容 :
A、Group by rollup(A ,B) 產生的分組種數:3種;
第一種:group by A,B
第二種:group by A
第三種:group by NULL
返回結果集:爲以上三種分組統計結果集的並集且未去掉重複數據。
3)帶rollup但groupby與rollup之間還包含有列信息
A、Group by A , rollup(A ,B) 產生的分組種數:3種;
第一種:group by A,A,B 等價於group by A,B
第二種:group by A,A 等價於group by A
第三種:group by A,NULL 等價於group by A
返回結果集:爲以上三種分組統計結果集的並集且未去掉重複數據。
- CUBE
CUBE語句的工作萬式與此不同。它對分組列表中的所有字段進行排列組合,井根據每一種組合結果,分別進行統計彙總。最後,CUBE語句也會對全表進行統計。 CUBE語句的語法結構如下:
GROUP BY CUBE(column list of grouping sets)
- 3、cube和rollup區別:
帶cube子句的groupby會產生更多的分組統計數據。cube後的列有多少種組合(注意組合是與順序無關的)就會有多少種分組。
1)假設有n個維度,rollup會有n個聚合:
rollup(a,b) 統計列包含:(a,b)、(a)、()
rollup(a,b,c)統計列包含:(a,b,c)、(a,b)、(a)、()
……以此類推ing……
2)假設有n個緯度,cube會有2的n次方個聚合:
cube(a,b) 統計列包含:(a,b)、(a)、(b)、()
cube(a,b,c) 統計列包含:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()
10.4 having
- having子句和group by一起使用,緊跟在group by的後邊,having子句可以使用結果集中的列,也可以使用聚合函數(max、min、count、sum、svg)。having的作用是對分組後的結果進行過濾。這裏在提一下where,where是對每一行進行過濾的,查詢出符合where條件的每一行。having是對查詢出結果集分組後的結果進行過濾。
SELECT COLUMN1,COLUMN2
FROM TABLE1, TABLE2
WHERE CONDITIONS
GROUP BY COLUMN1,COLUMN2
HAVING CONDITIONS
ORDER BY COLUMN1,COLUMN2
第11章 調整數據外觀
11.1 ANSI字符函數
- 在SQL裏以不同於存儲方式的格式來表示字符串。
11.2 常用字符函數
11.2.1 串接函數
MySQL
select concat('A','B')
CONCAT(COLUMN_NAME ,[' ',] COLUMN_NAME [COLUMN_NAME])
Oracle
COLUMN_NAME || [''||] COLUMN_NAME [COLUMN_NAME]
11.2.2 TRANSLATE函數
- 搜索字符串裏的字符並查找特定的字符,標記找到的位置,然後用替代字符串裏對應的字符替換它。
TRANSLATE( CHARACTER SET , VALUE1 , VALUE2)
--所有的I都被替換爲A 、N替換爲B 、D 替換爲C
SELECT TRANSLATE(CITY,'IND','ABC') FROM EMPLOYEE_TBL;
11.2.3 REPLACE函數
- 用於把某個字符或字符串替換爲指定的個字符〈或多個字符)。其使用
類似於TRANSLATE函數,只是它是把一個字符或字符串替換到另一個字符串裏面。
第四部分 建立複雜的數據庫查詢
第13章 在查詢裏結合表
13.1 從多個表查詢數據
- 能夠從多個在選擇數據是SQL最強大的特性之一。如果沒有這種能力,關係型數據庫的
整個概念就無法實現了。有時單表查詢就可以得到有用的信息,但在現實世界裏,最實用用的查詢是要從數據庫裏的多個表獲取數據。
13.2 綜合的類型
- 概念:結合就是把兩個或事個表組合在一起來在取數據。
- 分類:
- 等值結合、內部結合、等值連接,內連接。
- 非等值結合(範圍連接)
- 外部結合(外連接又分成左連接、右連接)
- 自連接(自結合)
13.2.2 內連接(等值結合)
- 最常用也是最重要的結合就是等值結合,也被稱爲內部結合/內連接。內連接通常利用通用字段結合兩個表,而這個字段通常是每個表裏的主鍵。
- 語法:
SELECT TABLE1.COLUMN1 , TABLE2.COLUMN2 ...
FROM TABLE1, TABLE2 [, TABLE3]
WHERE TABLE1.COLUMN_NAME = TABLE2.COLUMN_NAME
[AND TABLE1.COLUMN_NAME = TABLE3.COLUMN_NAME ]
- 具體範例如下:
SELECT EMPLOYEE_TBL.EMP_ID,
EMPLOYEE_PAY_TBL.DATE_HIRE
FROM EMPLOYEE_TBL,
EMPLOYEE_PAY_TBL
WHERE EMPLOYEE_TBL.EMP_ID=EMPLOYEE_PAY_TBL.EMP_ID;
13.2.3 使用表別名
- 使用表的別名在SQL 語句顯對錶進行重命名,這是種臨時性的改變。表在數據
庫裏的實際名樣不會受到影響。 - 起別名是完成自結合的必要條件。
- 選擇字段必須用表別名修飾。
- 減少代碼量,易讀性,不易犯錯。
SELECT E.EMP_ID, EP.SALARY, EP. DATE_HIRE, E.LAST_NAME
FROM EMPLOYEE_TBL E,
EMPLOYEE_PAY_TBL EP,
WHERE E.EMP_ID=EP.EMP_ID
AND EP.SALARY>20000;
13.2.4 不等值連接(結合)
- 不使用等號進行連接多表查詢的條件, 就是非等值連接。
- 不等值連接可能會產生冗餘數據注意刪除。
- 語法:
SELECT TABLE1.COLUMN1 , TABLE2.COLUMN2 ...
FROM TABLE1, TABLE2 [, TABLE3]
WHERE TABLE1.COLUMN_NAME != TABLE2.COLUMN_NAME
[AND TABLE1.COLUMN_NAME!= TABLE3.COLUMN_NAME ]
具體範例如下:
SELECT EMPLOYEE_TBL.EMP_ID,
EMPLOYEE_PAY_TBL.DATE_HIRE
FROM EMPLOYEE_TBL,
EMPLOYEE_PAY_TBL
WHERE EMPLOYEE_TBL.EMP_ID != EMPLOYEE_PAY_TBL.EMP_ID;
salgrade : 工資級別表格
- grade工資級別 1-5
- losal這個級別最低工資
- hisal這個級別最高工資
- 查詢每個員工的salary和對應的工資級別
1. between
select salary,last_name,grade from s_emp,salgrade where salary between losal and hisal;
2. and
select salary,last_name,grade from s_emp,salgrade where salary>=losal and salary<=hisal;
13.2.5外連接(+) 外部結合
-
定義
- 外連接的結果集, 等於內連接的結果集,加上匹配不上的記錄!
- 通過在字段後面添加(+), 來完成外連接操作。(+)在誰後面就用NULL補充誰的數據。
- 外連接會返回一個表裏的全部記錄,即使對應的記錄在第二個表裏不存在。加號(+)用於在查詢裏表示外部結合,放在WHERE子句裏表名的後面,具有加號的表是沒有匹配記錄的表。
-
分類:外連接被劃分爲左外連接、右外連接和全外連接。
-
語法:
外部結合的-般語法如下所示
FROM TABLEl
{RIGHT | LEFT | FULL} [OUTER] JOIN
ON TABLE2
Oracle 的語法是
FromSELECT A.COLUMN_NAME, B.COLUMN_NAME [, C.COLUMN_NAME]...
FAOM TABLE1 A, TABLE2 B [,TABLE3 C]
WHERE TABLE1A.COLUMN_NAME[(+)] = TABLE2 = B.COLUMN_NAME[(+)]
[ AND TABLE1A.COLUMN_NAME[(+)] = TABLE3.COLUMN_NAME[(+)] ]
- 格式:
把(+)加在where條件的字段後面,(+)號修飾的字段所在的表的對面表格的數據全部被選中 !
e.manager_id(+)=m.id: m表被全部選中 e.manager_id=m.id(+):e表被全部選中
特點: 內連接匹配不上的數據, 因爲外連接要取出, 外連接會通過補足null行來生成結果集
查詢s_emp表格, 獲取普通員工的信息
select distinct m.last_name,m.id from s_emp e,s_emp m where e.manager_id(+)=m.id and e.manager_id is null;
e m
e.id e.name e.m_id m.id m.name m.m_id
1 a null 1 a null
2 b 1 2 b 1
3 c 1 3 c 1
4 d 2 4 d 2
5 e 2 5 e 2
select m.id,m.name from e,m where e.manager_id is null;
- 實例:
表結構:
- 外連接實例:
--查詢測是的臨時表
select * from s_emp_test;
--內連接 兩張表的數據
select * from s_emp_test e1, s_emp_test e2
where e1.id=e2.m_id;
--內連接 一張表的數據 有重複
select e1.* from s_emp_test e1, s_emp_test e2
where e1.id=e2.m_id;
-- 外連接 (+)在=前 e2表中的數據全部展示出來,不符合條件的用NULL補充到e1
select * from s_emp_test e1, s_emp_test e2
where e1.m_id(+)=e2.id;
--外連接 (+)在=前 等同於如下右連接 e2爲主表 e2表的數據全部展示,e1表用NULL補足
select * from s_emp_test e1 right join
s_emp_test e2 on e1.m_id=e2.id;
-- 外連接 (+)在=和字段後 e1表中的數據全部展示出來,不符合條件的用NULL補充到e2
select * from s_emp_test e1,
s_emp_test e2 where e1.m_id=e2.id(+);
--外連接 (+)在=和字段後 等同於如下左連接 e1爲主表 e1表的數據全部展示,e2表用NULL補足
select * from s_emp_test e1 left join
s_emp_test e2 on e1.m_id=e2.id(+);
-- 查詢普通員工 --
-- 左連接:查詢普通員工(非領導的員工信息)根據上面的外連接(+)在後面,外連接補NULL,然後用e2表的ID is null 取出員工號
select * from s_emp_test e1, s_emp_test e2
where e1.id=e2.m_id(+) and e2.id is null;
-- 右連接:查詢普通員工的另一種方式
select * from s_emp_test e1, s_emp_test e2
where e1.m_id(+)=e2.id and e1.id is null;
--注意用 where 而不是 and 用and去並集 不符合要求
select * from s_emp_test e1 right join
s_emp_test e2 on e1.m_id=e2.id where e1.id is null;
-- 查詢領導 --
-- 右連接
select distinct e2.* from s_emp_test e1
right join s_emp_test e2
on e1.m_id = e2.id where e1.m_id is not null;
-- 左連接
select distinct e1.* from s_emp_test e2
left join s_emp_test e1 on e2.m_id = e1.id
where e2.m_id is not null;
--全外連接 左連接和有鏈接的結果取數學合集(去掉重複)
-- FULL JOIN 或 FULL OUTER JOIN
select * from s_emp_test e1 FULL JOIN s_emp_test e2 on e1.m_id=e2.id;
13.2.6自連接
- 一張表中,有多層的業務含義的數據,要把某一層的含義數據取出來時,使用自連接!把一張表看作多張表進行查詢。
- 具體範例例如:
SELECT A.LAST_NAME, B.LAST_NAME , A.FIRST_NAME...
FROM EMPLOYEE_TBL A,
EMPLOYEE_TBL B
WHERE A.LAST_NAME = B.LAST_NAME;
第14章 使用於查詢定義未確定數據
14.1 什麼是子查詢
- 定義:就是嵌套查詢。是位於另一個查詢的WHERE子句裏的查詢,它返回的數據
通常在主查詢裏作爲個條件,從而進一步限制數據庫返回的數據。 - 語法:
SELECT COLUMN_NAME FROM TABLE
WHERE COLUMN_NAME = ( SELECT COLUMN_NAME FROM TABLE WHERE CONDITIONS);
14.2 子查詢嵌套
1、select與子查詢 常用
-- 查詢低於編號311549902員工工資的 人員的的信息
select EP.PAY_RATE,E.EMP_ID,E.LAST_NAME,E.FIRST_NAME from EMPLOYEE_PAY_TBL EP,EMPLOYEE_TBL E where EP.SALARY >(SELECT SALARY from EMPLOYEE_PAY_TBL where EMP_ID='311549902');
2、子查詢也可以用於DML(INSERT UPDATE DELETE等語句)不常用。