1. 程式人生 > 資料庫 >Redis的兩種持久化RDB和AOF

Redis的兩種持久化RDB和AOF

Mysql

1. 資料庫

概念:資料倉庫

作用:儲存資料,管理資料

2.資料庫xxx語言 crud

DDL 定義語言

DML 操作語言

DQL 查詢語言

DCL 控制語言

2.1 操作資料庫

操作資料庫--->操作表--->操作資料

  • 建立資料庫

  • # 如果不存在就建立
    create database if not exists immortal;
    
  • 刪除資料庫

  • # 如果存在則刪除
    drop database if exists immortal;
    
  • 使用資料庫

  • # 使用資料庫
    use mybatis;
    
  • 檢視資料庫

  • # 檢視資料庫
    show databases;
    

2.2 資料庫的列型別

數值

  • tinyint 十分小的資料 1個位元組

  • smallint 較小的資料 2個位元組

  • int 標準的整數 4個位元組 常用的

  • bigint 較大的資料 8個位元組

  • float 浮點數 4個位元組

  • double 浮點數 8個位元組(精度問題)

  • decimal 字串形式的浮點數 金融計算的時候,一般使用decimal

字串

  • char 字串固定大小 0-255
  • varchar 可變字串 0-65535
  • tinytext 微型文字 2^8 -1
  • text 文字 2^16-1

時間跟日期

  • date YYYY-MM-DD
  • time HH:mm:ss
  • datetime YYYY-MM-DD HH:mm:ss 常用
  • timestamp 時間戳 1970.1.1 到現在的毫秒數
  • year 年份

null

  • 沒有值
  • 不要用null進行計算

2.3 資料庫庫的欄位屬性(重點)

Unsigned

  • 無符號整數
  • 聲明瞭該列,不能宣告為負數

Zerofill

  • 0填充
  • 不足的位數,使用0填充 int (3) 5---->(005)

自增

  • 通常理解為自增,自動在上一條的記錄上+1(預設)
  • 通常用來設計唯一的主鍵,必須是整數型別
  • 可以自定義設計主鍵的起始值和步長

Null 和 Not Null

  • 假設設定為Not Null,如果不給賦值,就會報錯
  • Null 如果不填寫值 預設就是Null

預設 Default

  • 設定預設的值
  • 如果不設定值,會有預設的值

2.4 每一個表都必須要有的欄位

id 				主鍵
verison 		樂觀鎖
is_delete		偽刪除		
gmt_create		建立時間
gmt_update		修改時間

2.5 建立表

建立一個學生表

欄位

  • 學號int
  • 密碼 varchar(20)
  • 姓名 varchar(20)
  • 出生日期 datatime
  • 家庭住址 varchar(50)
  • 性別 varchar(2)
  • email varchar(20)
  • AUTO_INCREMENT 自增
  • DEFAULT 預設
  • PRIMARY KEY 主鍵
CREATE TABLE if not exists `NewTable` (
    `id`  int(3) NOT NULL AUTO_INCREMENT COMMENT 'id' ,
    `name`  varchar(20)  NOT NULL DEFAULT '懶得一筆' COMMENT 'name' ,
    `pwd`  varchar(20)  NOT NULL DEFAULT '123456' COMMENT 'password',
    PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci COMMENT='student';
  • 格式

  • CREATE TABLE if not exists 表名(
    	`欄位名` 列型別 屬性 索引 註釋,
        `欄位名` 列型別 屬性 索引 註釋,
        `欄位名` 列型別 屬性 索引 註釋,
        `欄位名` 列型別 屬性 索引 註釋,
    )[表型別][表字符集][註釋]
    
  • 檢視建立資料庫 表的語句

  • # 檢視資料庫建立語句
    show create database mybatis;
    # 檢視資料表建立語句
    show create table student;
    
  • # 查看錶結構  description
    desc student;
    
  • 新手的坑

  • ``用這個符號 不要用 ‘ ’ 這個 他們不一樣 我找了30分鐘 --_--

  • 刪除修改表

  • # 修改表名
    alter table teacher rename as student;
    
  • # 增加表的欄位
    alter table student add age int(3);
    
  • # 修改表的欄位  約束
    alter table student modify age varchar(10);
    
  • # 修改表字段的名字
    alter table student change age address varchar(20);
    
    # 刪除表
    drop table if exists student;
    

    所有的建立和刪除儘量加上判斷 報錯影響心情

2.6 資料庫引擎 engine

  • INNODB 是預設的
  • MYISAM 是早些年使用的
INNODB MYISAM
事務支援 支援事務 不支援事務
資料行鎖定 支援 不支援
外來鍵約束 支援 不支援
全文索引 不支援 支援
表空間的大小 較大 約為2倍 較下小

常規使用操作

  • MYISAM 節約空間,速度較快
  • INNODB 安全性高,事務的處理,多表多使用者的操作

所有的資料檔案都是儲存到data目錄下的

本質上還是檔案儲存

3. Mysql資料管理

3.1 外來鍵(瞭解)

資料庫級別的外來鍵,我們不建議使用,有太多的關聯關係(資料庫過多造成困擾)

阿里開發手冊上有這麼一條

【強制】 不得使用外來鍵於級聯,一切外來鍵概念必須在應用層解決問題
坦白來說
每次刪除或修改都要考慮外來鍵因素,導致開發特別的痛苦

最佳實現

  • 資料庫就是單純的表,只用來儲存資料
  • 我們想使用多張表的資料,想使用外來鍵(用程式去實現)

3.2 DML語言(重要)

資料庫意義,儲存,管理

DML = 資料操作語言

  • insert
  • update
  • delete
操作符 含義 範圍 結果
= 等於 5=8 false
<> 或 != 不等於 5=8 true
< 小於
> 大於
<= 小於等於
>= 大於等於
BETWEENT....and 在某範圍內 5~8
AND && 和 5>8 and 1>2
OR || 或 5>1 or 1>2

3.2.1 插入

# 插入語句格式 insert into 表名(欄位1,欄位2,欄位3)values('值1'),('值2'),('值3');
insert into `student`(`name`)values('immortal');

3.2.2 修改

# 修改語句格式 update 表名 set column_name = 值 where 條件   多個數據逗號隔開
update student set name = '666' where id = 1;

3.2.3 刪除

# 刪除語句格式 delete from 表名 where 條件
delete from `student` where id = 4;

清空 TRUNCATE

  • 作用:完全清空一個數據庫的表,表的結構和索引約束不會變
  • TRUNCATE 會重新設定自增列 ,不會影響事務

3.3 DQL語言 查詢資料

使用頻率最高的語句 語法

image-20201216204740086

3.3.1 指定查詢欄位

select * from 表名;

-- 別名 alias  as
select studentName as name from student;

-- 函式 字串拼接concat(str1, str2,...)
select CONCAT('name:',studentname) as 'new name' from student;

-- 去重 distinct   去除重複的資料
select DISTINCT studentno from result;

-- 檢視當前版本
select version();

-- 還可以用來計算
select 1000*3-1 as result;

-- 學員的成績+1 
SELECT studentno,studentresult,studentresult+1 AS '加分後' FROM result; 

-- 模糊查詢 重點  like   萬用字元%
select studentno,studentname from student WHERE studentname LIKE '張%';

-- 模糊查詢 重點  in   區間
SELECT studentno,studentname,address from student WHERE address IN ('廣東','深圳');

3.3.2 連表查詢

join 對比

7種join理論

操作 描述
inner join 如果表中有一個匹配,就返回行
left join 會在左表返回所有的值,即使右表裡沒有匹配
right join 會在右表返回所有的值,即使左表裡沒有匹配

思路

  • 分析需求,分析欄位來自於那些表(連線查詢)
  • 確定使用哪一種查詢 inner left right
  • 確定交叉點(兩個表那些資料是相同的) ON
  • 判斷的條件

格式

  • SELECT 想要查詢的欄位 表1 連線方式 表2 ON 交叉點 Where 條件

  • SELECT s.studentno,studentname,subjectno,studentresult FROM student s
    LEFT JOIN 
    result r
    ON s.studentno = r.studentno
    WHERE studentresult IS NULL;
    

3.3.3 自連線

把一個表想象成兩個一模一樣的表就好理解了

圖片理解能好一點

3.3.4 分頁和排序

排序

  • ASC升序 DESC 降序

  • -- 格式  ORDER BY 用於排序的欄位 排序方法
    SELECT * FROM `result` ORDER BY studentresult DESC;
    

分頁 緩解資料庫壓力,給使用者更好的體驗

  • Limit LIMIT 起始資料點,顯示資料條數

  • -- 格式 
    SELECT * FROM `result` 
    ORDER BY studentresult ASC
    LIMIT 0,5;
    

    分頁實現

百度圖片使用 瀑布流實現 是刷不完的一直在載入

3.3.5 函式

官方

[]: ""

常用函式

數學運算

  • select ABS(-8);   --絕對值
    
    SELECT CEILING(9.4);     --先上取整
    
    SELECT FLOOR(9.4);       --向下取整
    
    SELECT RAND();   --隨機數
    

字串

  • SELECT CHAR_LENGTH('hello world!')  --字串長度
    
    SELECT CONCAT('hello',' ','world');  --合併字串
    
    SELECT LOWER('Hello World');  --小寫
    
    SELECT UPPER('Hello World');	--大寫
    

時間 日期

  • SELECT CURRENT_DATE();   --獲取當前日期
    
    SELECT NOW();   --獲取當前時間
    
    SELECT SYSDATE(); -- 系統時間
    

3.3.6 聚合函式

函式名稱 描述
COUNT() 計數
SUM() 求和
AVG() 平均值
MAX() 最大
MIN() 最小
...... .......

COUNT();

SELECT COUNT('id') FROM student;  --Count(欄位) 會忽略null值

SELECT COUNT(*) FROM student;     --Count(*)  不會忽略null值

3.3.7 Group By Having

.....

3.4 MD5 加密 (擴充套件)

MD5資訊摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的,可以產生出一個128位(16)的雜湊值(hash value),用於確保資訊傳輸完整一致。MD5由美國密碼學家(Ronald Linn Rivest)設計,於1992年公開,用以取代演算法。這套演算法的程式在 RFC 1321 標準中被加以規範。1996年後該演算法被證實存在弱點,可以被加以破解,對於需要高度安全性的資料,專家一般建議改用其他演算法,如。2004年,證實MD5演算法無法防止碰撞(collision),因此不適用於安全性認證,如公開金鑰認證或是等用途。

MD5由、、MD2改進而來,主要增強演算法複雜度和不可逆性。MD5演算法因其普遍、穩定、快速的特點,仍廣泛應用於普通資料的加密保護領域 [2] 。

-- 加密
UPDATE student SET pwd=MD5(pwd);

3.5 事務

要麼都成功,要麼都失敗

將一組sql 放在一個批次去執行

參考連結

事務原則ACID

  • 原子性(Atomicity)
    • 原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
  • 一致性(Consistency)
    • 事務前後資料的完整性必須保持一致。
  • 隔離性(Isolation) 事務提交
    • 事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作資料所幹擾,多個併發事務之間要相互隔離。
  • 永續性(Durability)
    • 永續性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響

隔離性 產生的問題

  • 髒讀:

    • 指一個事務讀取了另外一個事務未提交的資料。
  • 不可重複讀:

    • 在一個事務內讀取表中的某一行資料,多次讀取結果不同。(這個不一定是錯誤,只是某些場合不對)
  • 虛讀(幻讀)

    • 是指在一個事務內讀取到了別的事務插入的資料,導致前後讀取不一致。
      (一般是行影響,多了一行)
# Mysql 是預設開啟事務自動提交的
# 關閉自動提交
SET autocommit = 0;
# 開啟 預設
SET autocommit = 1;


# 手動處理事務
SET autocommit = 0;
# 開啟事務
start transaction;
insert into grade(gradename)values('研究生');
# 提交: 持久化
commit;
# 回滾: 回到原來的位置
rollback;
# 事務結束
SET autocommit = 1;

3.6 索引

索引的分類

  • 主鍵索引(primary key)
    • 唯一的標識,主鍵不可重複,只能有一個
  • 唯一索引(unique key)
    • 避免重複的列出現,多個列都可以標識 唯一索引
  • 常規索引 (key)
    • 預設的 index 和key 關鍵字來設定
  • 全文索引 (FullText)
    • 在特別資料庫引擎下才有
    • 快速定位資料
  • 太重要 涉及知識面太廣 先停停