簡介
- 主要知識點包括:能夠與mysql建立連接,創建數據庫、表,分別從圖形界面與腳本界面兩個方面講解
- 相關的知識點包括:E-R關系模型,數據庫的3范式,mysql中數據字段的類型,字段約束
- 數據庫的操作主要包括:
- 數據庫的操作,包括創建、刪除
- 表的操作,包括創建、修改、刪除
- 數據的操作,包括增加、修改、刪除、查詢,簡稱crud
- 學生表結構:
- id
- 名稱
- 性別
- 地址
- 生日
- 科目表結構:
- id
- 名稱
數據庫簡介
- 人類在進化的過程中,創造了數字、文字、符號等來進行數據的記錄,但是承受着認知能力和創造能力的提升,數據量越來越大,對於數據的記錄和准確查找,成為了一個重大難題
- 計算機誕生后,數據開始在計算機中存儲並計算,並設計出了數據庫系統
- 數據庫系統解決的問題:持久化存儲,優化讀寫,保證數據的有效性
- 當前使用的數據庫,主要分為兩類
- 文檔型,如sqlite,就是一個文件,通過對文件的復制完成數據庫的復制
- 服務型,如mysql、postgre,數據存儲在一個物理文件中,但是需要使用終端以tcp/ip協議連接,進行數據庫的讀寫操作
E-R模型
- 當前物理的數據庫都是按照E-R模型進行設計的
- E表示entry,實體
- R表示relationship,關系
- 一個實體轉換為數據庫中的一個表
- 關系描述兩個實體之間的對應規則,包括
- 一對一
- 一對多
- 多對多
- 關系轉換為數據庫表中的一個列 *在關系型數據庫中一行就是一個對象
三范式
- 經過研究和對使用中問題的總結,對於設計數據庫提出了一些規范,這些規范被稱為范式
- 第一范式(1NF):列不可拆分
- 第二范式(2NF):唯一標識
- 第三范式(3NF):引用主鍵
- 說明:后一個范式,都是在前一個范式的基礎上建立的
安裝
- 安裝
sudo apt-get install mysql-server mysql-client 然后按照提示輸入
管理服務
- 啟動
service mysql start
- 停止
service mysql stop
- 重啟
service mysql restart
允許遠程連接
- 找到mysql配置文件並修改
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf 將bind-address=127.0.0.1注釋
- 登錄mysql,運行命令
grant all privileges on *.* to 'root'@'%' identified by 'mysql' with grant option; flush privileges;
- 重啟mysql
數據完整性
- 一個數據庫就是一個完整的業務單元,可以包含多張表,數據被存儲在表中
- 在表中為了更加准確的存儲數據,保證數據的正確有效,可以在創建表的時候,為表添加一些強制性的驗證,包括數據字段的類型、約束
字段類型
- 在mysql中包含的數據類型很多,這里主要列出來常用的幾種
- 數字:int,decimal
- 字符串:varchar,text
- 日期:datetime
- 布爾:bit
約束
- 主鍵primary key
- 非空not null
- 惟一unique
- 默認default
- 外鍵foreign key
使用圖形窗口連接
- 下發windows的navicat
- 點擊“連接”彈出窗口,按照提示填寫連接信息,如下圖
- 連接成功后,會在連接名稱下面顯示出當前的數據庫
- 雙擊選中數據庫,就可以編輯此數據庫
- 下次再進入此軟件時,通過雙擊完成連接、編輯操作
數據庫操作
- 在連接的名稱上右擊,選擇“新建數據庫”,彈出窗口,並按提示填寫
- 在數據庫上右擊,選擇“刪除數據庫”可以完成刪除操作
表操作
- 當數據庫顯示為高亮時,表示當前操作此數據庫,可以在數據中創建表
- 一個實體對應一張表,用於存儲特定結構的數據
- 點擊“新建表”,彈出窗口,按提示填寫信息
- 主鍵的名稱一般為id,設置為int型,無符號數,自動增長,非空
- 自動增長表示由mysql系統負責維護這個字段的值,不需要手動維護,所以不用關心這個字段的具體值
- 字符串varchar類型需要設置長度,即最多包含多少個字符
- 點擊“添加欄位”,可以添加一個新的字段
- 點擊“保存”,為表定義名稱
數據操作
- 表創建成功后,可以在右側看到,雙擊表打開新窗口,如下圖
- 在此窗口中可以增加、修改、刪除數據
邏輯刪除
- 對於重要數據,並不希望物理刪除,一旦刪除,數據無法找回
- 一般對於重要數據,會設置一個isDelete的列,類型為bit,表示邏輯刪除
- 大於大量增長的非重要數據,可以進行物理刪除
- 數據的重要性,要根據實際開發決定
使用命令連接
- 命令操作方式,在工作中使用的更多一些,所以要達到熟練的程度
- 打開終端,運行命令
mysql -uroot -p 回車后輸入密碼,當前設置的密碼為mysql
- 連接成功后如下圖
- 退出登錄
quit或exit
- 退出成功后如下圖
- 登錄成功后,輸入如下命令查看效果
查看版本:select version(); 顯示當前時間:select now();
- 注意:在語句結尾要使用分號;
-
遠程連接
- 一般在公司開發中,可能會將數據庫統一搭建在一台服務器上,所有開發人員共用一個數據庫,而不是在自己的電腦中配置一個數據庫
- 運行命令
mysql -hip地址 -uroot -p
- -h后面寫要連接的主機ip地址
- -u后面寫連接的用戶名
- -p回車后寫密碼
數據庫操作
- 創建數據庫
create database 數據庫名 charset=utf8;v
- 刪除數據庫
drop database 數據庫名;
- 切換數據庫
use 數據庫名;
- 查看當前選擇的數據庫
select database();
表操作
- 查看當前數據庫中所有表
show tables;
- 創建表
auto_increment表示自動增長
create table 表名(列及類型); 如: create table students( id int auto_increment primary key, sname varchar(10) not null );
- 修改表
alter table 表名 add|change|drop 列名 類型; 如: alter table students add birthday datetime;
- 刪除表
drop table 表名;
- 查看表結構
desc 表名;
- 更改表名稱
rename table 原表名 to 新表名;
- 查看表的創建語句
show create table '表名';
數據操作
- 查詢
select * from 表名
- 增加
全列插入:insert into 表名 values(...)
缺省插入:insert into 表名(列1,...) values(值1,...)
同時插入多條數據:insert into 表名 values(...),(...)...;
或insert into 表名(列1,...) values(值1,...),(值1,...)...;
- 主鍵列是自動增長,但是在全列插入時需要占位,通常使用0,插入成功后以實際數據為准
- 修改
update 表名 set 列1=值1,... where 條
- 刪除
delete from 表名 where 條件
- 邏輯刪除,本質就是修改操作update
alter table students add isdelete bit default 0; 如果需要刪除則 update students isdelete=1 where ...;
備份與恢復
數據備份
- 進入超級管理員
sudo -s
- 進入mysql庫目錄
cd /var/lib/mysql
- 運行mysqldump命令
ysqldump –uroot –p 數據庫名 > ~/Desktop/備份文件.sql; 按提示輸入mysql的密碼
數據恢復
- 連接mysqk,創建數據庫
- 退出連接,執行如下命令
mysql -uroot –p 數據庫名 < ~/Desktop/備份文件.sql
根據提示輸入mysql密碼
總結
- 數據庫解決的問題,E-R模型,三范式
- 圖形界面操作數據庫、表、數據
- 命令行操作數據庫、表、數據
表查詢簡介
- 查詢的基本語法
select * from 表名;
- from關鍵字后面寫表名,表示數據來源於是這張表
- select后面寫表中的列名,如果是*表示在結果中顯示表中所有列
- 在select后面的列名部分,可以使用as為列起別名,這個別名出現在結果集中
- 如果要查詢多個列,之間使用逗號分隔
消除重復行
- 在select后面列前使用distinct可以消除重復的行
select distinct gender from students;
條件
- 使用where子句對表中的數據篩選,結果為true的行會出現在結果集中
- 語法如下:
select * from 表名 where 條件;
比較運算符
- 等於=
- 大於>
- 大於等於>=
- 小於<
- 小於等於<=
- 不等於!=或<>
- 查詢編號大於3的學生
select * from students where id>3;
- 查詢編號不大於4的科目
select * from subjects where id<=4;
- 查詢姓名不是“黃蓉”的學生
select * from students where sname!='黃蓉';
- 查詢沒被刪除的學生
select * from students where isdelete=0;
邏輯運算符
- and
- or
- not
- 查詢編號大於3的女同學
select * from students where id>3 and gender=0;
- 查詢編號小於4或沒被刪除的學生
select * from students where id<4 or isdelete=0;
模糊查詢
- like
- %表示任意多個任意字符
- _表示一個任意字符
- 查詢姓黃的學生
select * from students where sname like '黃%';
- 查詢姓黃並且名字是一個字的學生
select * from students where sname like '黃_';
- 查詢姓黃或叫靖的學生
select * from students where sname like '黃%' or sname like '%靖%';
范圍查詢
- in表示在一個非連續的范圍內
- 查詢編號是1或3或8的學生
select * from students where id in(1,3,8);
- between ... and ...表示在一個連續的范圍內
- 查詢學生是3至8的學生
select * from students where id between 3 and 8;
- 查詢學生是3至8的男生
select * from students where id between 3 and 8 and gender=1;
空判斷
- 注意:null與''是不同的
- 判空is null
- 查詢沒有填寫地址的學生
select * from students where hometown is null;
- 判非空is not null
- 查詢填寫了地址的學生
select * from students where hometown is not null;
- 查詢填寫了地址的女生
select * from students where hometown is not null and gender=0;
優先級
- 小括號,not,比較運算符,邏輯運算符
- and比or先運算,如果同時出現並希望先算or,需要結合()使用
聚合
- 為了快速得到統計數據,提供了5個聚合函數
- count(*)表示計算總行數,括號中寫星與列名,結果是相同的
- 查詢學生總數
select count(*) from students;
- max(列)表示求此列的最大值
- 查詢女生的編號最大值
select max(id) from students where gender=0;
- min(列)表示求此列的最小值
- 查詢未刪除的學生最小編號
select min(id) from students where isdelete=0;
- sum(列)表示求此列的和
- 查詢男生的編號之后
select sum(id) from students where gender=1;
- avg(列)表示求此列的平均值
- 查詢未刪除女生的編號平均值
select avg(id) from students where isdelete=0 and gender=0;
分組
- 按照字段分組,表示此字段相同的數據會被放到一個組中
- 分組后,只能查詢出相同的數據列,對於有差異的數據列無法出現在結果集中
- 可以對分組后的數據進行統計,做聚合運算
- 語法:
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...
- 查詢男女生總數
select gender as 性別,count(*) from students group by gender;
- 查詢各城市人數
select hometown as 家鄉,count(*) from students group by hometown;
分組后的數據篩選
- 語法:
select 列1,列2,聚合... from 表名 group by 列1,列2,列3... having 列1,...聚合...
having后面的條件運算符與where的相同
- 查詢男生總人數
方案一 select count(*) from students where gender=1; ----------------------------------- 方案二: select gender as 性別,count(*) from students group by gender having gender=1;
對比where與having
- where是對from后面指定的表進行數據篩選,屬於對原始數據的篩選
- having是對group by的結果進行篩選
排序
- 為了方便查看數據,可以對數據進行排序
- 語法:
select * from 表名 order by 列1 asc|desc,列2 asc|desc,...
- 將行數據按照列1進行排序,如果某些行列1的值相同時,則按照列2排序,以此類推
- 默認按照列值從小到大排列
- asc從小到大排列,即升序
- desc從大到小排序,即降序
- 查詢未刪除男生學生信息,按學號降序
select * from students where gender=1 and isdelete=0 order by id desc;
- 查詢未刪除科目信息,按名稱升序
select * from subject where isdelete=0 order by stitle;
獲取部分行
- 當數據量過大時,在一頁中查看數據是一件非常麻煩的事情
- 語法
select * from 表名 limit start,count
- 從start開始,獲取count條數據
- start索引從0開始
示例:分頁
- 已知:每頁顯示m條數據,當前顯示第n頁
- 求總頁數:此段邏輯后面會在python中實現
- 查詢總條數p1
- 使用p1除以m得到p2
- 如果整除則p2為總數頁
- 如果不整除則p2+1為總頁數
- 求第n頁的數據
select * from students where isdelete=0 limit (n-1)*m,m
總結
- 完整的select語句
select distinct * from 表名 where .... group by ... having ... order by ... limit star,count
- 執行順序為:
- from 表名
- where ....
- group by ...
- select distinct *
- having ...
- order by ...
- limit star,count
- 實際使用中,只是語句中某些部分的組合,而不是全部