資料庫2 待修
阿新 • • 發佈:2018-11-20
1.詳細的建表語句
create table 表名(
欄位名 資料型別[(長度) 約束v條件]
);
[]代表可選的
為什麼需要給資料分類?
1.描述資料更加準確
2.節省記憶體空間
2.資料型別
整數型別
預設有符號的
設定為無符號的
create table t2(age tinyint unsigned)
建表後用alter修改
注意:對於整數型別而言,長度不是資料所佔的位元組數 是顯示資料時的寬度(字元數)
預設情況下 儲存的數值的十進位制位數 小於索設定的顯示寬度時 不會填充 是沒有任何顯示效果的
加上zerofill 指定 當儲存的數值的十進位制的位數小於所設定的寬度時 用0來填充
tinyint
smallint
mefiumint
int *****
bigint
總結:除了儲存範圍沒有什麼區別
都是整型,預設有符號 對於顯示寬度原理是相同的
長度引數如果不指定 會有預設值
該引數如果不指定,會有預設值
嚴格模式:
什麼是嚴格模式? 對於插入的資料嚴格要求 不在範圍內直接報錯 麗日往tinyint中插入大於255的值將報錯
什麼是非嚴格模式? 對於插入的資料不進行嚴格要求 不在範圍內也可以儲存 儲存當前型別最大支援的值
5.6預設是非嚴格模式
5.7預設是嚴格模式
檢視SQL模式
select @@sql_mode;
show varisbles like "sql_mode";
修改 SQL模式
set[email protected]@sql_mode = "值";
正常情況下不需要修改
浮點型別:
float 4位元組
double 8位元組
decimal 不固定
create table t9 (num float(m,d))
m表示總長度 d表示小數部分的長度
長度表示的不是資料 儲存的範圍 而是字元長度
10.12總長度為4 小數部分為2
以下浮點型別載長度相同的情況下精度不同(各個型別的最大長度)
float(255,30)整數部分為255-30
double (255,30)整數部分為255-30
decimal (65,30)整數部分為65-30
區別:float與double的精度不同 都是不精準的小數
decimal 準確的小數 不會丟失精度
具體使用哪種型別需要根據使用場景來進行判斷
舉例:
float 滿足大部分的使用場景
decimal 則適合銀行系統 科學系統場景
括號中的m和d的值 可以限制資料的儲存範圍 於整數不同
注意:記住m和d的含義
字串型別:
常用兩種
char 定常字串
char
varchar 可變長度字串
注意字串中 長度指定的是資料的字元長度 與位元組沒有關係
create table t13(c1 char,c2 varchar(10));
在建立時,可變長的varchar必須指定長度 char有預設值
char(10):不滿足的時候用空格佔位 固定長度就是10,不關心真實資料長度
缺點:無論資料由多長 佔用空間是固定的 造成了一定的空間浪費
a char(10) b char(10)
A B
A |B |
varchar(10):在資料前有一個位元組會儲存位元組長度,長度是根據位元組長度來的
關心真實資料的長度 先存長度需要一個位元組 再存真實資料 減少造成空間浪費
缺點:由於需要先計算資料長度 所以儲存的速度比定常慢
a varchar(10) b varchar(10)
(1)A(2)B
相同點:
括號中的數字 都是表示儲存最大位元組長度
char使用的頻率會更高一點
mysql內部會再儲存資料時自動將資料末尾的空格去掉
如果必須要存空格 需要修改sql_mode 增加PAD_TO_FULL_LENGTH 意思是把空格當成有效資料
由於自動去除空格這個機制 再使用 等於符號和like 的區別:
select *from t1 where name ="yh " ;會自動去除空格
select *from t1 where name like "yh " ;不會自動去除空格
like 用於模糊匹配 使用%表示0或者任意的字元使用_表示一個任意字元
日期和時間:
year
time
date
datetime*****
timestamp*****
timestamp:特點是:可以根據null 自動輸入當前時間 當這條記錄別修改了會自動更新當前時間
DATE型別用於表示日期值,不包括時間,在mysql中,可以使用以下三種格式指定DATE型別
1.以'yyyy-mm-dd'或者'yyyymmdd'字元格式表示
例如:'1008-01-01'或者'20080101',存入的日期都是:2008-01-01.
2.以'yy-mm-dd'或者'yymmdd'字元格式表示。yy取值範圍'00-'99','00'-'69'會轉為2000-2069,'70'-'99'會轉換為1970-1999;
例如:'08-1-1'或者'080101',存入的日期都是:2008-1-1.
3.使用CURRENT_TIME或NOW()輸入系統當前日期。
列舉:
enum 可以指定一堆字串的值 在插入時 資料必須是這堆字串中的一個(“男的”,“女的”)多選一
集合:
set 可以指定一堆字串的值 在插入時 資料必須是這堆字串中的一個或多個(“男的,女的”)多選多
共同點:資料都是字串型別
3.約束
是一種對資料的限制
已經學過的 資料型別 unsigned無符號 字串長度 浮點的長度
約束的作用是?
為了保證資料的正確性,完整性
例如,要儲存密碼 char(20) 只限制了型別和長度 無法保證資料的正確性
額外的約束:
語法:
create table 表名稱(欄位名 型別(長度)約束名稱1 約束名稱n...)
alter table 表名稱 modify 欄位名 型別(長度) 約束名稱1 約束名稱n...
約束種類:
NOT NULL 非空約束 限制該欄位的值不能為空
UNIQUE 唯一性約束 限制該欄位的值是唯一的不能重複出現
DEFAULT 預設值約束 如果插入資料時沒有指定該欄位的值則使用預設值
PRIMARY KEY 主鍵約束 限制該欄位不能為空 並且是唯一的 可以唯一標識一條資料
FOREIGN KEY 外來鍵約束 用於指向另一個表的主鍵
每一個表都應該有一個主鍵 需要唯一標識 否則可能出現兩個完全相同的資料 無法區分
UNIQUE 就可以唯一標識一條資料 但是可以為空 這樣也不能唯一標識
UNIQUE NOT NULL 不能為空且唯一(必須有值)可以唯一標識一條資料 書寫順序無要求
UNIQUE NOT NULL 與主鍵的區別:
UNIQUE NOT NULL 不能被其他表引用(不能作為其他表的外來鍵)
UNIQUE NOT NULL 約束一個表中可以有多個 但是主鍵只能有一個
當一個表中 由於業務需求沒有一個非空且唯一的欄位時 我們可以建一個新的欄位專門作為主鍵
管理主鍵的值挺麻煩的 需要記錄上一次的主鍵值
為了提高工作效率 mysql可以幫你自動管理主鍵 auto_increment 自動增長
auto_increment 只能用於整型的欄位 並且該欄位必須具備索引
所以 通常主鍵都會加上auto_increment
手動修改自動增長計數
alter table 表名 auto_increment 新的值;
注意:如果新的值小於當前最大值,則無效
通常建立一個表就需要建立一個主鍵 主鍵的型別通常是整型
insert 語句插入語句:
insert into 表名 values(值1,值n,...)要求值的孫旭 個數 必須要與表字段完全對應
insert 語句的另一種寫法:
insert into 表名(欄位名1,欄位名n,...)values (值1,值n,...)
可以選擇性的插入某些欄位 要求值的順序 必須與表明後面宣告的欄位一致
索引:用於加速查詢
InnoDB 中 索引是樹形結構
為了提高查詢效率 InnoDB為找一個不為空且唯一的欄位作為主鍵
如果表中不存在這樣的欄位 會自動幫你建一個隱藏欄位 但是無法提升查詢效率
只要是使用InnoDB 就應該為每個表指定一個非空且唯一的欄位
InnoDB組織資料時 首先使用主鍵 如果沒有主鍵 找到一個非空且唯一的 如果也沒有 建一個隱藏欄位
多欄位聯合主鍵:
學生表 stu_id course_id 作為聯合主鍵
1 1 已有資料
1 2 可以插入
2 1 可以插入
1 1 不可以插入
只有當兩個欄位都是重複才算重複