關係型數據庫MySQL(基礎)

1. 數據庫

1.1 數據庫的概念

數據庫是一種特殊的文件,比通常的文件增刪改查速度快的多。html

1.2 MySQL核心元素

  • 記錄(行)
  • 字段(列)
  • 數據表(字段、記錄的集合)
  • 數據庫(數據表的集合)

1.3 RDBMS(關係型數據庫)

常見的關係型數據庫(RDBMS):python

  • oracle:在之前的大型項目中使用,銀行,電信等項目(收費)
  • mysql:web時代使用最普遍的關係型數據庫(開源)
  • ms sql server:在微軟的項目中使用
  • sqlite:輕量級數據庫,主要應用在移動平臺

常見的非關係型數據庫:mysql

  • Redis
  • MongoDB

1.4 RDBMS和數據庫的關係

SQL就是操做RDBMS即關係型數據庫的專用語言,經過SQL來實現增刪改查。不區分大小寫

有一款圖形化界面的軟件Navicat,是封裝SQL語言的一款軟件,能夠經過圖形化界面手動操做數據庫建立等全部操做web

2. MySQL數據類型

2.1 經常使用的數據類型

使用數據類型的原則是:夠用就行,儘可能使用取值範圍小的,而不用大的,這樣能夠更多的節省存儲空間正則表達式

  • 整數:int,bit
  • 小數:decimal
  • 字符串:varchar,char
  • 枚舉類型:enum
  • 日期時間: date, time, datetime
  1. 數值類型經常使用
類型 字節大小 有符號範圍(Signed) 無符號範圍(Unsigned)
bit 2個比特 默認表示0 只有0和1
tinyint 1 -128 ~ 127 0 ~ 255
smallint 2 -32768 ~ 32767 0 ~ 65535
mediumint 3 -8388608 ~ 8388607 0 ~ 16777215
int/integer 4 -2147483648 ~2147483647 0 ~ 4294967295
bigint 8 -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709551615
  1. 字符串經常使用
類型 字節大小 示例
char 0-255 類型:char(3) 輸入 'ab', 實際存儲爲'ab ', 輸入'abcd' 實際存儲爲 'abc'
varchar 0-255 類型:varchar(3) 輸 'ab',實際存儲爲'ab', 輸入'abcd',實際存儲爲'abc'
text 0-65535 大文本
  1. 日期時間類型
類型 字節大小 示例
date 4 '2020-01-01'
time 3 '12:29:59'
datetime 8 '2020-01-01 12:29:59'
year 1 '2017'
timestamp 4 '1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC

2.2 約束條件

  • primary key(主鍵):物理上存儲的順序
  • not null(非空):此字段不容許填寫空值
  • unique(惟一):此字段的值不容許重複
  • default(默認):當不填寫此值時會使用默認值,若是填寫時以填寫爲準
  • foreign key(外鍵):對關係字段進行約束,當爲關係字段填寫值時,會到關聯的表中查詢此值是否存在,若是存在則填寫成功,若是不存在則填寫失敗並拋出異常

說明:雖然外鍵約束能夠保證數據的有效性,可是在進行數據的crud(增長、修改、刪除、查詢)時,都會下降數據庫的性能,因此不推薦使用,那麼數據的有效性怎麼保證呢?答:能夠在邏輯層進行控制 數值類型(經常使用)sql

3. 命令SQL

3.1 基本操做

說明:一切操做基於安裝好MySQL以後,且不分大小寫數據庫

  • 鏈接MySQL:mysql -uroot -p密碼
  • 退出數據庫:exit/quit/Ctrl+d
  • 顯示數據庫版本:select version();
  • 顯示時間:select now();
  • 查看全部數據庫:show databases;
  • 建立數據庫:create database 數據庫名 charset=utf8;
  • 查看建立數據庫所使用的全部語句:show crate database 數據庫名;
  • 刪除數據庫:drop database 數據庫名;(工做中慎用)
  • 使用數據庫:use 數據庫名;
  • 查看當前使用的數據庫:select database();

使用數據庫後數據表的操做:瀏覽器

  • 查看當前數據庫中全部表:show tables;
  • 建立表:create table 數據表名(字段1 字段類型 字段約束條件,字段2 類型 約束...);
  • 查看錶結構:desc 數據表名;
  • 向表裏添加數據:insert into 數據表名 values(0, xx, xxx,...);
  • 查看數據表內全部數據(少數據類型):select * from 數據表名;
  • 查看錶的建立語句:show create table 數據表名;

3.2 修改數據表

  • 添加字段:alter table 表名 add 字段名(列) 類型 約束等;
  • 修改字段中類型/約束:alter table 表名 modify 字段名(列) 要修改的類型/約束;
  • 修改字段名及類型/約束:alter table 表名 change 原名 新名 類型/約束;
  • 刪除字段(基本不用):alter table 表名 drop 字段(列)名
  • 刪除表(工做中慎用):drop table 表名;

3.3 增長表內數據

  • 全列插入:insert into 表名 values(...);
  • 部分插入:insert into 表名(列1,...) values(值1,...)
  • 多行插入:insert into 表名 values(...), (...), ...;

3.4 修改表內數據

  • 修改:updata 表名 set 列1=值1,列2=值2... where 判斷條件;(不加where所有修改成列1=值1...,加上where修改知足判斷條件的列1=值1...)

3.5 刪除

  • 物理刪除(不推薦):delete from 表名 where 判斷條件;(刪除知足判斷條件的數據,其它主鍵不變,刪除的主鍵消失)
  • 邏輯刪除(推薦):alter table 表名 add 字段名 bit;(添加一個bit類型的字段,表示已經不能再使用了)

3.6 查詢的基本使用

  • 查詢全部列:select * from 表名;
  • 條件查詢:select * from 表名 where 判斷條件;(多行、某行或某個數據)
  • 查詢指定列:select 列1,列2... from 表名;
  • 爲列或表指定別名:select 字段名1 as 別名1,字段名1 as 別名1... from 數據表 as 別名;(數據顯示按書寫順序顯示,可調換先後位置,顯示的數據也會調換)

4. 查詢的全部經常使用用法

4.1 條件查詢

  • 消除重複行:select distinct 字段名 from 表名;
  • 比較運算符:select * from 表名 where >、<、<=、>=、=、!=;
  • 邏輯運算符:select * from 表名 where 條件1 and、or、not 條件2;

4.2 模糊查詢

  • select 列1 from 表名 where 列1 like "_表示一個、%表示0個或多個、中文表示知足該位置出現那個中文的數據";
  • select 列1 from 表名 where 列1 rlike "正則表達式";

4.3 範圍查詢

  • 查詢在in(條件)非連續的條件中的數據:select 列1 from 表名 where 列1 in(...);
  • 查詢不在not in(條件)非連續的條件中的數據:select 列1 from 表名 where 列1 not in(...);
  • 查詢在一個連續範圍內的數據:select 列1 from 表名 where 列1 between x and y;
  • 查詢在一個連續範圍以外的數據:select 列1 from 表名 where 列1 not between x and y;

4.4 空判斷

  • 判空:select * from 表名 where 判斷對象 is null;
  • 判非空:select * from 表名 where 判斷對象 is not null; 注意:Python中None不等於""、[]、()、{}等,此處也是。

4.5 排序

  • 默認從小到大排訓asc:select 列1 from 表名 where 判斷條件 order by 列1 (asc可省略);
  • 從大到小排desc:select * from 表名 where 判斷條件 order by 列1 desc;

例:給定一個students表,查詢年齡在18-34歲之間的女性,身高從高到矮排序,若是身高相同的狀況下按照年齡從小到大排序,若是年齡也相同按照id從大到小排序。安全

select * from students where (age between 18 and 34) and gender=2 order by height desc, age asc, id desc;bash

4.6 聚合函數

  • 查總數:select count(*) from 表名;
  • 查最大值:select max(*) from 表名;
  • 查最小值:select min(*) from 表名;
  • 求和:select sum(*) from 表名;
  • 求平均值:select avg(*) from 表名;等同於:select sum()/count() from 表名;
  • 四捨五入,保留2位小數:select round(avg(*), 2) from 表名;

4.7 分組

  • 按照性別分組,查詢全部性別:select gender from 表名 group by gender;
  • 查詢同種性別的姓名:select gender,group_concat(name) from 表名 where gender="男" group by gender;
  • having和where:查詢出的數據判斷用having,未查出的數據判斷用where.

4.8 分頁

  • 限制查詢出來的數據個數:select * from 表名 limit 2;限制只顯示2個
  • 分頁顯示:select * from 表名 limit (第n頁-1【不能爲計算式,只能是數字或參數】),數據個數;

4.9 鏈接查詢

  • 查詢的信息有表A和表B的數據:select ... from 表A inner join 表B on 表A.關聯字段=表B.關聯字段;
  • 查詢表A對應的表B:select * from 表A left join 表B on 表A.關聯字段=表B.關聯字段;(不管如何都會顯示完表A,right join on 表名位置相反)

4.10 自關聯

例:省級聯動 url:demo.lanrenzhijia.com/2014/city06…

  • 查詢全部省份(省份最大上級是null):select * from areas where pid is null;
  • 查詢陝西省有哪些市:select * from areas as province inner join areas as city on city.pid=province.aid having province.atitle="陝西省";或者 select province.atitle, city.atitle from areas as province inner join areas as city on city.pid=province.aid having province.atitle="山東省";
  • 查詢西安市有哪些縣城(區):select province.atitle, city.atitle from areas as province inner join areas as city on city.pid=province.aid having province.atitle="青島市"; 或者 select * from areas where pid=(select aid from areas where atitle="青島市")
  • 子查詢:在一個查詢信息中查詢

例:查出最高的男生信息 select * from students where height=(select max(height) from students);

5. 視圖

5.1 視圖的概念

通俗的講,視圖就是一條select語句執行後返回的結果集。也是對若干基本表的引用,一張虛表,指向各個表的內存地址(不可操做,只可查,基本表數據發生了改變,視圖也會跟着改變)

5.2 視圖的定義

建議以v_開頭

create view 視圖名稱 as select語句;
複製代碼

5.3 查看視圖

查看錶會將全部的視圖也列出來

show tables;
複製代碼

5.4 使用視圖

視圖的用途就是方便查詢

select * from v_stu_score;
複製代碼

5.5 刪除視圖

drop view 視圖名稱;
例:
drop view v_stu_sco;
複製代碼

例:視圖demo

5.6 視圖的做用

  1. 提升了重用性
  2. 對數據庫重構,卻不影響程序的運行
  3. 提升了安全性能,能夠對不一樣的用戶開放
  4. 讓數據更加清晰

6. 事務

6.1 爲何要有事務

  • 事務普遍的運用於訂單系統、銀行系統等多種場景。
  • 若是A給B轉帳,A帳戶扣錢以後,系統出了故障,B沒有收到錢,而A也白白損失了錢,這種狀況是不被容許發生的
  • 所謂事務,它就是一個操做序列,這些操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位。

例:要麼轉帳成功,要麼轉帳失敗,不存在轉帳過程當中流失的問題。

6.2 事務的四大特性(簡稱ACID)

  1. 原子性(Atomicity)
  2. 一致性(Consistency)
  3. 隔離性(Isolation)
  4. 持久性(Durability) 能夠用start transaction語句開始一個事務,而後要麼使用commit提交將修改的數據持久保存,要麼使用rollback回滾全部的修改,事務SQL的樣本以下:
start transaction;

select balance from checking where customer_id = 10233276;

update checking set balance = balance - 200.00 where customer_id = 10233276;

update savings set balance = balance + 200.00 where customer_id = 10233276;

commit;
複製代碼

一個好的事務應該知足上述4大特性

6.3 事務命令

表的引擎類型必須是innodb類型纔可使用事務,這是mysql表的默認引擎

查看錶的建立語句,能夠看到engine = innodb

  • 開啓事務:begin、start transaction;
  • 完成後提交:commit;
  • 誤操做後後退回滾操做:rollback;

7. 索引

數據量很大時,查詢數據會很慢,能夠添加索引來優化查詢。

7.1 索引的概念

索引是一種特殊的文件,它們包含着對數據表裏全部記錄的引用指針。

7.2 索引的原理

字典目錄就是典型的索引,數據庫也能夠用此類方法查詢,好比,把數據分紅段,而後分段查詢,若是有1000條數據,要查第250條,每100條分紅一段,第三段就能夠找到第250條數據,除去了90%無用效數據。

7.3 索引的操做

  1. 建立索引
    • 若是指定字段是字符串,須要指定長度,建議長度與定義字段時長度一致
    • 字段類型若是不是字符串,能夠不填寫長度部分

create index 索引名稱 on 表名(字段名稱(長度))

  1. 刪除索引:drop index 索引名稱 on表名;

例:create table test_index(title varchar(10));

7.4 注意事項

創建太多的索引將會影響更新個插入的速度,由於它須要一樣更新每一個索引文件,對於一個常常須要更新和插入的表格,就不必創建索引了,對於較小的表,排序的開銷不會很大,也不必創建另外的索引。創建索引會佔用磁盤空間

8. MySQL主從同步配置

8.1 主從同步的定義

主從同步使得數據能夠從一個數據庫服務器複製到其餘服務器上,在複製數據時,一個服務器充當主服務器(master),其他的服務器充當從服務器(slave)。由於複製是異步進行的,因此從服務器不須要一直鏈接着主服務器,從服務器甚至能夠經過撥號斷斷續續地鏈接主服務器。經過配置文件,能夠指定複製全部的數據庫,某個數據庫,甚至是某個數據庫上的某個表。 主從同步的好處:

  • 經過增長從服務器來提升數據庫的性能,在主服務器上執行寫入和更新,在從服務器上向外提供讀功能,能夠動態地調整從服務器的數量,從而調整整個數據庫的性能
  • 提升數據安全,由於數據已複製到從服務器,從服務器能夠終止複製進程,因此,能夠在從服務器上備份而不破壞主服務器相應數據
  • 在主服務器上生成實時數據,而在從服務器上分析這些數據,從而提升主服務器的性能

8.2 主從同步的基本步驟

有不少種配置主從同步的方法,能夠總結爲以下的步驟:

  1. 在主服務器上,必須開啓二進制日誌機制和配置一個獨立的ID
  2. 在每個從服務器上,配置一個惟一的ID,建立一個用來專門複製主服務器數據的帳號
  3. 在開始複製進程前,在主服務器上記錄二進制文件的位置信息
  4. 若是在開始複製以前,數據庫中已經有數據,就必須先建立一個數據快照(可使用mysqldump導出數據庫,或者直接複製數據文件)
  5. 配置從服務器要鏈接的主服務器的IP地址和登錄受權,二進制日誌文件名和位置

9. 服務器的動態資源請求

9.1 瀏覽器請求動態頁面的過程

9.2 WSGI

WSGI容許開發者將選擇web框架和web服務器分開。能夠混合匹配web服務器和web框架,選擇一個適合的配對。好比,能夠在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上運行 Django, Flask, 或 Pyramid。真正的混合匹配,得益於WSGI同時支持服務器和架構:

web服務器必須具有WSGI接口,全部的現代Python Web框架都已具有WSGI接口,它讓你不對代碼做修改就能使服務器和特色的web框架協同工做。

9.3 定義WSGI

只要求Web開發者實現一個函數,就能夠響應HTTP請求

def application(environ, start_response):
    start_response("200 OK", [("Content-Type", "text/html")])
    return "Hello World!"
複製代碼

上面的application()函數就是符合WSGI標準的一個HTTP處理函數,它接收兩個參數:

  • environ:一個包含全部HTTP請求信息的dict對象;
  • start_response:一個發送HTTP響應的函數。

10. web整體簡圖

相關文章
相關標籤/搜索