第七篇 SQL從安裝到解除安裝
什麼是資料庫
資料庫 DataBase 簡稱db
資料庫管理系統 DataBase Management System 簡稱DBMS
sql是非過程化語言
建立時間和更新時間的預設值 CURRENT_TIMESTAMP
資料庫設計過程階段
按照規範的設計方法,一個完成的資料庫設計一般分為以下六個階段: 1. 需求分析: 分析使用者的需求,包括資料、功能和效能需求; 2. 概念結構設計:主要採用E-R模型進行設計,包括畫E-R圖; 3. 邏輯結構設計:通過將E-R圖轉換成表,實現從E-R模型到關係模型的轉換,進行關係規範化; 4. 資料庫物理設計:主要是為所設計的資料庫選擇合適的儲存結構和儲存路徑; 5. 資料庫的實施:包括程式設計、測試和試執行; 6. 資料庫執行和維護:系統的執行和資料庫的日常維護
完整性描述
實體完整性指表中行的完整性
域完整性指列的值域的完整性,如資料型別、格式、值域範圍、是否允許空值等等
參照完整性基於外來鍵與被引用主鍵之間的關係,確保鍵值在所有表中的一致性
三個模式
在資料庫的三級模式結構中:
模式也稱為邏輯模式或概念模式;
外模式也稱為使用者模式;
內模式也稱為物理模式或儲存模式。
三個模型
層次模型:用樹狀<層次>結構來組織資料的資料模型
網狀模型:用有向圖表示實體和實體之間的聯絡的資料結構模型
關係模型:使用表格表示實體和實體之間關係的資料模型
資料表的邏輯運算
投影得到元組 選取得到列 連線在多個關係的笛卡爾積中進行篩選出的新關係 交運算是多個關係之間交集所產生的新的關係。
下載安裝
軟體下載
步驟
1、下載後得到zip壓縮包.
2、解壓到自己想要安裝到的目錄,
3、新增環境變數:我的電腦->屬性->高階->環境變數
選擇PATH,在其後面新增: 你的mysql 安裝檔案下面的bin資料夾
4、編輯 my.ini 檔案 ,注意替換路徑位置
[mysqld]
basedir=D:\Program Files\mysql-5.7\
datadir=D:\Program Files\mysql-5.7\data\
port=3306
skip-grant-tables
5、啟動管理員模式下的CMD,並將路徑切換至mysql下的bin目錄,然後輸入mysqld –install (安裝mysql)
6、再輸入 mysqld --initialize-insecure --user=mysql 初始化資料檔案
7、然後再次啟動mysql 然後用命令 mysql –u root –p 進入mysql管理介面(密碼可為空)
8、進入介面後更改root密碼
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
9 重新整理許可權
flush privileges;
10、修改 my.ini檔案刪除最後一句skip-grant-tables
11、重啟mysql即可正常使用
net stop mysql
net start mysql
12、連線上測試出現以下結果就安裝好了
mysql -uroot -p123456
13 連線資料庫語句 : mysql -h 伺服器主機地址 -u 使用者名稱 -p 使用者密碼
基本命令
update user set password=password('123456')where user='root'; --修改密碼
flush privileges; --重新整理資料庫
show databases; --顯示所有資料庫
use dbname; --開啟某個資料庫
show tables; --顯示資料庫mysql中所有的表
describe user; --顯示錶mysql資料庫中user表的列資訊
create database name; --建立資料庫
use databasename; --選擇資料庫
exit; 退出Mysql
sc delete mysql; 清空服務 安裝失敗的時候使用
? 命令關鍵詞
: 尋求幫助
-- 表示註釋
DDL 資料定義語言
建立資料庫
建立資料庫 : create database [if not exists] 資料庫名;
刪除資料庫 : drop database [if exists] 資料庫名; 可選屬性 判斷是否存在
檢視資料庫 : show databases;
使用資料庫 : use 資料庫名;
建立表
sqlyog
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '學號',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名' ,
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密碼',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性別',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '郵箱',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=UTF8
總結
加``是為了防止轉義字元的出現 方式表明未識別
SHOW CREATE DATABASE school --檢視建立資料庫的語句
SHOW CREATE TABLE student --檢視student資料表的定義語句
DESC student --顯示錶的結構
資料欄位型別
UnSigned
- 無符號的
- 宣告該資料列不允許負數 .
ZEROFILL
- 0填充的
- 不足位數的用0來填充 , 如int(3),5則為005Auto_InCrement
- 自動增長的 , 每新增一條資料 , 自動在上一個記錄數上加 1(預設)
- 通常用於設定主鍵 , 且為整數型別
- 可定義起始值和步長
- 當前表設定步長(AUTO_INCREMENT=100) : 隻影響當前表
- SET @@auto_increment_increment=5 ; 影響所有使用自增的表(全域性)
NULL 和 NOT NULL
- 預設為NULL , 即沒有插入該列的數值
- 如果設定為NOT NULL , 則該列必須有值
DEFAULT
- 預設的
- 用於設定預設值
例如,性別欄位,預設為"男" , 否則為 “女” ; 若無指定該列的值 , 則預設值為"男"的值
mysql資料表的型別
經驗
- 使用MyiSAM:節約空間及相應速度
- 適用於InnoDB:安全性 事務處理及多使用者操作資料表
DML資料操作語言
插入資料
INSERT INTO 表名[(欄位1,欄位2,欄位3,…)] VALUES(‘值1’,‘值2’,‘值3’)
INSERT INTO grade(gradename) VALUES (‘大三’),(‘大四’);
外來鍵
CREATE TABLE `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年級ID',
`gradename` VARCHAR(50) NOT NULL COMMENT '年級名稱',
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
修改資料
UPDATE 表名 SET column_name=value [,column_name2=value2,…] [WHERE condition];
UPDATE grade SET gradename = ‘高中’ WHERE gradeid = 1;
where語句
刪除資料
DELETE FROM 表名 [WHERE condition];
– 刪除最後一個數據
DELETE FROM grade WHERE gradeid = 2
Truncate命令
作用:用於完全清空表資料 , 但表結構 , 索引 , 約束等不變 ;
語法:
TRUNCATE [TABLE] table_name;
-- 清空年級表
TRUNCATE grade
區別:注意:區別於DELETE命令
- 相同 : 都能刪除資料 , 不刪除表結構 , 但TRUNCATE速度更快
- 不同 :
- 使用TRUNCATE TABLE 重新設定AUTO_INCREMENT計數器
- 使用TRUNCATE TABLE不會對事務有影響 (事務後面會說
DQL資料查詢語言
select語法
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] -- 聯合查詢
[WHERE ...] -- 指定結果需滿足的條件
[GROUP BY ...] -- 指定結果按照哪幾個欄位來分組
[HAVING] -- 過濾分組的記錄必須滿足的次要條件
[ORDER BY ...] -- 指定查詢記錄按一個或多個條件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];
-- 指定查詢的記錄從哪條至哪條
where邏輯操作符
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-I1s5SigW-1606473148121)(E:/Typora/image/1606395610488.png)]
查詢多個數據
SELECT studentno,studentname FROM student;
統計表中有多少條資料
select count(*) from student
騷操作
發現重複資料 去重
重複的資料只顯示一條
SELECT DISTINCT `StudentNO` FROM result
資料庫表示式
資料庫表示式:文字值 列 Null 函式 計算表示式 系統變數
模糊查詢
between and \ like \ in \ null
模糊搜尋查詢
WHERE studentname LIKE ‘%嘉%’;
查詢學號為1000,1001,1002學生的成績
WHERE studentno IN (1000,1001,1002);
查詢BornDate為空的欄位
WHERE BornDate IS NULL;
as字句取別名
作用:
- 可給資料列取一個新別名
- 可給表取一個新別名
- 可把經計算或總結的結果用另一個新名稱來代替
-- 這裡是為列取別名(當然as關鍵詞可以省略)
SELECT studentno AS 學號,studentname AS 姓名 FROM student;
-- 使用as也可以為表取別名
SELECT studentno AS 學號,studentname AS 姓名 FROM student AS s;
-- 使用as,為查詢結果取一個新名字
-- CONCAT()函式拼接字串
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;
連線查詢
join
- INNER JOIN 如果表中有至少一個匹配,則返回行
- LEFT JOIN 即使右表中沒有匹配,也從左表中返回所有的行
- RIGHT JOIN 即使左表中沒有匹配,也從右表中返回所有的行
key值為兩個表相連的中間值 相等即為連線
select_list 需要查詢的資訊:查詢條件和中間值
TableA A 給表起別名 as可以省略
自連線
先把自己拆成兩個表 然後進行連線查詢(有先行課的情況下需要進行自連結)
複製一份以後 判斷條件 id=他先行課的id
子查詢
在where語句中巢狀一個語句
比較一下連線查詢和子查詢的區別
從裡向外查詢(先執行最裡面在執行外面
分頁和排序
瀑布流:eg:抖音無限往下重新整理
顯示錶中前5條資料
limit 頁數,頁面大小
select * from student limit 0,5
排序
ORDER BY 要排序的欄位 DESC|ASC --降序|升序
mysql函式
常用函式
數學運算
SELECT ABS(-8) --取絕對值
SELECT CTILING(9.4) --向上取整
SELECT FlOOR(9.4) --向下取整
SELECT RAND() --取隨機數
SELECT SIGN(10) --返回一個數的符號 正數返回1 負數返回-1
字串函式
SELECT CHAR_LENGTH('') --返回字串的長度
SELECT CONCAT('我','你') -- 拼接字串
SELECT INSERT('str',1,2,'str1') --從第一個字元開始,將str的兩個字元替換成str1
SELECT LOWER('') --轉換成小寫
SELECT UPPER('') --轉換成大寫
INSTR 返回第一次出現的字串的索引
時間和日期函式
聚合函式
- COUNT() 計數
- count(data) 會忽略所有的null值
- count(*) 計算行數 所有列都會查
- count(1) 計算行數 只會查一列
- SUM() 求和
- AVG() 平均值
- MAX() 最大值
- MIN() 最小值
GROUP BY 欄位名 通過什麼來分組
HAVING 二次過濾
MD5函式
增強演算法複雜度和不可逆性
加密演算法
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id =1
插入時加密
INSERT INTO testmd5 VALUES(4,‘xiaoming’,MD5(‘123456’))
如何校驗 將使用者傳入資料庫的密碼 進行MD5加密
SELECT * FROM testmd5 WHERE `name`='xiaoming' AND pwd=MD5('123456')
事務
將一組sql放在一個批次中去執行,要麼都成功要麼都失敗
CAP原則
1.1 定義
CAP是“Consistency,Avalilability, Partition Tolerance”的一種簡稱,其內容分別是:
(1)強一致性:即在分散式系統中的同一資料多副本情形下,對於資料的更新操作體現出的效果與只有單份資料是一樣的。
(2)可用性:客戶端在任何時刻對大規模資料系統的讀/寫操作都應該保證在限定延時內完成;
(3)分割槽容忍性:在大規模分散式資料系統中,網路分割槽現象,即分割槽間的機器無法進行網路通訊的情況是必然發生的,所以系統應該能夠在這種情況下仍然繼續工作。
對於一個大規模分散式資料系統來說,CAP三要素是不可兼得的,同一系統至多隻能實現其中的兩個,而必須放寬第3個要素來保證其他兩個要素被滿足。一般在網路環境下,執行環境出現網路分割槽是不可避免的,所以系統必須具備分割槽容忍性§特性,所以在一般在這種場景下設計大規模分散式系統時,往往在AP和CP中進行權衡和選擇。
1.2 為什麼分散式環境下CAP三者不可兼得呢?
由於上面已經提到對於分散式環境下,P是必須要有的,所以該問題可以轉化為:如果P已經得到,那麼C和A是否可以兼得?可以分為兩種情況來進行推演:
(1) 如果在這個分散式系統中資料沒有副本,那麼系統必然滿足強一致性條件,因為只有獨本資料,不會出現資料不一致的問題,此時C和P都具備。但是如果某些服務
器宕機,那必然會導致某些資料是不能訪問的,那A就不符合了。
(2) 如果在這個分散式系統中資料是有副本的,那麼如果某些伺服器宕機時,系統還是可以提供服務的,即符合A。但是很難保證資料的一致性,因為宕機的時候,可能
有些資料還沒有拷貝到副本中,那麼副本中提供的資料就不準確了。
所以一般情況下,會根據具體業務來側重於C或者A,對於一致性要求比較高的業務,那麼對訪問延遲時間要求就會低點;對於訪問延時有要求的業務,那麼對於資料一致性要求就會低點。一致性模型主要可以分為下面幾類:強一致性、弱一致性、最終一致性、因果一致性、讀你所寫一致性、會話一致性、單調讀一致性、以及單調寫一致性,所以需要根據不同的業務選擇合適的一致性模型。
ACID原則
(1) 原子性(Atomicity):是指一個事務要麼全部執行,要麼完全不執行。
(2) 一致性(Consistency): 事務在開始和結束時,應該始終滿足一致性約束。比如系統要求A+B=100,那麼事務如果改變了A的數值,則B的數值也要相應修改來滿足這樣一致性要求;與CAP中的C代表的含義是不同的。
最終一致性,銀行轉錢,無論怎麼轉,錢的數量一致,
(3) 隔離性(Isolation):如果有多個事務同時執行,彼此之間不需要知曉對方的存在,而且執行時互不影響,事務之間需要序列化執行,有時間順序。
事務的獨立性,互相隔離,互不干擾
(4) 永續性(Durability):事務的永續性是指事務執行成功以後,對系統狀態的更新是永久的,不會無緣無故回滾撤銷。
沒有提交事務回滾,提交事務不可逆
髒讀:一個事務讀取了另外一個事務未提交的資料 隔離性的問題
不可重複讀:多次讀取結果不同
幻讀:一個事務讀取到了另外一個事務插入的資料,導致前後讀取不一致(一般是行影響 多了一行)
索引
mysql為什麼使用b+樹 減少磁碟訪問 io的問題 優先把根節點載入到記憶體中 載入索引 儘量不要增加樹深
olap 對歷史資料的分析
oltp 傳統的資料庫用的是這個
區域性性原理和磁碟預讀(瞭解) 載入的時候以頁(4k)為單位進行交換 innodb是以塊讀 16k
索引是什麼
儲存引擎:innodb檔案 兩個ibd檔案將資料和索引儲存在一起 聚簇索引
mylsam myd 儲存資料 索引在 myi 非聚簇索引
frm儲存表結構
hash為什麼不行
hash衝突:而且容易造成空間的浪費 進行範圍查詢需要一條條資料進行對比
二叉樹為什麼不行
層級問題(樹太高) io量太大
儘量在開發中sql不要寫*
用二分查詢需要將二叉樹變成二叉搜尋樹 BST-》可是資料如果遞減的話,樹可能就退還成了連結串列,左分支空-》 avl樹 (最長子樹和最短子樹高度相差1)平衡二叉樹-》需要進行樹的旋轉 插入效能低 查詢效能高
紅黑樹
紅黑樹是每個節點都帶有顏色屬性的二叉查詢樹,顏色或紅色或黑色。 [3] 在強制一般要求以外,對於任何有效的紅黑樹我們增加了如下的額外要求:
- 性質1. 節點是紅色或黑色。
- 性質2. 根節點是黑色。
- 性質3.所有葉子都是黑色。(葉子是NUIL節點)
- 性質4. 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
- 性質5… 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
b樹
一層一個根節點下超過兩個元素就往上新增 -》2²-1個值插進來的時候會影響樹高
b+樹
資料都在葉子節點 非葉子節點只儲存key值(索引) 葉子之間是雙向連結串列
概念
索引分類:
根據儲存來分:聚簇索引和非聚簇索引
根據是用來分:
-
主鍵索引 根據主鍵查詢
-
唯一索引 給列新增一個唯一索引 可以根據該列來查詢
-
普通索引 回表 索引覆蓋
-
組合索引 最左匹配:
什麼時候會有索引失效:
- like查詢%開頭
- 組合索引如果中間某一個值進行了範圍查詢也會失效
- 使用函式的時候會失效
- 使用表示式的時候會失效
- 型別不匹配的時候會失效 設及隱式轉換的時候會失效
- 資料量特別大也會失效
- 在某情況下會失效
-
全文索引
回表
當存在主鍵索引和普通索引時,根據普通索引的b+樹找到資料,返回主鍵值,根據主鍵取索引樹找對應的值
索引覆蓋
根據name索引已經查出了資料 不需要在根據age去查這個資料了
索引下推
謂詞下推 join有三種連線方式(瞭解)
1 先從儲存引擎中把所有符合name的資料拉取回來 然後再server層進行age篩選
2 從儲存引擎拉去資料的時候把name和age都做了篩選
最左匹配
eg 選地址必須先選擇省 在選擇市 在選擇地區 不能直接選擇地區
資料庫三大正規化
-
1NF 只要有不重複的組就可以(就是說每一列都不可再分)
-
2NF 滿足第一正規化 所有非主屬性都完全依賴於主碼
- 包含在任意一個碼中的屬性被稱為主屬性
- 解決資料冗餘和插入異常的問題
- 你建立一個學生表 關係模型(班級編號,班級名稱,學號,姓名,老師id,老師名稱)這種是不合理的
- 通過你的id可以找到你,這是完全依賴,
- 通過你可以找到你老師 通過你同班同學一可以找到你老師 這是部分依賴 這種情況就需要分表
- 判斷是否屬於2正規化
- 第一步:找出資料表中所有的碼。
- 第二步:根據第一步所得到的碼,找出所有的主屬性。
- 第三步:資料表中,除去所有的主屬性,剩下的就都是非主屬性了。
- 第四步:檢視是否存在非主屬性對碼的部分函式依賴
-
3NF 滿足第二正規化 所有非主屬性對任何候選碼都不存在傳遞依賴
- 解決插入異常,修改異常與刪除異常的問題
- 每個屬性都跟主鍵有直接關係而不是間接關係
- 你建立一個學生表 關係模型(學號,姓名,年齡,性別,所在院校,院校地址,院校電話)
- 你和你學校電話存在傳遞依賴 (間接關係)你-》你學校-》學校電話
-
BCNF 解決了主屬性對於碼的部分函式依賴與傳遞函式依賴。
-
碼的定義 K 確定的情況下,該表除 K 之外的所有屬性的值也就隨之確定,那麼 K 就是碼
-
碼有主碼和候選碼 意味著碼存在多個
-
滿足BCNF’的條件
1 所有非主屬性對每一個候選鍵都是; 滿足2NF
2 所有的主屬性對每一個不包含它的候選鍵,也是完全函式依賴;
3 沒有任何屬性完全函式依賴於非候選鍵的任何一組屬性。 滿足2NF
-
正規化小結
1NF:關係中的每個屬性都不可分。列的原子性
2NF:消除了非主屬性對於碼(鍵)的部分函式依賴。
3NF:消除了非主屬性對於碼(鍵)的傳遞函式依賴。
BCNF:消除了主屬性對於碼(鍵)的部分或傳遞函式依賴。
exe安裝完全解除安裝
執行安裝mysql-server 右上角安裝程式,點選Remove進行解除安裝。
刪除mysql目錄 C:\Program Files\MySQL
檢查C:\WINDOWS目錄下是否有my.ini檔案,將其刪除 這個檔案不一定存在
win+r,彈出執行程式視窗,然後輸入regedit
刪除 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL
如下兩個key不一定有,沒有就不理了 刪除
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application \MySQL
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL
刪除ProgramData目錄下的檔案 C:\ProgramData\MySQL Server 5.5