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語言 查詢資料
使用頻率最高的語句 語法
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)
- 在特別資料庫引擎下才有
- 快速定位資料
- 太重要 涉及知識面太廣 先停停