-- 數據庫備份 在庫外執行,將數據庫備份,在當前目錄生成一個xxx.sql文件
mysqldump -uroot -p 數據庫名 > xxx.sql;
-- 數據庫恢復 在庫外執行,將數據庫恢復到其餘數據庫中去
mysql -uroot -p 新數據庫名 < xxx.sql; 複製代碼
原子性:python
一個事務必須被視爲一個不可分割的最小工做單元,整個事務中的全部操做要麼所有提交成功,要麼所有失敗回滾,對於一個事務來講,不可能只執行其中的一部分操做,這就是事務的原子性mysql
一致性:sql
數據庫老是從一個一致性的狀態轉換到另外一個一致性的狀態。(例如在轉帳過程當中系統崩潰,支票帳戶中也不會損失,由於事務最終沒有提交,因此事務中所作的修改也不會保存到數據庫中。)數據庫
隔離性:緩存
一般來講,一個事務所作的修改操做在提交事務以前,對於其餘事務來講是不可見的。函數
持久性:fetch
一旦事務提交,則其所作的修改會永久保存到數據庫。ui
在使用事務以前,先要確保表的存儲引擎是 InnoDB
類型, 只有這個類型纔可使用事務,MySQL數據庫(5.1以後)中表的存儲引擎默認是 InnoDB
類型。編碼
表的存儲引擎說明:spa
表的存儲引擎就是提供存儲數據一種機制,不一樣表的存儲引擎提供不一樣的存儲機制。
查看MySQL數據庫支持的表的存儲引擎:
-- 查看MySQL數據庫支持的表的存儲引擎show engines;複製代碼
說明:
經常使用的表的存儲引擎是 InnoDB
和 MyISAM
InnoDB
是支持事務的
MyISAM
不支持事務,優點是訪問速度快,對事務沒有要求或者以select、insert爲主的均可以使用該存儲引擎來建立表
開啓事務:
begin;--或者start transaction;複製代碼
開啓事務後執行修改命令,變動數據會保存到MySQL服務端的緩存文件中,而不維護到物理表中
MySQL數據庫默認採用自動提交(autocommit
)模式,若是沒有顯示的開啓一個事務,那麼每條sql語句都會被看成一個事務執行提交的操做
set autocommit = 0;
--設置autocommit = 0 變爲了手動提交事務,默認爲1爲自動提交
insert into 表名(name) values('張無忌');
-- 須要執行手動提交,數據纔會真正添加到表中, 驗證的話須要從新打開一個鏈接窗口查看錶的數據信息,由於是臨時關閉自動提交模式
commit --提交事務
-- 另外從新打開一個終端窗口,鏈接MySQL數據庫服務端
mysql -uroot -p
-- 而後查詢數據,若是上個窗口執行了commit,這個窗口才能看到數據select * from 表名;複製代碼
回滾事務:
放棄本地緩存文件中的緩存數據, 表示回到開始事務前的狀態
rollback; --回滾事務複製代碼
索引在MySQL中也叫作「鍵」,它是一個特殊的文件,它保存着數據表裏全部記錄的位置信息,更通俗的來講,數據庫索引比如是一本書前面的目錄,能加快數據庫的查詢速度。
應用場景:
當數據庫中數據量很大時,查找數據會變得很慢,咱們就能夠經過索引來提升數據庫的查詢效率。
查看錶中已有索引:
show index from 表名;複製代碼
說明:
主鍵列會自動建立索引
索引的建立:
-- 建立索引的語法格式
-- alter table 表名 add index 索引名[可選](列名, ..)
-- 給name字段添加索引
alter table 表名 add index my_name (name);複製代碼
說明:
索引名不指定,默認使用字段名
索引的刪除:
-- 刪除索引的語法格式
-- alter table 表名 drop index 索引名
-- 若是不知道索引名,能夠查看創表sql語句
show create table 表名;
alter table 表名 drop index my_name;複製代碼
聚合函數的介紹
聚合函數又叫組函數,一般是對錶中的數據進行統計和計算,通常結合分組(group by)來使用,用於統計和計算分組數據。下面是一些常見的聚合函數:
count(col): 表示求指定列的總行數
max(col): 表示求指定列的最大值
min(col): 表示求指定列的最小值
sum(col): 表示求指定列的和
avg(col): 表示求指定列的平均值
分組查詢
分組查詢就是將查詢結果按照指定字段進行分組,字段中數據相等的分爲一組。
語法格式:
GROUP BY 列名 [HAVING 條件表達式] [WITH ROLLUP]複製代碼
HAVING對分組後的數據進行條件過濾,WITH ROLLUP在全部記錄的最後加上一條記錄,顯示select查詢時聚合函數的統計和計算結果。
-- 根據gender字段進行分組,彙總全部人的年齡
select gender,group_concat(age) from 表名 group by gender with rollup;複製代碼
下面對數據庫比較常見的SQL語句作一些簡單總結:
insert into 表名(name) values ('黃蓉'),('郭靖'),('黃藥師'); --一次插入多列;
select * from 表名 where not age between 10 and 25; --年齡不在10到25之間;
select * from 表名 where age in(20,23); --年齡是20,23的;
select * from 表名 where height is null; --身高不爲空;
select * from 表名 order by age desc,height desc; --年齡按降序,年齡相同身高按降序排序;
--求平均價格,而且保留兩位小數
select round(avg(price),2) from 表名;
--查詢全部價格大於平均價格的商品,而且按價格降序排序
select id,name,price from 表名 where price > (select round(avg(price),2) from 表名) order by price desc;
--分頁查詢
select * from 表名 limit start,count
-- limit是分頁查詢關鍵字
-- start表示開始行索引,默認是0-
- count表示查詢條數複製代碼
查詢兩個表中符合條件的共有記錄。
select 字段 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2複製代碼
inner join 就是內鏈接查詢關鍵字
on 就是鏈接查詢條件
以左表爲主根據條件查詢右表數據,若是根據條件查詢右表數據不存在使用null值填充。
select 字段 from 左表 left join 右表 on 左表.字段1 = 右表.字段2複製代碼
left join 就是左鏈接查詢關鍵字
on 就是鏈接查詢條件
以右表爲主根據條件查詢左表數據,若是根據條件查詢左表數據不存在使用null值填充。
select 字段 from 左表 right join 右表 on 左表.字段1 = 右表.字段2複製代碼
right join 就是右鏈接查詢關鍵字
on 就是鏈接查詢條件
外鍵約束:對外鍵字段的值進行更新和插入時會和引用表中字段的數據進行驗證,數據若是不合法則更新和插入會失敗,保證數據的有效性。
-- 爲cls_id字段添加外鍵約束
alter table students add foreign key(cls_id) references classes(id);複製代碼
-- 建立學校表
create table school( id int not null primary key auto_increment,
name varchar(10));
-- 建立老師表
create table teacher( id int not null primary key auto_increment,
name varchar(10),
s_id int not null,
foreign key(s_id) references school(id));複製代碼
-- 須要先獲取外鍵約束名稱,該名稱系統會自動生成,能夠經過查看錶建立語句來獲取名稱
show create table teacher;
-- 獲取名稱以後就能夠根據名稱來刪除外鍵約束
alter table teacher drop foreign key 外鍵名;複製代碼
pymysql
是python鏈接mysql
的一個比較經常使用的庫。可經過pip
安裝。
pip show pymysql
--查看是否裝pymysql及查看裝後的信息;
pip install pymysql --安裝複製代碼
import pymysql
''' host=None, # Mysql所在的主機IP地址,若是在本地使用localhost user=root, # 用戶名 password="mysql",# 密碼 database='py', # 使用哪一個數據庫 port=3306, # mysql的端口,默認3306 charset='utf8' # 數據庫編碼格式 '''
conn = pymysql.connect(host = 'None',
user = 'root',
password='mysql',
database='py',
port = 3306,
charset = 'utf8')
sql = 'select * from students' #待執行的sql語句
cursor = conn.cursor() # 獲取遊標
raw_count = cursor.execute(sql) #cursor執行sql語句,返回影響的行數
print('raw_count:',raw_count)
# one = cursor.fetchone() # 返回一個數據,格式是元祖
# print('one:',one)
res = cursor.fetchall() # 返回全部查詢數據,是一個複合元祖
for one in res:
print(one)
cursor.close() # 關遊標
conn.close() # 關閉數據庫鏈接複製代碼
上面的代碼演示了查詢語句的基本使用。
try:
sql = "insert into students(name,age)values(%s,%s),(%s,%s)" # %s參數佔位,插入兩行
cursor = conn.cursor() # 獲取遊標
raw_count = cursor.execute(sql,['西門吹雪',25,'獨孤求敗',30]) #返回影響行數
print('raw_count:',raw_count)
conn.commit() #提交事務
except Exception as e:
print(e)
conn.rollback() # 出現錯誤,對數據進行回滾
finally:
cursor.close()
conn.close()複製代碼
防止sql
注入,用%s
佔位,可傳入任意類型數據, %s
佔位不須要帶引號。上面的代碼演示了執行sql
插入的操做。下面演示刪除與更新sql
的代碼。注意一下cursor
的execute()
方法,若是傳入第二個參數,能夠是列表或元祖。
conn = pymysql.connect(host = 'None',user = 'root',
password='mysql',database='py',
port = 3306,charset = 'utf8')
try:
# sql = "delete from students where id = %s" # 刪除
sql = "update students set age = %s where id = %s" # 修改
cursor = conn.cursor() # 獲取遊標
# raw_count = cursor.execute(sql,(9,)) #刪除id=9的數據
raw_count = cursor.execute(sql,(18,19)) # 修改
print('raw_count:',raw_count)
conn.commit() #提交事務
res = cursor.fetchall() #遍歷全部記錄
for one in res:
print(one)
except Exception as e:
print(e)
conn.rollback() # 出現錯誤,對數據進行回滾
finally:
cursor.close()
conn.close()複製代碼