1. 程式人生 > 資料庫 >第七篇 SQL從安裝到解除安裝

第七篇 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 即使左表中沒有匹配,也從右表中返回所有的行

img

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 選地址必須先選擇省 在選擇市 在選擇地區 不能直接選擇地區

資料庫三大正規化

  1. 1NF 只要有不重複的組就可以(就是說每一列都不可再分)

  2. 2NF 滿足第一正規化 所有非主屬性都完全依賴於主碼

    1. 包含在任意一個碼中的屬性被稱為主屬性
    2. 解決資料冗餘和插入異常的問題
    3. 你建立一個學生表 關係模型(班級編號,班級名稱,學號,姓名,老師id,老師名稱)這種是不合理的
      1. 通過你的id可以找到你,這是完全依賴,
      2. 通過你可以找到你老師 通過你同班同學一可以找到你老師 這是部分依賴 這種情況就需要分表
    4. 判斷是否屬於2正規化
      1. 第一步:找出資料表中所有的碼。
      2. 第二步:根據第一步所得到的碼,找出所有的主屬性。
      3. 第三步:資料表中,除去所有的主屬性,剩下的就都是非主屬性了。
      4. 第四步:檢視是否存在非主屬性對碼的部分函式依賴
  3. 3NF 滿足第二正規化 所有非主屬性對任何候選碼都不存在傳遞依賴

    1. 解決插入異常,修改異常與刪除異常的問題
    2. 每個屬性都跟主鍵有直接關係而不是間接關係
    3. 你建立一個學生表 關係模型(學號,姓名,年齡,性別,所在院校,院校地址,院校電話)
    4. 你和你學校電話存在傳遞依賴 (間接關係)你-》你學校-》學校電話
  4. BCNF 解決了主屬性對於碼的部分函式依賴與傳遞函式依賴。

    1. 碼的定義 K 確定的情況下,該表除 K 之外的所有屬性的值也就隨之確定,那麼 K 就是碼

    2. 碼有主碼和候選碼 意味著碼存在多個

    3. 滿足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