標籤:
/* 列屬性(列約束) */ ----------
1. 主鍵
- 能唯一標識記錄的欄位,可以作為主鍵。
- 一個表只能有一個主鍵。
- 主鍵具有唯一性。
- 聲明欄位時,用 primary key 標識。 也可以在欄位列表之後聲明
例:create table tab ( id int, stu varchar(10), primary key (id));
- 主鍵欄位的值不能為null。
- 主鍵可以由多個欄位共同組成。此時需要在欄位列表後聲明的方法。
例:create table tab ( id int, stu varchar(10), age int, primary key (stu, age));
2. unique 唯一索引(唯一約束)
使得某欄位的值也不能重複。
3. null 約束
null不是資料類型,是列的一個屬性。
表示當前列是否可以為null,表示什麼都沒有。
null, 允許為空白。預設。
not null, 不允許為空白。
insert into tab values (null, ‘val‘);
-- 此時表示將第一個欄位的值設為null, 取決於該欄位是否允許為null
4. default 預設值屬性
當前欄位的預設值。
insert into tab values (default, ‘val‘); -- 此時表示強制使用預設值。
create table tab ( add_time timestamp default current_timestamp );
-- 表示將目前時間的時間戳記設為預設值。
current_date, current_time
5. auto_increment 自動成長約束
自動成長必須為索引(主鍵或unique)
只能存在一個欄位為自動成長。
預設為1開始自動成長。可以通過表屬性 auto_increment = x進行設定,或 alter table tbl auto_increment = x;
6. comment 注釋
例:create table tab ( id int ) comment ‘注釋內容‘;
7. foreign key 外鍵約束
用於限制主表與從表資料完整性。
alter table t1 add constraint `t1_t2_fk` foreign key (t1_id) references t2(id);
-- 將表t1的t1_id外部索引鍵關聯到表t2的id欄位。
-- 每個外鍵都有一個名字,可以通過 constraint 指定
存在外鍵的表,稱之為從表(子表),外鍵指向的表,稱之為主表(父表)。
作用:保持資料一致性,完整性,主要目的是控制儲存在外鍵表(從表)中的資料。MySQL中,可以對InnoDB引擎使用外鍵約束:文法:
foreign key (外鍵欄位) references 主表名 (關聯欄位) [主表記錄刪除時的動作] [主表記錄更新時的動作]此時需要檢測一個從表的外鍵需要約束為主表的已存在的值。外鍵在沒有關聯的情況下,可以設定為null.前提是該外鍵列,沒有not null。
可以不指定主表記錄更改或更新時的動作,那麼此時主表的操作被拒絕。
如果指定了 on update 或 on delete:在刪除或更新時,有如下幾個操作可以選擇:
1. cascade,級聯操作。主表資料被更新(主索引值更新),從表也被更新(外索引值更新)。主表記錄被刪除,從表相關記錄也被刪除。
2. set null,設定為null。主表資料被更新(主索引值更新),從表的外鍵被設定為null。主表記錄被刪除,從表相關記錄外鍵被設定成null。但注意,要求該外鍵列,沒有not null屬性約束。
3. restrict,拒絕父表刪除和更新。
注意,外鍵只被InnoDB儲存引擎所支援。其他引擎是不支援的。
/* 建表規範 */ -------------------- Normal Format, NF
- 每個表儲存一個實體資訊
- 每個具有一個ID欄位作為主鍵
- ID主鍵 + 原子表
-- 1NF, 第一範式
欄位不能再分,就滿足第一範式。
-- 2NF, 第二範式
滿足第一範式的前提下,不能出現部分依賴。 消除符合主鍵就可以避免部分依賴。增加單列關鍵字。
-- 3NF, 第三範式
滿足第二範式的前提下,不能出現傳遞依賴。 某個欄位依賴於主鍵,而有其他欄位依賴於該欄位。這就是傳遞依賴。 將一個實體資訊的資料放在一個表內實現。
/* select */ ------------------
select [all|distinct] select_expr from -> where -> group by [合計函數] -> having -> order by -> limit
a. select_expr
-- 可以用 * 表示所有欄位。
select * from tb;
-- 可以使用運算式(計算公式、函數調用、欄位也是個運算式)
select stu, 29+25, now() from tb;
-- 可以為每個列使用別名。適用於簡化列標識,避免多個列標識符重複。
- 使用 as 關鍵字,也可省略 as.
select stu+10 as add10 from tb;
b. from 子句
用於標識查詢來源。
-- 可以為表起別名。使用as關鍵字。
select * from tb1 as tt, tb2 as bb;
-- from子句後,可以同時出現多個表。
-- 多個表會橫向疊加到一起,而資料會形成一個笛卡爾積。
select * from tb1, tb2;
c. where 子句
-- 從from獲得的資料來源中進行篩選。-- 整型1表示真,0表示假。-- 運算式由運算子和運算數組成。
-- 運算數:變數(欄位)、值、函數傳回值
-- 運算子:
=, <=>, <>, !=, <=, <, >=, >, !, &&, ||, in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor
is/is not 加上ture/false/unknown,檢驗某個值的真假
<=>與<>功能相同,<=>可用於null比較
d. group by 子句, 分組子句
group by 欄位/別名 [排序方式]
分組後會進行排序。升序:ASC,降序:DESC
以下[合計函數]需配合 group by 使用:
count 返回不同的非NULL值數目 count(*)、count(欄位)
sum 求和
max 求最大值
min 求最小值
avg 求平均值
group_concat 返回帶有來自一個組的串連的非NULL值的字串結果。組內字串串連。
e. having 子句,條件子句
與 where 功能、用法相同,執行時機不同。
where 在開始時執行檢測資料,對原資料進行過濾。
having 對篩選出的結果再次進行過濾。
having 欄位必須是查詢出來的,where 欄位必須是資料表存在的。
where 不可以使用欄位的別名,having 可以。因為執行WHERE代碼時,可能尚未確定列值。
where 不可以使用合計函數。一般需用合計函數才會用 having
SQL標準要求HAVING必須引用GROUP BY子句中的列或用於合計函數中的列。
f. order by 子句,排序子句
order by 排序欄位/別名 排序方式 [,排序欄位/別名 排序方式]...
升序:ASC,降序:DESC
支援多個欄位的排序。
g. limit 子句,限制結果數量子句
僅對處理好的結果進行數量限制。將處理好的結果的看作是一個集合,按照記錄出現的順序,索引從0開始。
limit 起始位置, 擷取條數
省略第一個參數,表示從索引0開始。
limit 擷取條數
h. distinct, all 選項
distinct 去除重複記
預設為all, 全部記錄
(未完待續)
(Shocker 來源:http://www.cnblogs.com/shockerli/p/1000-plus-line-mysql-notes.html)
一千行MySQL學習筆記(三)