數據庫基本總結

SQL:結構化查詢語言
SQL語句分爲:
DDL(數據定義語言)用於創建、修改和刪除數據內的數據結構。
DQL:(數據查詢語言) 用於從一個或多個表中查詢指定的數據。
DML:(數據操作語言) 用於修改數據庫中的數據。
DCL:(數據控制語言) 控制對數據庫的訪問。
創建個使用數據庫:
CREATE DATABASE 數據庫名;
連接到數據庫:
USE 數據庫名;
刪除數據庫:
DROP DATABASE 數據庫名;
管理表:
創建表:
CREATE TABLE<表名>
((列名)<列的數據類型>[(列的約束)]);
刪除表:
DROP TABLE (表名)

複製表:
SELECT * INTO (表名1) FROM 表名2;
注:如果是隻複製表結構不復制數據,只需在WHERE 子句中添加一個永遠不等於TRUE的條件即可;
修改表:
(添加某一列)
ALERT TABLE 表名 要添加的列名 數據類型;
注;如果要添加一個NOT NULL的列,表中必須是沒有記錄的空表。
(刪除某一列) 
ALERT TABLE 表名 DROP COLUMN 列名;
創建索引:
CREATE INDEX<索引名> ON <表名>(<列名一>,<列名二>......);


刪除索引:
DROP  INDEX  表名.索引名;


數據完整性概述
根據數據完整性的實施方法,可分爲四類:
1:實體完整性;
2:域完整性;
3:應用完整性;
4:自定義完整性;


創建非空約束:
NOT NULL.
設置主鍵約束:


CONSTRAINT 主鍵名(可省略)PRIMARY KEY(設定爲主鍵的列名);
主鍵自帶非空性和唯一性。


設置唯一約束;
UNIQUE;


唯一約束與主鍵的區別:
除了允許NULL外,唯一約束在功能上和主鍵約束是一致的。儘管兩種約束都實現了唯一性,但是在實現以下方面的
唯一性時應該使用唯一約束而不使用主鍵約束:
1:列或幾個列的組合不是主鍵,有時需要多個列的值的唯一。此時不能使用主鍵約束,這是因爲一個表   只能定義一個主鍵約束。而一個表可以定義多個唯一約束。
2:列的值允許NULL值。唯一約束可以定義在允許爲NULL值的列上,而主鍵約束只能定義不允許爲NULL的   列上。

指定默認值:
如:PhoneNo varchar(15)DEFAULT‘不知道號碼’NOT NULL;


設置檢查約束:
如:Age INT,
CONSTRAINT 檢查約束名(CHECK Age BETWEN 10 and 100 );

   SSN VARCHAR(15)NOT NULL,
CHECK (SSL LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' );(正則表達式)
使用自動編號:
如:
id int IDENTITY PRIMARY KEY,
注:默認情況下增量和種子值都是1。當然也可以指定增量和種子值:
id int IDENTITY(1000,1) PRIMARY KEY,




外鍵約束:
如:
FriendID INT ;
FPREIGN KEY (FriendID ) REFERENCE 表名(列名),


使用DML語句更改數據
添加數據:
插入單行數據:
INSERT INTO <表名> VALUES (<值列表>);

注:字符串和日期用被單引號包含。

插入多行數據:

INSERT INTO <表名>SELECT  <SELECT 語句>;
使用這種語句,實際上是講數據從一張表複製到另一張表,但是源表和目標表的列名和列數不一定相同。表名必須 已經存在。

表數據的複製:
SELECT <列名>INTO <新表名> FROM <表名>
更改數據:
UPDATE <表名> SET <列1=新值1,列2=新值2,>WHERE <過濾條件>;
刪除數據:
DELETE FROM <表名> WHERE <過濾條件>;


TRUNCATE TABLE<表名>(不能用於有外鍵約束的表)

注:TRUNCATE  TABLE 被優化,執行起來比DELETE 快,因爲它不留下詳細的刪除記錄日誌,這也意味着TRUNCATE   TABLE是不可回滾的,因爲數據被永久性刪除,同時TRUNCATE  TABLE也不會觸發我們觸發器。




簡單的數據查詢
排除重複數據
SELECT DISTINCT 列A FROM 表名
返回限定行數的查詢
SELECT TOP ROWCOUNT 列A,列B FROM 表名

SELECT 5 PERCENT ROWCOUNT 列A,列B FROM 表名


聚合函數與分組


常用的聚合函數如下:
COUNT:返回結果集中行的數目。
SUM: 返回結果集中所有值的總和。
AVG:返回結果集中所有值的平均值。
MAX:返回結果集中所有值的最大值。
MIN:返回結果集中所有值的最小值。


執行行和列計數
SELECT COUNT<計數規範> FROM 表名;
計數規範如下:
* 計算所有選擇的行包括NULL值
  ALL    計算指定列的所有非空值行。如果沒有僅僅是指定列而不帶ALL或者DISTINCT,這是默認操作
DISTINCT 計算指定列的唯一非空值行。




數據分組:
SELECT 列A,聚合函數 FROM 表名
WHERE 過濾條件
GROUP BY 列A


使用HAVING 子句


SELECT StudentId,Avg(Mark)AS AverageMark FROM StudentExam GROUP BY StudentId HAVING Avg(Mark) <50 OR Avg(Mark)>70


SQL語句的執行順序:
SELECT 字句
FROM  字句
WHERE 字句
GROUP  BY  字句
ORDER BY  字句
HAVING 字句

1:首先執行FROM字句
2: 如果有WHERE 字句,則根據其中的過濾條件,從中間表中去掉不滿足過濾條件的行。
3:根據GROUP BY 字句中指定的分組列,對中間表中的數據進行分組。
4:爲每個組計算SELECT 字句聚合函數的值,併爲每組生成查詢結果中的一行。
5:如果有HAVING 字句,則根據HAVING字句的過濾條件,分組計算聚合函數計算的結果再次過濾。
6:如果有ORDER BY 字句,則根據ORDER BY 字句中的列,對結果集進行排序。
使用子查詢:
子查詢分爲相關子查詢和非相關子查詢;
非相關子查詢是獨立於外部查詢的子查詢。子查詢總共執行一次,執行完畢後將值傳遞給外部子查詢。

相關子查詢的執行依賴於外部子查詢的數據,外部子查詢返回一行,子查詢就執行一次。
SELECT COLUMNA,(子查詢) AS COLUMN B FROM 表名;


在子查詢中使用運算符:


使用EXISTS 運算符:
EXISTS 運算符允許我們查找滿足條件的行,EXISTS後面總是跟一個子查詢,只要子查詢返回了行, EXISTS的值就爲真。


下面的查詢返回在任何一次考試中分數低於40的學生的ID和姓名:
SELECT StudentID,Name FROM Student s WHERE EXISTS(SELECT  StudentID FROM 


StudentExam e WHERE Mark<40 AND e.StudentID =s.StudentID ); 


使用ALL運算符
ALL運算符與子查詢和比較運算符一起使用。如果子查詢返回的所有值都滿足比較運算。那麼比較表達式 就爲真。如果不是所有值都滿足比較運算或子查詢沒有給外部語句返回行,則返回假。
SELECT COLUMN A FROM TABLEA WHERE COLUMN A >ALL(SELECT COULUMB FROM TABLEB);
這個查詢返回C從A表中返回COLUMN A 列值大於TABLE B中的每個COULMN B列值的所有行。


使用ANY運算符:
ANY 與ALL的工作方式不同,不同的是:在子查詢返回的值中,只要有一行滿足比較運算,那麼比較表達 式就爲真,如果所有值都不滿足,則返回假。
SELECT COLUMN A FROM TABLEA WHERE COLUMN A >ALL(SELECT COULUMB FROM TABLEB);
這個查詢返回C從A表中返回COLUMN A 列值大於TABLE B中的任何一個COULMN B列值的所有行。






組合查詢數據:
SQL提供了幾種運算符允許我們組合多個SQL查詢來實現這個用途。這些運算符分別是:
UNION、UNION ALL、INTERSECT 和DIFFERENCE
基本語法如下:
SELECT COLUMN A、 COLUMN B FROM TABLE A
<OPERATOR>
SELECT COLUMN C、 COLUMN D FROM TABLE B;




使用UNION 運算符:
SELECT COLUMN A、 COLUMN B FROM TABLE A
UNION
SELECT COLUMN C、 COLUMN D FROM TABLE B;
通常UNION的結果集列名與UNION的第一個SELECT語句的結果集中的列名相同,另一個SELECT語句的結果集的列名將 被忽略。


UNION用來去重複;
如:
{1,2,3,4}UNION{3,4,5,6};
結果爲{1,2,3,4,5,6}
保留重複行:
SELECT COLUMN A、 COLUMN B FROM TABLE A
UNION ALL
SELECT COLUMN C、 COLUMN D FROM TABLE B;
通常UNION的結果集列名與UNION的第一個SELECT語句的結果集中的列名相同,另一個SELECT語句的結果集的列名將 忽略。


UNION ALL用來保留重複;
如:
{1,2,3,4}UNION{3,4,5,6};
結果爲{1,2,3,3,4,4,5,6}


交集和差分(oracle)


{1,2,3,4}INTERSECT{3,4,5,6};
結果爲{3,4}

{1,2,3,4}EXCEPT(OR MINUS){3,4,5,6};
結果爲{1,2,5,6}

聯接
使用兩表相等聯接
SELECT table1.column1,table1.column2,table2.column3 from table1,table2 where table1.column1=table2.column3;


SELECT table1.column1,table1.column2,table2.column3 from table1 join table2 on table1.column1=table2.column3;


使用多表相等聯接
SELECT * from table1 join  table2
on table1.column1=table2.column2 
join table3
on table1.column3=table3.column4;




使用非相等聯接:
SELECT * from table1,table2
where  table1.column1 <table2.column2;












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