python之路 mysql 博客园_Python之路(二十七):Mysql(下)
本結目錄
數據庫操作
數據表操作
外鍵約束
多表查詢
索引
事務
python連接Mysql
數據庫操作
此操作針對windows環境下
該操作再Mysql服務器啟動以及客戶端連接之后
對數據庫操作之前,引申一些較為聽的懂的白話
1、顯示數據庫
show databases; --后面記得跟英文字符的分號
show create database 數據庫名稱; --查看數據庫創建信息
默認數據庫: mysql - 用戶權限相關數據 test - 用于用戶測試數據 information_schema - MySQL本身架構相關數據
2、創建數據庫
show databases; --查看當前Mysql都有那些數據,根目錄都有那些文件夾
create database 數據庫名; --創建文件夾
use 數據庫名; --使用選中數據庫,進入目錄
show tables;--查看當前數據庫下都有那些表
create table 表名(nidint, namevarchar(20), pwdvarchar(64)); --創建數據庫表/*闡釋
相當于創建一個tb1的表 有nid,name,pwd三列
nid int 為int類型 varchar(20) 為字符類型最多20*/
select * from 表名; --查看表中的所有數據
insert into 表名(nid, name, pwd) values(1, 'alex', '123'); --插入數據
3、修改數據庫
alter databases 數據庫名稱 character set utf8; --修改數據庫編碼格式
4、刪除數據庫
drop database [if exists] db_name;
5、用戶管理
顯示當前使用的數據庫中所有表:show tables;
PS:用戶權限相關數據保存在mysql數據庫的user表中,所以也可以直接對其進行操作(不建議)
show databases;usemysql;
show tables;
可以看到mysql下有多少張表
user表是用戶表desc user; 查看user表有多少列select host,user from user; 可以看到用戶
創建用戶create user '用戶名'@'IP地址' identified by '密碼';
刪除用戶drop user '用戶名'@'IP地址';
修改用戶
renameuser '用戶名'@'IP地址'; to '新用戶名'@'IP地址';;
修改密碼set password for '用戶名'@'IP地址' = Password('新密碼')
數據表操作
1、創建數據表
create table表名(
列名 類型 是否可以為空,
列名 類型 是否可以為空
)ENGINE=InnoDB DEFAULT CHARSET=utf8--ENGINE=InnoDB 表示引擎 后為默認編碼格式為utf
--是否可空,null表示空,非字符串
not null --不可空
null --可空
--默認值,創建列時可以指定默認值,當插入數據時如果未主動設置,則自動添加默認值
create tabletb1(
nidint not null defalut 2,
numint not null)
--主鍵,一種特殊的唯一索引,不允許有空值,如果主鍵使用單個列,則它的值必須唯一,如果是多列,則其組合必須唯一。
create tabletb1(
nidint not null auto_increment primary key,
numint null)
或create tabletb1(
nidint not null,
numint not null,primary key(nid,num)
)
--自增,如果為某列設置自增列,插入數據時無需設置此列,默認將自增(表中只能有一個自增列)
create tabletb1(
nidint not null auto_increment primary key,
numint null)
或create tabletb1(
nidint not nullauto_increment,
numint null,index(nid)
)--對于自增列,必須是索引(含主鍵)。
--對于自增可以設置步長和起始值
show session variables like 'auto_inc%';set session auto_increment_increment=2;set session auto_increment_offset=10;
shwo global variableslike 'auto_inc%';set global auto_increment_increment=2;set global auto_increment_offset=10;
2、查看數據表
show tables; --顯示當前數據庫所有表
desc 表名; --查看表結構
showcreate table 表名 --查看完整表創建信息
3、修改表結構
--增加列(字段)--添加多字段用逗號隔開進行
alter table 表名 add 列名 類型 [約束條件];--刪除列(字段)--多字段刪除也用逗號隔開,無需加數據類型
alter table 表明 drop列名1,列名2...;--修改列(字段)
--列類型修改
alter table 表名 modify 列名 類型 [約束條件][first|after 列名];--列名稱修改
alter table 表名 change 原列名 新列名 類型 [約束條件][first|after 列名];
4、修改表名
rename table 原表名 to 新表名;
5、刪除表
drop table 表名;
表記錄操作
1、增
insert into 表 (列名,列名...) values(值,值,值...)insert into 表 (列名,列名...) values(值,值,值...),(值,值,值...)insert into 表 set 列名=值,列名=值...;--insert into 表 (列名,列名...) select (列名,列名...) from 表
2、刪
delete from 表名 where 字段鍵值對; --可多條多慮
delete from表名;truncate table表名;--如不進行篩選,則刪除表的所有記錄(表依舊存在)--delete 逐條刪除,留下空表--truncate 先刪除表,而后copy一個與之前相同的空表
3、改
update 表 set name = 'Tony' where id>1
--多條可以用逗號隔開進行修改--進行篩選則單獨對篩選的那部分進行修改--不進行篩選,則修改所有符合的部分
4、查(*****)
select * from 表 --查看表中的所有數據
select * from 表 where id > 1 --篩選id大于1的所有數據
select nid,name,gender as gg from 表 where id > 1 --查看id大于1的nid,name,gender的三個字段 as ... 表示進行別名設置
A、條件select * from 表 where id > 1 and name != 'alex' and num = 12; --篩選id>1且name不為alex且num為12的數據
select * from 表 where id between 5 and 16; --篩選id值在5到16范圍內的數據
select * from 表 where id in (11,22,33) --篩選id值為11或22或33的數據
select * from 表 where id not in (11,22,33) --反之
select * from 表 where id in (select nid from表)
B、SQL通配符select * from 表 where name like '%le%' --選取name包含有le的所有數據
select * from 表 where name like 'ale_' --ale開頭的所有(一個字符)
select * from 表 where name regexp "^[awv]"; --選取name以'a'、'w'或'v'開始的所有數據
select * from tb where name regexp "^[a-c]"; --選取name以a到c開頭范圍內的所有的數據
select * from tb where name regexp "^[^a-c]";--選取name非以a到c開頭的所有數據
C、限制select * from tb limit 2; --前2行
select * from tb limit 2,2; --從第2行開始的后2行
select * from tb limit 2 offset 2; --從第2行開始的后2行
D、排序select * from tb order by name asc; --按照name升序排列
select * from tb order by name desc; --按照name降序排列
E、分組select * from tb group by name; --根據名字分組
select * from tb group by 2; --根據第2個字段分組
select * from employee_tbl group by name having id>4; --根據名字分組且id大于4的數據
--where作用于分組前,having作用于分組后且可以用聚合函數,在where中就不行
F、聚合函數(經常作用于分組查詢配合使用)SUM(字段) --求和
COUNT(字段) --次數統計
AVG(字段) --平均值
MAX(字段) --最大
MIN(字段) --最小
= --等于
<> --不等于。注釋:在 SQL 的一些版本中,該操作符可被寫成 !=
> --大于
< --小于
>= --大于等于
<= --小于等于
BETWEEN--在某個范圍內
LIKE --搜索某種模式
IN --指定針對某個列的多個可能值
以上都只是單表性的查詢,例如模擬在實際生活中,會有一張員工表,而員工會有其歸屬的部門,那么相應的也會有一張部門表.在其中相應的倆者之間會有一種相應的關聯,那么這里引申了外鍵及多表查詢
外鍵約束
外鍵可以理解為一種約束,它有以下限制(FOREIGN KEY為創建外鍵的關鍵詞)
注意:作為外鍵一定要和關聯主鍵的數據類型保持一致
FOREIGN KEY 約束用于預防破壞表之間連接的行為。
FOREIGN KEY 約束也能防止非法數據插入外鍵列,因為它必須是它指向的那個表中的值之一。
創建外鍵
--1、建立從表的時候就和主表建立外鍵
CREATE TABLETABLE_NAME('字段'類型,'字段'類型,
... ...FOREIGN KEY (從表字段) REFERENCES主表(字段)
);--2、建表完成之后,也可以通過sql語句和主表建立聯系
ALTER TABLE 從表 ADD CONSTRAINT 外鍵名稱(形如:FK_從表_主表) FOREIGN KEY (從表字段) REFERENCES 主表(字段);
刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱
--創建表 班級表和學生表
CREATE TABLEclass(
idINT PRIMARY KEYAUTO_INCREMENT,
nameVARCHAR(20),
prieceINT);DESCclass;INSERT INTO class(name,priece) VALUES("python",15800),
("linux",14800),
("go",16800),
("java",18800);SELECT * FROMclass;CREATE TABLE student (sid INT PRIMARY KEYAUTO_INCREMENT,
nameVARCHAR(20),
ageINT,
sexTINYINT(1),
class_idINT,FOREIGN KEY (class_id) REFERENCESclass(id));
SHOWCREATE TABLEstudent;DESCstudent;INSERT INTO student(name,age,sex,class_id) VALUES("tony1",18,0,1),
("tony2",19,1,1),
("tony3",17,1,2),
("tony4",19,1,3),
("tony5",19,0,2),
("tony6",20,1,4);SELECT * FROMstudent2;CREATE TABLE student2(sid INT PRIMARY KEYAUTO_INCREMENT,
nameVARCHAR(20),
ageINT,
sexTINYINT(1),
class_idINT);--建表之后添加外鍵
ALTER TABLE student2 ADD CONSTRAINT a1 FOREIGN KEY (class_id) REFERENCESclass(id);
SHOWCREATE TABLEstudent2;--這樣綁定的class_id超出class的id則不讓插入
INSERT INTO student2(name, age, sex, class_id) VALUES("tony8",17,0,1);--刪除外鍵
ALTER TABLE student2 DROP FOREIGN KEYa1;--刪除外鍵之后,則可以插入超出class id范圍的數據
INSERT INTO student2(name, age, sex, class_id) VALUES("tony9",17,0,5);
INOODB下支持的ON語句
--外鍵約束對子表的含義: 如果在父表中找不到候選鍵,則不允許在子表上進行insert/update
--外鍵約束對父表的含義: 在父表上進行update/delete以更新或刪除在子表中有一條或多條對
--應匹配行的候選鍵時,父表的行為取決于:在定義子表的外鍵時指定的
--on update/on delete子句
-----------------innodb支持的四種方式---------------------------------------
-----cascade方式 在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄-----外鍵的級聯刪除:如果父表中的記錄被刪除,則子表中對應的記錄自動被刪除--------
FOREIGN KEY (charger_id) REFERENCESClassCharger(id)ON DELETE CASCADE
------set null方式 在父表上update/delete記錄時,將子表上匹配記錄的列設為null
--要注意子表的外鍵列不能為not null
FOREIGN KEY (charger_id) REFERENCESClassCharger(id)ON DELETE SET NULL
------Restrict方式 :拒絕對父表進行刪除更新操作(了解)
------No action方式 在mysql中同Restrict,如果子表中有匹配的記錄,則不允許對父表對應候選鍵
--進行update/delete操作(了解)
多表查詢
join 用于把來自兩個或多個表的行結合起來。
不同的 SQL JOIN 類型:
INNER JOIN:如果表中有至少一個匹配,則返回行
LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行
RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有的行
FULL JOIN:只要其中一個表中存在匹配,則返回行(mysql不支持全外連接,而是使用union與union all)
無對應關系則不顯示selectA.num, A.name, B.namefromA,BWhere A.nid =B.nid
無對應關系則不顯示selectA.num, A.name, B.namefrom A inner joinBon A.nid =B.nid
A表所有顯示,如果B中無對應關系,則值為nullselectA.num, A.name, B.namefrom A left joinBon A.nid =B.nid
B表所有顯示,如果B中無對應關系,則值為nullselectA.num, A.name, B.namefrom A right joinBon A.nid = B.nid
索引
1、概述
MySQL索引的建立對于MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。
雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。
建立索引會占用磁盤空間的索引文件。
2、分類
普通索引:僅加速查詢
唯一索引:加速查詢 + 列值唯一(可以有null)
主鍵索引:加速查詢 + 列值唯一 + 表中只有一個(不可以有null)
組合索引:多列值組成一個索引,專門用于組合搜索,其效率大于索引合并
全文索引:對文本的內容進行分詞,進行搜索
索引合并:使用多個單列索引組合查詢搜索覆蓋索引:select的數據列只用從索引中就能夠取得,不必讀取數據行,換句話說查詢列要被所建的索引覆蓋
a、普通索引
#創建表直接指定索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX ix_name (username(length))
);
#表外創建索引
CREATE INDEX indexName ON mytable(username(length));#修改表結構
ALTER mytable ADD INDEX indexName ON (username(length));
#刪除索引
DROP INDEX indexname ON tablename;
b、唯一索引
#創建表直接指定唯一索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
);
#創建唯一索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
#刪除索引
DROP UNIQUE INDEX 索引名 ON 表名
c、主鍵索引
#創建主鍵索引
CREATE TABLE t1(
id INT PRIMARY KEY,
name VARCHAR(16)
);
OR
CREATE TABLE t1(
id INT NOT NULL,
name VARCHAR(16),
PRIMARY KEY(id)
);
#添加主鍵
ALTER TABLE 表名 DROP PRIMARY KEY;
#刪除主鍵
ALTER TABLE 表名 DROP PRIMARY KEY;
ALTER TABLE 表名 MODIFY 列名 類型,DROP PRIMARY KEY;
d、組合索引
組合索引是多個列組合成一個索引來查詢
應用場景:頻繁的同時使用多列來進行查詢,如:where name = 'Tony' and age = 18。
#創建表
CREATE TABLE demo(
nid INT NOT NULL auto_increment PRIMARY KEY ,
name VARCHAR(32) NOT NULL,
age INT NOT NULL
)#創建組合索引
CREATE INDEX ix_name_age ON demo(name,age);
如上創建組合索引之后,查詢一定要注意:
name and email ?-- >使用索引,name一定要放前面
name ? ? ? ? ? ? ? ? -- >使用索引
email ? ? ? ? ? ? ? ? -- >不使用索引
注意:同時搜索多個條件時,組合索引的性能效率好過于多個單一索引合并。
e、全文索引
#創建全文索引
CREATE TABLE emp3 (
id INT,
name VARCHAR(30) ,
resume VARCHAR(50),
FULLTEXT INDEX index_resume (resume)
);
3、相關
#顯示索引信息
SHOW INDEX FROM table_name;
事務
1、概述
MySQL 事務主要用于處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務,但是一旦有某一個出現錯誤,即可回滾到原來的狀態,從而保證數據庫數據完整性。!
在MySQL中只有使用了Innodb數據庫引擎的數據庫或表才支持事務
事務處理可以用來維護數據庫的完整性,保證成批的SQL語句要么全部執行,要么全部不執行
事務用來管理insert,update,delete語句
一般來說,事務是必須滿足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
1、事務的原子性:一組事務,要么成功;要么撤回。
2、穩定性?: 有非法數據(外鍵約束之類),事務撤回。
3、隔離性:事務獨立運行。一個事務處理后的結果,影響了其他事務,那么其他事務會撤回。事務的100%隔離,需要犧牲速度。
4、可靠性:軟、硬件崩潰后,InnoDB數據表驅動會利用日志文件重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定什么時候吧事務保存到日志里。
2、事務操作
開啟事務 start transaction
回滾事務 rollback
提交事務 commit
保留點 ? ?savepoint
?View Code
py連接MySQL
pymsql是Python中操作MySQL的模塊,其使用方法和MySQLdb幾乎相同
1、下載安裝
2、操作使用
執行SQL
獲取查詢數據
注:在fetch數據時按照順序進行,可以使用cursor.scroll(num,mode)來移動游標位置,如:
cursor.scroll(1,mode='relative') ?# 相對當前位置移動
cursor.scroll(2,mode='absolute') # 相對絕對位置移動
fetch數據類型
關于默認獲取的數據是元祖類型,如果想要或者字典類型的數據,即:
總結
以上是生活随笔為你收集整理的python之路 mysql 博客园_Python之路(二十七):Mysql(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 陌陌安卓版下载安装(陌陌安卓版下载)
- 下一篇: cdn可以防止ddos(cdn如何防止d
