之前都是對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)表進(jìn)行的操作,
之后都是對(duì)表中的數(shù)據(jù)進(jìn)行操作:
MySQL數(shù)據(jù)操作
1. MySQL數(shù)據(jù)管理DML
1. 外鍵(不重要)
- 數(shù)據(jù)庫(kù)級(jí)別外鍵:不推薦
添加另一個(gè)表中的建過(guò)來(lái):
-- 在創(chuàng)建表()的最后寫(xiě):
key `FK_本表屬性` (`本表屬性`),
constraint `FK_本表屬性` foreign key (`本表屬性`) references `另外表名`(`另外表的屬性`)
或者在表創(chuàng)建之后:
alter table `本表名` add constraint `FK_本表屬性` foreign key(`屬性名`) references `另外表名`(`另外表屬性`)
- 程序級(jí)別外鍵:推薦
2. DML語(yǔ)言(數(shù)據(jù)操作)
插入 insert:
-- 插入一個(gè)值
insert into `表名`(`屬性1`,`屬性2`) values(`屬性1的值`,`屬性2的值`)
-- 插入多行值
insert into `表名`(`屬性1`,`屬性2`) values(`屬性1的值`,`屬性2的值`),(`屬性1的值`,`屬性2的值`)
修改 update:修改數(shù)據(jù)一定要走索引(where后的數(shù)據(jù)是索引,否則事務(wù)未提交走的是表級(jí)鎖
update `表名` set `屬性`="要修改的值" where `key` = 某個(gè)值
-- 修改一行的多個(gè)值
update `表名` set `屬性1`="value1",`屬性2`="value2" where `key` = 某個(gè)值
where后的條件:=, <, >, <>是不等于,between...and...., and, or,
刪除delete:
delete from `表名` where `屬性`=`某個(gè)值`
-- 刪除一張表的記錄,
truncate `表名`
delete table `表名 和 truncate的區(qū)別
truncate更專(zhuān)業(yè),auto_insc等屬性重新計(jì)z數(shù),而delete刪除整張表的記錄時(shí),自增不重新計(jì)數(shù)。truncate不會(huì)影響事務(wù)
使用delete的區(qū)別:
InnoDB:自增存儲(chǔ)在內(nèi)存中,當(dāng)重啟mysql后,自增也從初始值開(kāi)始,mysql80修復(fù)了;
MyISAM: 自增存儲(chǔ)在文件中,重啟mysql也從上一次刪除的后續(xù)值進(jìn)行
2. DQL查詢語(yǔ)句
*** 重要***
select [ALL| DISTINCT] {table.field [as anotherName]} from
table_name
[left|right|inner join table2_name]
-- 順序不能變
[where ]
[group by] -- 指定結(jié)果按照哪幾個(gè)字段分組
[having] -- 過(guò)濾分組的記錄必須滿足的次要條件
[order by]
[limit {offset, row_count}];
1. 查詢 去重
select語(yǔ)句:遠(yuǎn)古筆記
new:
-- 函數(shù)concat(a, b), 可以做連接
select concat("name:", StudentName) as 新名字 from student;
-- 返回的結(jié)果為:
| 新名字|
|name:趙四|
-- select 語(yǔ)句也可以跟計(jì)算、系統(tǒng)變量、version()函數(shù)、等
select version();
select @@auto_increment_increment
2. 條件子句
條件:
where sno >1000 and sno < 2000;
where sno between 1000 and 2000;
where sno >1000 && sno < 2000;
模糊查詢:
where name like '劉%' -- like后面的一定要用單引號(hào)包起來(lái)
_
匹配單個(gè)字符,%
匹配0~多個(gè)字符
in, is null, is not null
3. 聯(lián)表查詢JOIN
內(nèi)連接(兩邊都符合條件)
自連接
外連接(左外,右外)
左外:左表為主表,左表中的數(shù)據(jù)全部出現(xiàn),右邊必須滿足條件,所以左表會(huì)匹配到右表中沒(méi)有的null(對(duì)右表更嚴(yán)格)
4. 分頁(yè) LIMIT 和排序 ORDER BY
分頁(yè):用于前端分頁(yè)顯示
- 緩解數(shù)據(jù)庫(kù)壓力
limit語(yǔ)法:
-- limit 起始值,頁(yè)面展示的數(shù)據(jù)條數(shù)
第n頁(yè):
limit (n-1)*pageSize, pageSize
eg:
1-100個(gè)數(shù)據(jù)
limit 0, 5 -- 第0個(gè)數(shù)據(jù)到第4個(gè)數(shù)據(jù)
limit 5, 5 -- 第5個(gè)數(shù)據(jù)到第9個(gè)數(shù)據(jù)(第二頁(yè))
limit 10,5 -- 第10個(gè)數(shù)據(jù)到第14個(gè)數(shù)據(jù)(第三頁(yè))
5. 子查詢(不用)
本質(zhì):在where語(yǔ)句中,嵌套一個(gè)查詢語(yǔ)句
select from
where xxx = (子查詢語(yǔ)句) -- 先執(zhí)行子查詢,后執(zhí)行外查詢
3. 函數(shù)
1. 常用函數(shù)
-- 數(shù)學(xué)運(yùn)算
select abs(-8) -- 絕對(duì)值
select ceiling(9.4) -- 向上取整(常用),結(jié)果為10
select floor(9.4) -- 向下取整 9
select rand() -- 返回一個(gè)[0,1) 的隨機(jī)數(shù)
-- 字符串
select char_length("") -- 字符串長(zhǎng)度
替換,反轉(zhuǎn),大小寫(xiě),用在操作中
-- 時(shí)間和日期函數(shù)
select current_date() -- 獲取當(dāng)前日期
select now() -- 獲取 YYYY MM DD HH mm ss
select year(now()) -- 獲取年,頁(yè)可以獲得月,日,時(shí),分,秒
-- 系統(tǒng)
select system_user() -- 獲取使用數(shù)據(jù)庫(kù)的用戶
select user() -- 同上
select version()
2. 聚合函數(shù)
遠(yuǎn)古筆記
3. 數(shù)據(jù)庫(kù)級(jí)別MD5加密
message digest algorithm 5th
MD5 不可逆
-- 寫(xiě)法
表: id name pwd
-- 插入時(shí)加密
insert into testTable values (1, "firstName", MD5("123456"))
-- (校驗(yàn)) 對(duì)用戶傳入的數(shù)據(jù)加密,比對(duì)加密后的值, 如果查出來(lái)就匹配
select * from testTable
where name = "xiaoming" and pwd = MD5("用戶的輸入密碼")
4. 事務(wù)
要么都成功,要么都失敗
將一組SQL放到一個(gè)批次中去執(zhí)行
事務(wù)原則:遠(yuǎn)古筆記 ACID
Transaction : 事務(wù)
Atomicity : 要么都成功,要么都失敗
Consistency(最終一致性)事務(wù)前后數(shù)據(jù)完整性保證一致
Isolation :并發(fā)訪問(wèn)時(shí),互不干擾
Durability : 事務(wù)一旦提交,寫(xiě)入數(shù)據(jù)庫(kù)不可逆
事務(wù)級(jí)別:
丟失修改數(shù)據(jù):t1修改,每提交,被t2修改給覆蓋
讀臟數(shù)據(jù):t1修改,沒(méi)有提交的時(shí)候t2讀,t1回滾了,t2讀到臟數(shù)據(jù)
不可重復(fù)讀: t1讀,沒(méi)提交,t2修改,t1發(fā)現(xiàn)前后讀不一致
幻讀:同上,t2修改增加了一列
-- mysql默認(rèn)開(kāi)始事務(wù),如果要手動(dòng)提交事務(wù), 手動(dòng)關(guān)閉:
set autocommit = 0;
-- 事務(wù)開(kāi)啟:
start transaction;
insert ....
insert ...
commit; -- 提交 or
rollback; -- 回滾
-- 事務(wù)結(jié)束
set autocommit = 1;
-- 不重要
savepoint 保存點(diǎn)名
rollback to savepoint 保存點(diǎn)名 -- 也可以設(shè)置保存點(diǎn), 最后回滾到保存點(diǎn)去。(事務(wù)沒(méi)提交,保存點(diǎn)也沒(méi)用)
release savepoint 保存點(diǎn)名 -- 刪除保存點(diǎn)
5. 索引
** B+樹(shù)
兩個(gè)連接:用explain命令查看使用索引時(shí)搜索的行數(shù)(對(duì)比不同)
CodingLabs - MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理
(13條消息) 【MySQL優(yōu)化】——看懂explain_漫漫長(zhǎng)途,終有回轉(zhuǎn);余味苦澀,終有回甘-CSDN博客_explain
索引:幫助Mysql高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),(索引是數(shù)據(jù)結(jié)構(gòu))
1. 索引分類(lèi):
- 主鍵索引:primary key
- 一張表只能由一個(gè)主鍵索引,但主鍵索引可以是多列
- 唯一索引: unique key
- 唯一索引是被索引的列中,不允許有相同的行值;一個(gè)表可以有多個(gè)列是唯一索引
- 常規(guī)索引: key/index
- 默認(rèn)
- 全文索引: FullText
- 特定的引擎才有,MyISAM有
2. 測(cè)試索引:
explain 執(zhí)行語(yǔ)句; -- 可以顯示查詢次數(shù)等
3. 索引原則:
- 索引不是越多越好
- 不要對(duì)經(jīng)常變動(dòng)的數(shù)據(jù)加索引
- 小數(shù)據(jù)量不需要加索引
- 索引一般加在常用來(lái)查詢的字段上。
索引的數(shù)據(jù)結(jié)構(gòu):
Hash類(lèi)型的索引
BTree:InnoDB 默認(rèn)
6. 權(quán)限管理和備份
1. 用戶管理
SQLyog可視化管理:(點(diǎn)擊小人,新建用戶,下一頁(yè)是權(quán)限選擇)
sql管理:找mysql下的user表本質(zhì)還是對(duì)mysql.user進(jìn)行增刪改查
-- 創(chuàng)建一個(gè)用戶
CREATE USER kuangsheng IDENTIFIED BY '123456';
-- 修改密碼
SET PASSWORD = PASSWORD('xinmima') -- 修改當(dāng)前版本密碼
SET PASSWORD FOR kuangsheng = PASSWORD('xinmima') -- 修改某用戶密碼
-- 重命名用戶名
RENAME
-- 用戶授權(quán)
GRANT
-- 撤銷(xiāo)權(quán)限
REVOKE
-- 刪除用戶
DROP USER
2. 數(shù)據(jù)庫(kù)備份
保證數(shù)據(jù)不丟失,數(shù)據(jù)轉(zhuǎn)移
Mysql數(shù)據(jù)庫(kù)備份的方式:
-
拷貝物理文件
-
SQLyog可視化導(dǎo)出
- 想要導(dǎo)出的表右鍵備份或?qū)С觯?/li>
-
命令行導(dǎo)出 mysqldump
# mysqldump -h主機(jī),-u用戶名,-p密碼 ,數(shù)據(jù)庫(kù) 表,> 導(dǎo)出到的地址/文件名 mysqldump -hlocalhost -uroot -p123456 school student > 地址/文件名 # 導(dǎo)入:在cmd中登錄到mysql>下,: source 地址/文件名.sql
7. 數(shù)據(jù)庫(kù)的歸約,三大范式
前端: ant design網(wǎng)站
1NF(原子性):數(shù)據(jù)庫(kù)中每一列都是不可分割的原子數(shù)據(jù)項(xiàng)
2NF:(對(duì)主鍵沒(méi)有部分依賴):每張表只描述一件事情
3NF: (直接依賴, 沒(méi)有傳遞依賴)
規(guī)范性和性能問(wèn)題
本文摘自 :https://www.cnblogs.com/