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