1、庫操做
建立庫
create database 庫名(charset utf8 對庫的編碼進行設置,不寫就用默認值)
庫名能夠由字母、數字、下劃線、特殊字符,要區分大小寫,惟一性,不能使用關鍵字,不能用數字開頭,最長128位
查看數據庫
注意:在cmd中輸入指令是不區分大小寫的
show databases; #這查看的是全部的庫
show create database db1; #這是查看指定的庫
select database(); #這是查看當前的庫
選擇數據庫
USE 數據庫名 #至關於在電腦上雙擊文件夾,進入文件夾
刪除數據庫
DROP DATABASE 數據庫名;
修改數據庫
alter database db1 charset utf8; #只能修改庫的編碼格式
2、表操做
一、存儲引擎
存儲引擎就是表的類型,MySQL中根據不一樣的存儲引擎會有不一樣的處理機制,存儲引擎的概念是MySQL裏面纔有的。
1.一、MySQL的一個整個工做流程
1.二、存儲引擎的分類
在cmd中輸入show engines能夠查看全部的引擎,輸入show variables like 'storage_engine%'能夠查看當前使用的引擎。
MyISAM引擎特色:
1.不支持事務
事務是指邏輯上的一組操做,組成這組操做的各個單元,要麼全成功要麼全失敗。
2.表級鎖定
數據更新時鎖定整個表:其鎖定機制是表級鎖定,也就是對錶中的一個數據進行操做都會將這個表鎖定,其餘人不能操做這個表,
這雖然可讓鎖定的實現成本很小可是也同時大大下降了其併發性能。
3.讀寫互相阻塞
不只會在寫入的時候阻塞讀取,MyISAM還會再讀取的時候阻塞寫入,但讀自己並不會阻塞另外的讀。
4.只會緩存索引
MyISAM能夠經過key_buffer_size的值來提升緩存索引,以大大提升訪問性能減小磁盤IO,可是這個緩存區只會緩存索引,而不會緩存數據。
5.讀取速度較快
佔用資源相對較少
6.不支持外鍵約束,但只是全文索引
7.MyISAM引擎是MySQL5.5版本以前的默認引擎,是對最初的ISAM引擎優化的產物。
單一對數據庫的操做可使用MyISAM,就是儘可能純度、純寫
InnoDB引擎
介紹:InnoDB引擎是MySQL數據庫的另外一個重要的存儲引擎,正稱爲目前MySQL AB所發行新版的標準,被包含在全部二進制安裝包裏。
和其餘的存儲引擎相比,InnoDB引擎的優勢是支持兼容ACID的事務(相似於PostGreSQL),以及參數完整性(即對外鍵的支持)。
Oracle公司與2005年10月收購了Innobase。Innobase採用雙認證受權。它使用GNU發行,也容許其餘想將InnoDB結合到商業軟件的團體得到受權。
InnoDB引擎特色:
1.支持事務:支持4個事務隔離界別,支持多版本讀。
2.行級鎖定(更新時通常是鎖定當前行):經過索引實現,全表掃描仍然會是表鎖,注意間隙鎖的影響。
3.讀寫阻塞與事務隔離級別相關(有多個級別,這就不介紹啦~)。
4.具體很是高效的緩存特性:能緩存索引,也能緩存數據。
5.整個表和主鍵與Cluster方式存儲,組成一顆平衡樹。(瞭解)
6.全部SecondaryIndex都會保存主鍵信息。(瞭解)
7.支持分區,表空間,相似oracle數據庫。
8.支持外鍵約束,不支持全文索引(5.5以前),之後的都支持了。
9.和MyISAM引擎比較,InnoDB對硬件資源要求仍是比較高的。
小結:三個重要功能:Supports transactions,row-level locking,and foreign keys
Memory引擎:把數據放在內存中
BLACKHOLE引擎:黑洞引擎,數據放進去就消失
1.三、存儲引擎的使用
create table 表名(id int)engine=InnoDB 在建立表的時候能夠指定引擎
二、建立表
#語法:
create table 表名(字段名1 類型[(寬度) 約束條件],字段名2 類型[(寬度) 約束條件],字段名3 類型[(寬度) 約束條件]);
#注意:
1. 在同一張表中,字段名是不能相同
2. 寬度和約束條件可選、非必須,寬度指的就是字段長度約束,例如:char(10)裏面的10
3. 字段名和類型是必須的
show tables; #這是查看當前庫下的全部表
describe 表名; #也能夠寫成desc 表名,這是查看錶的結構
insert into 表名 values(填對應的數據); #這是向表裏面插入數據
select 表名(字段)from 表名; #這是查看錶中某字段的全部數據
select * from 表名; #這是查看錶中全部字段的全部數據
三、MySQL的基礎數據類型
3.一、整數類型:tinyint,smallint,mediumint,int,bigint
tinyint[(m)] [unsigned] [zerofill]
小整數,數據類型用於保存一些範圍的整數數值範圍:2**8
有符號:-128 ~ 127
無符號:0~ 255
PS: MySQL中無布爾值,使用tinyint(1)構造。
int[(m)][unsigned][zerofill]
整數,數據類型用於保存一些範圍的整數數值範圍:2**32
有符號:-2147483648 ~ 2147483647
無符號:0~ 4294967295
bigint[(m)][unsigned][zerofill]
大整數,數據類型用於保存一些範圍的整數數值範圍: 2**64
有符號: -9223372036854775808 ~ 9223372036854775807
無符號:0 ~ 18446744073709551615
注意:對於整型來講,數據類型後面的寬度並非存儲長度限度,而是顯示長度限制
3.二、浮點型:
1.FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
定義:單精度浮點數(非準確小數值),m是整數部分總個數,d是小數點後個數。m最大值爲255,d最大值爲30,
例如:float(255,30]
有符號: -3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38
無符號: 1.175494351E-38 to 3.402823466E+38
精確度: **** 隨着小數的增多,精度變得不許確 ****
2.DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
定義:雙精度浮點數(非準確小數值),m是整數部分總個數,d是小數點後個數。m最大值也爲255,d最大值也爲30
有符號: -1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308
無符號: 2.2250738585072014E-308 to 1.7976931348623157E+308
精確度:****隨着小數的增多,精度比float要高,但也會變得不許確 ***
3.decimal[(m[,d])] [unsigned] [zerofill]
定義:準確的小數值,m是整數部分總個數(負號不算),d是小數點後個數。 m最大值爲65,d最大值爲30。
比float和double的整數個數少,可是小數位數都是30位
精確度:**** 隨着小數的增多,精度始終準確 ****
對於精確數值計算時須要用此類型,decimal可以存儲精確值的緣由在於其內部按照字符串存儲。
精度從高到低:decimal、double、float
decimal精度高,可是整數位數少,float和double精度低,可是整數位數多,float已經知足絕大多數的場景了,可是什麼導彈、航線等要求精度很是高,
因此仍是須要按照業務場景自行選擇,若是又要精度高又要整數位數多,那麼你能夠直接用字符串來存。
在使用時,m必須大於d,否則會報錯
3.三、日期類型:date,time,datetime,timestamp,year
year:YYYY(範圍:1901/2155)2018
date:YYYY-MM-DD(範圍:1000-01-01/9999-12-31)例:2018-01-01
time:HH:MM:SS(範圍:'-838:59:59'/'838:59:59')例:12:09:32
datetime:YYYY-MM-DD HH:MM:SS(範圍:1000-01-01 00:00:00/9999-12-31 23:59:59 Y)例: 2018-01-01 12:09:32
timestamp:YYYYMMDD HHMMSS(範圍:1970-01-01 00:00:00/2037 年某時)
經常使用寫法:
create table t1(x datetime not null default now()); # 須要指定傳入,空值時默認取當前時間
create table t2(x timestamp); # 無需任何設置,在傳空值的狀況下自動傳入當前時間
3.四、字符串類型
CHAR 和 VARCHAR 是最常使用的兩種字符串類型。
CHAR(N)用來保存固定長度的字符串,對於 CHAR 類型,N 的範圍 爲 0 ~ 255
VARCHAR(N)用來保存變長字符類型,對於 VARCHAR 類型,N 的範圍爲 0 ~ 65 535
CHAR(N)和 VARCHAR(N) 中的 N 都表明字符長度,而非字節長度。#CHAR類型
對於 CHAR 類型的字符串,MySQL 數據庫會自動對存儲列的右邊進行填充(Right Padded)操做,直到字符串達到指定的長度 N。
而在讀取該列時,MySQL 數據庫會自動將填充的字符刪除。咱們能夠把sql——mode設置爲 PAD_CHAR_TO_ FULL_LENGTH,就會顯示填充的字符。
#VARCHAR類型
VARCHAR 類型存儲變長字段的字符類型,與 CHAR 類型不一樣的是,其存儲時須要在前綴長度列表加上實際存儲的字符,該字符佔用 1 ~ 2 字節的空間。
當存儲的字符串長度小 於 255 字節時,其須要 1 字節的空間,當大於 255 字節時,須要 2 字節的空間。
length(字段) #查看該字段數據的字節長度
char——length(字段) #查看該字段數據的字符長度
3.五、枚舉類型enum和集合類型set
enum:單選,只能在給定的範圍內選一個值
set:多選,能夠在給定的範圍內選擇一個或多個值
示例:
枚舉
CREATE TABLE shirts (name VARCHAR(40),size ENUM('xsmall', 'small', 'medium', 'large', 'x-large'));
INSERT INTO shirts VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');
集合
CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
INSERT INTO myset VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
四、表的完整性約束
4.1 分類
PRIMARY KEY (PK) 標識該字段爲該表的主鍵,能夠惟一的標識記錄
FOREIGN KEY (FK) 標識該字段爲該表的外鍵
NOT NULL 標識該字段不能爲空,不設置默承認覺得空的
UNIQUE KEY (UK) 標識該字段的值是惟一的
AUTO_INCREMENT 標識該字段的值自動增加(整數類型,並且爲主鍵)
DEFAULT 爲該字段設置默認值,不設置默認爲null
UNSIGNED 無符號,不設置默認爲有符號的
ZEROFILL 使用0填充
4.二、not null,default,unique,primary key,unsigned
create table t1(id int unsigned not null default 1) #表示id字段爲無符號,不能夠爲空,默認值爲1
create table t1(id int unique) #表示id字段的值不能重複
create table t1(id int ,name char(10),constraint ak_name unique(name)) #這也表示name不能重複
聯合惟一:
create table t1(id int,name char(10),unique(id,name)) #表示必須不能出現id和name都相同
主鍵:至關於not null + unique
create table t1(id int primary key)
create table t1(id int,name char(10),constriaint pk_name primary key(id) #這是兩種方式均可以設置主鍵,
聯合主鍵:
create table t1(id int,name char(10),primary key(id,name))
4.三、自動增加
create table t1(id int primary key auto_increment,name char(10)
insert into t1(name) values('nnn'),('sss'); #此時沒有輸入id,但id會從1開始自動增加
insert into t1 values(4,'rrr'); #當咱們指定id了,就以指定的爲準
insert into t1(name) values('tt') #如今的id也是自動增加,可是接着上一條的id開始增加
上面插入數據的id分別是:1,2,4,5
對於自動增加的字段,能夠用delete刪除數據,但再插入值時是按照刪除前最後一條數據的id值開始增加
delete from t1
select * from t1; #如今爲空的
insert into t1(name)values('rtsa') #因爲刪除前最後一條id爲5,因此接上,那這一條id爲6
用truncate清空表,在插入數據又是從1開始自增
truncate t1;
insert into t1(name) values('fsdf') #此時的id爲1
在建立表的時候能夠設定自動增加的起始值
create table t1(id int auto_increment,name char(10),auto_increment=3); #這樣設定後,表的自動增加就從3開始
建立表之後,也能夠修改自增起始值
alter table t1 auto_increment=4;
設置步長
set session auto_increment_increment=2; #這是設置會話級別的步長
set global auto_increment_increment=2; #這是設置全局級別的步長
例子:
set global auto_increment_increment=5;
set global auto_increment_offset=3;
最後獲得的自動增加值爲:1,6,11,16.。。。。。
4.四、外鍵foreign key:其實就是代表表與表之間的關係,表與表之間有三種關係,一對一,一對多,多對多,在任何狀況下都得先把‘一’的表(就至關於被指向的表)建立。
一對多關係
先建立‘一’的表,就是dep表
create table dep(id int primary key,name char(10),comment char(10)); #而後插入數據就行
在建立‘多’的表,就是emp表,在emp表中的dep_id,指向的是dep表中的id
create table emp(
id int primary key,
name char(10),
gender enum('male','female'),
dep_id int,
foreign key(dep_id) references dep(id) on delete cascade on update cascade);
一對一關係:就只要把外鍵設爲惟一的就好了
先建立被指向的表,即customer表
create table customer(id int primary key,name char(10),phone int,qq int);
在建立student表,表中的cm_id指向customer表中的id
create table student(
id int primary key,
cname char(10),
class_name,
cm_id int unique,
foreign key(cm_id) references customer(id) on delete cascade on update cascade);
多對多關係:咱們就應該創建第三個表(關聯表)來鏈接連個表的關係
多對多關係表,就應該最後建立關聯表就行,先建立另外兩個表就行,即author表和book表
create table author(id int primary key,name char(10));
create table book(id int primary key,bname char(10),price int);
最後來建立關聯表,即author表
create table author_book(
id int primary key,
author_id int,
book_id int,
foreign key(author_id) references author(id) on delete cascade on update cascade,
foreign key(book_id) references book(id) on delete cascade on update cascade);
注意:咱們通常在建立表的時候最好把id設置爲主鍵,其次是咱們外鍵指向的字段必須是not null + unique的,最後是,
在外鍵的後面加上on delete cascade on update cascade,做用在於外鍵的值會跟隨指向的字段的值改變而改變
五、表的修改alter table
語法:
1. 修改表名
ALTER TABLE 表名 RENAME 新表名
2. 增長字段
ALTER TABLE 表名
ADD 字段名 數據類型 [完整性約束條件…], #注意這裏能夠經過逗號來分割,一下添加多個約束條件
ADD 字段名 數據類型 [完整性約束條件…];
ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件…] FIRST; #添加這個字段的時候,把它放到第一個字段位置去。
ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件…] AFTER 字段名;
#after是放到後的這個字段的後面去了,咱們經過一個first和一個after就能夠將新添加的字段放到表的任意字段位置了。
3. 刪除字段
ALTER TABLE 表名 DROP 字段名;
4. 修改字段
ALTER TABLE 表名 MODIFY 字段名 數據類型 [完整性約束條件…];#modify給字段從新定義類型和約束條件,但已經有主鍵是不能修改,也不須要再寫
ALTER TABLE 表名 CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件…]; #change比modify還多了個更名字的功能,這一句是隻改了一個字段名
ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件…];#這一句除了改了字段名,還改了數據類型、完整性約束等等的內容
5.增長複合主鍵
alter table 表名 add primary key(字段,字段)
6.刪除主鍵
alter table 表名 drop primary key #主鍵只能經過這方式進行刪除
六、複製表
方法一
alter table t2 select * from t1; #複製結構+數據
這種狀況下能夠指定複製表的某些字段,只需把*換成表名(字段)就行,可是不能複製主鍵、外鍵、自動增加約束條件
alter table t2 select * from t1 where 1=0; #由於1=0爲假的,因此找不到對應數據,就只複製結構
方法二
create table t2 like t1;
這種方法只複製結構,沒有數據,但全部的約束條件都複製了
文章轉自Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx