標籤:zmq2 asd zll style pat hbm clj tcap ane
SQL 的約束
約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性、唯一性。、
1 約束分類
約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性、唯一性。
在MySQL中,通常有這幾種約束:
| 約束類型: |
主鍵 |
預設值 |
唯一 |
外鍵 |
非空 |
| 關鍵字: |
PRIMARY KEY |
DEFAULT |
UNIQUE |
FOREIGN KEY |
NOT NULL |
刪除庫語句為:
1 DROP DATABASE <資料庫名>
2主鍵
主鍵 (PRIMARY KEY)是用於約束表中的一行,作為這一行的唯一識別碼,在一張表中通過主鍵就能準確定位到一行,因此主鍵十分重要。主鍵不能有重複且不可為空。
1 Id int(10)primary key2 constraint <主鍵名> primary key (主鍵) eg constraint <app_pk> primary key (name)3 constraint <主鍵名> primary key (主鍵,主鍵) eg constraint <app_pk> primary key (id,name) 4 複合主鍵。主鍵不僅可以是表中的一列,也可以由表中的兩列或多列來共同標識
3 預設值約束
預設值約束 (DEFAULT) 規定,當有 DEFAULT 約束的列,插入資料為空白時,將使用預設值。
1 people_num int(10) default ‘10‘, people_num有DEFAULT約束,預設值為10
DEFAULT 約束只會在使用 INSERT 語句時體現出來,INSERT語句中,如果被 DEFAULT 約束的位置沒有值,那麼這個位置將會被 DEFAULT 的值填充,如語句:
1 # 正常插入資料2 INSERT INTO department(dpt_name,people_num) VALUES(‘dpt1‘,11);3 4 #插入新的資料,people_num 為空白,使用預設值5 INSERT INTO department(dpt_name) VALUES(‘dpt2‘);
4 唯一約束
唯一約束 (UNIQUE) 比較簡單,它規定一張表中指定的一列的值必須不能有重複值,即這一列每個值都是唯一的。
1 unique (phone), unique約束,phone的值唯一
當 INSERT 語句新插入的資料和已有資料重複的時候,如果有 UNIQUE約束,則 INSERT 失敗,比如:
1 INSERT INTO people VALUES(01,110110);2 INSERT INTO people VALUES(02,110110,);
5 外鍵約束
外鍵 (FOREIGN KEY) 既能確保資料完整性,也能表現表之間的關係。
一個表可以有多個外鍵,每個外鍵必須 REFERENCES (參考) 另一個表的主鍵,被外鍵約束的列,取值必須在它參考的列中有對應值。
在 INSERT 時,如果被外鍵約束的值沒有在參考列中有對應,則INSERT 失敗:
1 INSERT INTO abc VALUES(01,110111);
可見之後將 110111 改為110110,則插入成功:
6 非空約束
非空約束 (NOT NULL),聽名字就能理解,被非空約束的列,在插入值時必須非空。
1 age int(10), 沒有非空約束2 phone int(12) not NULL, 有非空約束
在MySQL中違反非空約束,不會報錯,只會有警告,比如以下語句:
#INSERT 成功 age 為空白,因為沒有非空約束,表中顯示 NULLINSERT INTO pp(id ,phone) VALUES(01,110); #警告 phone 被非空約束,值為空白,表中顯示0INSERT INTO pp(id ,age) VALUES(02,110);
結果,出現警告,但還是插入資料成功,(5.5.50版本),5.6 版本以上的 MySQL 會報錯,禁止插入不符合非空約束的資料:
此時 pp表的內容為:
SELECT語句詳解
在資料庫動作陳述式中,使用最頻繁,也被認為最重要的是 SELECT 查詢語句。前面用到了 SELECT * FROM table_name; 這條語句用於查看一張表中的所有內容。
而 SELECT 與各種限制條件關鍵詞搭配使用,具有各種豐富的功能,這次實驗就進行詳細介紹。
1 基本的SELECT語句
SELECT 語句的基本格式為:
1 SELECT 要查詢的列名 FROM 表名字 WHERE 限制條件;
如果要查詢表的所有內容,則把 要查詢的列名 用一個星號 * 號表示,代表要查詢表中所有的列。
有時只需要查看某個表的指定的列,比如要查看people 表的 name 和 age:
1 SELECT name,age FROM people;
2 數學符號條件
SELECT 語句常常會有 WHERE 限制條件,用於達到更加精確的查詢。WHERE限制條件可以有數學符號 (=,<,>,>=,<=) ,剛才我們查詢了 name 和 age,現在稍作修改:
1 SELECT name,age FROM people WHERE age>25;
篩選出 age 大於 25 的結果。
或者尋找一個名字為 Mary 的人的 name,age 和 phone:
1 SELECT name,age,phone FROM people WHERE name=‘Mary‘;
3 “AND”與“OR”
從這兩個單詞就能夠理解它們的作用。WHERE 後面可以有不止一條限制,而根據條件之間的邏輯關係,可以用 OR(或) 和 AND(且) 串連:
1 #篩選出 age 小於 25,或 age 大於 302 SELECT name,age FROM people WHERE age<25 OR age>30;
1 #篩選出 age 大於 25,且 age 小於 302 SELECT name,age FROM people WHERE age>25 AND age<30;
而剛才的限制條件 age>25 AND age<30 ,如果需要包含25和30這兩個數位話,可以替換為 age BETWEEN 25 AND 30 :
4 IN 和 NOT IN
關鍵詞IN和NOT IN的作用和它們的名字一樣明顯,用於篩選“在”或“不在”某個範圍內的結果,比如說我們要查詢在dpt3或dpt4的人:
1 SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt IN (‘dpt3‘,‘dpt4‘);
而NOT IN的效果則是,如下面這條命令,查詢出了不在dpt1也不在dpt3的人:
1 SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt NOT IN (‘dpt1‘,‘dpt3‘);
5 萬用字元
關鍵字 LIKE 在SQL語句中和萬用字元一起使用,萬用字元代表未知字元。SQL中的萬用字元是 _ 和 % 。其中 _ 代表一個未指定字元,% 代表不定個未指定字元。
比如,要只記得電話號碼前四位元為1101,而後兩位忘記了,則可以用兩個 _ 萬用字元代替:
1 SELECT name,age,phone FROM employee WHERE phone LIKE ‘1101__‘;
另一種情況,比如只記名字的首字母,又不知道名字長度,則用 % 萬用字元代替不定個字元:
1 SELECT name,age,phone FROM employee WHERE name LIKE ‘J%‘;
這樣就尋找出了首字母為 J 的人。
6 對結果排序
有時可能需要對結果按某一列來排序,這就要用到 ORDER BY 排序關鍵詞。預設情況下,ORDER BY的結果是升序排列,而使用關鍵詞ASC和DESC可指定升序或降序排序。
比如,我們按salary降序排列,SQL語句為:
1 SELECT name,age,salary,phone FROM employee ORDER BY salary DESC;
7 SQL 內建函數和計算
SQL 允許對錶中的資料進行計算。對此,SQL 有 5 個內建函數,這些函數都對 SELECT 的結果做操作:
| 函數名: |
COUNT |
SUM |
AVG |
MAX |
MIN |
| 作用: |
計數 |
求和 |
求平均值 |
最大值 |
最小值 |
其中 COUNT 函數可用於任何資料類型(因為它只是計數),而 SUM 、AVG 函數都只能對數字類資料類型做計算,MAX 和 MIN 可用於數值、字串或是日期時間資料類型。
具體舉例,比如計算出salary的最大、最小值,用這樣的一條語句:
1 SELECT MAX(salary) AS max_salary,MIN(salary) FROM employee;
使用AS關鍵詞可以給值重新命名
8 子查詢
上面討論的 SELECT 語句都僅涉及一個表中的資料,然而有時必須處理多個表才能獲得所需的資訊。例如:想要知道名為 "Tom" 的員工所在部門做了幾個工程。員工資訊儲存在 employee 表中,但工程資訊儲存在project 表中。
對於這樣的情況,我們可以用子查詢:
1 SELECT of_dpt,COUNT(proj_name) AS count_project FROM project2 WHERE of_dpt IN3 (SELECT in_dpt FROM employee WHERE name=‘Tom‘);
子查詢還可以擴充到3層、4層或更多層。
9 串連查詢
在處理多個表時,子查詢只有在結果來自一個表時才有用。但如果需要顯示兩個表或多個表中的資料,這時就必須使用串連 (join) 操作。
串連的基本思想是把兩個或多個表當作一個新的表來操作,如下:
1 SELECT id,name,people_num2 FROM employee,department3 WHERE employee.in_dpt = department.dpt_name4 ORDER BY id;
另一個串連語句格式是使用 JOIN ON 文法,剛才的語句等同於:
1 SELECT id,name,people_num2 FROM employee JOIN department3 ON employee.in_dpt = department.dpt_name4 ORDER BY id;
結果也與剛才的語句相同。
MySQL筆記(2)