ORACLE數據庫

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。
    父子關係.png-288.8kB
  -- 外鍵約束--
  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語句,查詢必要元素。至少指定一張表可以指定多張表。
  • 語法
 from1[,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;
  • 實例:
    表結構:
    查到的全部數據.png-132.1kB
  • 外連接實例:
--查詢測是的臨時表
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;

右外連接.png-87kB
左外連接.png-79.5kB
查詢普通員工.png-73.7kB
查詢領導.png-47.4kB
全外連接.png-69.1kB

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等語句)不常用。

第15章 組合多個查詢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章