python第四十六天 数据库总结

1. SQL语句

1.1 数据库

复制代码
# 增
create database review;

# 查
show databases;
show create database review; # 查看数据库的创建,默认为  CHARACTER SET latin1 编码

# 改
# 没有专门的改操作,删了重建
alter database review charset utf8; # 将数据库的字符编码改为utf8编码

# 删
drop database review;
复制代码

1.2 数据表

复制代码
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;
复制代码

1.3 数据行

复制代码
# 增
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;
复制代码

1.4 数据行的高级查询

复制代码
# 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. pymysql操作

2.1 SQL注入

原因: 相信用户输入的所有的数据

解决方法:

  1. 自己手动去判断转义用户输入的数据

  2. 不要拼接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;
复制代码

唯一索引:unique

复制代码
# 第一种
    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);
复制代码

普通索引:index

复制代码
# 第一种
    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);
复制代码

3.3 查看是否使用索引:explain

复制代码
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 
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------
复制代码

3.4 使用规则

复制代码
- 不建议使用 like 进行搜索
- 组合索引最左前缀
如果组合索引为:(name,email)
    where name and email       -- 使用索引
    where name                 -- 使用索引
    where email                -- 不使用索引
复制代码

3.5 删除索引

复制代码
# 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  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
复制代码

4 存储介绍

复制代码
Innodb(支持高并发)
    1.(默认版本包含5.5)
    2.支持事务
    3.不支持全文索引
    4.索引和数据都是在同一个文件中, .ibd 表的结构实在.frm文件中

MyIsam(支持高并发不是特别理想)
    1.(默认版本5.5以下 5.3)
    2.不支持事务
    3.支持全文索引
    4..frm: 表结构
      .MYD: 表数据
      .MYI: 表索引
    
   
全文索引:(中文很好)
    sphinx 

猜你喜欢

转载自www.cnblogs.com/liguodeboke/p/11129736.html
今日推荐