關係型數據庫之Mysql

簡介

  • 主要知識點包括:可以與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表示自動增加python

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
  • 實際使用中,只是語句中某些部分的組合,而不是所有
相關文章
相關標籤/搜索