1 SQL是什麼? 答:是結構話語言,是一種操作關係型資料庫的語言。 2 SQL語言分類? 3 數據類型? 整數:int,bit 小數:decimal 字元串:varchar,char 日期時間: date, time, datetime 枚舉類型(enum) 整數:int,bit 小數:decim ...
1 SQL是什麼?
答:是結構話語言,是一種操作關係型資料庫的語言。
2 SQL語言分類?
SQL語言 | 說明 | 舉例 |
DDL | 數據定義語言 | create drop |
DML | 數據操作語言 | insert update delete |
DQL | 數據查詢語言 | select |
DCL | 數據管理語言 | grant revoke |
TPL | 事務處理語言 | begin transaction commit rollback |
CCL | 指針控制語言 | declear cursor |
3 數據類型?
-
整數:int,bit
-
小數:decimal
-
字元串:varchar,char
-
日期時間: date, time, datetime
-
枚舉類型(enum)
說明:
-
decimal表示浮點數,如decimal(5,2)表示共存5位數,小數占2位
-
char表示固定長度的字元串,如char(3),如果填充ab時會補一個空格
-
varchar表示可變長度的字元串,如varchar(3),填充ab時就會存儲ab
-
字元串text表示存儲大文本,當字元大於4000時推薦使用
- 對於圖片、音頻、視頻等文件,不存儲在資料庫中,而是上傳到某個伺服器上,然後在表中存儲這個文件的保存路徑
4 數值類型對應的位元組大小?
數值類型 | 類型 | 位元組大小 |
TINYINT | 1 | -128 ~ 127 |
SMALLINT | 2 | -32768 ~ 32767 |
MEDIUMINT | 3 | -8388608 ~ 8388607 |
INT | 4 | |
BIGINT | 8 |
5 字元串對應的位元組大小?
字元串 | 類型 | 位元組大小 |
CHAR | 0-255 | 類型:char(3) 輸入 'ab', 實際存儲為'ab ', 輸入'abcd' 實際存儲為 'abc' |
VARCHAR | 0-255 | 類型:varchar(3) 輸 'ab',實際存儲為'ab', 輸入'abcd',實際存儲為'abc' |
TEXT | 0-65535 | 文本 |
6 日期時間對應位元組大小?
類型 | 位元組大小 | 例子 |
DATE | 4 | ‘2020-01-01’ |
TIME | 3 | ‘12:00:00’ |
DATETIME | 8 | '2020-01-01 12:00:00' |
YEAR | 1 | '2019' |
TIMESTAMP |
4 |
'1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC |
7 約束?
- 主鍵primary key:物理上存儲的順序
- 非空not null:此欄位不允許填寫空值
- 惟一unique:此欄位的值不允許重覆
- 預設default:當不填寫此值時會使用預設值,如果填寫時以填寫為準
- 外鍵foreign key:對關係欄位進行約束,當為關係欄位填寫值時,會到關聯的表中查詢此值是否存在,如果存在則填寫成功,如果不存在則填寫失敗並拋出異常
(1)primary key
假如有一張學生信息表,裡面記錄了學生的學號 ,姓名,成績等,那麼,會不會有兩個學號相同的學生,答案肯定是否定的,如果有的話也只能是插入信息的時候犯下的錯誤,那麼我們如何去避免這種錯誤呢,這時候,primary key就發揮作用了。
下麵我們創建一個stu_inform表:
create table stu_inform(
id int,
name varchar(20),
grade double,
primary key(id),
);
(2) 聯合主鍵
這樣的話我們就為id 加上了主鍵約束,我們來插入一個錯誤的信息
insert into stu_inform values(1,'張三',100.00),(1,'李四',100.00); -- Error
[同時兩個id]
如果是這樣插入的話環境會報出一個錯誤,這個錯誤正是主鍵約束的作用。
但是如果你也想讓姓名也不能相同,你可能會這樣寫
create table stu_inform(
id int,
name varchar(20),
grade double,
primary key(id,name) );
接下來我們插入一個數據
insert into stu_inform values(1,'張三',100.00),(1,'李四',100.00);
你會發現這條語句是完全可行的,是完全沒有錯誤的,這是為什麼呢,這是因為這是一個聯合主鍵,它的作用是id不能重覆 且 姓名也不能重覆,註意是且。
你如果這樣寫的話
insert into stu_inform values(1,'張三',100.00),(1,'張三',100.00);//Error
你如果這樣寫的話就是大錯特錯了,因為這違反了聯合主鍵。因為id和姓名同時相同了就是這個道理。
那麼要怎樣才能實現id不能相同,同時姓名也不能相同呢,這就是下一篇要講的unique的作用了。
(3) primary key習慣
1、不更新主鍵列的值
2、不重用主鍵列的值
3、不在主鍵列中使用可能會更改的值(例如,如果使用一個名字作為主鍵以標識某個供應商,應該供應商合併和更改其名字時,必須更改這個主鍵)
4、在使用InnoDB存儲引擎時,如果沒有特別的需要,請永遠使用一個與業務無關的自增欄位作為主鍵
(4) foreign key外鍵
foreignkey 是指一對多關係時建立的關係:
外鍵是表中與另一個表的另一個欄位匹配的欄位。
外鍵對相關表中的數據施加限制,這使MySQL能夠保持參照完整性。
操作:
我們有兩個表:customers
和orders.
每個客戶都有零個或多個訂單,每個訂單隻能屬於一個客戶。
customers
表和orders
表之間的關係是一對多關係,並且orders
由該customerNumber
欄位指定的表中的外鍵建立。
表中的customerNumber
欄位與orders
表中的customerNumber
主鍵欄位相關 customers
。
該customers
表稱為父表或被引用表,該orders
表稱為子表或引用表。
外鍵可以是一列或一組列。子表中的列通常引用父表中的主鍵列。
一個表可能有多個外鍵,並且子表中的每個外鍵都可能引用不同的父表。
子表中的行必須包含父表中存在的值,例如,表中的每個訂單記錄orders
必須具有表customerNumber
中存在的值customers
。因此,多個訂單可以指同一個客戶,這種關係被稱為一個(客戶)多個(訂單)或一對多
外鍵的預設作用有兩點:
1、對子表(外鍵所在的表)的作用:子表在進行寫操作的時候,如果外鍵欄位在父表中找不到對應的匹配,操作就會失敗。
2、對父表的作用:對父表的主鍵欄位進行刪和改時,如果對應的主鍵在子表中被引用,操作就會失敗。
外鍵的定製作用----三種約束模式:
district:嚴格模式(預設), 父表不能刪除或更新一個被子表引用的記錄。
cascade:級聯模式, 父表操作後,子表關聯的數據也跟著一起操作。
set null:置空模式,前提外鍵欄位允許為NLL, 父表操作後,子表對應的欄位被置空。
使用外鍵的前提:
1、表儲存引擎必須是innodb,否則創建的外鍵無約束效果。
2、外鍵的列類型必須與父表的主鍵類型完全一致。
3、外鍵的名字不能重覆。
4、已經存在數據的欄位被設為外鍵時,必須保證欄位中的數據與父表的主鍵數據對應起來。