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];