MySQL函式、事務、索引、許可權管理和備份、規範資料庫設計
官網:https://dev.mysql.com/doc/refman/8.0/en/built-in-function-reference.html
5.1、常用函式
-- ==============常用函式===============
-- 數字運算
SELECT ABS(-7) -- 絕對值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4) -- 向下取整
SELECT RAND() -- 返回一個0~1之間的隨機數
SELECT SIGN(10) -- 判斷一個數的符號 負數返回-1,正數返回1
-- 字串函式
SELECT CHAR_LENGTH('我愛資料庫') -- 字串長度
SELECT CONCAT('我','愛','你們') -- 拼接字串
SELECT LOWER('ZhangGuorong') -- 小寫字母
SELECT UPPER('ZhangGuorong') -- 大寫字母
SELECT INSERT('我愛程式設計helloWorld',1,2,'超級熱愛') -- 查詢,從某個位置開始替換某個長度
SELECT SUBSTR('榮哥說堅持就能成功',4,6) -- 返回指定的子字串
SELECT REPLACE('榮哥說堅持就能成功','堅持','努力') -- 替換出現的指定字串
SELECT REVERSE('你愛我') -- 反轉
-- 查詢 姓 周的同學 ,把周替換成張
SELECT REPLACE(studentName,'周','張') FROM student
WHERE studentName LIKE '周%'
-- 時間和日期函式 (記住)
SELECT CURRENT_DATE() -- 獲取當前日期
SELECT LOCALTIME() -- 本地時間
SELECT SYSDATE() -- 系統時間
SELECT YEAR(NOW()) -- 顯示當前年份
SELECT DAY(NOW()) -- 天
SELECT SECOND(NOW()) -- 秒
-- 系統
SELECT VERSION()
SELECT USER()
SELECT SYSTEM_USER()
5.2、聚合函式(常用)
函式名稱 | 描述 |
---|---|
count() | 計數 |
sum() | 求和 |
avg() | 平均值 |
max() | 最大值 |
min() | 最小值 |
... | ... |
5.3資料庫級別的MD5加密(擴充套件)
什麼是MD5
主要增強演算法的複雜性和不可逆性
MD5 不可逆,具體的值的 MD5 是一樣的
MD5 破解網站的原理,背後有一個字典,MD5加密後的值,加密前的值
-- 加密
UPDATE student SET pwd=MD5(pwd) WHERE id=1
UPDATE student SET pwd=MD5(pwd) -- 加密全部的密碼
-- 插入的時候加密
INSERT INTO student (`id`,`name`,`pwd`) VALUES('13','胡',MD5('123456'))
-- 如何校驗:將使用者傳遞進來的密碼,進行md5加密,然後比對加密後的值
SELECT * FROM student WHERE `name` = '胡' AND pwd=MD5('123456')
select總結
6、事務
6.1、什麼是事務
要麼都成功,要麼都失敗
事務原則:ACID原則 原子性,一致性,隔離性,永續性 (髒讀,幻讀。。。)
原子性:要麼都成功,要麼都失敗
一致性:事務前後的資料完整性要保證一致
永續性:事務一旦提交則不可逆,被持久化到資料庫中
隔離性:事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務的運算元資料所幹擾,多個併發事務之間要相互隔離
-- 模擬轉賬:事務
SET autocommit = 0 -- 關閉自動提交
START TRANSACTION -- 開啟一個事務
UPDATE `account` SET money = money-500 WHERE `name` = 'A' -- A減500
UPDATE `account` SET money = money+500 WHERE `name` = 'B' -- B加500
COMMIT; -- 提交事務,就被持久化了,這時候在按回滾就回不去了
ROLLBACK; -- 回滾
SET autocommit = 1; -- 恢復預設值
7、索引
MySQL官方對索引的定義為:索引(index)是幫助MySQL高效獲取資料的資料結構。
提取句子主幹,就可以得到索引的本質:索引是資料結構
7.1、索引的分類
在一個表中,主鍵索引只能有一個,唯一索引可以有多個
-
主鍵索引 (PRIMARY KEY)
-
-
唯一的標識,主鍵不可重複,只能有一個列作為主鍵
-
-
唯一索引(UNIQUE KEY)
-
-
避免重複的列出現,唯一索引可以重複,多個列都可以標識位 唯一索引
-
-
常規索引 (KEY/INDEX)
-
-
預設的, index、key關鍵字來設定
-
-
全文索引(FullText)
-
-
在特定的資料庫引擎下才有,MyISAM
-
快速定位資料
-
8、許可權管理和備份
8.1、使用者管理
SQL yog 視覺化管理
SQL命令操作
使用者表:mysql.user
本質:讀這張表進行增刪改查
-- 建立使用者 create user 使用者名稱 identified by '密碼'
CREATE USER kuangshen IDENTIFIED BY '123456'
-- 修改密碼(修改當前使用者密碼)
SET PASSWORD = PASSWORD('123456')
-- 修改密碼(修改指定使用者密碼)
SET PASSWORD FOR kuangshen = PASSWORD('111111')
-- 重新命名
RENAME USER kuangshen TO zhang
-- 使用者授權 all privileges 全部的許可權, 庫.表
-- all privileges 除了給別人授權,其他都能幹
GRANT USER PRIVILEGES ON *.* TO kuangshen2
-- 查詢許可權
SHOW GRANTS FOR kuangshen2 -- 檢視指定使用者許可權
SHOW GRANTS FOR root@localhost
-- ROOT使用者許可權:GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
-- 撤銷許可權 revoke 哪些許可權,在哪個庫撤銷,給誰撤銷
REVOKE ALL PRIVILEGES ON *.* FROM kuangshen2
-- 刪除使用者
DROP USER kuangshen
8.2、MySQL備份
為什麼要備份:
-
保證重要的資料不丟失
-
資料轉移
MySQL資料庫備份的方式
-
直接拷貝物理檔案(在date檔案裡面)
-
在Sqlyog這種視覺化工具中手動匯出
-
-
右鍵點選表,選擇備份或匯出
-
-
使用命令列匯出 mysqldump 命令列使用(cmd)
# mysqldump -h 主機 -u 使用者名稱 -p 密碼 資料庫 表名 >物理磁碟位置/檔名
mysqldump -hlocalhost -uroot -p123456 school student >d:/a.sql
# mysqldump -h 主機 -u 使用者名稱 -p 密碼 資料庫 表1 表2 表3 >物理磁碟位置/檔名
mysqldump -hlocalhost -uroot -p123456 school student >d:/a.sql
# mysqldump -h 主機 -u 使用者名稱 -p 密碼 資料庫>物理磁碟位置/檔名
mysqldump -hlocalhost -uroot -p123456 school>d:/a.sql
#匯入(先在命令列登入資料庫,然後在use 要匯入的資料庫後在執行以下操作)
#登入的情況中,切換到指定的資料庫
#source 備份檔案
1.source d:/a.sql (推薦使用)
2.mysql -u使用者名稱 -p密碼 庫名< 備份檔案(不推薦)
假設你要備份資料庫,防止資料丟失。
9、規範資料庫設計
9.1、為什麼需要設計
當資料庫比較複雜的時候,我們就需要設計了
糟糕的資料庫設計:
-
資料冗餘,浪費空間
-
資料庫插入和刪除都會麻煩、異常【遮蔽使用物理外來鍵】
-
程式的效能差
良好的資料庫設計:
-
節省記憶體空間
-
保證資料庫的完整性
-
方便我們開發系統
軟體開發中,關於資料庫的設計
-
分析需求:分析業務和需要處理的資料庫需求
-
概要設計:設計關係圖E-R圖
9.2、三大正規化
為什麼需要資料規範化?
-
資訊重複
-
更新異常
-
插入異常(無法正常顯示資訊)
-
刪除異常(丟失有效的資訊)
三大正規化(瞭解)
第一正規化(1NF)
原子性:保證每一列不可再分
第二正規化(2NF)
前提:滿足第一正規化
每張表只描述一件事情
第三正規化(3NF)
前提:滿足第一、er正規化
第三正規化需要確保資料表中的每一列資料都和主鍵直接相關,而不能間接相關。
規範性 和 效能的問題
關聯查詢的表不得超過三張表
-
考慮商業化的需求和目標,(成本,使用者體驗!)資料庫的效能更加重要
-
在規範效能的問題的時候,需要適當的考慮以下規範性!
-
故意給某些增加一些冗餘的欄位。(從多表查詢中變為單表查詢)
-
故意增加一些計算列(從大資料量降低為小資料量的查詢:索引)
-