MySQL-Day03回顧
一、索引
一、普通索引 index
二、惟一索引(UNI,字段值不容許重複,但能夠爲NULL)
一、建立
一、字段名 數據類型 unique
二、unique(字段名),
unique(字段名)...
三、create unique index 索引名 on 表名(字段名);
二、刪除(只能一個一個刪)
show index from 表名;
drop index 索引名 on 表名;
三、主鍵索引&自增加屬性(PRI,字段值不容許重複且不能爲NULL)
一、注意:一個表中只能有一個字段爲主鍵字段
二、建立
一、id int primary key auto_increment,
二、primary key(字段名)
三、alter table 表名 add primary key(字段名)
三、刪除
一、先刪除自增加屬性
alter table 表名 modify 字段名 數據類型;
二、刪除主鍵
alter table 表名 drop primary key;
四、已有表添加自增加屬性
alter table 表名 modify 字段名 數據類型 auto_increment;
四、外鍵索引
一、做用:讓當前表字段值在另外一個表字段的範圍內去選擇
二、建立
一、foreign key(參考字段名)
references 被參考表名(被參考字段名)
on delete 級聯動做
on update 級聯動做
二、alter table 表名 add foreign key(...)...
## 會受到表中原有數據的限制 ##
三、級聯動做
一、cascade
二、restrict(默認)
三、set null
四、no action
四、使用規則
一、兩張表被參考字段和參考字段數據類型要一致
二、被參考字段必須是 主鍵
五、刪除外鍵
一、查看外鍵名
show create table 表名;
二、刪除外鍵
alter table 表名 drop foreign key 外鍵名;
二、數據導入
一、load data infile "/var/lib/mysql-files/文件名"
into table 表名
fields terminated by "分隔符"
lines terminated by "\n"
二、步驟
一、在數據庫中建立對應的表
二、查看數據庫的搜索路徑
show variables like "secure_file_priv";
三、將文件拷貝到搜索路徑中
sudo cp 文件 /var/lib/mysql-files/
四、執行數據導入語句
三、數據導出
一、select ... from 表名
into outfile "/var/lib/mysql-files/文件名"
fields terminated by "分隔符"
lines terminated by "\n";
二、注意
一、導出內容徹底由select查詢語句決定
二、路徑必須指定數據庫搜索路徑
四、表複製
一、create table 表名 select 查詢語句 [where false];
二、複製表不會把原表的 key 屬性複製過來
五、嵌套查詢(子查詢)
六、多表查詢
一、笛卡爾積
select 字段名列表 from 表名列表;
二、加 where 條件 == inner join
七、鏈接查詢
一、內鏈接(只顯示匹配到的記錄)
二、外鏈接
一、左鏈接(以左表爲主去顯示查詢結果)
二、右鏈接
三、select 字段名列表 from 表1 left join 表2 on 條件;
MySQL-Day04筆記
一、MySQL用戶帳戶管理
一、開啓MySQL遠程鏈接
一、獲取root權限
sudo -i
二、cd到配置文件所在路徑
cd /etc/mysql/mysql.conf.d/
三、vi mysqld.cnf
#bind-address = 127.0.0.1
瀏覽模式 -> a(插入模式)
-> esc(瀏覽模式) ->
shift + :(命令行模式) ->
:wq(保存並退出)
四、重啓mysql服務
/etc/init.d/mysql restart
二、添加受權用戶
一、使用root用戶鏈接到服務器
mysql -uroot -p123456
二、添加新的受權用戶
create user "用戶名"@"IP地址" identified by "密碼";
create user "tiger"@"%" identified by "123456";
IP地址的表示方式:
一、% 表示用戶能夠從任何地址鏈接到服務器
二、localhost 用戶只能從本地鏈接
三、指定一個IP 表示用戶只能今後IP鏈接到服務器
三、給用戶受權
grant 權限列表 on 庫.表 to "用戶名"@"IP地址" with grant option;
grant all privileges on *.* to "tiger"@"%" with grant option;
權限列表:select,update,delete,insert,alter,drop,create,...
庫.表: *.* 表示全部庫的全部表
### 寫入到 庫mysql下的user表, user、host兩個字段
四、練習
添加一個受權用戶 monkey ,全部人均可以鏈接,只對 db1庫有查詢權限
一、添加受權用戶 monkey
create user "monkey"@"%" identifited by "123456";
二、給 monkey 用戶受權
grant select on db1.* to "monkey"@"%" with grant option;
三、驗證:mysql -hIP地址 -umonkey -p
五、刪除受權用戶
drop user "用戶名"@"IP地址";
drop user "tiger"@"%";
二、數據備份(mysqldump,在Linux終端中操做)
一、命令格式
mysqldump -uroot -p 源庫名 > 路徑/xxx.sql
二、示例
一、備份db2庫
mysqldump -uroot -p db2 > /home/tarena/db2.sql
三、源庫名的表示方式
--all-databases 備份全部庫
庫名 備份單個庫
-B 庫1 庫2 ... 備份多個庫
庫名 表1 表2 ...備份指定庫的指定表
四、練習
一、備份全部庫 all_mysql.sql,放到用戶主目錄下的 mydata 目錄中
mysqldump -uroot -p --all-databases > ~/mydata/all_mysql.sql
二、備份 db2 庫中的sheng、city、xian三張表 db2scx.sql
mysqldump -uroot -p db2 sheng city xian > ~/mydata/db2scx.sql
三、備份 MOSHOU 和 db2 庫,MSdb2.sql
mysqldump -uroot -p -B MOSHOU db2 > ~/mydata/MSdb2.sql
三、數據恢復
一、命令格式
mysql -u用戶名 -p 目標庫名 < 路徑/xxx.sql
二、示例
一、先備份庫
mysqldump -uroot -p db2 > db2.sql
二、刪除庫
drop database db2;
三、先建立空庫
create database db2 default charset=utf8;
四、恢復命令
mysql -uroot -p db2 < db2.sql
三、備份分爲 徹底備份 和 增量備份
徹底備份:mysqldump
增量備份:binlog日誌、xbackup工具
四、從全部庫的備份文件中恢復某一個庫(--one-database)
mysql -u用戶名 -p --one-database 目標庫名 < all_mysql.sql
示例:
mysql -uroot -p --one-database db2 < all_mysql.sql
注意:
一、恢復庫時庫中新增的表不會刪除
二、恢復時必須先建立空庫
四、事務和事務回滾
一、定義
一件事從開始發生到結束的整個過程
二、做用
確保數據的一致性
三、事務和事務回滾的應用
一、mysql中默認sql語句會自動commit到數據庫
show variables like "autocommit";
二、事務應用
一、開啓事務
mysql> start transaction;
mysql> ... SQL命令
## 此時autocommit被禁用,SQL命令不會對數據庫中數據作修改
二、終止事務
mysql> commit;
或者
mysql> rollback;
三、注意
一、事務回滾rollback只針對於對錶記錄的操做,增、刪、改,對建立庫、建立表的操做無效
三、案例
一、背景
你:建行卡
你朋友:工商卡
你在建行的自動提款機給你朋友工商卡轉5000元
二、過程
一、轉帳中...
一、先到建行的數據庫把你的餘額 -5000
二、再到工行的數據庫把你朋友的餘額 +5000
三、commit; 轉帳成功
rollback; 回滾,轉帳失敗
二、過程
表一、CCB
create table CCB(
name varchar(20),
money int
);
insert into CCB values("Zhuanqian",10000);
表二、ICBC
create table ICBC(
name varchar(20),
money int
);
insert into ICBC values("Shouqian",4000);
開始轉帳
mysql>start transaction;
mysql>update CCB set money=5000 where name="Zhuanqian";
mysql>update ICBC set money= 斷電了,宕機了..;
mysql>rollback;
五、存儲引擎
一、定義
是用來處理表的處理器
二、存儲引擎基本操做
一、查看已有表的存儲引擎
show create table 表名; # engine=...
二、建立表時指定存儲引擎
create table 表名(...)engine=myisam;
三、查看全部的存儲引擎
mysql> show engines;
三、工做中使用的存儲引擎
innodb myisam
四、經常使用存儲引擎特色
一、innodb特色
一、共享表空間
表名.frm 表結構
表名.ibd 表記錄&索引信息
二、支持行級鎖
二、myisam特色
一、獨享表空間
表名.frm 表結構
表名.myd 表記錄
表名.myi 索引信息
二、支持表級鎖
五、鎖
一、加鎖的目的
解決客戶端併發訪問的衝突問題
二、鎖類型
讀鎖(select)共享鎖
加讀鎖以後不能更改表中內容,但能夠進行查詢
寫鎖(insert,update,delete)互斥鎖、排他鎖
三、鎖粒度
表級鎖
行級鎖
####操做完成後會自動釋放鎖
六、如何決定使用哪一種存儲引擎
一、執行查詢操做多的表使用myisam存儲引擎(使用innodb浪費資源)
二、執行寫操做比較多的表使用innodb存儲引擎
七、如何更改表的默認存儲引擎
一、sudo -i
二、cd /etc/mysql/mysql.conf.d/
三、vi mysqld.cnf
[mysqld]
defalut-storage-engine = myisam
四、/etc/init.d/mysql restart
八、memory存儲引擎
memory: 表記錄存儲在內存中
表名.frm 表結構
## 服務重啓以後表結構在,表記錄都消失
六、MySQL調優
一、選擇合適的存儲引擎
一、常常用來讀的表使用myisam存儲引擎
二、其他的表都用innodb存儲引擎
二、SQL語句調優(儘可能避免全表掃描)
一、在select where order by常涉及到的字段上創建索引
二、where子句中不使用 !=,不然將放棄使用索引進行全表掃描
三、儘可能避免用NULL值判斷,不然會全表掃描
示例:
select id from t1 where number is null;
優化:
在number字段設置默認值0
四、儘可能避免 or 來鏈接條件,致使全表掃描
示例(優化前):
select id from t1 where id=10 or id=20;
優化後:
select id from t1 where id=10
union all
select id from t1 where id=20;
五、模糊查詢儘可能避免使用前置 %,致使全表掃描
select id from t1 where name like "a%";
六、儘可能避免 in 和 not in,致使全表掃描
select id from t1 where id in(1,2,3);
select id from t1 where id between 1 and 3;
七、儘可能避免使用 select * ...,要用具體的字段列表代替 *,不要返回用不到的任何字段
七、Python數據庫編程
一、python數據庫接口(Python DB-API)
一、爲開發人員提供的數據庫應用編程接口
二、支持的數據庫服務軟件
mysql、Oracle、SQL_Server、mongodb...
三、python提供的操做mysql模塊
python3: pymysql
python2: MySQLdb
四、pymsql模塊使用流程
一、創建數據庫鏈接
二、建立遊標對象
三、使用遊標對象的方法操做數據庫
四、提交commit
五、關閉遊標對象
六、關閉數據庫鏈接
五、創建數據庫鏈接
一、語法格式
對象名 = pymysql.connect("主機地址","用戶名","密碼","庫名",charset="utf8")
二、connect鏈接對象支持的方法
一、cursor() 建立一個遊標對象db.cursor()
二、commit() 提交到數據庫執行(表記錄增刪改)
三、rollback() 回滾
四、close() 關閉數據庫鏈接
三、遊標對象支持的方法
一、execute("SQL命令") 執行SQL命令
二、fetchone() 取得結果集的第一條記錄
三、fetchmany(n) 取得結果集的 n 條記錄
四、fetchall() 取得結果集的全部記錄
五、close() 關閉遊標對象
八、Mysql workbench(圖形化界面管理工具)
九、ER模型&ER圖
一、定義
ER模型即 實體 - 關係 模型
ER圖即 實體關係圖
二、三個概念
一、實體
二、屬性
三、關係
一、定義 :實體之間的關係
二、分類
一對一關係(1:1) : 班級和班長
一對多關係(1:n) : 公司和職工、班級和學生
多對多關係(m:n) : 學生和課程
四、ER圖的繪製
一、矩形框表明實體,菱形框表明關係,橢圓形表明屬性
二、見 ER圖.png