文章目錄
一.概念
1.事務
(1)什麼是事物?
將一組增刪改查看成一個執行單元,要麼全成功,要麼有一個失敗,數據庫就會回滾,所有操作都不生效
(2)事務的特性?
-
①原子性:將一組增刪改看成一個整體,要不全成功,要不有一個失敗,數據庫就回滾,所有操作都不生效
-
②一致性:事務開始前的狀態和事務執行後的狀態保持一致
-
③隔離性:當多個用戶併發訪問數據庫時,線程會爲用戶開啓一個事務,事務與事務相互隔離,互不干擾
-
④持久性:一旦事務執行生效會永久運用到數據庫,即使設備故障也不影響
(3)不考慮隔離性導致的問題
- ①髒讀:當事務A訪問了事務B未提交的數據,並使用了它
- ②幻讀:當事務A訪問了數據表,事務B修改或刪除了數據,導致事務A讀取與實際不符合,類似出現幻覺
- ③不可重複讀:當事務A多次訪問同一條數據,事務B修改了它,導致事務A兩次讀取的數據不一樣
(4)四個隔離級別
- ①Read uncommitted:讀未提交,最低隔離級別,可能會出現所有情況
- ②Read committed:讀提交,可以避免幻讀
- ③Repeatable read:可重複讀,可以避免幻讀和不可重複讀
- ④Serialzable:串行化,可以避免髒讀、幻讀和不可重複讀。
(5)事務的操作
- 開啓事務:begin
- 提交事務:commit
- 回滾事務:rollback
2.重要的MySQL引擎
①MyISAM:不支持事務,查詢速度相對較慢,將數據儲存在三個文件,一個放索引,一個放數據,一個放表結構
②InnoDB:支持事務,查詢速度相對較快,將數據儲存在兩個文件中,一個放表結構,一個放數據和索引
3.常用的數據類型
int | 存儲整數類型,默認存儲十一位 |
---|---|
char | 存儲定長字符串,無論字符串長度是否夠長,都佔用規定大小 |
varchar | 存儲變長字符串,大小隨字符串長度變化 |
datetime | 存儲日期類型 H:H:H S:S:S |
decimal | 存儲小數,兩個參數,第一個參數爲長度,第二個參數爲幾位小數 |
4.字段約束
unsigned | 約定字符是有符號還是無符號 |
---|---|
primary | 主鍵約束 |
foreign | 外鍵約束 |
unique | 唯一約束 |
int(4) | 最大寬度 |
not null | 不能爲空 |
auto_increment | 自增 |
5.常見的索引
primary key | 唯一索引,不可重複且不能爲空 |
---|---|
unique | 唯一索引,不可重複可以爲空 |
index | 普通索引,可以爲空可以重複 |
多列索引 | 可以爲空可以重複 |
6.視圖
(1)定義:是一張虛擬的表,儲存着複雜的查詢語句
(2)優點:
- ①簡單:存儲着複雜的sql語句,使用時可以直接調用視圖
- ②安全:數據具有對庫和表的權限管理,但是沒有對字段的管理權限,使用視圖可以實現權限管理
- ③數據獨立性:視圖基於源表,源表的結構改變不會影響視圖
(3)缺點:
- ①維護和管理成本增大,對數據遷移有很大影響
- ②如果存儲簡單的查詢語句,視圖會按照複雜的查詢語句執行,會降低執行效率
(4)添加視圖:
crate view 視圖名 as(查詢語句);
(5)查看所有視圖:
show table status where comment='view';
(6)查看視圖表:
select * from 視圖名;
(7)刪除視圖:
drop view 視圖名;
7.觸發器
(1)定義:
觸發器(trigger)也叫觸發程序,觸發器是一種特殊的存儲過程,但是觸發器不需要語句調用,也不需要手動啓動,通過有增刪改事件觸發,當指定表發生指定動作,將激活觸發器。
(2)添加觸發器語句:
create trigger 觸發器名字 觸發時間 觸發事件 on 表名 for each row begin 觸發後的事件 end;
(3)查看所有觸發器:
select * from information_schema.triggers/G;
(4)刪除觸發器:
drop trigger 觸發器名字;
8.Mysql優化:
爲什麼要優化?
一個應用吞吐量瓶頸往往出現在數據庫的處理速度上,隨着應用程序的使用和業務的拓展,數據庫數據量逐漸增多,數據庫處理壓力逐漸增大,關係型數據庫數據存放在磁盤上的,讀寫速度較慢(與內存中的數據相比)
優化方式:
- 設計表的時候嚴格根據數據庫的設計範式來設計數據庫;
- select 後儘量不使用*
- 儘量不使用嵌套查詢,使用連接查詢或者where查詢
- sql關鍵詞儘量使用大寫
- 儘量使用邏輯外交不使用物理外鍵
- 給查詢頻繁的字段添加索引,並且遵循最左原則(儘量將首選關鍵字段放在最前邊)
- 垂直分庫分表:把一些不經常讀的數據或者結果複雜的表拆分成多張表,較少磁盤I/O操作;
- 水平分庫分表:於數據量龐大的表,使用水平分庫分表
- 使用緩存,把經常訪問到的數據而且不需要經常變化的數據放在緩存中,能節約磁盤IO;
- 優化硬件;
- 主從分離讀寫;採用主從複製把數據庫的讀操作和寫入操作分離開來;
9.索引:
(1)定義:一種高效獲取數據的存儲結構,類似於子字典的目錄
(2)優點:提升數據的查詢速度,減少io操作
(3)缺點:維護成本高,會降低其他操作的執行速度
(4)添加索引:
alter table 表名 add 索引類型 索引名(字段名);
(5)查看所有:
show index from 表名;
(6)刪除主鍵索引:
alter table 表名 drop primary key;
(7)刪除索引:
drop index 索引的名字 on 表名;
二.庫的操作
(1)進入數據庫:
mysql -u用戶名 -p密碼 -h主機地址 -P端口號
(2)創數據庫:
create database 庫名;
(3)使用數據庫:
use 庫名;
(4)查看所有數據庫:
show databases;
(5)刪除數據庫:
drop database 庫名;
三.數據庫的表
(1)創建表:
create table 表名(
字段名1 約束,
字段名2 約束,
)charset=utf8;
(2)查看所有表:
show tables;
(3)查看建表語句:
show create table 表名\G;
(4)刪表:
drop table 表名;
(5)表結構的操作:
①添加字段:
alter table 表名 add 字段名 約束;
②刪除字段:
alter table 表名 drop 字段名;
③修改字段:
alter table 表名 modify 字段名 約束;
alter table 表名 change 舊字段名 新字段名 約束;(不改名則寫兩次舊字段名)
④修改表名
alter table 舊錶名 rename as 新表名;
⑤修改編碼類型:
alter table 表名 charset=utf8;
⑥修改自增值:
alter table students auto_increment=新值;(修改的自增值只能比原數據最大的自增值大)
四.數據的操作
(1)添加數據
insert into 表名 values(按字段順序依次寫數據1),(按字段順序依次寫數據2);
insert into 表名(指定字段) values(按指定字段順序依次寫數據1),(按指定字段順序依次寫數據2);
(2)更新數據
update 表名 set 字段名=新數據 where 條件;
(3)刪除數據
delete from 表名 where 條件;
(4)基本查詢數據
------------------------------------where條件查詢
select * from 表名 where 條件;
--------------------------------------分組 group by having
例如:select id from 表名 group by id;
select id from 表名 group by id having id>5;(分組和再篩選最後返回數據)
select id from 表名 where id>5 group by id having id>10;(先where篩選再分組再having篩選最後返回數據)
------------------------------------排序 desc(降序) asc(默認,升序)
select * from 表名 order by 排序條件 desc;
-------------------------------------------limit 分頁
select * from 表名 limit 3;(只顯示三個數據)
select * from 表名 limit 3,4;(跳過三個查看四個數據)
--------------------------------------------聚合函數
max最大值:select max(age) from 表名;
min最小值:select min(age) from 表名;
avg平均值:select avg(age) from 表名;
count計數:select age,count(age) from 表名 group by age;
(5) 運算符:
①and:select * from 表名 where 條件一 and 條件二;
②or :select * from 表名 where 條件一 and 條件二;
③in :select * from 表名 where 字段 in (選項1,選項2,選項3..);
④not:select * from 表名 where 字段 not in (選項1,選項2,選項3..);
⑤= :select * from 表名 where 字段=某值;
五.關係查詢
(1)嵌套查詢
select * from 表1 where id in(select id from 表2);
(2)where關聯
select * from 表1,表2 where 表1.id=表2.id;
(3)連接查詢
內連接
select * from 表1 inner join 表2 on 表1.id=表2.id;(以共同條件爲準)
左連接
select * from 表1 left join 表2 on 表1.id=表2.id;(已左表爲準)
右鏈接
select * from 表1 right join 表2 on 表1.id=表2.id;(已左表爲準)
六.表的關係
(1)一對一
一張表的一條數據對應另一張表的一條數據
(2)一對多
一張表的一條數據對應另一個表的多條數據(例如班級學生)
(3)多對多
一張表的多條數據對應另一個表的多條數據
七.數據的備份
(1)備份庫:
mysqldump -u root -p 庫名 > 備份的庫名.sql
(2)備份表:
mysqldump -u root -p 庫名 表名 > 備份的表名.sql
(3)導入表/庫:
mysql -uroot -p 庫名 < 備份的文件.sql
(導入庫需要先創建輸入庫,因爲實際是導入表,必須重新創入個新的數據庫,然後再導入)
八.創建mysql用戶,添加權限
(1)創建用戶:
create user '用戶名'@'ip地址' identified by '密碼';
(2)授權:
grant all/select/insert/delete on 庫名.表名 to 用戶名@主機地址;
(3)刪除用戶:
drop user 用戶名@主機地址;
(4)修改密碼:
update user set authentication_string=password('新密碼') where user=‘用戶名’ and host=‘主機地址’;
九.pymysql連接數據庫
步驟:
- 1.導入pymysql包
- 2.連接數據庫
- 3.創建遊標
- 4.創建sql語句,並且執行
- 5.若是增刪改需要提交
- 6.關閉遊標和數據庫
import pymysql
#1.連接數據庫
db=pymysql.connect(host='localhost',port='3306',user='root',password='123456',database='news')
#2.創建遊標
cursor=db.cursor()
#3.寫sql語句
sql1='sql增刪改語句'
#4.執行sql1語句
cursor.execute(sql)
##5.若是增刪改都需要保存命令
db.commit()
sql2='sql查詢語句'
cursor.execute(sql2)#執行sql2語句
print(cursor.fetchone()) # 只獲取一個數據,並且還是個生成器
print(cursor.fetchall()) # 會獲取所有數據
#6.關閉遊標和數據庫
cursor.close()
db.close()
十.orm 瞭解概念
ORM,全稱Object Relational Mapping,意爲對象關係映射。
-
①ORM是一個操作數據庫的框架
-
②ORM會將python代碼翻譯成對應數據庫的sql語句
-
③ORM會將數據庫中的表,映射成python中的類
-
④一張表就是一個類,將表中的字段映射成對象的屬性。
優點:可以降低數據庫和程序之間的耦合,專注於業務邏輯即可
缺點:ORM生成的sql語句,不是最優的sql語句,執行效率會比較低。