一、序言
1、MySQL簡介
本機安裝的是MySQL5.7數據庫,採用離線安裝的方式,筆者打算把數據庫學懂後再升級爲8.0版本的。MySQL其實是一個數據管理系統(DataBase Managment System, DBSM),既包括數據的存儲,又具有有數據的管理功能。MySQL5.7默認的引擎是InnoDB,它提供事務安全的存儲機制。InnoDB通過建立行級鎖來保證事務完整性並以Oracle風格的共享鎖來處理Select語句。一般來說,對於MySQL5.0以上的版本,無須指定數據表的存儲機制,因爲系統默認使用InnoDB存儲機制。除了InnoDB外,MySQL早期的數據庫引擎是MylSAM,它對事物的支持並不好。SQL(Structured Query Language)是結構化查詢語言,是操作和檢索關係數據庫的標準語言。
2、標準SQL的四種類型
1、DQL(Data Query Language)查詢語句:主要由select關鍵字完成,查詢語句是SQL語句中最複雜、功能最豐富的語句。
2、DML(Data Manipulation Language,數據操作語言)語句:主要由insert、update和delete三個關鍵字完成。
3、DDL(Data Definition Language,數據定義語言)語句:主要由create、alter、drop和truncate四個關鍵字完成。
4、DCL(Data Control Language,數據控制語言)語句:主要由grant和revoke兩個關鍵字來完成。
3、啓動、停止MySQL
由於是離線安裝,因此並不支持在CMD命令行輸入“ net start mysql ”這種啓動方式,而是需要去MySQL的bin目錄下找到mysqld.exe程序來運行啓動數據庫;同理,也不支持“ net stop mysql ”這種停止服務的方式,呃,怎麼在bin目錄裏用exe程序來停服我沒用過,在寫這篇筆記時專門查過這個問題,但沒找到答案,所以,我一般都是直接去任務管理器裏結束mysql任務來停服。
4、MySQL數據類型
列類型 |
說明 |
tinyint/smallint/mediumint int/bigint |
1字節/2字節/3字節/4字節/8字節整數,又可分爲有符號和無符號兩種。這些整數類型的區別僅僅是表示的範圍不同。 int默認最多11位, int(2) 必須是2位數字 |
float/double |
單精度、雙精度浮點類型 |
decimal/dec |
精確小數類型,相對於float和double不會產生精度丟失的問題 decimal(6,2) |
date |
日期類型,不能保存時間,當把Java中的Date對象保存到date列時,時間部分丟失 |
time |
時間類型,不能保存日期,當把Java中的Date對象保存到date列時,日期部分丟失 |
datetime |
日期、時間類型 |
timestamp |
時間戳類型 不能沒有值. 默認是系統當前時間. yyyy-MM-dd |
year |
年類型,僅僅保存時間的年份 |
char |
定長字符串類型 char(10) 必須是10個字符的字符串 |
varchar |
可變長度字符串類型 **** varchar(10) 最多10個字符 |
binary |
定長二進制字符串類型,它以二進制形式保存字符串 |
varbinary |
可變長度的二進制字符串類型,它以二進制形式保存字符串 |
tinyblob/blob/ mediumtblob/longblob |
1字節/2字節/3字節/4字節的二進制大對象,可以用於存儲圖片,音樂等二進制數據,分別可存儲255B/64KB/16MB/4GB大小 |
tinytext/text mediumtext/longtext |
1字節/2字節/3字節/4字節的文本對象,可以用於存儲超長的字符串,分別可存儲255B/64KB/16MB/4GB大小的文本 |
一、SQL基礎語句
1、數據庫(database)的基本操作
(1)、查詢(顯示)所有數據庫
show databases;
(2)、創建一個名爲“ review ”的數據庫
create database review;
(3)、刪除名爲“ review ”的數據庫
drop database review;
(4)、如果存在名爲“review”的數據庫,則不創建,否則創建名爲“ review ”的數據庫
create database if not exists review;
(5)、如果存在名爲“review”的數據庫,則刪除它,否則不刪除
drop database if exists review;
(6)、查看當前數據庫下的所有表
show tables;
2、表(table)的定義、修改、刪除等(DDL)
(1)、創建一個名爲“ tstudent ”的表,若不存在,則創建,否則不創建。
create table if not exists tstudent(
sid int primary key auto_increment comment '主鍵',
sname varchar(30) not null comment '姓名',
sgae int(2) comment '年齡',
ssex int(1) comment '性別'
);
(2)、查看錶“ tstudent ”的表結構
desc tstudent;
(3)、查看建表“ tstudent ”的SQL語句
show create table tstudent;
(4)、刪除表“ tstudent ”,若存在則刪除(刪除表裏的數據和表結構)
drop table if exists tstudent;
(5)、UUID函數的用法(其中 “ dual ”是個虛表)
select replace(uuid(),'-','') as uuid from dual;
(6)、給已經建好的表“ tstudent ”新增一個地址的字段
alter table tstudent add(saddr varchar(100) comment '地址');
/**若要增加多個字段,則每個字段結構用逗號隔開**/
(7)、修改“ tstudent ”表裏的“ saddr ”字段的信息爲“ saddress varchar(200) comment '家庭住址' ”
1、change關鍵字和modify關鍵字:
alter table tstudent change saddr saddress varchar(200) comment '家庭住址';
/**change關鍵字在修改表結構時可以修改字段名**/
alter table tstudent modify saddress varchar(150) comment '現住址';
/**modify關鍵字在修改表結構時不能修改字段名,只能修改當前字段的結構**/
(8)、重命名錶“ tstudent ”的名字爲“ t_students ”
alter table tstudent rename to t_students;
(9)、刪除表中“ saddress ”這個字段
alter table tstudent drop saddress;
(10)、一次性刪除表中的所有數據,但不會刪除表結構
truncate table tstudent;
3、表中數據的插入、更新、刪除(DML)
(1)、給表“ tstudent ”裏一次添加一條或多條數據數據
1、添加一條數據
insert into tstudent(sname,sage,ssex,saddr) values('張三',12,'男','山東濟南');
/**爲了性能的優化和後期的維護,建議在插入數據時將需要插入數據的字段依次寫上**/
2、一次添加多條數據,每條數據之間用逗號隔開;因主鍵是自增長,所以在插入時直接給它null
insert into tstudent(sid,sname,sage,ssex,saddr) values(null,'李四',13,'男','山東濟南'),(null,'張麗麗',13,'女','山東臨沂');
(2)、修改表“ tstudent ”裏的信息
1、根據id來修改數據(一次修改一條數據)
update tstudent set sname='小鑫哥',saddr='山東臨沂' where sid=2;
/**若要修改多個字段,則依次用逗號隔開即可**/
2、根據其他條件來修改數據(一次修改多條數據)
update tstudent set ssex='女' where ssex is null;
3、根據模糊匹配條件修改數據(一次修改多條數據)
update tstudent set sage=16 where saddr like '%濟南%';
(3)、刪除表裏的數據
1、此語句爲刪除表裏的所有數據
delete from tstudent;
/**與 truncate table tstudent; 這條語句相比,truncate的執行效率更高,而且會刪除自增長的主鍵的信息**/
2、根據主鍵來刪除一條數據
delete from tstudent where sid=2;
3、根據條件來刪除多條數據
delete from tstudent where sage>13;
(4)、外鍵約束,給city表裏的創建一個pid爲外鍵來自province表裏的pid字段,其中province表叫做主表或父表,city表叫做從表或子表
1、建表時就添加外鍵約束
create table if not exists province(
pid int primary key auto_increment,
pname varchar(10) not null
);
create table if not exists city(
cid int primary key auto_increment,
cname varchar(10) not null,
pid int,
constraint fk_c_p foreign key(pid) references province(pid)
);
2、已經建好表後,再添加約束
alter table city add constraint fk_c_p foreign key (pid) references province(pid);
(5)、插入、修改、刪除具有外鍵的子表或父表
1、插入數據到父表和子表
insert into province values(null,'山東省'),(null,'青海省');
insert into city values(null,'臨沂市',1),(null,'青島市',1);
insert into city values(null,'西寧市',2),(null,'海西市',2);
2、修改子表時,外間那一字段裏的數據只能是父表裏被關聯的數據,若不是,則無法修改和插入
update city set pid=3 where cname='海東市';
3、刪除外鍵約束
alter table city drop foreign key fk_c_p;
/**通過上述語句完成了外鍵約束的刪除操作,但是創建外鍵時自動創建的索引會被保留下來,所以需要通過下面這條語句來刪除索引達到徹底刪除的操作。**/
alter table city drop index fk_c_p;
(6)、級聯更新、刪除子表中外鍵的值
1、創建表時在子表外鍵那一字段後面加上示例中的語句即可設置級聯更新和刪除
create table if not exists province(
pid int primary key auto_increment,
pname varchar(10) not null
);
create table if not exists city(
cid int primary key auto_increment,
cname varchar(10) not null,
pid int,
constraint fk_c_p foreign key(pid) references province(pid) on update cascade on delete set null
);
2、級聯更新
update province set pid=3 where pname='山東省';
/**執行完這條語句後,city表中的pid字段會自動更新,與父表中的pid會保持一致,這就是級聯更新**/
3、級聯刪除
delete from province where pname='青海省';
/**執行完這條語句後,city表中的關聯着‘青海省’pid的外鍵值都將會設置爲null,這就是級聯刪除**/
(7)、級聯操作下的多對多建表和中間表
1、級聯操作裏的多對多建表,role表,power表,t_r_p中間表
create table if not exists role(
rid int primary key auto_increment,
rname varchar(20)
);
create table if not exists power(
pid int primary key auto_increment,
pname varchar(20)
);
create table if not exists t_r_p(
tid int primary key auto_increment,
rid int,
pid int,
constraint fk_t_r foreign key (rid) references role(rid) on update cascade on delete set null,
constraint fk_t_p foreign key (pid) references power(pid) on update cascade on delete set null
);
(8)、索引的建立與刪除。索引是存放在模式中的一個數據庫對象,雖然索引總是從屬於數據表,但它和數據表一樣從屬於數據庫對象。創建索引的唯一作用就是加速對錶的查詢,索引通過使用快速路徑訪問方法來快速定位數據,從而減少了磁盤的I/O。索引作爲數據庫對象,在數據字典中獨立存放,但不能獨立存在,必須從屬於某個表。創建索引有兩種方式:
a、自動:當在表上定義主鍵約束、唯一約束和外鍵約束時,系統會爲該數據列自動創建對應的索引。
b、手動:用戶可以通過 create index from tableName 語句來創建索引。
1、查看“tstudent”表中的索引
show index from tstudent;
2、給某一個創建一個索引,也可以給多個字段創建索引,只需將字段名寫在括號裏,用逗號隔開
create index sname2index on tstudent(sname,sphone);
3、刪除索引
drop index snameindex on tstudent;
(9)、視圖(view)。視圖看上去像一個數據表,但它不是數據表,因爲它並不能存儲數據。視圖只是一個或多個數據表中數據的邏輯顯示,使用視圖有以下幾點好處:
a、可以限制對數據的訪問
b、可以使複雜的查詢變得簡單
c、提供了數據的獨立性
d、提供了對相同數據的不同顯示。
因爲視圖只是數據表中數據的邏輯顯示,即一個查詢結果,所以創建視圖就是建立視圖名和查詢語句的關聯。
1、創建一個視圖
create or replace view nv201
as
select * from tstudent where ssex='女' and sage<=20;
/**視圖裏的數據會根據創建視圖時的where條件隨着原表裏的數據而自動更新,當視圖裏的數據被修改時,則原表裏的數據也會被修改**/
2、查詢視圖裏的數據
select * from nv201;
3、刪除一個視圖
drop view nv201;
4、創建一個視圖,限制更改where條件裏的字段值的視圖,但可以更改where條件之外字段的數據
create or replace view nv202
as
(select * from tstudent where ssex='女' and sage<=20)with check option;
/**若nv202視圖存在,則下面這條語句會執行失敗**/
update tstudent set sage=22 where sage=17;
4、用戶創建與權限控制(DCL)
(1)、創建、刪除一個用戶
1、創建一個名爲“lcx”的用戶,“%”意思是可以在所有主機上登錄這個賬號
create user 'lcx'@'%' identified by '123456';
2、刪除用戶“lcx”
drop user 'lcx'@'%';
(2)、給用戶設置權限,刪除權限
1、給予用戶“lcx”在review庫裏的對tstudent表的select 權限
grant select on review.tstudent to 'lcx'@'%';
2、給“lcx”用戶給予多個權限,中間依次用逗號隔開
grant select,update,delete on review.tstudent to 'lcx'@'%';
3、給“lcx”用戶給予所有權限
grant all on *.* to 'lcx'@'%';
4、給“lcx”用戶給予所有權限以及授權權限,即可以執行“grant....”語句的權限
grant all on *.* to 'lcx'@'%' with grant option;
5、刪除用戶“lcx”在review庫裏的對tstudent表的update權限
revoke update on review.tstudent from 'lcx'@'%';
6、刪除用戶“lcx”的所有權限
revoke all on *.* from 'lcx'@'%';
7、刷新權限,由授權者執行的語句
flush privileges;
(3)、數據庫或表的導入與導出
1、使用CMD窗口導出導入數據庫或數據表
mysqldump -u Bit -pBit review>D:\Test\review.sql
/**導出review這個數據庫(其中第一個“Bit”是用戶名,-p後面的“Bit”是對應的密碼“>”後面是本地路徑)**/
mysqldump -u Bit -pBit review city>D:\Test\review_city.sql
/**導出review這個庫裏的city表的數據**/
2、導入剛纔導出的數據(必須要登錄到數據庫後,創建一個新庫,然後執行以下命令)
source D:\Test\review.sql;