python第四十六天 数据库总结
Posted liguodeboke
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python第四十六天 数据库总结相关的知识,希望对你有一定的参考价值。
# 增 create database review; # 查 show databases; show create database review; # 查看数据库的创建,默认为 CHARACTER SET latin1 编码 # 改 # 没有专门的改操作,删了重建 alter database review charset utf8; # 将数据库的字符编码改为utf8编码 # 删 drop database review;
use review; # 增(创建) create table test ( id int auto_increment primary key, name varchar(32) not null default ‘‘ )engine=Innodb charset=utf8; create table test_join ( id int auto_increment primary key, course varchar(32) not null default ‘‘, name_join int not null default 0, constraint fk_name_id foreign key (name_join) references test(id) )engine=Innodb charset=utf8; # 删 drop table test; alter table test drop name; # 删除列/字段名 # 改 alter table test rename new_test; # 更改表名 alter table test change/modify name title varchar(32) not null default ‘‘; # 修改字段名 alter table test add title varchar(32) not null default ‘‘; # 增加新列 # 查 show tables;
# 增 insert into test (name) values (‘wangyong‘), (‘liguo‘), (‘jiyuzhi‘); # 删 delete from test where id=3; delete from test; # 删除之后,增加数据id会直接增加 truncate test; # 删除之后,增加数据id会清空 # 改 update test set name=‘title‘; # 将name属性的值全部改为title update test set name=‘title‘ where id=2; # 将id=2d的name属性的值改为title # 查 select * from test; select name from test;
# where select * from test where id>1 and id<=3; # between and 闭区间 select * from test where id between 1 and 3; # in / not in select * from test where id in (1,2,3); # 通配符 select * from test where name like ‘%wang%‘; select * from test where name like ‘%wang_‘; # limit select * from 表名 limit 索引偏移量, 取出多少条数据; select * from test where id limit 2,3; # 从第2号位(第3个数)开始查询3个 # group by 分组 # select age, 聚合函数(count(num)/sum(num)/max(num)/min(num)/avg(num)) from 表名 group by 列名; select name, count(name) from test group by name; select name, count(name) from test group by name having name=‘wangyong‘; # 二次筛选 # order by 排序 select * from test order by name desc; # desc:降序 select * from test order by name asc; # asc:升序 # 连表(left join、 right join、 inner join) # left join 左边的表全部显示, 右边没有用到不显示 select test.name, test_join.course from test left join test_join on test.id=test_join.name_join;
2.1 SQL注入
原因: 相信用户输入的所有的数据
解决方法:
-
自己手动去判断转义用户输入的数据
-
不要拼接SQL语句, 使用PyMySQL中的execute方法, 防止SQL的注入
import pymysql gender = input(‘gender>>>:‘) sname = input("sname>>>:") # 链接服务器 conn = pymysql.connect(host = ‘localhost‘, user = ‘root‘, password = ‘‘, database = ‘practiceday43‘, charset = ‘utf8‘ ) cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) # 写SQL语句,不要去拼接SQL语句 sql = "select * from student where gender = %s and sname = %s" # 传值的时候,以元组形式给SQL传参 cursor.execute(sql,(gender, sname)) res = cursor.fetchone() print(res) if res: print(‘获得值成功‘) else: print(‘获得值失败‘) cursor.close() conn.close()
2.2 事务
四大特性:
原子性: 一组操作, 要么全部成功, 要么全部失败 一致性: 操作之前和操作之后, 总的金额是一致的 隔离性: 本次事物的操作对其他事务的操作是没有任何影响的 持久性: 当我们commit/rollback之后, 影响就已经生效了, 补偿性事务来解决
使用
开启: start transaction 一组SQL语句的操作 完成(commit/rollback)
create table user( id int auto_increment primary key, name varchar(32) not null default ‘‘, money int not null default 1000 )engine=innodb charset=utf8; insert into user (name,money) values (‘wangyong‘,1000),(‘liguo‘,1000); # 正常操作 start transaction; update user set money=1100 where name=‘wangyong‘; updata user set money=900 where name=‘liguo‘; # 出现异常 rollback; # 最终结果, 数据未发生变化 mysql> select * from user; +----+----------+-------+ | id | name | money | +----+----------+-------+ | 1 | wangyong | 1000 | | 2 | liguo | 1000 | +----+----------+-------+
3. 索引
3.1 作用:加快查询的速度
3.2 分类与创建:
主键索引:primary key
# 第一种: create table test( id int auto_increment primary key, name varchar(32) not null default ‘‘ )engine=innodb charset=utf8; # 第二种: create table test( id int not null default 0, name varchar(32) not null default ‘‘ )engine=innodb charset=utf8; alter table test change id id int auto_increment primary key;
# 第一种 create table test( id int auto_increment primary key, name varchar(32) not null default ‘‘, unique ix_name (name) )engine=innodb charset=utf8; # 第二种 create unique index 索引名称 on 表名(name); create table test( id int auto_increment primary key, name varchar(32) not null default ‘‘ )engine=innodb charset=utf8; create unique index ix_name on test (name); # 创建联合唯一索引 create unique index 索引名称 on 表名 (name,age); create table test( id int auto_increment primary key, age int not null default 0, name varchar(32) not null default ‘‘ )engine=innodb charset=utf8; create unique index ix_name_age on test (age, name);
# 第一种 create table test( id int auto_increment primary key, name varchar(32) not null default ‘‘, index ix_name (name) )engine=innodb charset=utf8; # 第二种 create table test( id int auto_increment primary key, name varchar(32) not null default ‘‘ )engine=innodb charset=utf8; create index ix_name on test (name); # 联合索引 create table test( id int auto_increment primary key, age int not null default 0, name varchar(32) not null default ‘‘ )engine=innodb charset=utf8; create index ix_name_age on test (age, name);
explain selext * from test; +----+-------------+-------+-------+---------------+---------+---------+------+------+------------- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra +----+-------------+-------+-------+---------------+---------+---------+------+------+------------- | 1 | SIMPLE | test | index | NULL | ix_name | 98 | NULL | 1 | Using index +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------
- 不建议使用 like 进行搜索 - 组合索引最左前缀 如果组合索引为:(name,email) where name and email -- 使用索引 where name -- 使用索引 where email -- 不使用索引
# drop 索引名称 on 表名 drop index ix_name_age on test; mysql> explain select * from test; +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | test | ALL | NULL | NULL | NULL | NULL | 1 | NULL | +----+-------------+-------+------+---------------+------+---------+------+------+-------+
Innodb(支持高并发) 1.(默认版本包含5.5) 2.支持事务 3.不支持全文索引 4.索引和数据都是在同一个文件中, .ibd 表的结构实在.frm文件中 MyIsam(支持高并发不是特别理想) 1.(默认版本5.5以下 5.3) 2.不支持事务 3.支持全文索引 4..frm: 表结构 .MYD: 表数据 .MYI: 表索引 全文索引:(中文很好) sphinx
以上是关于python第四十六天 数据库总结的主要内容,如果未能解决你的问题,请参考以下文章