1. 數據庫
1.1 數據庫的概念
數據庫是一種特殊的文件,比通常的文件增刪改查速度快的多。html
1.2 MySQL核心元素
記錄(行)
字段(列)
數據表(字段、記錄的集合)
數據庫(數據表的集合)
1.3 RDBMS(關係型數據庫)
常見的關係型數據庫(RDBMS):python
oracle:在之前的大型項目中使用,銀行,電信等項目(收費)
mysql:web時代使用最普遍的關係型數據庫(開源)
ms sql server:在微軟的項目中使用
sqlite:輕量級數據庫,主要應用在移動平臺
常見的非關係型數據庫:mysql
1.4 RDBMS和數據庫的關係
SQL就是操做RDBMS即關係型數據庫的專用語言,經過SQL來實現增刪改查。不區分大小寫
有一款圖形化界面的軟件Navicat,是封裝SQL語言的一款軟件,能夠經過圖形化界面手動操做數據庫建立等全部操做web
2. MySQL數據類型
2.1 經常使用的數據類型
使用數據類型的原則是:夠用就行,儘可能使用取值範圍小的,而不用大的,這樣能夠更多的節省存儲空間正則表達式
整數:int,bit
小數:decimal
字符串:varchar,char
枚舉類型:enum
日期時間: date, time, datetime
數值類型經常使用
類型
字節大小
有符號範圍(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
字符串經常使用
類型
字節大小
示例
char
0-255
類型:char(3) 輸入 'ab', 實際存儲爲'ab ', 輸入'abcd' 實際存儲爲 'abc'
varchar
0-255
類型:varchar(3) 輸 'ab',實際存儲爲'ab', 輸入'abcd',實際存儲爲'abc'
text
0-65535
大文本
日期時間類型
類型
字節大小
示例
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 視圖的做用
提升了重用性
對數據庫重構,卻不影響程序的運行
提升了安全性能,能夠對不一樣的用戶開放
讓數據更加清晰
6. 事務
6.1 爲何要有事務
事務普遍的運用於訂單系統、銀行系統等多種場景。
若是A給B轉帳,A帳戶扣錢以後,系統出了故障,B沒有收到錢,而A也白白損失了錢,這種狀況是不被容許發生的
所謂事務,它就是一個操做序列,這些操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位。
例:要麼轉帳成功,要麼轉帳失敗,不存在轉帳過程當中流失的問題。
6.2 事務的四大特性(簡稱ACID)
原子性(Atomicity)
一致性(Consistency)
隔離性(Isolation)
持久性(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 索引的操做
建立索引
若是指定字段是字符串,須要指定長度,建議長度與定義字段時長度一致
字段類型若是不是字符串,能夠不填寫長度部分
create index 索引名稱 on 表名(字段名稱(長度))
刪除索引:drop index 索引名稱 on表名;
例:create table test_index(title varchar(10));
7.4 注意事項
創建太多的索引將會影響更新個插入的速度,由於它須要一樣更新每一個索引文件,對於一個常常須要更新和插入的表格,就不必創建索引了,對於較小的表,排序的開銷不會很大,也不必創建另外的索引。創建索引會佔用磁盤空間
8. MySQL主從同步配置
8.1 主從同步的定義
主從同步使得數據能夠從一個數據庫服務器複製到其餘服務器上,在複製數據時,一個服務器充當主服務器(master),其他的服務器充當從服務器(slave)。由於複製是異步進行的,因此從服務器不須要一直鏈接着主服務器,從服務器甚至能夠經過撥號斷斷續續地鏈接主服務器。經過配置文件,能夠指定複製全部的數據庫,某個數據庫,甚至是某個數據庫上的某個表。 主從同步的好處:
經過增長從服務器來提升數據庫的性能,在主服務器上執行寫入和更新,在從服務器上向外提供讀功能,能夠動態地調整從服務器的數量,從而調整整個數據庫的性能
提升數據安全,由於數據已複製到從服務器,從服務器能夠終止複製進程,因此,能夠在從服務器上備份而不破壞主服務器相應數據
在主服務器上生成實時數據,而在從服務器上分析這些數據,從而提升主服務器的性能
8.2 主從同步的基本步驟
有不少種配置主從同步的方法,能夠總結爲以下的步驟:
在主服務器上,必須開啓二進制日誌機制和配置一個獨立的ID
在每個從服務器上,配置一個惟一的ID,建立一個用來專門複製主服務器數據的帳號
在開始複製進程前,在主服務器上記錄二進制文件的位置信息
若是在開始複製以前,數據庫中已經有數據,就必須先建立一個數據快照(可使用mysqldump導出數據庫,或者直接複製數據文件)
配置從服務器要鏈接的主服務器的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整體簡圖