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