數(shù)據(jù)庫的概念和作用

特殊格式數(shù)據(jù)文件的集合就是數(shù)據(jù)庫

我們網(wǎng)頁看到的數(shù)據(jù)展示,其實在數(shù)據(jù)庫里存儲如上面的顯示
數(shù)據(jù)庫特點簡介

數(shù)據(jù)庫分類及特點

數(shù)據(jù)庫某年排行榜,可以看到幾種數(shù)據(jù)庫的排名,關(guān)系型數(shù)據(jù)庫排前
關(guān)系型數(shù)據(jù)庫
通過二維表的方式存儲數(shù)據(jù)


常見如上的關(guān)系型數(shù)據(jù)庫,我們學(xué)習(xí)MySQL數(shù)據(jù)庫,免費(商業(yè)版低收費),而ORACLE全套部署近百萬(安全性高),SQLite是移動端,嵌入式設(shè)備數(shù)據(jù)庫,可以不聯(lián)網(wǎng)運行,最后微軟的SQL Server是收費的而且只能跑在微軟的windows服務(wù)器上。MySQL體積小,速度快,成本低,很多中小型企業(yè)都在使用。
非關(guān)系型數(shù)據(jù)庫

使用Key-value方式存儲,也成NoSQL,常見mongoDB,redis
數(shù)據(jù)庫管理系統(tǒng)

DBMS數(shù)據(jù)庫管理系統(tǒng)分3部分,數(shù)據(jù)庫文件集合,服務(wù)端,客戶端,每個功能如上,關(guān)系圖如下


客戶端給服務(wù)端發(fā)送語句,必須是其聽得懂的SQL語句

SQL結(jié)構(gòu)化查詢語言,幾乎適用于所有關(guān)系型數(shù)據(jù)庫,但是某系細(xì)節(jié)有差異

SQL語句主要分如上5類,DQL數(shù)據(jù)查詢,DML數(shù)據(jù)操作,TPL事務(wù)處理,DCL數(shù)據(jù)控制,DDL數(shù)據(jù)定義,我們學(xué)習(xí)重點是DQL,DML,DDL

上圖又簡介了幾種關(guān)系型數(shù)據(jù)庫,簡單了解下

關(guān)系型數(shù)據(jù)庫,由多張數(shù)據(jù)表構(gòu)成,數(shù)據(jù)表由多個數(shù)據(jù)行構(gòu)成(數(shù)據(jù)行也叫一條數(shù)據(jù)記錄)。按列來看,把每個元素成為屬性或者字段(每列數(shù)據(jù)類型一致)
MYSQL環(huán)境搭建
linux安裝,終端sudo apt-get install mysql-server
啟動MySQL,終端sudo server mysql start(如果是重啟,關(guān)閉start分別換成restart,stop)
查看進程是否有mysql, 終端ps ajx|grep mysql (利用管道過濾,常常查看是否啟動成功)

配置環(huán)境

配置文件可以在/etc/mysql/mysql.conf.d下找到文件mysqld.cnf,可以用cat等命令查看

默認(rèn)配置如上,暫時不用修改,默認(rèn)端口3306,ip默認(rèn)本機ip127.0.0.1
注意啦!以下出現(xiàn)了中坑,本人經(jīng)查詢解決
坑1
視頻提出安裝mysql-server,其實mysql-client也需要一起安裝,
于是我們需要sudo apt-get install mysql-client給虛擬機安裝上客戶端。
于是我們興沖沖的使用mysql -uroot -p然后輸入密碼,哎?怎么不是視頻中的密碼,也不是網(wǎng)上有人說的為空。
/etc/mysql/debian.cnf.我們可以使用cat查看這個文件,找到password的內(nèi)容,然后復(fù)制,是個很長很惡心的密碼,然后用mysql -uroot -p后粘貼這個密碼,登錄成功后,在mysql shell下,執(zhí)行如下命令
> use mysql;
>update mysql.user set authentication_string=password('123456') where user='root'
比如想修改密碼為123456,可以使用如上,或者替換字符串'123456'
最后退出,使用sudo service mysql restart就可以使用自定義的簡單代碼登錄了。
坑2
視頻告訴我們可以按照可視化客戶端navicat,這個瀏覽器搜索安裝就行了,我分別給虛擬機和windows都安裝了一個,先說虛擬機問題吧。選擇下載64位Linux版本安裝,
切換到壓縮文件目錄cd xxx
使用tar -zxvf xxx.gz把文件解壓,然后切換到解壓目錄,使用./start_navicat運行安裝,記得要點2次取消,然后出現(xiàn)試用界面,視頻說會出現(xiàn)亂碼,然后就真的出現(xiàn)了,點開菜單欄倒數(shù)第3個的最后一個項目,這個就是選項,將字體設(shè)置為AR PL UKai ZN,同時也要把字體調(diào)大點,關(guān)閉,再進入就沒亂碼了。
坑3
我給筆記本和臺式都安裝了navicat客戶端,然后連接虛擬機的mysql,密碼明明是對的,卻發(fā)現(xiàn)無法連接,之前的虛擬機上的navicat卻可以連接。
我們進入虛擬機終端客戶端mysql -uroot ?-p
->GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; ? ? ? ? ? ? ? ? ? ? ?(123456根據(jù)你的密碼對應(yīng)上)
->FLUSH PRIVILEGES; (刷新防火墻)
quit或exit退出
打開/etc/mysql/mysql.conf.d/mysqld.cnf,將bind-address=127.0.0.1改為bind-address=0.0.0.0保存
重啟mysql ? ? sudo service mysql restart
然后navicat客戶端就可以連上mysql了
數(shù)據(jù)庫完整性(了解)
為了保證數(shù)據(jù)的正確性,要求數(shù)據(jù)的約束條件


記錄識別唯一,主鍵不為空

域完整性,同一列,數(shù)據(jù)類型一致,要求非空或默認(rèn)值

參照完整性,比如2個表格,一個存的是張三相關(guān),另一個存的是小張相關(guān),如果刪除了張三,小張也應(yīng)該被刪除
自定義完整性:比如性別只能是‘男’或者‘女’,而不能是其他

NAVICAT客戶端使用

連接數(shù)據(jù)庫

我們之前已經(jīng)做過連接了,這里再次介紹下連接的界面,然后連接創(chuàng)建完畢,但是要想連接成功,我們還必須雙擊左側(cè),讓其灰色變綠色,表示真正連接成功
默認(rèn)情況下會在下面顯示4個數(shù)據(jù)庫

創(chuàng)建數(shù)據(jù)庫
右鍵點擊綠色圖標(biāo)點擊新建數(shù)據(jù)庫

彈出新建窗口

我們有3個空可以填,第一個數(shù)據(jù)庫名自己起,但是不要和已有的庫重名,我們起名python,
字符集我們使用utf8,排序規(guī)則使用general ci(以后講),點確定數(shù)據(jù)庫就建立完畢

數(shù)據(jù)庫創(chuàng)建完是灰色的,因為我們并沒有打開,雙擊打開,此時數(shù)據(jù)庫就變成了綠色

我們在新建的python庫表位置右鍵新建表,出現(xiàn)如下圖

比如說我們創(chuàng)建一個字段,名id(注意這里字段名不能用中文),類型int,是不是null勾選作為域完整性約束,我們點了鍵那里,會出現(xiàn)一個鑰匙,此時null也會被自動勾選,這時為主鍵約束,比如該id是自增的,我們還會下面勾選自動遞增

我們選中一行,再加入字段時,按光標(biāo)↓就可以添加,我們輸入字段名name,會發(fā)現(xiàn)自動設(shè)置了類型varchar,長度255表示最多該項有255個字符。

我們點擊保存起名classes,在表下面雙擊就會發(fā)現(xiàn)如下圖,即創(chuàng)建了2列的表

如果我們想修改表,可以使用右鍵-設(shè)計表,又回歸到之前的界面
查看數(shù)據(jù),我們雙擊表就行
增加數(shù)據(jù),我們輸入內(nèi)容,就可以添加數(shù)據(jù),由于id設(shè)置了自動添加,所以我們可以不填,填入name和size,想新出現(xiàn)一行數(shù)據(jù)就按光標(biāo)↓,id自動出現(xiàn)

修改數(shù)據(jù),雙擊屬性單元格,輸入就行
保存表格,點下面√或者CTRL+S

刪除數(shù)據(jù),點擊減號圖標(biāo)

備份數(shù)據(jù)庫
右鍵點擊數(shù)據(jù)庫轉(zhuǎn)儲--結(jié)構(gòu)和數(shù)據(jù)

我們存儲到桌面,就會看見python.sql文件

此時我們可以將文件拷貝給其他工作組同事或者留作備份使用。
如果我們數(shù)據(jù)庫數(shù)據(jù)丟失了,比如我們先在navicat上刪除python數(shù)據(jù)庫,我們可以再新建一個數(shù)據(jù)庫,但是因為是空的,我們可以右鍵點擊數(shù)據(jù)庫選擇運行SQL文件

選擇桌面上的python.sql文件點擊開始,然后需要右鍵關(guān)閉數(shù)據(jù)庫,再雙擊打開,此時會發(fā)現(xiàn)之前的數(shù)據(jù)已經(jīng)成功添加進來
MYSQL數(shù)據(jù)類型


數(shù)值

整形類型
不同數(shù)據(jù)類型存儲長度不一樣(常用TINYINT,INT)
TINYINT 1字節(jié) ?-128到127 ? ? ?無符號0-255
SMALLINT 2字節(jié)-2**15到2**15-1 ?無符號0到2**16-1
MEDIUMINT 3字節(jié)
INT 4字節(jié)
BIGINT 8字節(jié)

浮點型
float和double,分別4到8字節(jié),float到小數(shù)點后6位,double到16位
定義方法float或者double加(總位數(shù),小數(shù)位數(shù)) 如float(5,3) 12.345

定點數(shù)
decimal(總位數(shù),小數(shù)位)需要精確計算小數(shù)時,比如價格等
字符串

char 255個字符
varchar65535個字節(jié)(常用varchar)其他如上圖(第二行應(yīng)該為字符)
text相關(guān)的都是按字節(jié)統(tǒng)計
char和varchar區(qū)別
比如我們使用char(5)和varchar(5)存儲‘he’,char會使用5個字符空間,而varchar只占用2個字符空間

text類型,存儲量大

類型選擇原則

枚舉類型?
字段名 enum(枚舉值用逗號分隔)

時間類型

datetime和timestamp區(qū)別,范圍和存儲大小不同

MYSQL數(shù)據(jù)庫----登錄和退出命令

登錄(mysql -uroot -p)

退出(exit或quit或ctrl+d)

我們已經(jīng)登錄了,可以查看版本和當(dāng)前時間(記得大部分命令開始要結(jié)尾;)

數(shù)據(jù)庫操作

create datebase 數(shù)據(jù)庫名; ? ? ? ? ? 創(chuàng)建數(shù)據(jù)庫
drop?datebase 數(shù)據(jù)庫名 ; ? ? ? ? ?刪除數(shù)據(jù)庫
use 數(shù)據(jù)庫名; ? ? ? ? ? 切換數(shù)據(jù)庫
select database(); ? ?查看當(dāng)前選擇的數(shù)據(jù)庫
(MYSQL命令大小寫不敏感)

上圖為剛登陸,查詢數(shù)據(jù)庫,因為沒有選擇,提示NULL

顯示所有數(shù)據(jù)庫,show databases;

我們使用use python;切換到python數(shù)據(jù)庫,這時再select database();就可以看到當(dāng)前選擇了python數(shù)據(jù)庫

我們嘗試創(chuàng)建一個數(shù)據(jù)庫,比如python_db名字,創(chuàng)建成功,會顯示Query OK。否則會出現(xiàn)一行提示,比如我們輸錯命令就會上圖后面的提示。
我們也可以用show create database 數(shù)據(jù)庫名 ?(可以卡看到數(shù)據(jù)庫創(chuàng)建過程,數(shù)據(jù)庫必須已存在)

上圖我們會發(fā)現(xiàn)python_db數(shù)據(jù)庫,過程語句和編碼及排序,我們會發(fā)現(xiàn)編碼不是utf8而是utf8mb4,而且排序也不是我們用的utf8_general_ci

我們可以指定編碼創(chuàng)建數(shù)據(jù)庫create database python_db1 charset=utf8;
python_db1是我們給新數(shù)據(jù)庫起的名字,可以看出編碼已經(jīng)被設(shè)置好,我們一般都設(shè)置為utf8否則你打開就是亂碼
刪除數(shù)據(jù)庫? drop database 數(shù)據(jù)庫名,刪除要慎重(找不回來)!!!
表結(jié)構(gòu)創(chuàng)建

為了把數(shù)據(jù)保存到數(shù)據(jù)庫,我們需要表格,上節(jié)學(xué)了創(chuàng)建數(shù)據(jù)庫,這節(jié)學(xué)習(xí)創(chuàng)建表

比如與我們打開進入到數(shù)據(jù)庫python_db1,然后先檢查有哪些表show tables;因為沒創(chuàng)建過,所以是空的

創(chuàng)建表格create table classes(
?id int unsigned primary key auto increment,
name varchar(10) not null,
num tinyint unsigned not null
);
語句分析:create table 表格名();基本sql創(chuàng)建表格語句,在括號里添加語句字段,字段間用逗號分隔,最后一個結(jié)尾不用逗號。字段用字段名 字段類型(之前講過)約束條件
比如第一個id我們設(shè)置為整數(shù),想要是無符號的用unsigned跟在int后面,約束條件,主鍵約束(唯一非空),遞增(auto_increment)
第二個字段name,我們使用varchar,設(shè)定最長10個字符,約束非空
第三個字段num,使用tinyint,約束非空
整體注意結(jié)構(gòu)和語法寫法!
應(yīng)用上述語句,就實現(xiàn)了創(chuàng)建表格

查看表結(jié)構(gòu)

desk 表名; ? ? ? ? ? ? ? ? ? ? ? ? 可以看到表結(jié)構(gòu)和設(shè)置,如上圖

我們接著再創(chuàng)建一個學(xué)生表,結(jié)構(gòu)要求如上
alter database my_db character set 'gbk';(這里需要注意的是,我們輸入漢字內(nèi)容,需要給數(shù)據(jù)庫指定默認(rèn)編碼gbk),否則enum那里會報錯,修改完畢后OK,記得每次有中文項目的內(nèi)容,修改數(shù)據(jù)庫編碼
表格創(chuàng)建成功??诳梢杂?b>show create table 表名 來顯示創(chuàng)建過程

我們會發(fā)現(xiàn)結(jié)果是比較亂的,這是因為嘗試將所有內(nèi)容一行寫下,但是屏幕不夠長。。。
我們可以給命令改成show create table 表名 \G;效果如下

表結(jié)構(gòu)修改

增加字段

alter table 表名 add 列名 類型;

比如我們給students條件birthday列,語句alter table students add birthday datetime;輸入完成功可以desc查看到添加了birthday列

重命名字段
字段已有,但是命名類型或者約束想修改

alter table 表名 change 原名 新名 新類型約束;
比如我開門把birthday改成birth而且要求非空,使用
alter table students change birthday birth datetime not null;
同樣修改后可以查看下
修改字段類型和約束
不修改命名,只修改類型和約束(比上一個功能簡單點)

alter table 表名 modify 列名 類型及約束;
比如我們把birth類型換成date使用
alter table students modify birth date not null;(需要注意的是之前的約束如果修改沒有寫進去就是默認(rèn),不會繼承之前的,上面的change也是,所以約束都要重寫)
刪除字段

alter table 表名 drop 列名;
如給students刪掉birth使用alter table students drop birth;
desc刪除后發(fā)現(xiàn)drop自段沒有了
刪除表

drop table 表名; ??
所有表的增刪改查要嚴(yán)格規(guī)劃,謹(jǐn)慎修改
表數(shù)據(jù)的增刪查改

本節(jié)學(xué)習(xí)表數(shù)據(jù)的創(chuàng)建,更新,讀取,刪除

查詢所有列 select * from 表名;

之前沒有添加數(shù)據(jù),所以我們沒有得到結(jié)果
插入數(shù)據(jù)insert into 表名 values(字段值用逗號分割,字符串要加引號?。?!);

添加數(shù)據(jù)后就可以查看到數(shù)據(jù)了

我們可以試試主鍵效果,如果再插入重復(fù)的id,會提示重復(fù)錯誤

我們之前刪了students,再創(chuàng)建出來,這回添加一行數(shù)據(jù)如下圖1行插入,然后我們知道有些值可以非空的,我們想給指定列插入內(nèi)容,可以使用下圖最后一行代碼,

想多行插入?insert students values()()()();插入幾行用幾個括號

修改數(shù)據(jù)

我們嘗試給表students的age列賦值age=38,使用update students set age=38;

設(shè)置后會發(fā)現(xiàn)age列的所有數(shù)據(jù)都被改成了38

我們想只改一列,比如給第二行age設(shè)成88,使用update students set age=88 where name='司馬狗剩';結(jié)果如下
我們也可以設(shè)置多列修改,所以一般模式為
update 表名 set 列名1=參數(shù)1, 列名2=參數(shù)2 ...where 屬性=xxx;(注意set屬性逗號分割)

查詢數(shù)據(jù)
我們之前學(xué)了查詢表格select * from 表名;現(xiàn)在我們也可以加條件,比如查詢students中name=‘司馬狗?!臄?shù)據(jù),效果如上圖。

我們還可以進一步拓展,想查看某些列數(shù)據(jù),如上(同理即可查詢where指定條件的某些列數(shù)據(jù))

我們想顯示中文列名,可以使用select 列名 as‘中文列名’ from 表名;效果如上(其實as也可以省略)
刪除

delete from 表名 where 條件約束;這種刪除后數(shù)據(jù)不可恢復(fù),是物理刪除
我們可以使用邏輯刪除,用alter table students add is_delete bit default 0;給表格設(shè)置默認(rèn)為0,
當(dāng)我們想做邏輯刪除時,使用update students set is_delete 1 where id=3;給指定數(shù)據(jù)設(shè)置刪除;
這樣我們就可以通過where is_delete=0;來過濾掉數(shù)據(jù)(但是數(shù)據(jù)庫還有這條數(shù)據(jù))
數(shù)據(jù)庫備份和恢復(fù)
我們之前用過navicat實現(xiàn)數(shù)據(jù)庫備份轉(zhuǎn)儲,導(dǎo)入?,F(xiàn)在我們用命令行來實現(xiàn)數(shù)據(jù)備份和恢復(fù)。
首先,數(shù)據(jù)庫備份不用進mysql環(huán)境,進入終端界面輸入如下命令即可
mysqldump -uroot -p python_db1>python_db1.sql就會在命令行當(dāng)前目錄導(dǎo)出一個python_db1.sql文件(得輸入密碼,因為-p后面沒寫),我們可以ls -l查看到,我們備份了數(shù)據(jù)庫,就可以刪除數(shù)據(jù)庫再導(dǎo)入,登陸mysql, mysql -uroot -p, ?然后drop database python_db1;刪除成功后,我們同樣需要創(chuàng)建一個數(shù)據(jù)庫以備導(dǎo)入,使用create database python_db charset=utf8;創(chuàng)建。然后我們exit退出mysql到終端,輸入mysql -uroot -p python_db <python_db1.sql然后輸入密碼,就可以實現(xiàn)數(shù)據(jù)庫的導(dǎo)入