當(dāng)前位置:首頁(yè) > IT技術(shù) > 數(shù)據(jù)庫(kù) > 正文

[數(shù)據(jù)庫(kù) 03] 數(shù)據(jù)操作
2021-11-30 22:52:28

之前都是對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)表進(jìn)行的操作,

之后都是對(duì)表中的數(shù)據(jù)進(jìn)行操作:

MySQL數(shù)據(jù)操作


1. MySQL數(shù)據(jù)管理DML

1. 外鍵(不重要)

  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 `另外表名`(`另外表屬性`) 
  1. 程序級(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更專業(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. 索引分類:

  • 主鍵索引: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類型的索引

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 
-- 撤銷權(quán)限
REVOKE
-- 刪除用戶
DROP USER

2. 數(shù)據(jù)庫(kù)備份

保證數(shù)據(jù)不丟失,數(shù)據(jù)轉(zhuǎn)移

Mysql數(shù)據(jù)庫(kù)備份的方式:

  1. 拷貝物理文件

  2. SQLyog可視化導(dǎo)出

    • 想要導(dǎo)出的表右鍵備份或?qū)С觯?/li>
  3. 命令行導(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/

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >