數據庫-基礎概念

一.認識數據庫

1.什麼是數據庫?

數據庫就是存儲數據的倉庫python

存儲數據的方式1

"""
第一天就學習了一種存儲數據的方式 就是變量 然而變量的存儲介質是內存,內存中的數據在斷電後就消失了,沒法永久保存
很明顯這是不行的 ,好比用戶剛剛註冊成功的用戶名密碼必需要永久。
"""

存儲數據的方式2

"""
使用文件來存儲數據就能夠實現永久存儲,可是文件是存儲於硬盤上的,首先要考慮的就是效率問題一個應用程序之因此效率低就是由於IO操做太多。
另外還須要考慮一個問題:
不可能全部組件運行在同一臺計算機上爲何?
一臺計算機的性能總歸有上限  例如淘寶雙11 雙12  用一臺計算機來作服務器的 配置再高都確定吃不消,那怎麼辦?
"""

計算機的性能進行擴展

"""
1.垂直擴展
不斷的提高硬件性能  不可取

2.橫向擴展 (分佈式計算)
添加更多的計算機 將程序的不一樣組件分別運行在不一樣的計算機上
帶來的優勢:
性能提升 穩定性提升(可拔插式)
如今性能問題已經解決了 經過分佈式的方式
可是這些組件雖然分佈在各個計算機上 可是它們仍是一個總體
也就是說你操做的數據文件仍是是同一份
默認狀況下 程序能訪問的數據 可是隻有當前計算機。
"""

訪問不一樣計算機上的文件數據

"""
如何能訪問別的計算機上的文件呢? 
只有一種辦法,經過網絡 經過網絡把你要什麼數據告訴服務器 服務器在經過網絡把你要的數據發送給你,得須要使用socket ,須要配套的來一個服務器端 和 客戶端程序,把客戶端程序分發給各個python程序 python程序經過客戶端來連接服務器端 從而完成數據的讀寫

也就是說數據庫本質上就是一套C/S結構的TCP程序
咱們徹底能夠本身來編寫這麼一套軟件,可是須要考慮一下幾個問題

1.socket需不需實現併發? 必需要
2.既然是併發 還要考慮線程安全問題?     須要給文件操做加鎖 
3.是否是任何計算機請求連接我都要接受呢? 不是須要進行用戶認證 
4.單純的對本地計算機上的數據進行讀取 速度都是很是慢的硬盤上的數據有尋道尋址時間 平均延遲時間,速度太慢! 要想辦法提升數據的存取效率,經過索引。

到如今咱們知道了要開發一款應用程序必須先解決上述四個問題,可是對於每個公司而言,開發週期是很是重要的,不可能爲了開發應用程序而先花大把時間來編寫數據庫程序,這便產生了專門的數據庫軟件廠商。寫出了專門的數據庫軟件。

2.常見數據庫

關係型數據庫

數據庫能夠爲數據與數據之間創建關聯關係,人是一條數據,他可能關聯着一個工做崗位數據。雙方能夠經過自身找到對方。mysql

"""
mysql 免費開源 支持中大型企業
	爲了防止mysql被閉源 以及 擔憂oracle的優化能力
	創始人Widenius 另起竈爐  開發了mariaDB  mariaDB 徹底兼容mysql 使用起來		如出一轍 	
    mysql的一輩子 坎坎坷坷 前後被 sun   - oracle收購
oracle 收費閉源 功能強大 分佈式數據庫 
SQLServer  微軟生態圈 僅支持 windows系統  太侷限  
DB2	IMB 開發的數據庫軟件 收費閉源  常常與IMB的機器綁定銷售  打折啥的

非關係型

通關key value存儲數據各個數據之間沒有關係 不是通用性數據庫 有侷限性,一般將數據存儲在內存中,以提升速度,因此非關係性數據庫多用於緩存,與關係型數據庫搭配使用。linux

"""
MongoDB
redis
memcache

總結: 咱們一般說的數據庫就是一套軟件 有服務端和客戶端 用來操做服務器端上的文件面試

3.數據庫相關概念

"""
數據:
	用於記錄事物的狀態信息 能夠是數字  字符  聲音 圖像等等 
	如name = jerry

記錄:
	一條記錄用於保存一個事物的典型特徵  就至關於文件中的一行
	如jerry,180,man,帥

表:
	本質就是一個文件,建立表的時候其實就是在建立一個文件 ,能夠在數據庫目錄下看到
	可不可能把全部數據全放到同一個文件裏?
	爲了下降耦合性 方便管理 都應該把數據分門別類 放到不一樣文件中 

庫:
	就是一個文件夾

DBMS:	
	數據庫管理軟件 就是一個套接字服務器端軟件

數據庫服務器:
	運行有數據庫管理軟件的計算機
	在公司咱們開發者關心的部分是哪些?
	從庫往上的須要咱們關心  DBMS 和 服務器是運維關心的

二.安裝mysql

1.下載安裝包

下載地址:https://dev.mysql.com/downloads/mysql/redis

下載的時候提供了帶界面的和不帶界面的 用哪一個呢?sql

服務器一般是不帶界面的linux系統,而且熟練掌握SQL語句一般是面試官的基本要求數據庫

此處安裝解壓版的,下載對應的32/64位壓縮包,解壓到指定位置便可。windows

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

不一樣引擎效果測試 插入數據

20180522111034300

mysql系統架構圖

截圖.png

5.6 與 5.7對比

1.須要初始化 mysqld --initialize-insecure

2.密碼字段變成了authentication_string

3.界面安裝的配置文件放到了C:\ProgramData中

相關文章
相關標籤/搜索