MYSQL--儲存引擎、資料型別、約束條件、
儲存引擎:
不同的資料應該有不同的處理機制
mysql儲存引擎
Innodb:預設的儲存引擎 查詢速度相比於myisam慢 但是更安全
myisam:mysql老版本用的儲存引擎
memory:記憶體引擎(資料全部存在記憶體中)
blackhole:無論存什麼都立刻消失(黑洞)
show engines;
資料型別:
建立表的完整語法:
create table 表名( 欄位名1 型別[(寬度) 約束條件], 欄位名2 型別[(寬度) 約束條件], 欄位名3 型別[(寬度) 約束條件] );
注意:
1、欄位名和欄位型別都是必須的 中括號內的引數都是可選的引數
2、同一張表中欄位名不能重複
3、最後一個欄位後面不能加括號
寬度:(使用資料庫的準則:儘可能讓它少幹活)
對儲存資料的限制
char(1) 只能存一個字元如果超過了mysql會自動幫你擷取或者直接報錯(mysql中的嚴格模式)
alter table tablename modify name char not null; not null(該欄位不能為空)
型別和中括號內的約束:
型別約束的是資料的儲存型別
而約束是基於型別之上的額外的限制
欄位型別:
整形: SMALLINT TINYINT INT BIGINT
=================有符號:預設有符號,即數字前有正負號=========== create table t1(id tinyint); insert into t1 values(-128); #插入成功 insert into t1 values(-129); #插入失敗,5.7版本報錯:ERROR 1264 (22003): Out of range value for column 'id' at row 1。之前版本不會報錯,會將 -129 存成 -128 insert into t1 values(127); #插入成功 insert into t1 values(128); #插入失敗,5.7版本報錯。之前版本不會報錯,會將128存成127 ===================無符號:範圍在 0~255====================== create table t2(id tinyint unsigned); insert into t2 values(-1); 插入失敗,5.7之前版本會將 -1 存成 0。 其餘結果就不一一演示了。 ===================zerofill測試整數型別的顯示寬度=============================== mysql> insert into zerofilltable values(1),(11),(111),(1111) mysql> select * from zerofilltable; +------+ | id | +------+ | 001 | | 011 | | 111 | | 1111 | +------+ 4 rows in set (0.00 sec)
TINYINT:預設是帶有符號的(-128,127),超出這個限制之後會存最大值或最小值
create table tablename(id TINYINT);
not null 不能為空
unsigned 無正負符號
zerofill 0填充多餘的位數
char後面的數字是用來限制儲存資料的長度的
特例:只有整型後面的數字不是用來限制儲存資料的長度的 而是用來控制展示資料的位數的
int(8) 夠/超8位有幾位存幾位,不夠8位就用空格填充
強調:對於整型來說,資料型別後的寬度並不是儲存限制,而是限時限制,所以在建立表的時候,如果欄位採用的是int型別,完全可以不指定限時寬度,預設的限時寬度,足夠顯示完整當初存放的資料
模糊匹配:
like
%:匹配任意多個字元
_:匹配任意一個字元
set session 臨時有效 只在你當前操作的視窗有效
set global全域性有效 終生有效
設定完成之後,你需要重新退出再次登陸就OK了
浮點型
float(255,30) 總共255位 小數部分佔30位
double(255,30) 總共255位 小數部分佔30位
decimal(65,30) 總共65位 小數部分佔30位
create table t12(id FLOAT(255,30));
create table t13(id DOUBLE(255,30));
create table t14(id DECIMAL(65,30));
精確度:float < double < decimal
字元型別
char(4):最大隻能存4個字元超出就會直接報錯 如果少了 會自動用空格填充
varchar(4):最大隻能存4個字元 超出就會直接報錯 如果少了 有幾個就存幾個
create table t15(name char(4));
create table t16(name varchar(4));
char_length():
msyq在儲存char型別欄位的時候 硬碟上確確實實存在的是固定長度的資料,但是在取出來的那一瞬間,mysql就會自動將填充的空格去除(可以通過嚴格模式,來修改該機制 讓其不做自動去處處理)
char與varchar的區別:
char取的時候方便直接按固定的長度取就可以
varchar:取得時候比較繁瑣,無法是知道資料到底有多長
char定長:
1、浪費空間
2、存取速度快
varchar變長:
1、節省空間
2、存取速度慢(相對於char比較慢)
存的時候 需要先給資料一個記錄長度的報頭
取的時候 需要先讀取報頭才能讀取真是資料
日期型別
mysql> create table t2(d date, t time, dt datetime); Query OK, 0 rows affected (0.03 sec) mysql> insert into t2 values(now(), now(), now()); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> select * from t2; +------------+----------+---------------------+ | d | t | dt | +------------+----------+---------------------+ | 2019-08-19 | 23:32:13 | 2019-08-19 23:32:13 | +------------+----------+---------------------+ 1 row in set (0.00 sec) ==============================================timestamp================================== mysql> create table t3(timestamp_ timestamp); Query OK, 0 rows affected (0.02 sec) mysql> insert into t3 values(now()); Query OK, 1 row affected (0.01 sec) mysql> select * from t3; +---------------------+ | timestamp_ | +---------------------+ | 2019-08-19 23:35:12 | +---------------------+ 1 row in set (0.00 sec) ==============================================year======================================= mysql> insert into t1 values(now()); Query OK, 1 row affected (0.00 sec) mysql> select * from t1; +-----------+ | born_year | +-----------+ | 2001 | | 1990 | | 2017 | | 2019 | +-----------+ 4 rows in set (0.00 sec) 1. 單獨插入時間時,需要以字串的形式,按照對應的格式插入 2. 插入年份時,儘量使用4位值 3. 插入兩位年份時,<=69,以20開頭,比如50, 結果2050 >=70,以19開頭,比如71,結果1971 MariaDB [db1]> create table t12(y year); MariaDB [db1]> insert into t12 values -> (50), -> (71); MariaDB [db1]> select * from t12; +------+ | y | +------+ | 2050 | | 1971 | +------+
date:年月日
datetime:年月日時分秒
year:年
time:時分秒
列舉和集合型別
列舉:enum限制某個欄位能夠儲存的資料型別
mysql> create table shirts( -> name varchar(40), -> size enum('s', 'l', 'x', 'xxl')); Query OK, 0 rows affected (0.02 sec) mysql> insert into shirts values('dress', 's'), ('youyiku', 'x'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from shirts; +---------+------+ | name | size | +---------+------+ | dress | s | | youyiku | x | +---------+------+ 2 rows in set (0.00 sec) =====================================只插入一個值==================================== mysql> insert into shirts(name) values('haha'); Query OK, 1 row affected (0.00 sec) mysql> select * from shirts; +---------+------+ | name | size | +---------+------+ | dress | s | | youyiku | x | | haha | NULL | +---------+------+ 3 rows in set (0.00 sec) ===========================列舉型別不一致會報錯========================================= mysql> insert into shirts values('der', 'asd'); ERROR 1265 (01000): Data truncated for column 'size' at row 1
集合:set限制某個欄位能夠儲存的資料內容
mysql> create table teacher( -> id int, -> name char(16), -> gender enum('male', 'female', 'others'), -> hobby set('pingpang', 'basketball', 'soccer')); Query OK, 0 rows affected (0.02 sec) =========================插入========================= mysql> insert into teacher values(1, 'egon', 'male', 'soccer,pingpang'); Query OK, 1 row affected (0.00 sec) 注意:插入的時候,set多選的值之間不能有其他的東西,如多了個空格之類的神奇玩意; ========================查詢==================== mysql> select * from teacher; +------+------+--------+-----------------+ | id | name | gender | hobby | +------+------+--------+-----------------+ | 1 | NULL | female | soccer | | 1 | egon | male | soccer | | 1 | egon | male | pingpang,soccer | +------+------+--------+-----------------+ 3 rows in set (0.00 sec)
約束條件:
not null:不能為空
unique:唯一
單列唯一:
限時某一個欄位是唯一的
聯合唯一:
在語句的最後用括號的形式,表示哪幾個欄位組合的結果是唯一的
default:給某個欄位設定預設值(當用戶寫了就用寫的,沒有的話就用預設的)
create table t17(id int,name char(16) default 'william
primary key:主鍵
限制效果跟not null + unique 組合效果一致 非空且唯一
create table t18(id int primary key);
primary key也是innodb引擎查詢必備的索引,索引可以當成書的目錄
innodb引擎在建立表的時候 必須要有一個主鍵,當你沒有指定主鍵的時候:
1、會將非空且唯一的欄位自動升級為主鍵
2、當你的表中沒有任何的約束條件的時候 innodb會採用自己的內部預設的一個主鍵欄位,該主鍵欄位你在查詢的時候是無法使用的,查詢資料的速度就會變得很慢,就好像是一頁一頁翻書
通常每張表都應該有一個id欄位,並且應該將id設定為表的主鍵欄位
聯合主鍵:多個欄位聯合起來作為表的一個主鍵, 本質還是一個主鍵!!!
ps:innodb引擎中一張表有且只有一個主鍵
auto_increment:自動遞增
delete from :僅僅是刪除資料沒 不會重置主鍵
truncate:初始化表 會重置主鍵
&n