SQL進階(三)


SQL Alias 別名:

SQL別名用於為表或表中的列提供臨時名稱,使列名具有可讀性,一個別名只存在於查詢期間;

列的SQL Alias語法:

SELECT column_name AS alias_name

FROM table_name;

表的SQL Alias語法:

SELECT column_name(s)

FROM table_name AS alias_name;

SQL約束:

約束類型:

約束 描述
NOT NULL約束 保證列中數據不能有NULL值
DEFAULT約束 提供該列數據未指定時所采用的默認值
UNIQUE約束 保證列中各數據各不相同
主鍵約束 唯一標識表中的行/記錄
外鍵約束 唯一標識其他表中的行/記錄
CHECK約束 此約束保證列中所有值滿足某一條件
索引 用於在數據庫中快速創建或檢索數據

SQL創建約束:

CREAT TABLE table_name

(

  column1 datatype constraint,

  column2 datatype constraint,

  column3 datatype constraint,

  ...

)

刪除約束:

任何現有約束都可以通過ALTER TABLE命令中指定DROP CONSTRAINT 選項的方式刪除掉;

如:刪除Employees表中的主鍵約束,可用如下命令:

ALTER TABLE Employees DROP CONSTRAINT Employees_PK;

UNIQUE 約束:

每個表可以有多個UNIQUE約束,但只能有一個PRIMARY KEY約束;

在SQL Server,Oracle,MS Access中,UNIQUE約束可向NOT NULL約束一樣寫於列的datatype后面;

在MySQL中:為“person”表中的“P_Id”列創建UNIQUE約束:

CREAT TABLE person

(

  P_Id int NOT NULL,
  LastName varchar(255) NOT NULL,
  FirstName varchar(255),
  Address varchar(255),
  City varchar(255),
  UNIQUE (P_Id)

)

如需命名UNIQUE約束,並定義多個列的UNIQUE約束,需用如下語法(適用於MySQl、SQL Server,Oracle,MS Access):

CONSTRAINT unique_name UNIQUE(column1,column2...)

當表已經創建時,如需在“p_Id”列創建UNIQUE約束,需用如下語法(適用於MySQl、SQL Server,Oracle,MS Access):

ALTER TABLE Persons

ADD UNIQUE(p_Id);

撤銷UNIQUE約束:

MySQL:

ALTER TABLE table_name

DROP INDEX unique_name

撤銷UNIQUE約束(SQL Server、Oracle、MS Access):

ALTER TABLE table_name

DROP CONTRAINT unique_name;

 PRIMARY KEY約束:

PRIMARY KEY 唯一標識數據庫中的每條記錄,主鍵必須包含唯一值,主鍵列不能包含NULL值,每個表都應該有一個主鍵且只能有一個主鍵;

PRIMARY KEY在用法上同UNIQUE,請參照UNIQUE,在此不多做闡釋。

FOREIGN KEY約束:

一個表中的FOREIGN KEY 指向另一個表中的PRIMARY KEY,FOREIGN KEY 約束能預防表之間連接破壞的行為。

MySQL:在“Orders”表中在“P_Id”列創建外鍵約束:

CREAT TABLE Orders

  O_Id int NOT NULL,

  OrderNo int NOT NULL,

  P_Id int,

  PRIMARY KEY(O_Id),

  FOREIGN KEY (P_Id)REFERENCES Persons(P_Id)

);

SQL Server,Oracle,MS Access:

CREAT  TABLE Oreders

  O_Id int NOT NULL PRIMARY KEY,

  OrederNo int NOT NULL,

  P_Id int FOREIGN KEY REFERENCES Persons(P_Id)

);

如需命名FOREIGN KEY並定義多個列的FOREIGN KEY約束,使用如下語句(適用於SQL Server,Oracle,MS Access,MySQL):

CREAT TABLE Orders

O_Id int  NOT NULL,

OrderNo int NOT NULL,

P_Id int,

PRIMARY KEY(O_Id),

CONSTRAINT fk_PerOrders FOREIGN KEY(P_Id)REFERENCES Persons(P_Id)

DEFAULT約束:

DEFAULT 約束用於向表中插入默認值,如果沒有規定其他的值,會將默認值插入到表中;

CREAT TABLE Persons

  P_Id int NOT NULL,

  LastName varchar(255) NOT NULL,

  FirstName varchar(255),

  Address varchar(255),

  City varchar(255) DEFAULT “sandnes”

);

若表已經被創建時,需創建DEFAULT約束使用如下語句:

MySQL:

ALTER TABEL Persons

ALTER City SET DEFAULT “sandnes”;

SQL Server,MS Access:

ALTER TABLE Persons

ADD CONSTRAINT DF_Persons_City DEFAULT ("sandnes") FOR City;

Oracle:

ALTER TABLE Persons

MODIFY City DEFAULT “sandnes”;

CHECK約束:

CHECK約束用於對列中的值進行約束;如果對單個列進行約束,那么該列只允許特定的值;如果對一個表進行約束,那么此約束會基於行中其他列的值在特定的列中對值進行限制;

CHECK用法同UNIQUE用法,約束寫於括號內;

SQL JOIN連接:

SQL JOIN語句用於將數據庫中兩個或兩個以上表中的記錄組合起來,連接通過公有值將不同表中的字段組合在一起;

關於SQL INNER JOIN、RIGHT JOIN、LEFT JOIN、FULL JOIN在SQL高級語句(二)中已有詳細闡述,在此不多做闡釋。

現介紹一種新的連接方式:

笛卡爾連接:又稱為交叉連接,返回兩個或者更多連接表中記錄的笛卡爾乘積,也就是說,他相當於連接謂詞總是為真或者缺少連接謂詞的內連接。基本語法如下:

SELECT table1.column1,table2.column2...

FROM tabel1,table2...

SQL UNION語句:

SQL UNION語句用於將兩個或更多的SELECT語句運算結果組合起來。在SQL高級語句(二)中已有詳細闡述,在此不多做闡釋。

有兩個子句(即運算法)有UNION語句非常像:

INTERSECT子句:用於組合兩個SELECT語句,但是只返回兩個SELECT語句的結果中都有的行;

EXCEPT子句:組合兩個SELECT語句,並將第一個SELECT語句的結果中存在,但是第二個SELECT語句的結果中不存在的行返回。

SQL克隆數據表:

某些情況下,我們可能需要原樣拷貝某張數據庫表,但是,CREAT TABLE卻不能滿足我們的需求,因為復制表必須和原表擁有一樣的索引,默認值等;

若使用MySQL關系型數據庫管理系統,可用以下幾個步驟解決該問題:

1、使用SHOW CREAT TABLE table_name命令來獲取一條指定原表的結構,索引等信息的CREAT TABLE語句;

2、將語句中的表名修改為克隆表的名字,然后執行該語句,這樣便可得到一張與原表完全相同的克隆表;

3、若還需要克隆表中的數據,需使用INSERT INTO...SELECT語句。

SQL索引:

建立索引是加快表查詢速度的有效手段。當我們需要在一本書中查找某些信息時,往往是通過目錄找到所需信息對應的頁碼,然后再從該頁碼中找到所要的信息,這種做法比直接翻閱書的內容速度要更快。如果把數據庫比作一本書,那么表的索引就是這本書的目錄,可以通過索引大大加快表的查詢;

同UNIQUE約束一樣,索引可以是唯一的,這種情況下,索引會阻止列中(或者列的組合,其中某些列有索引)出現重復的條目;

CREAT INDEX命令:

CREAT INDEX index_name ON table_name;

單列索引(即基於某一字段創建的索引):

CREAT INDEX index_name

ON table_name (column_name);

唯一索引:

唯一索引不止用於提升查詢性能,還用於保證數據完整性,唯一索引不允許向表中插入重復值;

CREAT UNIQUE INDEX index_name

ON table_name(column_name);

聚簇索引:

聚簇索引在表中兩個或更多列的基礎上建立;

CREAT INDEX index_name

ON table_name(column1,column2...);

創建單列索引還是聚簇索引要看每次查詢中,哪些列在作為過濾條件的WHERE子句中最常出現;

隱式索引:

隱式索引由數據庫服務器在創建某些對象時自動生成,如對於主鍵約束和唯一約束,數據庫服務器就會自動創建索引;

DROP INDEX命令:

DROP INDEX index_name;

盡管創建索引的目的是為了提升數據庫的性能,但是還是有些情況應當避免使用索引,下面的幾條指導原則給出了何時需要考慮是否使用索引:

1、小的數據庫不應當使用索引;

2、需要頻繁進行大批量的更新或插入操作的表不宜創建索引;

3、如果列中包含大數或者NULL值,不宜創建索引;

4、頻繁操作的列不宜創建索引;

 SQL子查詢:

又稱為內查詢或嵌套查詢,是嵌套在SQL查詢的WHERE子句中的查詢;

子查詢用於為主查詢返回所需數據,或者對檢索數據進行進一步的限制。

子查詢可以在SELECT,INSERT,UPDATE和DELETE語句中,同=,<,>,>=,<=,IN,BETWEEN運算符一起使用;

使用子查詢必需遵循下面幾個規則:

1、子查詢必須在圓括號中;

2、子查詢的SELECT子句中只能有一個列,除非主查詢中有多個列,用於與子查詢選中的列相比較;

3、子查詢不能使用OREDER BY,不過主查詢可以。在子查詢中,GROUP BY可以起到同ORDER BY一樣的作用;

4、返回多行數據的子查詢只能同多指操作符一起使用,比如IN操作符;

5、子查詢不能直接用於集合函數中;

6、BETWEEN操作符不能同子查詢一起使用,但BETWEEN操作符可以用在子查詢中;

7、SELECT列表中不能包含對BLOB、ARRAY、CLOB或NCLOB類型值的引用;

SELECT語句中的子查詢:

SELECT column_name[,column_name]

FROM table1[,table2]

WHERE column_name OPERATOR(如IN、=,<等)

  (

  SELECT column_name[,column_name]

  FROM table1[,table2]

  [WHERE]

  )

INSERT 語句中的子查詢:

INSERT INTO  table_name[(column1 [,column2])]

  SELECT [ *|column1 [,column2]

  RROM table1 [,table2]

  [WHERE VALUE OPERATOR]

UPDATE中的子查詢:

UPDATE tabel

SET column_name = new_value

[WHERE OPERATOR [VALUE]

  (SELECT column_name

  FROM table_name

  [WHERE])

DELETE語句中的子查詢:

DELETE FROM table_name

[WHERE OPERATOR [value]

  (SELECT column_name

  FROM table_name

  [WHERE])

ALTER TABLE 語句:

ALTER命令用於添加刪除或更改現有表中的列;

添加新列:

ALTER TABLE table_name ADD column_name datatype;

刪除列:

ALTER TABLE table_name DROP COLUMN column_name;

更改列的數據類型:

ALTER TABLE table_name MODIFY COLUMN column_name datatype;

添加NOT NULL約束:

ALTER TABLE table_name MODIFY column_name datatype NOT NULL;

 添加唯一約束:

ALTER TABLE table_name

ADD CONSTRAINT MyUniqueConstraint UNIQUE(column1,column2..)

添加CHECK約束:

ALTER TABLE

ADD CONSTRAINT MyCheckConstraint CHECK(condition);

添加主鍵約束:

ALTER TABLE table_name

ADD CONSTRAINT MyPrimaryKey PRIMARY KEY(column1,column2...)

刪除約束:

ALTER TABLE tabel_name

DROP CONSTRAINT constraintName;

MySQL刪除約束:

ALTER TABLE table_name

DROP INDEX constraint_name;

MySQL刪除主鍵列約束:

ALTER TABLE table_name

DROP PEIMARY KEY

SQL處理重復數據:

SQL中DISTINCT關鍵字與SELECT語句一起使用,可以達到消除重復記錄,只返回唯一記錄的目的;

SELECT DISTINCT column1,column2,....columnN

FROM table_name

WHERE [condition]

SQL視圖:

視圖是存儲在數據庫中的具有名字的SQL語句,或者說是以預定義的SQL查詢的形式存在的數據表的成分,是一種虛擬的表;允許用戶有以下的操作:

1、以用戶或者某些類型的用戶感覺自然或者直觀的方式來組織數據;

2、限制對數據的訪問,從而使得用戶僅能夠看到或者修改他們需要的數據;

3、從多個表中匯總數據,以產生報表;

創建視圖:

CREAT VIEW view_name AS

SELECT column1,column2...

FROM table_name

WHERE [condition];

CREAT CHECK OPTION:

CREAT CHECK OPTION是CREATE VIEW語句的一個可選項。WITH CHECK OPTION用於保證所有的UPDATE和INSERT語句都滿足視圖中的條件,如果不能滿足就會報錯,如:

CREAT VIEW customers_view AS

SELECT name,age

FROM customers

WHERE age IS NOT NULL

WITH CHEKC OPTION;

這的WITH CHECK OPTION使得視圖拒絕任何avg字段為NULL的條目;

更新視圖:

視圖可以在特定的情況下更新:

1、SELECT子句不能包含DISTINCT關鍵字;

2、SELECT子句不能包含任何匯總函數;

3、SELECT子句不能包含任何集合函數;

4、SELECT子句不能包含任何集合運算符;

5、SELECT子句不能包含ORDER BY 子句;

6、FROM子句中不能有多個數據表;

7、WHERE子句不能包含子查詢;

8、查詢語句中不能包含HAVING語句或GROUP BY;

9、計算得出的列不能更新;

10、視圖必須包含原始數據表中所有的NOT NULL列,從而使INSERT查詢生效;

向視圖中插入新行,刪除視圖中的行的規則同UPDATE命令;

刪除視圖:

DROP VIEW view_name;

SQL HAVING子句:

HAVING子句用於過濾指定條件,從而控制查詢結果中哪些組可以出現在最終結果里面;WHERE子句對被選擇的列施加條件,而HAVING子句則對GROUP BY子句所產生的組施加條件;

SELECT column1,column2

FROM table1,table2

WHERE [condition]

GROUP BY column1,column2

HAVING [condition]

ORDER BY column1,column2;

SQL事務:

事務是在數據庫上按照一定邏輯順序執行的任務序列,既可以由用戶手動執行,也可以由某種數據庫程序自動執行;事務實際上就是對數據庫的一個或多個更改,當我們在數據庫上創建更新或者刪除記錄師,我們就已經使用事務了;控制事務以保證數據的完整性,並對數據庫錯誤做出處理;

事務的屬性:(ACID)

原子性:保證任務中的所有操作都執行完畢,否則事務會在出現錯誤時終止,並回滾之前所有操作到原始狀態;

一致性:如果事務執行成功,則數據庫的狀態進行了正確的轉變;

隔離性:保證不同的事務相互獨立,透明的執行;

持久性:即使出現系統故障,之前成功執行的事務的結果也會持久存在;

事務控制的四個命令:

COMMIT:提交更改;

ROLLBACK:回滾更改;

SAVEPOINT:在事務內部創建一系列可以ROLLBACK的還原點;

SET TRANSACTION:命名事務;

COMMIT:

COMMIT命令用於保存事務對數據庫的更改,會將上次COMMIT命令或者ROLLBACK命令執行以來所有的事務都保存到數據庫中,語法如下:

COMMIT;

ROLLBACK:

用於撤銷尚未保存到數據庫中的事務;只能撤銷上次自COMMIT命令或者ROLLBACK命令執行以來的事務,語法如下:

ROLLBACK;

SAVEPOINT命令:

SAVEPOINT是事務中的一個狀態點,使得我們可以將事務回滾到特定的點,而不是將整個事務都撤銷,語法如下:

SAVEPOINT savepoint_name;

而ROLLBACK是撤銷一系列的事務,若要回滾至某一保存點需使用:

ROLLBACK TO savepoint_name;

RELEASE SAVEPOINT命令:

RELEASE SAVEPOINT用於刪除之前創建的保存點,語法如下:

RELEASE SAVEPOINT savepoint_name;

SET TRANSATION命令:

SET TRANSATION命令可以用來初始化數據庫事務,指定隨后的事務的各種特征。如將某個事務指定為只讀或讀寫:

SET TRANSATION [READ WRITE|READ ONLY];

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM