日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

python之路 mysql 博客园_Python之路(二十七):Mysql(下)

發(fā)布時間:2023/12/3 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python之路 mysql 博客园_Python之路(二十七):Mysql(下) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。