數據庫的概念和作用
特殊格式數據文件的集合就是數據庫
我們網頁看到的數據展示,其實在數據庫里存儲如上面的顯示
數據庫特點簡介
數據庫分類及特點
數據庫某年排行榜,可以看到幾種數據庫的排名,關系型數據庫排前
關系型數據庫
通過二維表的方式存儲數據
常見如上的關系型數據庫,我們學習MySQL數據庫,免費(商業版低收費),而ORACLE全套部署近百萬(安全性高),SQLite是移動端,嵌入式設備數據庫,可以不聯網運行,最后微軟的SQL Server是收費的而且只能跑在微軟的windows服務器上。MySQL體積小,速度快,成本低,很多中小型企業都在使用。
非關系型數據庫
使用Key-value方式存儲,也成NoSQL,常見mongoDB,redis
數據庫管理系統
DBMS數據庫管理系統分3部分,數據庫文件集合,服務端,客戶端,每個功能如上,關系圖如下
客戶端給服務端發送語句,必須是其聽得懂的SQL語句
SQL結構化查詢語言,幾乎適用于所有關系型數據庫,但是某系細節有差異
SQL語句主要分如上5類,DQL數據查詢,DML數據操作,TPL事務處理,DCL數據控制,DDL數據定義,我們學習重點是DQL,DML,DDL
上圖又簡介了幾種關系型數據庫,簡單了解下
關系型數據庫,由多張數據表構成,數據表由多個數據行構成(數據行也叫一條數據記錄)。按列來看,把每個元素成為屬性或者字段(每列數據類型一致)
MYSQL環境搭建
linux安裝,終端sudo apt-get install mysql-server
啟動MySQL,終端sudo server mysql start(如果是重啟,關閉start分別換成restart,stop)
查看進程是否有mysql, 終端ps ajx|grep mysql (利用管道過濾,常常查看是否啟動成功)
配置環境
配置文件可以在/etc/mysql/mysql.conf.d下找到文件mysqld.cnf,可以用cat等命令查看
默認配置如上,暫時不用修改,默認端口3306,ip默認本機ip127.0.0.1
注意啦!以下出現了中坑,本人經查詢解決
坑1
視頻提出安裝mysql-server,其實mysql-client也需要一起安裝,
于是我們需要sudo apt-get install mysql-client給虛擬機安裝上客戶端。
于是我們興沖沖的使用mysql -uroot -p然后輸入密碼,哎?怎么不是視頻中的密碼,也不是網上有人說的為空。
/etc/mysql/debian.cnf.我們可以使用cat查看這個文件,找到password的內容,然后復制,是個很長很惡心的密碼,然后用mysql -uroot -p后粘貼這個密碼,登錄成功后,在mysql shell下,執行如下命令
> 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次取消,然后出現試用界面,視頻說會出現亂碼,然后就真的出現了,點開菜單欄倒數第3個的最后一個項目,這個就是選項,將字體設置為AR PL UKai ZN,同時也要把字體調大點,關閉,再進入就沒亂碼了。
坑3
我給筆記本和臺式都安裝了navicat客戶端,然后連接虛擬機的mysql,密碼明明是對的,卻發現無法連接,之前的虛擬機上的navicat卻可以連接。
我們進入虛擬機終端客戶端mysql -uroot ?-p
->GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; ? ? ? ? ? ? ? ? ? ? ?(123456根據你的密碼對應上)
->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了
數據庫完整性(了解)
為了保證數據的正確性,要求數據的約束條件
記錄識別唯一,主鍵不為空
域完整性,同一列,數據類型一致,要求非空或默認值
參照完整性,比如2個表格,一個存的是張三相關,另一個存的是小張相關,如果刪除了張三,小張也應該被刪除
自定義完整性:比如性別只能是‘男’或者‘女’,而不能是其他
NAVICAT客戶端使用
連接數據庫
我們之前已經做過連接了,這里再次介紹下連接的界面,然后連接創建完畢,但是要想連接成功,我們還必須雙擊左側,讓其灰色變綠色,表示真正連接成功
默認情況下會在下面顯示4個數據庫
創建數據庫
右鍵點擊綠色圖標點擊新建數據庫
彈出新建窗口
我們有3個空可以填,第一個數據庫名自己起,但是不要和已有的庫重名,我們起名python,
字符集我們使用utf8,排序規則使用general ci(以后講),點確定數據庫就建立完畢
數據庫創建完是灰色的,因為我們并沒有打開,雙擊打開,此時數據庫就變成了綠色
我們在新建的python庫表位置右鍵新建表,出現如下圖
比如說我們創建一個字段,名id(注意這里字段名不能用中文),類型int,是不是null勾選作為域完整性約束,我們點了鍵那里,會出現一個鑰匙,此時null也會被自動勾選,這時為主鍵約束,比如該id是自增的,我們還會下面勾選自動遞增
我們選中一行,再加入字段時,按光標↓就可以添加,我們輸入字段名name,會發現自動設置了類型varchar,長度255表示最多該項有255個字符。
我們點擊保存起名classes,在表下面雙擊就會發現如下圖,即創建了2列的表
如果我們想修改表,可以使用右鍵-設計表,又回歸到之前的界面
查看數據,我們雙擊表就行
增加數據,我們輸入內容,就可以添加數據,由于id設置了自動添加,所以我們可以不填,填入name和size,想新出現一行數據就按光標↓,id自動出現
修改數據,雙擊屬性單元格,輸入就行
保存表格,點下面√或者CTRL+S
刪除數據,點擊減號圖標
備份數據庫
右鍵點擊數據庫轉儲--結構和數據
我們存儲到桌面,就會看見python.sql文件
此時我們可以將文件拷貝給其他工作組同事或者留作備份使用。
如果我們數據庫數據丟失了,比如我們先在navicat上刪除python數據庫,我們可以再新建一個數據庫,但是因為是空的,我們可以右鍵點擊數據庫選擇運行SQL文件
選擇桌面上的python.sql文件點擊開始,然后需要右鍵關閉數據庫,再雙擊打開,此時會發現之前的數據已經成功添加進來
MYSQL數據類型
數值
整形類型
不同數據類型存儲長度不一樣(常用TINYINT,INT)
TINYINT 1字節 ?-128到127 ? ? ?無符號0-255
SMALLINT 2字節-2**15到2**15-1 ?無符號0到2**16-1
MEDIUMINT 3字節
INT 4字節
BIGINT 8字節
浮點型
float和double,分別4到8字節,float到小數點后6位,double到16位
定義方法float或者double加(總位數,小數位數) 如float(5,3) 12.345
定點數
decimal(總位數,小數位)需要精確計算小數時,比如價格等
字符串
char 255個字符
varchar65535個字節(常用varchar)其他如上圖(第二行應該為字符)
text相關的都是按字節統計
char和varchar區別
比如我們使用char(5)和varchar(5)存儲‘he’,char會使用5個字符空間,而varchar只占用2個字符空間
text類型,存儲量大
類型選擇原則
枚舉類型?
字段名 enum(枚舉值用逗號分隔)
時間類型
datetime和timestamp區別,范圍和存儲大小不同
MYSQL數據庫----登錄和退出命令
登錄(mysql -uroot -p)
退出(exit或quit或ctrl+d)
我們已經登錄了,可以查看版本和當前時間(記得大部分命令開始要結尾;)
數據庫操作
create datebase 數據庫名; ? ? ? ? ? 創建數據庫
drop?datebase 數據庫名 ; ? ? ? ? ?刪除數據庫
use 數據庫名; ? ? ? ? ? 切換數據庫
select database(); ? ?查看當前選擇的數據庫
(MYSQL命令大小寫不敏感)
上圖為剛登陸,查詢數據庫,因為沒有選擇,提示NULL
顯示所有數據庫,show databases;
我們使用use python;切換到python數據庫,這時再select database();就可以看到當前選擇了python數據庫
我們嘗試創建一個數據庫,比如python_db名字,創建成功,會顯示Query OK。否則會出現一行提示,比如我們輸錯命令就會上圖后面的提示。
我們也可以用show create database 數據庫名 ?(可以卡看到數據庫創建過程,數據庫必須已存在)
上圖我們會發現python_db數據庫,過程語句和編碼及排序,我們會發現編碼不是utf8而是utf8mb4,而且排序也不是我們用的utf8_general_ci
我們可以指定編碼創建數據庫create database python_db1 charset=utf8;
python_db1是我們給新數據庫起的名字,可以看出編碼已經被設置好,我們一般都設置為utf8否則你打開就是亂碼
刪除數據庫? drop database 數據庫名,刪除要慎重(找不回來)!!!
表結構創建
為了把數據保存到數據庫,我們需要表格,上節學了創建數據庫,這節學習創建表
比如與我們打開進入到數據庫python_db1,然后先檢查有哪些表show tables;因為沒創建過,所以是空的
創建表格create table classes(
?id int unsigned primary key auto increment,
name varchar(10) not null,
num tinyint unsigned not null
);
語句分析:create table 表格名();基本sql創建表格語句,在括號里添加語句字段,字段間用逗號分隔,最后一個結尾不用逗號。字段用字段名 字段類型(之前講過)約束條件
比如第一個id我們設置為整數,想要是無符號的用unsigned跟在int后面,約束條件,主鍵約束(唯一非空),遞增(auto_increment)
第二個字段name,我們使用varchar,設定最長10個字符,約束非空
第三個字段num,使用tinyint,約束非空
整體注意結構和語法寫法!
應用上述語句,就實現了創建表格
查看表結構
desk 表名; ? ? ? ? ? ? ? ? ? ? ? ? 可以看到表結構和設置,如上圖
我們接著再創建一個學生表,結構要求如上
alter database my_db character set 'gbk';(這里需要注意的是,我們輸入漢字內容,需要給數據庫指定默認編碼gbk),否則enum那里會報錯,修改完畢后OK,記得每次有中文項目的內容,修改數據庫編碼
表格創建成功海口可以用show create table 表名 來顯示創建過程
我們會發現結果是比較亂的,這是因為嘗試將所有內容一行寫下,但是屏幕不夠長。。。
我們可以給命令改成show create table 表名 \G;效果如下
表結構修改
增加字段
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;(需要注意的是之前的約束如果修改沒有寫進去就是默認,不會繼承之前的,上面的change也是,所以約束都要重寫)
刪除字段
alter table 表名 drop 列名;
如給students刪掉birth使用alter table students drop birth;
desc刪除后發現drop自段沒有了
刪除表
drop table 表名; ??
所有表的增刪改查要嚴格規劃,謹慎修改
表數據的增刪查改
本節學習表數據的創建,更新,讀取,刪除
查詢所有列 select * from 表名;
之前沒有添加數據,所以我們沒有得到結果
插入數據insert into 表名 values(字段值用逗號分割,字符串要加引號!!!);
添加數據后就可以查看到數據了
我們可以試試主鍵效果,如果再插入重復的id,會提示重復錯誤
我們之前刪了students,再創建出來,這回添加一行數據如下圖1行插入,然后我們知道有些值可以非空的,我們想給指定列插入內容,可以使用下圖最后一行代碼,
想多行插入?insert students values()()()();插入幾行用幾個括號
修改數據
我們嘗試給表students的age列賦值age=38,使用update students set age=38;
設置后會發現age列的所有數據都被改成了38
我們想只改一列,比如給第二行age設成88,使用update students set age=88 where name='司馬狗剩';結果如下
我們也可以設置多列修改,所以一般模式為
update 表名 set 列名1=參數1, 列名2=參數2 ...where 屬性=xxx;(注意set屬性逗號分割)
查詢數據
我們之前學了查詢表格select * from 表名;現在我們也可以加條件,比如查詢students中name=‘司馬狗剩’的數據,效果如上圖。
我們還可以進一步拓展,想查看某些列數據,如上(同理即可查詢where指定條件的某些列數據)
我們想顯示中文列名,可以使用select 列名 as‘中文列名’ from 表名;效果如上(其實as也可以省略)
刪除
delete from 表名 where 條件約束;這種刪除后數據不可恢復,是物理刪除
我們可以使用邏輯刪除,用alter table students add is_delete bit default 0;給表格設置默認為0,
當我們想做邏輯刪除時,使用update students set is_delete 1 where id=3;給指定數據設置刪除;
這樣我們就可以通過where is_delete=0;來過濾掉數據(但是數據庫還有這條數據)
數據庫備份和恢復
我們之前用過navicat實現數據庫備份轉儲,導入。現在我們用命令行來實現數據備份和恢復。
首先,數據庫備份不用進mysql環境,進入終端界面輸入如下命令即可
mysqldump -uroot -p python_db1>python_db1.sql就會在命令行當前目錄導出一個python_db1.sql文件(得輸入密碼,因為-p后面沒寫),我們可以ls -l查看到,我們備份了數據庫,就可以刪除數據庫再導入,登陸mysql, mysql -uroot -p, ?然后drop database python_db1;刪除成功后,我們同樣需要創建一個數據庫以備導入,使用create database python_db charset=utf8;創建。然后我們exit退出mysql到終端,輸入mysql -uroot -p python_db <python_db1.sql然后輸入密碼,就可以實現數據庫的導入