一.認識數據庫
1.什么是數據庫?
數據庫就是存儲數據的倉庫
存儲數據的方式1
"""
第一天就學習了一種存儲數據的方式 就是變量 然而變量的存儲介質是內存,內存中的數據在斷電后就消失了,無法永久保存
很明顯這是不行的 ,比如用戶剛剛注冊成功的用戶名密碼必須要永久。
"""
存儲數據的方式2
"""
使用文件來存儲數據就可以實現永久存儲,但是文件是存儲於硬盤上的,首先要考慮的就是效率問題一個應用程序之所以效率低就是因為IO操作太多。
另外還需要考慮一個問題:
不可能所有組件運行在同一台計算機上為什么?
一台計算機的性能總歸有上限 例如淘寶雙11 雙12 用一台計算機來做服務器的 配置再高都肯定吃不消,那怎么辦?
"""
計算機的性能進行擴展
"""
1.垂直擴展
不斷的提升硬件性能 不可取
2.橫向擴展 (分布式計算)
添加更多的計算機 將程序的不同組件分別運行在不同的計算機上
帶來的優點:
性能提高 穩定性提高(可拔插式)
現在性能問題已經解決了 通過分布式的方式
但是這些組件雖然分布在各個計算機上 但是它們還是一個整體
也就是說你操作的數據文件還是是同一份
默認情況下 程序能訪問的數據 但是只有當前計算機。
"""
訪問不同計算機上的文件數據
"""
如何能訪問別的計算機上的文件呢?
只有一種辦法,通過網絡 通過網絡把你要什么數據告訴服務器 服務器在通過網絡把你要的數據發送給你,得需要使用socket ,需要配套的來一個服務器端 和 客戶端程序,把客戶端程序分發給各個python程序 python程序通過客戶端來鏈接服務器端 從而完成數據的讀寫
也就是說數據庫本質上就是一套C/S結構的TCP程序
我們完全可以自己來編寫這么一套軟件,但是需要考慮一下幾個問題
1.socket需不需實現並發? 必須要
2.既然是並發 還要考慮線程安全問題? 需要給文件操作加鎖
3.是不是任何計算機請求鏈接我都要接受呢? 不是需要進行用戶認證
4.單純的對本地計算機上的數據進行讀取 速度都是非常慢的硬盤上的數據有尋道尋址時間 平均延遲時間,速度太慢! 要想辦法提高數據的存取效率,通過索引。
到現在我們知道了要開發一款應用程序必須先解決上述四個問題,但是對於每一個公司而言,開發周期是非常重要的,不可能為了開發應用程序而先花大把時間來編寫數據庫程序,這便產生了專門的數據庫軟件廠商。寫出了專門的數據庫軟件。
2.常見數據庫
關系型數據庫
數據庫可以為數據與數據之間建立關聯關系,人是一條數據,他可能關聯着一個工作崗位數據。雙方可以通過自身找到對方。
"""
mysql 免費開源 支持中大型企業
為了防止mysql被閉源 以及 擔心oracle的優化能力
創始人Widenius 另起灶爐 開發了mariaDB mariaDB 完全兼容mysql 使用起來 一模一樣
mysql的一生 坎坎坷坷 先后被 sun - oracle收購
oracle 收費閉源 功能強大 分布式數據庫
SQLServer 微軟生態圈 僅支持 windows系統 太局限
DB2 IMB 開發的數據庫軟件 收費閉源 經常與IMB的機器綁定銷售 打折啥的
非關系型
通關key value存儲數據各個數據之間沒有關系 不是通用性數據庫 有局限性,通常將數據存儲在內存中,以提高速度,所以非關系性數據庫多用於緩存,與關系型數據庫搭配使用。
"""
MongoDB
redis
memcache
總結: 我們通常說的數據庫就是一套軟件 有服務端和客戶端 用來操作服務器端上的文件
3.數據庫相關概念
"""
數據:
用於記錄事物的狀態信息 可以是數字 字符 聲音 圖像等等
如name = jerry
記錄:
一條記錄用於保存一個事物的典型特征 就相當於文件中的一行
如jerry,180,man,帥
表:
本質就是一個文件,創建表的時候其實就是在創建一個文件 ,可以在數據庫目錄下看到
可不可能把所有數據全放到同一個文件里?
為了降低耦合性 方便管理 都應該把數據分門別類 放到不同文件中
庫:
就是一個文件夾
DBMS:
數據庫管理軟件 就是一個套接字服務器端軟件
數據庫服務器:
運行有數據庫管理軟件的計算機
在公司我們開發者關心的部分是哪些?
從庫往上的需要我們關心 DBMS 和 服務器是運維關心的
二.安裝mysql
1.下載安裝包
下載地址:https://dev.mysql.com/downloads/mysql/
下載的時候提供了帶界面的和不帶界面的 用哪個呢?
服務器通常是不帶界面的linux系統,並且熟練掌握SQL語句通常是面試官的基本要求
此處安裝解壓版的,下載對應的32/64位壓縮包,解壓到指定位置即可。
2.mysql目錄解析
"""
bin 執行文件
mysqld 服務器主程序
mysql 無界面的客戶端
data 數據文件
my-default.ini 配置文件模板
3.啟動mysql服務器
注意:5.7后的版本需要先初始化 執行:mysqld --initialize-insecure
'''
啟動服務器
1.運行CMD,通過cd 進入bin目錄
2.執行mysqld就可以啟動服務器,如果報錯的話使用管理員權限來運行CMD
這是一個socket服務器程序 這時候相當於做了一下事情:
啟動服務器socket 並監聽端口 默認綁定當前ip 端口默認3306
啟動客戶端
運行mysql 注意他是一個socket程序 要連接服務器需要ip 和 端口
mysql -h ip -P port -uroot -p 密碼默認為空
看到歡迎界面則說明socket鏈接成功了
執行過程分析:
這個命令提示符本質是什么?
就是一個input
接受一條指令然后發送給服務器
服務器接收到之后呢解析指令
取出你要的數據在send給客戶端
那問題來了 指令肯定不能隨便寫,不然服務器不認識,大家必須得有套規范
就是sql 語句
sql全稱為 結構化查詢語言,是所有非關系型數據庫都支持的語言,學習數據庫很大一部分時間是在學習sql語句。
登錄成功后可以執行一下命令來查看所有存在的數據庫
show databases;
對比data文件夾來看
那在講命令之前呢 思考一下 我們每次要使用mysql都得先cd到這個目錄中非常麻煩
怎么解決呢?
4.加到環境變量
找到安裝目錄,將bin路徑復制填入系統設置的path中即可
命令總結:
mysqld #啟動服務器
啟動客戶端 #mysql -h -P -u -p 本機簡寫 mysql -u -p
#關閉服務器
tasklist | findstr mysqld
taskkill /F /PID 8372
也可以直接退出CMD
5.注冊系統服務
服務器的啟動和關閉都需要執行命令 還是不夠方便 怎么辦呢?
'''
將mysql注冊到系統服務中 mysqld --install
需要注意的是 默認注冊的服務名稱叫做mysql 這與bin下的mysql是兩碼子事,一個系統服務一個是客戶端執行文件
刪除服務 sc delete mysql(服務名)
查看系統服務 運行->services.msc
通常設置為自動啟動。
如果注冊系統服務失敗則可能是因為你之前安裝過mysql 卸載重裝即可。
界面版的安裝失敗也可能是之前安裝了,導致端口占用。
三.修改管理員密碼
現在密碼默認為空 這樣是不安全的
萬一誰過來把你數據刪了 怎么辦?
#修改密碼
在知道原始密碼的情況下可以使用mysqladmin
mysqladmin是一個用於管理數據庫的程序,包括修改密碼,數據備份等
修改密碼:
mysqladmin -uroot -p舊密碼 password 123
警告忽略即可
#破解密碼:
萬一你不小心把密碼忘記了怎么辦? 到公司不可能卸載重裝
這個密碼它肯定要找地方存儲起來 ,那存客戶端還是服務器呢?
服務器 ,那存在內存還是硬盤呢? 必然是硬盤,既然如此,一定有一文件用於存放密碼信息
#方式1:刪除用於記錄用戶密碼數據文件
沒問題 簡單粗暴 但是,這個文件里不只有你的賬號信息 還有別人賬號數據 還有授權相關的數據
所以你最好不要這么干!
那你在思考一下,服務器驗證用戶的本質是什么,是不是讀取一個文件的數據來和你輸入的數據進行對比,
那你可不可以這樣子 我告訴我服務器說你不要去讀那個授權文件,可以!
#方式2: 跳過授權表 進入系統修改授權表推薦
跳過這個操作是服務器相關的操作所以 咱的先關掉服務器重新開 在重新開的時候來告訴它
1.停止服務
2.啟動服務器並添加參數
**mysqld --skip-grant-tables**
3.使用客戶端登錄服務器 執行修改命令 此時不需要輸入密碼
update mysql.user set password = password("123123") where user="root" and host="localhost"**
4.刷新權限
flush privileges
5.命令行中重啟服務器驗證新密碼
四 編碼設置
使用客戶端執行\s 可以查看當前服務器的設置信息
latin1 gbk 就是默認的編碼。 服務器是拉丁 客戶端是 GBK
很顯然要亂碼,我們必須保證編碼方式一致!
如何設置:
在mysql安裝目錄下有個my_default.ini 他就是配置文件,但是他不是正在使用的
而是一個模板文件,我們如果要自己編寫配置文件,需要自己復制一個叫做my.ini的文件來編寫
編寫格式我們已經學習過了
configpaser模塊
[section]
option = value
要設置客戶端的內容就寫在mysql分區
要設置服務器的內容就寫在mysqld分區下
mysql在啟動的時候會自動到安裝目錄下找my.ini文件 找到命令對應的標題加載里面的設置項
測試:在配置文件中加入用戶名密碼配置
[mysql]
user = "root"
pasword = "123"
需要注意的是:mysql mysqld都會來讀取這個文件,對於客戶端和服務器我們需要使用section來區分
# 服務器配置部分
[mysqld]
character-set-server = utf8
# 客戶端mysql配置部分
[mysql]
default-character-set = utf8
# 其余客戶端配置部分
[client]
default-character-set = utf8
注意:修改了mysqld配置需要重啟服務器
五 mac配置
首先明確 配置文件編寫方式相同!
不同的在於:
1.mysql的安裝路徑 mac默認無法修改
位於:/usr/local
使用command + shift + g 來前往
2.配置文件名稱為 my.cnf 需要放在
當出現問題無法修正時可以重裝mysql解決
mac徹底刪除mysql
sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /var/db/receipts/com.mysql.*
windows刪除安裝目錄 刪除系統服務即可
六 基本sql語句
1.庫相關 文件夾
增
create database mydb charset utf8;
查
show databases;
show create databases mydb;
改
alter database mydb charset gbk
刪
drop database mydb;
2.表相關 文件
切換文件夾 (選擇數據庫)
use mydb;
增
create table t1 (id int,name char)
查
show tables;
show create table t1;
desc t1;
改
改字段
alter table 表名 add | modify | drop | change
add 跟 列名和類型
modify 跟 列名 和 類型
drop 跟列名
change 跟 舊列名 新列名 類型
改字符編碼
alter table 表名 default character set gbk
改名稱
rename table tname1 to tname2
刪
drop table 表名
3.記錄相關 一行數據
增
insert into tablename values(data,....),(data)...
查
select id,name from t1;
列名可用*號表示通配符
改
update 表名 set 列名 = 值 where 條件;
可同時修改多個字段,用逗號隔開 列名=值,列名=值...
沒有條件則修改全部
刪
delete from 表名 where 條件;
沒有條件則刪除所有;
重建表,清空所有數據;
truncate table t1;
七 相關規范
字段名 表名 庫名
由 數字 字母 @ $ # _ 組成
不能純數字
不能是mysql關鍵字 如int
八 表的分類(數據存儲引擎)
什么是引擎?
如汽車的發動機
引擎就是一個系統的核心部分
為什么需要分類呢?
發動機分類呢?
分柴油 汽油 電動
各自的使用場景不同
mysql支持的引擎
show engines
不同引擎效果測試 插入數據
mysql系統架構圖
5.6 與 5.7對比
1.需要初始化 mysqld --initialize-insecure
2.密碼字段變成了authentication_string
3.界面安裝的配置文件放到了C:\ProgramData中