MySQL學習進階
存儲引擎
MyISAMMySQL 5.0 之前的默認數據庫引擎,最為常用。擁有較高的插入,查詢速度,但不支持事務 InnoDB事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定, MySQL 5.5 起成為默認數據庫引擎 ——MyISAM表中在插入式整個表被鎖定.InnoDB只鎖定該記錄.所有如果執行大量的update和insert,應該使用InnoDB;如果主要用來執行select,應該是MyISAM. BDB源 自 Berkeley DB,事務型數據庫的另一種選擇,支持Commit 和Rollback 等其他事務特性 Memory所有數據置於內存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會占用和數據量成正比的內存空間。並且其內容會在 MySQL 重新啟動時丟失 Merge將一定數量的 MyISAM 表聯合而成一個整體,在超大規模數據存儲時很有用 Archive非常適合存儲大量的獨立的,作為歷史記錄的數據。因為它們不經常被讀取。Archive 擁有高效的插入速度,但其對查詢的支持相對較差 Federated將不同的 MySQL 服務器聯合起來,邏輯上組成一個完整的數據庫。非常適合分布式應用 Cluster/NDB高冗余的存儲引擎,用多臺數據機器聯合提供服務以提高整體性能和安全性。適合數據量大,安全和性能要求高的應用 CSV: 邏輯上由逗號分割數據的存儲引擎。它會在數據庫子目錄裏為每個數據表創建一個 .csv 文件。這是一種普通文本文件,每個數據行占用一個文本行。CSV 存儲引擎不支持索引。 BlackHole:黑洞引擎,寫入的任何數據都會消失,一般用於記錄 binlog 做復制的中繼 EXAMPLE 存儲引擎是一個不做任何事情的存根引擎。它的目的是作為 MySQL 源代碼中的一個例子,用來演示如何開始編寫一個新存儲引擎。同樣,它的主要興趣是對開發者。EXAMPLE 存儲引擎不支持編索引。mysql數據類型
(1) 數值類型
(2)字符串類型
(3)日期和時間型
sql語言
約束
約束類型: | 主鍵 | 默認值 | 唯一 | 外鍵 | 非空 |
---|---|---|---|---|---|
關鍵字: | PRIMARY KEY | DEFAULT | UNIQUE | FOREIGN KEY |
NOT NULL |
主鍵(PRIMARY KEY)是用於約束表中的一行,作為這一行的標識符,在一張表中通過主鍵就能準確定位到一行,因此主鍵十分重要。主鍵要求這一行的數據不能有重復且不能為空。
還有一種特殊的主鍵——復合主鍵。主鍵不僅可以是表中的一列,也可以由表中的兩列或多列來共同標識
默認值約束(DEFAULT)規定,當有DEFAULT約束的列,插入數據為空時該怎麽辦。
DEFAULT約束只會在使用INSERT語句(上一實驗介紹過)時體現出來,INSERT語句中,如果被DEFAULT約束的位置沒有值,那麽這個位置將會被DEFAULT的值填充
唯一約束(UNIQUE)比較簡單,它規定一張表中指定的一列的值必須不能有重復值,即這一列每個值都是唯一的。
當INSERT語句新插入的數據和已有數據重復的時候,如果有UNIQUE約束,則INSERT失敗.
外鍵(FOREIGN KEY)既能確保數據完整性,也能表現表之間的關系。
一個表可以有多個外鍵,每個外鍵必須REFERENCES(參考)另一個表的主鍵,被外鍵約束的列,取值必須在它參考的列中有對應值。
在INSERT時,如果被外鍵約束的值沒有在參考列中有對應,比如以下命令,參考列(department表的dpt_name)中沒有dpt3,則INSERT失敗
非空約束(NOT NULL),聽名字就能理解,被非空約束的列,在插入值時必須非空。
在MySQL中違反非空約束,不會報錯,只會有警告.
CREATE DATABASE mysql_shiyan; use mysql_shiyan; CREATE TABLE department ( dpt_name CHAR(20) NOT NULL, people_num INT(10) DEFAULT ‘10‘, CONSTRAINT dpt_pk PRIMARY KEY (dpt_name) ##約束名 dpt_pk 、主鍵約束 ); CREATE TABLE employee ( id INT(10) PRIMARY KEY, name CHAR(20), age INT(10), salary INT(10) NOT NULL, phone INT(12) NOT NULL, in_dpt CHAR(20) NOT NULL, UNIQUE (phone), CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name) ##外鍵約束 ); CREATE TABLE project ( proj_num INT(10) NOT NULL, proj_name CHAR(20) NOT NULL, start_date DATE NOT NULL, end_date DATE DEFAULT ‘2017-08-15‘, of_dpt CHAR(20) REFERENCES department(dpt_name), CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name) );示例
表的操作
1、創建表
CREATE
TABLE
表名 (屬性名 數據類型 [完整性約束條件],
屬性名 數據類型 [完整性約束條件],
屬性名 數據類型 [完整性約束條件])
2、查看表結構
describe 表名
3、查看表結構
show
create
table
表名
show
create
table
表名 \G
4、修改表名
alter
table
舊表名 rename [
to
] 新表名;
5、修改字段的數據類型
alter
table
表名
modify
屬性名 數據類型;
6、修改字段名
alter
table
表名 change 舊屬性名 新屬性名 [新數據類型];
7、增加字段
alter
table
表名
add
屬性名1 數據類型 [完整性約束條件] [
first
]
after
屬性名2;
8、刪除字段
alter
table
表名
drop
屬性名;
9、刪除關聯表
(1)刪除表的外鍵約束外鍵是一個特殊字段,其將某一個表與其父表建立關聯關系。在創建表的時候,外鍵約束就已經設定好了。去掉他們之間的關聯關系需要用到下面語句。
alter
table
表名
drop
foreign
key
外鍵別名;
drop
table
表名;
(3)刪除被其他表關聯的父表
當刪除有關聯關系的表時,用drop table example1 會報錯,原因是有外鍵依賴於該表
例如創建了一個example4表依賴於example1表,example4表的外鍵stu_id依賴於example1表的主鍵。example1表時example4表的父表。
如果要刪除example4表,必須先去掉這種依賴關系。最簡單的辦法是先刪除子表example4,然後刪除父表example1。但這樣可能會影響子表的其他數據。
另一種方法是先刪除子表的外鍵約束,然後刪除父表。這種方法不會影響子表的其他數據,可以保證數據庫的安全。
比如,example4表的外鍵別名是d_fk,刪除example4的外鍵約束
alter
table
example4
drop
foreign
key
d_fk;
可以通過show create table example4 \G來查看是否已刪除。
然後再執行 drop
table
example1;
執行成功則表示操作成功。
幫助
\h 查看幫助
\s 查看當前環境
\c 廢棄當前輸入命令
創建用戶並授權
CREATE USER [email protected] IDENTIFIED BY ‘password‘;
GRANT {ALL | SELECT | INSERT | UPDATE } ON databasename.tablename TO [email protected]
工作中使用的示例:
BEGIN DECLARE win_id VARCHAR(20); DECLARE win_count VARCHAR(20); SELECT id FROM windows_vps_log ORDER BY id DESC LIMIT 1 into win_id; SELECT count(id) FROM windows_vps_log into win_count; IF win_count>5000000 THEN delete from windows_vps_log where id <= win_id-3000000; END IF; END存儲過程
SELECT machine_host, CONCAT(lan_ip, ‘:‘, `port`) AS "問題機", dial_time FROM client_info WHERE mac IN ( SELECT mac FROM windows_vps_log WHERE invalid = 0 AND TIMESTAMPDIFF(MINUTE, create_time, now()) > 180 ) ORDER BY machine_host desc;多表查詢
MySQL學習進階