連接數據庫操作
/*連接mysql*/ mysql -h 地址 -P 端口 -u 用戶名 -p 密碼 例如: mysql -h 127.0.0.1 -P 3306 -u root -p **** /*退出mysql*/ exit;
數據庫操作
#數據庫操作 /*關鍵字:create 創建數據庫(增)*/ create database 數據庫名 [數據庫選項]; 例如: create database test default charset utf8 collate utf8_bin; /*數據庫選項:字符集和校對規則*/ 字符集:一般默認utf8; 校對規則常見: ⑴ci結尾的:不分區大小寫 ⑵cs結尾的:區分大小寫 ⑶bin結尾的:二進制編碼進行比較 /*關鍵字:show 查看當前有哪些數據庫(查)*/ show databases; /*查看數據庫的創建語句*/ show create database 數據庫名; /*關鍵字:alter 修改數據庫的選項信息(改)*/ alter database 數據庫名 [新的數據庫選項]; 例如: alter database test default charset gbk; /*關鍵字:drop 刪除數據庫(刪)*/ drop database 數據庫名; /*關鍵字:use 進入指定的數據庫*/ use 數據庫名;
表的操作
#表的操作 /*關鍵字:create 創建數據表(增)*/ create table 表名( 字段1 字段1類型 [字段選項], 字段2 字段2類型 [字段選項], 字段n 字段n類型 [字段選項] )表選項信息; 例如: create table test( id int(10) unsigned not null auto_increment comment 'id', content varchar(100) not null default '' comment '內容', time int(10) not null default 0 comment '時間', primary key (id) )engine=InnoDB default charset=utf8 comment='測試表'; 語法解析(下文MySQL列屬性單獨解析): 如果不想字段為NULL可以設置字段的屬性為NOT NUL,在操作數據庫時如果輸入該字段的數據為NULL,就會報錯. AUTO_INCREMENT定義列為自增的屬性,一般用於主鍵,數值會自動加1. PRIMARY KEY關鍵字用於定義列為主鍵.可以使用多列來定義主鍵,列間以逗號分隔. ENGINE 設置存儲引擎,CHARSET 設置編碼, comment 備注信息.
/*關鍵字:show 查詢當前數據庫下有哪些數據表(查)*/ show tables; /*關鍵字:like 模糊查詢*/ 通配符:_可以代表任意的單個字符,%可以代表任意的字符 show tables like '模糊查詢表名%'; /*查看表的創建語句*/ show create table 表名; /*查看表的結構*/ desc 表名; /*關鍵字:drop 刪除數據表(刪)*/ drop table [if exists] 表名 例如: drop table if exists test; /*關鍵字:alter 修改表名(改)*/ alter table 舊表名 rename to 新表名;
/*修改列定義*/ /*關鍵字:add 增加一列*/ alter table 表名 add 新列名 字段類型 [字段選項]; 例如: alter table test add name char(10) not null default '' comment '名字';
/*關鍵字:drop 刪除一列*/ alter table 表名 drop 字段名; 例如: alter table test drop content;
/*關鍵字:modify 修改字段類型*/ alter table 表名 modify 字段名 新的字段類型 [新的字段選項]; 例如: alter table test modify name varchar(100) not null default 'admin' comment '修改后名字';
/*關鍵字:first 修改字段排序,把某個字段放在最前面*/ alter table 表名 modify 字段名 字段類型 [字段選項] first; 例如: alter table test modify name varchar(100) not null default 'admin' comment '最前面' first;
/*關鍵字:after 修改字段排序,字段名1放在字段名2的后面*/ alter table 表名 modify 字段名1 字段類型 [字段選項] after 字段名2; 例如: alter table test modify name varchar(100) not null default 'admin' comment 'time字段后面' after time;
/*關鍵字:change 重命名字段*/ alter table 表名 change 原字段名 新字段名 新的字段類型 [新的字段選項]; 例如: alter table test change name username varchar(50) not null default '' comment '用戶名字';
/*修改表選項*/ alter table 表名 表選項信息; 例如: alter table test engine Myisam default charset gbk; --修改存儲引擎和修改表的字符集
數據操作
#數據操作 /*關鍵字:insert 插入數據(增)*/ insert into 表名(字段列表) values(值列表); 例如: create table user( id int(10) unsigned not null auto_increment comment 'id', name char(10) not null default '' comment '名字', age int(3) not null default 0 comment '年齡', primary key (id) )engine=InnoDB default charset=utf8 comment='用戶表'; --插入數據 insert into user(id,name,age) values(1,'admin_a',50); insert into user(name) values('admin_b');
/*關鍵字:select 查詢數據(查)*/ select *[字段列表] from 表名[查詢條件]; 例如: select * from user;--查全部字段用*代替
select name from user where age>0;--查name字段,age大於0
/*關鍵字:delete 刪除數據(刪)*/ delete from 表名[刪除條件]; 例如: delete from user where age<1;--刪除age小於1數據
/*關鍵字:update 修改數據(改)*/ update 表名 set 字段1=新值1,字段n=新值n [修改條件]; 例如: update user set age=100 where name='admin_a';
MySQL數據類型
#MySQL數據類型 /*MySQL三大數據類型:數值型、字符串型和日期時間型*/
/*數值型*/
/*字符串型*/
/*日期時間型*/
MySQL列屬性
#MySQL列屬性 /*null、not null、default、primary key、auto_increment、comment*/ MySQL真正約束字段的是數據類型,但是數據類型的約束太單一,需要有一些額外的約束,來更加保證數據的合法性. MySQL常用列屬性有:null、not null、default、primary key、auto_increment、comment. /*空屬性: null和not null*/ 空屬性: null(空,默認) 和 not null(不為空). mysql數據庫默認字段都是為null的,實際開發過程中盡可能保證所有的數據都不應該為null,空數據沒有意義. 例如: create table test( a int not null, b int ); insert into test (a,b) values(10,null); insert into test (a,b) values(null,10);--報錯
/*默認值: default*/ default: 自定義默認值屬性,通常配合not null一起使用. 例如: create table test1( a int not null default 200, b int ); insert into test1(b) values(20);--或 insert into test1(a,b) values(default,20);
/*主鍵|唯一索引*/ Mysql中提供了多種索引? (下文索引更多解析) 1.主鍵索引:primary key 2.唯一索引:unique key 3.全文索引:fulltext index 4.普通索引:key 或 index 主鍵:primary key 一張表中只能有一個字段可以使用對應的主鍵,用來唯一的約束該字段里面的數據,不能重復和不能為null. 設置主鍵有兩種方式: (1)在定義一個字段的時候直接在后面進行設置primary key 例如: create table test2( id int(10) unsigned not null primary key, name char(20) not null default '' );
(2)定義完字段后再定義主鍵 例如: create table test3( id int(10) unsigned not null, name char(20) not null default '', primary key (id) );
唯一鍵:unique key 解決表中多個字段需要唯一性約束的問題. 例如:create table test4( id int(10) unsigned not null, name char(20) not null default '', goods varchar(100) not null default '', primary key (id), unique key (name,goods) );
/*自動增長: auto_increment*/ 自增長屬性:每次插入記錄的時候,自動的為某個字段的值加1(基於上一個記錄). 通常跟主鍵搭配. 自增長規則:(1)任何一個字段要做自增長前提必須是一個索引 (2)自增長字段必須是整型數字 例如: create table test5( id int(10) unsigned not null auto_increment, name char(20) not null default '', primary key (id) );
/*列描述 comment*/ 列描述(注釋):comment 與其他的注釋符不同之處在於,這里的注釋內容屬於列定義的一部分. 例如:create table user( id int(10) unsigned not null auto_increment comment 'id', name char(20) not null default '' comment '名字', primary key (id) )engine=InnoDB default charset=utf8 comment='用戶表';
索引
#索引 /*索引的概述和優缺點和種類*/ 什么是索引? 索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表里所有記錄的引用指針. 類比理解:數據庫中的索引相當於書籍目錄一樣,能加快數據庫的查詢速度. 沒有索引的情況,數據庫會遍歷全部數據后選擇符合條件的選項. 創建相應的索引,數據庫會直接在索引中查找符合條件的選項. 索引的性質分類: 索引分為聚集索引和非聚集索引兩種,聚集索引是索引中鍵值的邏輯順序決定了表中相應行的物理順序,而非聚集索引是不一樣; 聚集索引能提高多行檢索的速度,而非聚集索引對於單行的檢索很快. 索引的優點: (1)加快數據檢索速度 (創建索引主要原因) (2)創建唯一性索引,保證數據庫表中每一行數據的唯一性 (3)加速表和表之間的連接 (4)使用分組和排序子句對數據檢索時,減少檢索時間 (5)使用索引在查詢的過程中,使用優化隱藏器,提高系統的性能 索引的缺點: (1)創建索引和維護索引要耗費時間,時間隨着數據量的增加而增加 (2)索引需要占用物理空間和數據空間 (3)表中的數據操作插入、刪除、修改, 維護數據速度下降 索引種類 (1)普通索引: 僅加速查詢 (2)唯一索引: 加速查詢 + 列值唯一(可以有null) (3)主鍵索引: 加速查詢 + 列值唯一(不可以有null)+ 表中只有一個 (4)組合索引: 多列值組成一個索引,專門用於組合搜索,其效率大於索引合並 (5)全文索引: 對文本的內容進行分詞,進行搜索 (注意:目前僅有MyISAM引擎支持)
/*創建表時直接指定索引*/ --創建主鍵索引 例如:create table student( id int(10) unsigned not null auto_increment comment 'id主鍵索引', name char(20) not null default '' comment '名字', class varchar(50) not null default '' comment '班級', seat_number smallint(5) not null default 0 comment '座位編號', primary key (id) )engine=InnoDB default charset=utf8 comment='學生表';
/*創建索引*/ create [unique唯一索引][clustered聚集索引] index <索引名> on <表名>(<列名稱>[<排序>],<列名稱>[<排序>]…); 語法解析:其中unique和clustered為可選項. 注意:基本表上最多僅僅能建立一個聚集索引. "列名稱":規定需要索引的列. "排序":可選asc(升序)和desc(降序)缺省值為asc.
--創建唯一索引(unique key 簡寫 unique) 例如:create unique index number on student(seat_number desc);
--創建普通索引 例如:create index name_class on student(name asc,class desc);
/*刪除索引*/ drop index <索引名> on 表名; 例如:drop index number on student;
外鍵
/*外鍵約束: foreign key */ 外鍵約束: foreign key 被約束的表叫做副表,外鍵設置在副表上面,外鍵引用主鍵字段所在的表叫做主表. (作用:約束兩張表的數據) 外鍵定義語法: constraint 外鍵約束名稱 foreign key(外鍵字段) references 主表名稱(引用字段) 外鍵數據操作: 1.當有外鍵約束之后,添加數據的時候,先添加主表數據,再添加副表數據 2.當有了外鍵約束,修改數據的時候,先改副表的數據,在修改主表的數據 3.當有了外鍵約束,刪除數據的時候,也是先刪除副表的數據,再刪除主表的數據
外鍵注意事項: 1.外鍵約束只有InnoDB存儲引擎才支持. 2.實際項目中往往會用到外鍵的設計思想,但往往不會真正的從語法上進行外鍵約束. 因為外鍵約束的級聯操作可能會帶來一些現實的邏輯問題. 另外使用外鍵會較低mysql的效率.
儲存引擎
/*儲存引擎: engine*/ 常見的引擎:Myisam InnoDB BDB Memory Archive 等 不同的引擎在保存表的結構和數據時采用不同的方式? MyISAM表文件含義:.frm表定義,.MYD表數據,.MYI表索引 InnoDB表文件含義:.frm表定義,表數據空間文件(存放表的數據和索引)和日志文件
注意:項目中一般用InnoDB引擎.
MySQL中innodb與myisam的區別 (1):InnoDB支持事物,MyISAM不支持事物 (2):InnoDB支持行級鎖,MyISAM支持表級鎖 (3):InnoDB支持快照數據(MVCC),MyISAM不支持 (4):InnoDB支持外鍵,MyISAM不支持 (5):InnoDB不支持全文索引,MyISAM支持 innodb使用的是行級鎖:只有在增刪改查時匹配的條件字段帶有索引時,innodb才會使用行級鎖.(行級鎖:要為匹配條件字段加索引) innodb使用的是表級鎖:如果增刪改查時匹配的條件字段不帶有索引時,innodb使用的將是表級鎖.(表級鎖:數據庫全表查詢,需要將整張表加鎖,保證查詢匹配的正確性) 觸發讀鎖:就是用select命令時觸發讀鎖. 觸發寫鎖:就是在你使用update,delete,insert時觸發寫鎖,並且使用rollback或commit后解除本次鎖定 更好的區分:讀寫鎖和表級鎖行級鎖. 將讀寫鎖叫做權限鎖(決定了加鎖后用戶有哪些操作權限),將表級鎖行級鎖叫做對象鎖(決定將鎖加在某一行還是整張表) MVCC多版本並發控制,也可稱之為一致性非鎖定讀;它通過行的多版本控制方式來讀取當前執行時間數據庫中的行數據. 實質上使用的是快照數據. 為什么要使用MVCC? 消除鎖的開銷. (如果要保證數據的一致性,最簡單的方式就是對操作數據進行加鎖,但是加鎖不可避免的會有鎖開銷. 所以使用MVCC能避免進行加鎖的方式並提高並發.)
三范式
/*數據庫三范式*/ --建表規范 - 每個表保存一個實體信息 - 每個具有一個ID字段作為主鍵 - ID主鍵 + 原子表 --第一范式 字段不能再分,確保每列保持原子性. --第二范式 滿足第一范式的基礎上,不能有部分依賴. 消除符合組合主鍵(A,B)就可以避免部分依賴. 增加單列關鍵字. --第三范式 滿足第二范式的基礎上,不能有傳遞依賴. 某個字段依賴於主鍵,而有其他字段依賴於該字段. 這就是傳遞依賴. 將一個實體信息的數據放在一個表內實現