python mysql高级_Python高级笔记(九)Python使用MySQL

1. MySQL基本使用

1.1 数据库简介

Mysql: 关系型数据库,做网站

redis:当作缓存

mongodb:非关系型数据库,做爬虫

SQL语句:

DQL:数据查询语言,用于对数据进行查询,如select

DML:数据操作语言,对数据进行增加、修改、删除,如insert、update、delete

TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback

DCL:数据控制语言,进行授权与权限的回收,如grant、revoke

DDL:数据定义语音,进行数据库、表的管理等,如create、drop

CCL:指针控制语言,通过控制指针完成表的操作,如declare cursor

MySQL安装

安装服务器段,输入:sudo apt-get install mysql-server (ubuntu里已经安装好了mysql服务器端,无须再安装,并且设置成了开机启动

服务器用于接收客户端的请求,执行sql语句,管理数据库

服务器端一般以服务方式管理,名称mysql

启动服务器: sudo service mysql start

查看进程中是否存在mysql服务: ps -aux |grep mysql

34c38c640f053d3a618615d4ebab7334.png

停止服务: sudo service mysql stop

重启服务: sudo service mysql restart

配置

配置文件目录为:/etc/mysql/mysql.cnf

40badfa32d1c26a3fc4026c1cc05b179.png

进入conf.d目录,打开mysql.cnf,发现没有配置

进入mysql.conf.d目录,打开mysql.cnf,可以看到配置项

01c94d98dcfeba164078f1710dd529bb.png

主配置项如下:

#

# Instead of skip-networking the default is now to listen only on

# localhostwhich is more compatible and is not lesssecure.

bind-address = 127.0.0.1#

#*Fine Tuning

#

key_buffer_size=16M

max_allowed_packet=16M

thread_stack=192K

thread_cache_size= 8# This replaces the startup script and checks MyISAM tablesifneeded

# the firsttimethey are touched

myisam-recover-options =BACKUP

#max_connections= 100#table_open_cache= 64#thread_concurrency= 10#

#*Query Cache Configuration

#

query_cache_limit=1M

query_cache_size=16M

#

#*Logging and Replication

#

# Both location gets rotated by the cronjob.

# Be aware that this log type is a performance killer.

# As of5.1 you can enable the log at runtime!#general_log_file= /var/log/mysql/mysql.log

#general_log= 1#

# Error log-should be very few entries.

#

log_error= /var/log/mysql/error.log

客户端

安装:sudo apt-get install mysql-client

帮助:mysql --help

最基本的连接命令如下:sudo mysql -u root -p

b784eb1e2a5300305a040f4ad24e966d.png

1.2 数据完整性

a067ac87b055d16356c128a67dcd7117.png

b876817c64ea58c263cb2080f4b10596.png

ae925f4be7e51056aa17d9e04498eb70.png

1.3 命令行脚本

1.3.1 命令行连接

7e402c40c92c5e278784f63ea4a179fe.png

1.3.2 数据库操作

查看所有数据库

show databases;

cb6e12f192c0be7683e1564782062a42.png

显示时间

select now();

368690e96f34f4325d7cfc31745e06da.png

创建数据库

默认是latin编码(不推荐)

create database python01;

9aca7e668ee5a98525c18c2d13c15456.png

82f9ef8e1bb7f9be61480ba2cac34664.png

用utf8编码创建

create database python01new charset=utf8;

9ec250ad9ae3f489d01df3826d045923.png

删除数据库

drop database python01;

注意:

10f525b70b011cae392413f50bc11d04.png

1.3.3 数据表操作

use databaseName;

select database();

show tables;

desc tablename; (显示表的属性)

79f1df2970dc9a835718587657b6211e.png

创建表

ff234dc861a538412168343b6214493e.png

a960190878ef5a8d6242649ee7b5fd8e.png

create tablestudent (

idint unsigned not null auto_increment primary key, --auto_increment自增长

name varchar(20),

agetinyint unsigned default 0,

highdecimal(5, 2),

gender enum("男","女","中性", "保密")default"保密",

cls_idintunsigned

);

注意:表数据有中文,需要设置数据库编码为utf8

81c28f31ef77d5231da7033e19f30ce0.png

插入数据

insert into student values(0, "老王", 18, 188.88, "男", 0);

修改表结构 - 添加字段

alter table student add birthday datetime;

f533a67692450b929955c6258b4b6f37.png

修改表结构 - 修改字段:不重命名版(修改列名类型及约束)

alter table 表名 modify 列名 类型及约束;

alter table student modify birthday date;

521b129e9cb47a1f7781c4e316a94ead.png

修改表结构 - 修改字段:重命名版(重命名列名)

alter table student change birthday birth date default "1997-08-22";

e9b22f55ef90ee87dbf11be997a16162.png

修改表结构 - 删除字段(少用)

alter table student drop high;

6e5be5f78eaa2b5852bf3e7c8303154c.png

删除表

drop table xxxx;

查看表的创建语句

63ae9cc1fbdce56ea5c91d580aacf960.png

1.3.4 数据增删改查

增加

insert into student values(0, "豆子", 19, "男", 1, "1997-8-20");insert into student values(null, "豆子", 19, "男", 1, "1997-8-20");insert into student values(default, "豆子", 19, "男", 1, "1997-8-20"),(default, "彦", 19, "女", 1, "1997-8-20");insert into student(name, gender) values("大乔", "男");insert into student(name, gender) values("大乔", "女"), ("貂蝉", "女");

删除(建议逻辑删除)

alter table student add is_delete bit default 0;

update student set is_delete=1 where name="大乔";

修改

update student set gender=2 where name="大乔";update student set name="天启" where id=1;update student set name="艾青", age=33, gender=2 where id=3;

2e4c38266973d9eb8f744b26f444e7ac.png

195a902085e95a5ced86da0a94eb7b58.png

查询

select * from student where id>3;select id as 学号, gender as 性别 ,name as 姓名 from student;

1.3.5 数据备份&恢复

1.4 数据库设计

5e19e030b223f4dc873e20eeb81cb101.png

bcc6648103166d096058e2094e77f773.png

3f602f57b103373c344fefac11eafecd.png

(第一范式:不能再拆)

82bbcfd2de6f0a492c84665fd40ca582.png

(第二范式:必须有主键,如果表里的主键是由两个或多个列构成的,那就不能只由一个列判断了,其他字段必须全部依赖主键而不是一部分)

277dd233fedf66ec679a52302c8c666c.png

5ce9fbb45cbb05bf8e4e417f5859eab0.png

(第三范式:另外非主键列必须直接依赖于主键,不能存在传递依赖,即不能存在:非主键列A依赖非主键列B,非主键B依赖于主键的情况)

b54c8e8d26ee11255f836ddedf85bd13.png

85386a7cbe5af83f3e5a63353eb6d055.png

2. MySQL查询

2.1 MySQL查询

2.11 创建数据库、数据表

--创建数据库

create database python_test_1 charset=utf8;--使用数据库

usepython_test_1;--students表;

create tablestudents(

idint unsigned primary key auto_increment not null,

namevarchar(20) default '',

agetinyint unsigned default 0,

heightdecimal(5, 2),

gender enum("男","女","中性", "保密")default"保密",

cls_idint unsigned default 0,

is_deletebit default 0);--classes表

create tableclasses (

idint unsigned auto_increment primary key not null,

namevarchar(30) not null);

2.12 准备数据

--准备数据--向students表中插入数据

insert into students values(0, '小明', 18, 180.00, 2, 1, 0),

(0, '小月月', 18, 180.00, 2, 2, 1),

(0, "彭于晏", 29, 185.00, 1, 1, 0),

(0, "刘德华", 50, 175.00, 1, 1, 0),

(0, '黄蓉', 38, 160.00, 2, 1, 0),

(0, '凤姐', 28, 150.00, 4, 2, 1),

(0, '王祖贤', 18, 172.00, 2, 1, 1),

(0, '周杰伦', 36, NULL, 1, 1, 0),

(0, '陈尘', 27, 181.00, 1, 2, 0),

(0, '刘亦菲', 20, 160, 2, 2, 0),

(0, '金星', 33, 162.00, 3, 3, 1),

(0, '郭靖', 12, 170.00, 1, 4, 0),

(0, '周杰', 34, 176.00, 2, 5, 0);--向classes表中插入数据

insert into classes values (0, "python_01期"), (0, "python_02期");

2.13 查询所有字段

select * from students;

2.14 查询指定字段

--查询指定字段

select name as 姓名, age as 年龄 fromstudents;select students.name, students.age fromstudents;select s.name, s.age from students ass;--失败的select students.name, students.age from students as s;

--去重

select distinct gender from students;

2.2 条件

2.21 比较运算符

--比较运算符 >, =, <=, !=--查询age>18的信息

select * from students where age > 18;

2.22 逻辑运算符

--逻辑运算符 and, or, not

select * from students where age>18 and age<28;

2.23 模糊查询 (like, rlike)

--模糊查询 like, % 替换1个或者多个, _ 替换1个--查询姓名中 以"小"开始的名字

select * from students where name like "小%";--查询姓名中 有 “小” 所有的名字

select * from students where name like "%小%";--查询有2个字的名字

select name from students where name like"__";--查询至少有2个字的名字

select name from students where name like "__%";--rlike 正则--查询以 周开始的姓名

select name from students where name rlike "^周.*";--查询以 周开始,伦结尾的姓名

select name from students where name rlike "^周.*伦$";

114149669b2ca466cf771eda7f930199.png

981b200fadb23100d01b65b9cecca55b.png

956b24175401b3baaf0bce7b14e4de2a.png

2.24 范围查询 (in)

--范围查询--in (1, 3, 8) 表示在一个非连续的范围内--查询 年龄为18、20, 28, 34的姓名

select name, age from students where age in (18, 20, 28, 34);--查询 不是这几个年龄的 名字

select name, age from students where age not in (18, 20, 28, 34);--查询 不在18,34年龄之间的名字

select name, age from students where not age between 18 and 34;select name, age from students where age not between 18 and 34;--错误select name, age from students where age not (between 18 and 34);

8fde78d69802c7dfcda58556d544c453.png

2.25 空判断

--空判断

select * from students where height is null;

2.3 排序

--排序--查询年龄在18到34之间的男性,按照年龄从小到大排序

select * from students where (age between 18 and 34) and gender=1 order byage;select * from students where (age between 18 and 34) and gender=1 order by age asc;--降序, 且相同时按照第二个字段(id desc)来排序

select * from students where (age between 18 and 34) and gender=2 order by age desc, id desc;

a744445b220eaeb8c4886d05da18d298.png

2.4 聚合函数

--聚合函数--count(), 查询男性多少人

select count(*) as 男性人数 from students where gender=1;--最大值max, 平均数ave--查询最大的年龄

select max(age) fromstudents;--计算平均年龄

select round(sum(age)/count(*), 2) from students;

2614b977fbcde5d5daa6e9d6c6a5e39b.png

2.5 分组(常和聚合函数一起用,可以单独计算组里的数据)

--分组--按照性别分组,查询所有的性别, select后面要取,唯一能标记组的东西

select gender from students group by gender;

77dbdfa7d7f39250dc2047eb329f8443.png

--计算每种性别的人数

select gender, count(*) from students group by gender;

3fe074e4ad7455008f30853808f51c68.png

--计算每种性别最大年龄

select gender, max(age) from students group by gender;

6cd7f0abf12cb0f1906ae788be16c0cf.png

-- 查看组里的信息

--查看组里的信息

select gender, group_concat(name) from students group by gender;

446b702debbac7c4fc3c301e1e9e76a8.png

2.51 设置需要分组数据的条件(where需要放在group前面)

select gender, group_concat(name, "_", age, " ", id) from students where gender=1 group by gender;

26d663ccd774a325bd84ce066df394bd.png

2.52 设置分组结果的条件(having在group后面)

select gender, group_concat(name), avg(age) from students group by gender having avg(age) > 30;

1414a39f289efe1871a7bcef58527d85.png

2.5 分页(limit在最后)

2.51 limit (第N页-1)*每页的个数, 每页的个数

select * from students where gender=1 limit 2, 5;

cf5115272c06487035cb57745d494195.png

2.52 limit在最后

select * from students where gender=2 order by height desc limit 0, 2;

1188c18699ad4969ae17c0630a063951.png

2.6 连接查询(多个表的关联查询)

e534fb4e2efa73a05ad0095a67f30c6c.png

2.61 内连接(inner join)

--查询 有能够对应班级以及班级信息

select * from students inner join classes on students.cls_id = classes.id;

1e1c545f1ed03b97b008a0922a07e768.png

优化

--按照要求显示姓名、班级

select students.*, classes.name from students inner join classes on students.cls_id = classes.id;

798087d747af04b81d34228748df3a2e.png

给表起名字

select s.*, c.name from students as s inner join classes as c on s.cls_id = c.id;

加排序

--查询 有能够对应班级的学生以及班级信息,按照班级进行排序

select c.name, s.* from students as s inner join classes as c on s.cls_id = c.id order by c.name, s.id;

a787ddc1804c468d718fca600de1703e.png

2.62 左连接(left join)(谁写在left左边,就以谁为基准)

--查询每位学生对应的班级信息

select * from students as s left join classes as c on s.cls_id = c.id;

be0394baee1bccade862a0fdabafe9cb.png

注意:没有对应班级的学生

--查询没有对应班级的学生信息--having: 是从结果集里判断结果

select * from students as s left join classes as c on s.cls_id = c.id having c.id is null;--where: 是从原表里判断结果

select * from students as s left join classes as c on s.cls_id = c.id where c.id is null;

c580b30c812bff301ee404dc9afbc236.png

2.7 自关联

如这种形式:

05dcef63bdda497a567112da1bc839f2.png

c2161a96a7a99f1133a26926c8eec3b6.png

自己关联自己,p_id里存放上一级的id,null表示最高级。

5cc60559cf8fe0668c4524c07b918440.png

2.71 创建areas表

create tableareas(

aidint primary key,

atitlevarchar(20),

pidint);

插入数据,source areas.sql

--查xx省的xx市

select province.atitle, city.atitle from areas as province inner join areas as city on city.pid = province.aid having province.atitle="山东省";

2.8 子查询

--查询最高的学生信息

select * from students where height = (select max(height) from students);

1938ca1a0e6afe1bfe3516b4513e7193.png

3. MySQL和Python交互

3.1 准备数据

3.2 SQL演练

3.3 数据库设计

3.4 python操作mysql步骤

3.5 增删改查

3.6 参数化

4. MySQL高级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值