數(shù)據(jù)庫的概念和作用
特殊格式數(shù)據(jù)文件的集合就是數(shù)據(jù)庫
我們網(wǎng)頁看到的數(shù)據(jù)展示餐禁,其實(shí)在數(shù)據(jù)庫里存儲(chǔ)如上面的顯示
數(shù)據(jù)庫特點(diǎn)簡(jiǎn)介
數(shù)據(jù)庫分類及特點(diǎn)
數(shù)據(jù)庫某年排行榜,可以看到幾種數(shù)據(jù)庫的排名,關(guān)系型數(shù)據(jù)庫排前
關(guān)系型數(shù)據(jù)庫
通過二維表的方式存儲(chǔ)數(shù)據(jù)
常見如上的關(guān)系型數(shù)據(jù)庫,我們學(xué)習(xí)MySQL數(shù)據(jù)庫饺鹃,免費(fèi)(商業(yè)版低收費(fèi))汗侵,而ORACLE全套部署近百萬(安全性高),SQLite是移動(dòng)端极舔,嵌入式設(shè)備數(shù)據(jù)庫凤覆,可以不聯(lián)網(wǎng)運(yùn)行,最后微軟的SQL Server是收費(fèi)的而且只能跑在微軟的windows服務(wù)器上拆魏。MySQL體積小盯桦,速度快,成本低渤刃,很多中小型企業(yè)都在使用拥峦。
非關(guān)系型數(shù)據(jù)庫
使用Key-value方式存儲(chǔ),也成NoSQL卖子,常見mongoDB,redis
數(shù)據(jù)庫管理系統(tǒng)
DBMS數(shù)據(jù)庫管理系統(tǒng)分3部分略号,數(shù)據(jù)庫文件集合,服務(wù)端洋闽,客戶端玄柠,每個(gè)功能如上,關(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í)重點(diǎn)是DQL,DML,DDL
上圖又簡(jiǎn)介了幾種關(guān)系型數(shù)據(jù)庫泽疆,簡(jiǎn)單了解下
關(guān)系型數(shù)據(jù)庫户矢,由多張數(shù)據(jù)表構(gòu)成,數(shù)據(jù)表由多個(gè)數(shù)據(jù)行構(gòu)成(數(shù)據(jù)行也叫一條數(shù)據(jù)記錄)殉疼。按列來看梯浪,把每個(gè)元素成為屬性或者字段(每列數(shù)據(jù)類型一致)
MYSQL環(huán)境搭建
linux安裝捌年,終端sudo apt-get install mysql-server
啟動(dòng)MySQL,終端sudo server mysql start(如果是重啟,關(guān)閉start分別換成restart,stop)
查看進(jìn)程是否有mysql挂洛, 終端ps ajx|grep mysql (利用管道過濾礼预,常常查看是否啟動(dòng)成功)
配置環(huán)境
配置文件可以在/etc/mysql/mysql.conf.d下找到文件mysqld.cnf,可以用cat等命令查看
默認(rèn)配置如上虏劲,暫時(shí)不用修改托酸,默認(rèn)端口3306,ip默認(rèn)本機(jī)ip127.0.0.1
注意啦柒巫!以下出現(xiàn)了中坑励堡,本人經(jīng)查詢解決
坑1
視頻提出安裝mysql-server,其實(shí)mysql-client也需要一起安裝堡掏,
于是我們需要sudo apt-get install mysql-client給虛擬機(jī)安裝上客戶端应结。
于是我們興沖沖的使用mysql -uroot -p然后輸入密碼,哎泉唁?怎么不是視頻中的密碼鹅龄,也不是網(wǎng)上有人說的為空。
/etc/mysql/debian.cnf.我們可以使用cat查看這個(gè)文件游两,找到password的內(nèi)容砾层,然后復(fù)制漩绵,是個(gè)很長(zhǎng)很惡心的密碼贱案,然后用mysql -uroot -p后粘貼這個(gè)密碼,登錄成功后止吐,在mysql shell下宝踪,執(zhí)行如下命令
> use mysql;
>update mysql.user set authentication_string=password('123456') where user='root'
比如想修改密碼為123456,可以使用如上,或者替換字符串'123456'
最后退出碍扔,使用sudo service mysql restart就可以使用自定義的簡(jiǎn)單代碼登錄了瘩燥。
坑2
視頻告訴我們可以按照可視化客戶端navicat,這個(gè)瀏覽器搜索安裝就行了不同,我分別給虛擬機(jī)和windows都安裝了一個(gè)厉膀,先說虛擬機(jī)問題吧。選擇下載64位Linux版本安裝二拐,
切換到壓縮文件目錄cd xxx
使用tar -zxvf xxx.gz把文件解壓服鹅,然后切換到解壓目錄,使用./start_navicat運(yùn)行安裝百新,記得要點(diǎn)2次取消企软,然后出現(xiàn)試用界面,視頻說會(huì)出現(xiàn)亂碼饭望,然后就真的出現(xiàn)了仗哨,點(diǎn)開菜單欄倒數(shù)第3個(gè)的最后一個(gè)項(xiàng)目形庭,這個(gè)就是選項(xiàng),將字體設(shè)置為AR PL UKai ZN,同時(shí)也要把字體調(diào)大點(diǎn)厌漂,關(guān)閉萨醒,再進(jìn)入就沒亂碼了。
坑3
我給筆記本和臺(tái)式都安裝了navicat客戶端桩卵,然后連接虛擬機(jī)的mysql验靡,密碼明明是對(duì)的,卻發(fā)現(xiàn)無法連接雏节,之前的虛擬機(jī)上的navicat卻可以連接胜嗓。
我們進(jìn)入虛擬機(jī)終端客戶端mysql -uroot ?-p
->GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; ? ? ? ? ? ? ? ? ? ? ?(123456根據(jù)你的密碼對(duì)應(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í)別唯一辞州,主鍵不為空
域完整性,同一列寥粹,數(shù)據(jù)類型一致变过,要求非空或默認(rèn)值
參照完整性,比如2個(gè)表格涝涤,一個(gè)存的是張三相關(guān)媚狰,另一個(gè)存的是小張相關(guān),如果刪除了張三阔拳,小張也應(yīng)該被刪除
自定義完整性:比如性別只能是‘男’或者‘女’崭孤,而不能是其他
NAVICAT客戶端使用
連接數(shù)據(jù)庫
我們之前已經(jīng)做過連接了,這里再次介紹下連接的界面糊肠,然后連接創(chuàng)建完畢辨宠,但是要想連接成功,我們還必須雙擊左側(cè)货裹,讓其灰色變綠色嗤形,表示真正連接成功
默認(rèn)情況下會(huì)在下面顯示4個(gè)數(shù)據(jù)庫
創(chuàng)建數(shù)據(jù)庫
右鍵點(diǎn)擊綠色圖標(biāo)點(diǎn)擊新建數(shù)據(jù)庫
彈出新建窗口
我們有3個(gè)空可以填,第一個(gè)數(shù)據(jù)庫名自己起弧圆,但是不要和已有的庫重名赋兵,我們起名python,
字符集我們使用utf8搔预,排序規(guī)則使用general ci(以后講)霹期,點(diǎn)確定數(shù)據(jù)庫就建立完畢
數(shù)據(jù)庫創(chuàng)建完是灰色的,因?yàn)槲覀儾]有打開斯撮,雙擊打開经伙,此時(shí)數(shù)據(jù)庫就變成了綠色
我們?cè)谛陆ǖ膒ython庫表位置右鍵新建表,出現(xiàn)如下圖
比如說我們創(chuàng)建一個(gè)字段,名id(注意這里字段名不能用中文)帕膜,類型int昼扛,是不是null勾選作為域完整性約束养盗,我們點(diǎn)了鍵那里巨税,會(huì)出現(xiàn)一個(gè)鑰匙鸵隧,此時(shí)null也會(huì)被自動(dòng)勾選,這時(shí)為主鍵約束荒典,比如該id是自增的酪劫,我們還會(huì)下面勾選自動(dòng)遞增
我們選中一行,再加入字段時(shí)寺董,按光標(biāo)↓就可以添加覆糟,我們輸入字段名name,會(huì)發(fā)現(xiàn)自動(dòng)設(shè)置了類型varchar遮咖,長(zhǎng)度255表示最多該項(xiàng)有255個(gè)字符滩字。
我們點(diǎn)擊保存起名classes,在表下面雙擊就會(huì)發(fā)現(xiàn)如下圖御吞,即創(chuàng)建了2列的表
如果我們想修改表麦箍,可以使用右鍵-設(shè)計(jì)表,又回歸到之前的界面
查看數(shù)據(jù)陶珠,我們雙擊表就行
增加數(shù)據(jù)挟裂,我們輸入內(nèi)容,就可以添加數(shù)據(jù)揍诽,由于id設(shè)置了自動(dòng)添加诀蓉,所以我們可以不填,填入name和size寝姿,想新出現(xiàn)一行數(shù)據(jù)就按光標(biāo)↓交排,id自動(dòng)出現(xiàn)
修改數(shù)據(jù)划滋,雙擊屬性單元格饵筑,輸入就行
保存表格,點(diǎn)下面√或者CTRL+S
刪除數(shù)據(jù)处坪,點(diǎn)擊減號(hào)圖標(biāo)
備份數(shù)據(jù)庫
右鍵點(diǎn)擊數(shù)據(jù)庫轉(zhuǎn)儲(chǔ)--結(jié)構(gòu)和數(shù)據(jù)
我們存儲(chǔ)到桌面根资,就會(huì)看見python.sql文件
此時(shí)我們可以將文件拷貝給其他工作組同事或者留作備份使用。
如果我們數(shù)據(jù)庫數(shù)據(jù)丟失了同窘,比如我們先在navicat上刪除python數(shù)據(jù)庫,我們可以再新建一個(gè)數(shù)據(jù)庫玄帕,但是因?yàn)槭强盏模覀兛梢杂益I點(diǎn)擊數(shù)據(jù)庫選擇運(yùn)行SQL文件
選擇桌面上的python.sql文件點(diǎn)擊開始想邦,然后需要右鍵關(guān)閉數(shù)據(jù)庫裤纹,再雙擊打開,此時(shí)會(huì)發(fā)現(xiàn)之前的數(shù)據(jù)已經(jīng)成功添加進(jìn)來
MYSQL數(shù)據(jù)類型
數(shù)值
整形類型
不同數(shù)據(jù)類型存儲(chǔ)長(zhǎng)度不一樣(常用TINYINT,INT)
TINYINT 1字節(jié) ?-128到127 ? ? ?無符號(hào)0-255
SMALLINT 2字節(jié)-2**15到2**15-1 ?無符號(hào)0到2**16-1
MEDIUMINT 3字節(jié)
INT 4字節(jié)
BIGINT 8字節(jié)
浮點(diǎn)型
float和double,分別4到8字節(jié)鹰椒,float到小數(shù)點(diǎn)后6位锡移,double到16位
定義方法float或者double加(總位數(shù),小數(shù)位數(shù)) 如float(5,3) 12.345
定點(diǎn)數(shù)
decimal(總位數(shù)漆际,小數(shù)位)需要精確計(jì)算小數(shù)時(shí)淆珊,比如價(jià)格等
字符串
char 255個(gè)字符
varchar65535個(gè)字節(jié)(常用varchar)其他如上圖(第二行應(yīng)該為字符)
text相關(guān)的都是按字節(jié)統(tǒng)計(jì)
char和varchar區(qū)別
比如我們使用char(5)和varchar(5)存儲(chǔ)‘he’,char會(huì)使用5個(gè)字符空間奸汇,而varchar只占用2個(gè)字符空間
text類型施符,存儲(chǔ)量大
類型選擇原則
枚舉類型?
字段名 enum(枚舉值用逗號(hào)分隔)
時(shí)間類型
datetime和timestamp區(qū)別,范圍和存儲(chǔ)大小不同
MYSQL數(shù)據(jù)庫----登錄和退出命令
登錄(mysql -uroot -p)
退出(exit或quit或ctrl+d)
我們已經(jīng)登錄了擂找,可以查看版本和當(dāng)前時(shí)間(記得大部分命令開始要結(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ù)庫,因?yàn)闆]有選擇贯涎,提示NULL
顯示所有數(shù)據(jù)庫骨坑,show databases;
我們使用use python;切換到python數(shù)據(jù)庫,這時(shí)再select database();就可以看到當(dāng)前選擇了python數(shù)據(jù)庫
我們嘗試創(chuàng)建一個(gè)數(shù)據(jù)庫柬采,比如python_db名字欢唾,創(chuàng)建成功,會(huì)顯示Query OK粉捻。否則會(huì)出現(xiàn)一行提示礁遣,比如我們輸錯(cuò)命令就會(huì)上圖后面的提示。
我們也可以用show create database 數(shù)據(jù)庫名 ?(可以卡看到數(shù)據(jù)庫創(chuàng)建過程肩刃,數(shù)據(jù)庫必須已存在)
上圖我們會(huì)發(fā)現(xiàn)python_db數(shù)據(jù)庫祟霍,過程語句和編碼及排序,我們會(huì)發(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)建表
比如與我們打開進(jìn)入到數(shù)據(jù)庫python_db1,然后先檢查有哪些表show tables;因?yàn)闆]創(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)建表格語句寞埠,在括號(hào)里添加語句字段屁置,字段間用逗號(hào)分隔,最后一個(gè)結(jié)尾不用逗號(hào)仁连。字段用字段名 字段類型(之前講過)約束條件
比如第一個(gè)id我們?cè)O(shè)置為整數(shù)蓝角,想要是無符號(hào)的用unsigned跟在int后面,約束條件,主鍵約束(唯一非空)使鹅,遞增(auto_increment)
第二個(gè)字段name颇象,我們使用varchar,設(shè)定最長(zhǎng)10個(gè)字符并徘,約束非空
第三個(gè)字段num遣钳,使用tinyint,約束非空
整體注意結(jié)構(gòu)和語法寫法麦乞!
應(yīng)用上述語句蕴茴,就實(shí)現(xiàn)了創(chuàng)建表格
查看表結(jié)構(gòu)
desk 表名; ? ? ? ? ? ? ? ? ? ? ? ? 可以看到表結(jié)構(gòu)和設(shè)置,如上圖
我們接著再創(chuàng)建一個(gè)學(xué)生表姐直,結(jié)構(gòu)要求如上
alter database my_db character set 'gbk';(這里需要注意的是倦淀,我們輸入漢字內(nèi)容,需要給數(shù)據(jù)庫指定默認(rèn)編碼gbk)声畏,否則enum那里會(huì)報(bào)錯(cuò)撞叽,修改完畢后OK,記得每次有中文項(xiàng)目的內(nèi)容插龄,修改數(shù)據(jù)庫編碼
表格創(chuàng)建成功涸钙澹口可以用show create table 表名 來顯示創(chuàng)建過程
我們會(huì)發(fā)現(xiàn)結(jié)果是比較亂的,這是因?yàn)閲L試將所有內(nèi)容一行寫下均牢,但是屏幕不夠長(zhǎng)糠雨。。徘跪。
我們可以給命令改成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;
同樣修改后可以查看下
修改字段類型和約束
不修改命名哨查,只修改類型和約束(比上一個(gè)功能簡(jiǎn)單點(diǎn))
alter table 表名 modify 列名 類型及約束逗抑;
比如我們把birth類型換成date使用
alter table students modify birth date not null;(需要注意的是之前的約束如果修改沒有寫進(jìn)去就是默認(rèn),不會(huì)繼承之前的解恰,上面的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(字段值用逗號(hào)分割,字符串要加引號(hào)P鼐骸F坂汀!)卫枝;
添加數(shù)據(jù)后就可以查看到數(shù)據(jù)了
我們可以試試主鍵效果煎饼,如果再插入重復(fù)的id,會(huì)提示重復(fù)錯(cuò)誤
我們之前刪了students校赤,再創(chuàng)建出來吆玖,這回添加一行數(shù)據(jù)如下圖1行插入,然后我們知道有些值可以非空的马篮,我們想給指定列插入內(nèi)容沾乘,可以使用下圖最后一行代碼,
想多行插入?insert students values()()()();插入幾行用幾個(gè)括號(hào)
修改數(shù)據(jù)
我們嘗試給表students的age列賦值age=38浑测,使用update students set age=38;
設(shè)置后會(huì)發(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屬性逗號(hào)分割)
查詢數(shù)據(jù)
我們之前學(xué)了查詢表格select * from 表名掷匠;現(xiàn)在我們也可以加條件,比如查詢students中name=‘司馬狗梳Γ’的數(shù)據(jù)槐雾,效果如上圖。
我們還可以進(jìn)一步拓展幅狮,想查看某些列數(shù)據(jù)募强,如上(同理即可查詢where指定條件的某些列數(shù)據(jù))
我們想顯示中文列名,可以使用select 列名 as‘中文列名’ from 表名崇摄;效果如上(其實(shí)as也可以省略)
刪除
delete from 表名 where 條件約束擎值;這種刪除后數(shù)據(jù)不可恢復(fù),是物理刪除
我們可以使用邏輯刪除,用alter table students add is_delete bit default 0;給表格設(shè)置默認(rèn)為0逐抑,
當(dāng)我們想做邏輯刪除時(shí)鸠儿,使用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實(shí)現(xiàn)數(shù)據(jù)庫備份轉(zhuǎn)儲(chǔ)厕氨,導(dǎo)入〗浚現(xiàn)在我們用命令行來實(shí)現(xiàn)數(shù)據(jù)備份和恢復(fù)。
首先命斧,數(shù)據(jù)庫備份不用進(jìn)mysql環(huán)境田晚,進(jìn)入終端界面輸入如下命令即可
mysqldump -uroot -p python_db1>python_db1.sql就會(huì)在命令行當(dāng)前目錄導(dǎo)出一個(gè)python_db1.sql文件(得輸入密碼,因?yàn)?p后面沒寫)国葬,我們可以ls -l查看到贤徒,我們備份了數(shù)據(jù)庫芹壕,就可以刪除數(shù)據(jù)庫再導(dǎo)入,登陸mysql接奈, mysql -uroot -p, ?然后drop database python_db1踢涌;刪除成功后,我們同樣需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫以備導(dǎo)入序宦,使用create database python_db charset=utf8;創(chuàng)建睁壁。然后我們exit退出mysql到終端,輸入mysql -uroot -p python_db <python_db1.sql然后輸入密碼互捌,就可以實(shí)現(xiàn)數(shù)據(jù)庫的導(dǎo)入