mysql数据库

MySQL数据库

  • 1.数据库初识
  • 2.关系型数据库管理系统
  • 3.SQL初识
  • 4.MySQL数据库初识
  • 5.数据类型与约束
  • 6.Navicat的使用
  • 7.登录和登出数据库
  • 8.数据库操作的SQL语句
  • 9.as 和distinct关键字
  • 10. where条件查询
  • 11.mysql高级查询
  • 12.mysql高级操作
  • 13.PyMySQL的使用
  • 14.sql注入和防止sql注入
  • 15.事务
  • 16.索引

1.数据库初识

  1. 数据库的初识
    1. 数据库是存储与管理数据的仓库,数据按照一定的格式进行存储,用户可以对数据库中的数据进行增删改查等操作。
    2. 数据库分类:
      1. 关系型数据库(类似于表格有字段和字段对应的值)
        1. 指采用了关系模型来组织的数据库,简单来说,关系模型指的就是二维表格模型,好比Excel文件中的表格,强调使用表格的方式存储数据
        2. 关系型数据库中核心元素
          1. 数据行
          2. 数据列
          3. 数据表
          4. 数据库(数据表的含义)
        3. 常用的关系型数据库
          1. Oracle(收费的)
          2. Microsoft SQL Server(收费的)
          3. MySQL
          4. SQLite(常用于手机,体积小)
        4. 特点:
          1. 易于维护:格式一致
          2. 使用方便;sql语言通用
    3. 菲关系型数据库(数据结构化存储方法的集合,可以是文档或键值对)MongoDB(文档型) redis(键值对)
      1. 又称为NoSQL(Not Only SQL),意为不仅仅是SQL,对NoSQL最普遍的定义是非关联型的,强调j键值对的方式存储数据
      2. 常用的非关系型数据库:
        1. MongoDB
        2. Redis
      3. 特点:
        1. 格式灵活:存储数据的格式可以是键值对形式,文档格式
        2. 速度快:可以使用内存
  2. 数据库的特点:
    1. 持久化存储
    2. 读写速度极高
    3. 保证数据的有效性

2.关系型数据库管理系统

  1. 关系型数据库管理系统初识
    1. 数据库管理系统是为管理关系型数据库而设计的软件系统,想要使用关系型数据库就需要用到数据库管理系统,也是一个应用软件
    2. 关系型数据库管理系统分为:
      1. 关系型数据库服务端软件(一般安装在服务器上)
        1. 主要负责管理不同的数据库,而每个数据库里面会有一系列数据文件,数据文件是用来存储数据的,其实数据库就是一系列数据文件的集合。
      2. 关系型数据库客户端软件
        1. 主要负责和关系型数据库服务端软件进行通信,向服务端传输数据或从服务端获取数据
  2. 关系型数据库管理系统的效果图
    mysql数据库_第1张图片
  3. 通信流程效果图
    mysql数据库_第2张图片

3.SQL初识

SQL是结构化查询语言,是一种用来操作RDBMS的数据库的语言,可以通过SQL操作oracle,sql server,mysql,sqlite等关系型数据库
SQL的作用是实现数据库客户端和数据库服务端之间的通信,SQL就是通信的桥梁

  1. SQL语言主要分为:
    1. DQL :数据查询语言,用于对数据进行查询, select
    2. DML : 数据操作员,对数据进行增,删改,insert,update,delelte
    3. TPL : 事务处理语言,对事务进行处理, begin,transaction,commit,rollback
    4. DCL: 数据控制语言,进行授权与权限回收 , grant,revoke
    5. DDL: 数据定义语言,进行数据库,表的管理等, create,drop
  2. 对于程序员,重点是数据的增删查改,需熟练DQL,DML,能够编写DDL完成数据库,表的操作,其他操作日TPL,DCL了解即可
  3. SQL语言不分大小写

4.MySQL数据库初识

MyQL是一个关系型数据库管理系统,在Web应用方面,MySQL是最好的RDBMS(关系型数据库管理系统)应用软件,是由MySQL AB公司开发,目前是Oracle旗下的产品,MySQL是最流行的关系型数据库管理系统中的一个

  1. MySQL特点:
    1. MySQL是开源的,
    2. MySQL支持大型数据库,可以处理拥有上千万条记录的大型数据库
    3. MySQL使用标准的SQL数据语言形式
    4. MySQL可以在不同操作系统上安装,并提供多种编程语言的操作接口,这些编程语言包括C,C+,PYTHON,java,Ruby等
  2. MYSQL数据库的安装
    1. Mysql数据库服务端软件安装
      1. Ubuntu安装及命令(现在的服务端已默认安装)
        1. 安装 sudo apt-get install mysql-server

        2. 查看是否安装 apt list | grep mysql-server

        3. 查看mysql服务状态
        4. sudo service mysql status

        5. 停止mysql服务
        6. sudo service mysql stop

        7. 启动mysql服务
        8. sudo service mysql start

        9. 重启mysql服务
        10. sudo service mysql restart

        11. 查看当前进程 ps

        12. 表示所有用户 -a

        13. 表示显示用户名 -u

        14. 表示显示所有的执行程序 -x

    2. MySQL配置文件
      1. 配置文件路径:/etc/mysql/mysql.confi.d/mysqld.cnf

      2. port 表示端口号,默认为 3306

      3. bind-address 表示服务器绑定的ip,默认为127.0.0.1

      4. datadir表示数据库保存路径,默认为/var/lib/mysql

      5. log_error 表示错误日志,默认为 /var/log/mysql/error.log

  3. Mysql数据库客户端软件安装
    1. 客户端是程序员或dba使用的软件,通过socket方式与服务端程序通信
    2. 常用的Mysql数据库客户端软件有:
      1. 图形化界面客户端 Navicat

        1. 可以在Navicat官网下载
        2. 将压缩文件拷贝到Ubuntu虚拟机中,放到桌面,解压
          1. 使用: tar zxvf navicat112_mysql_cs_x64.tar.gz

          2. 启动:./start_navicat

        3. 解决试用期:删除用户主目录下的.navicat64目录
          1. cd ~

          2. rm -r .navicat64

      2. 命令行客户端mysql(目前使用的Ubuntu中已经安装了MYSQL命令行客户端软件)

        1. sudo apt-get install mysql-client

5.数据类型与约束

数据类型是指在创建表的时候为表中字段指定数据类型,只有数据符合要求才能存储起来,使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用大的,这样也可以更多的节省存储空间。

  1. 常用数据类型:

    1. 整数:int ,bit
    2. 小数:decimal
    3. 字符串:varchar,char
    4. 日期时间:date,time,datetime
    5. 枚举类型:(enum)
  2. 数据类型说明:

    1. decimal 表示浮点数,如decimal(5,2)表示共存5位数,小数占2位
    2. char 表示固定长度的字符串,如 char(3),若填充’ab’时会补一个空格为‘ab’,3表示字符数
    3. varchar表示可变长度的字符串,如varchar(3),填充’ab’时就会存储‘ab’,3表示字符数
    4. 对于图片,音频,视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径
    5. 字符串text表示存储大文本,当字符大于4000时推荐使用,如技术博客
  3. 数据约束:

    1. 约束是指数据在数据类型限定的基础上额外增加的要求
    2. 常见约束 :
      1. 主键primary key; 物理上存储的顺序,MySQL建议所有表的主键字段都叫id,类型为int unsigned
      2. 非空not null ;此字段不允许填写填空题
      3. 唯一 unique:此字段不允许重复
      4. 默认 default:当不填写字段对应的值会使用默认值,若填写时以填写为主
      5. 外键 foreign key; 对关系字段进行约束,当为关系字段填写值时,会在关联的表中查询此值是否存在,存在则填写成功,否则失败并抛出异常
  4. 数据类型
    mysql数据库_第3张图片

6.Navicat的使用

navicat是一套快速,可靠并价格适应的数据库管理工具,适用于三种平台:Windows,mac,OS,及linux.可以对本机或远程的MYSQL。SQL Server,SOLite,Oracle等数据库进行管理及开发。专门为简化数据库的操作而设计,它的设计符合数据库管理员,开发人员及中小企业的需求,Navicat是一个数据库图形化客户端软件,让你可以以安全并简单的方式对数据库进行操作。

  1. navicat的使用
    1. 和MySQL数据库服务端建立连接
    2. 数据库操作、
      1. 字符集 必须指定utf-8编码格式,否则会出现中文乱码
      2. 排序规则:utf8_general_ci 通用的排序规则忽略大小写 utf8-bin区分大小写
    3. 数据表操作
    4. 数据表中数据的操作

7.登录和登出数据库

  1. 登录 mysql -uroot -p -u后面是登录用户名 -p后面是登录密码,若不填写,回车后会提示输入密码

  2. 显示当前时间 select now();

  3. 登出数据库 exit / quit / ctrl+d

8.数据库操作的SQL语句

  1. 库级操作
    1. 查看所有数据库 show databases;

    2. 创建数据库 create database 数据库名 charset=utf-8; 例:create database python charset=utf-8;

    3. 使用数据库 use 数据库名;

    4. 查看当前使用的数据库 select database();
      5.> 删除数据库-慎重 drop database 数据库名; 例:drop database python;

  2. 表级操作
    1. 查看当前数据库中的所有表 show tables;

    2. 创建表 create table st(id int unsigned primary key auto_increment not null,name varchar(20) not null,age tinyint unsigned default 0;height decimal(5,2);gender enum('男’,‘女’));说明:create table 表名( 字段命名 数据类型 可选约束条件,。。);

    3. 修改表-添加字段 alter table 表名 modify 列名 类型 约束; alter table st modify birth data not null; 说明:modify:只能修改字段类型或者约束,不能修改字段名

    4. 修改表-修改字段名和字段类型 alter talbe 表名 change 原名 新名 类型及约束;例:alter table st change bith datetime not null;

    5. 表操作SQL语句
      1. 查询语句 select * from 表名;

      2. 查询指定列 select 列,列。。from 表名; 例:select id,namefrom st;

      3. 全列插入 insert into 表名 values(…) 例: insert into st values(0,‘xx’,default,'男‘);

      4. 部分列插入,值的顺序与输出的列顺序对应 insert into 表名 (列名,…),values(值,…);

      5. 修改数据 update 表名 set 列1=值1,列2=值2,,, where 条件

      6. 删除数据(物理删除) delete from 表名 where 条件

9.as 和distinct关键字

  1. as 关键字
    在使用SQL语句显示结果的时候,往往在屏幕显示的字段名并不具备良好的可读性,此时可使用as 给字段起一个别名。
    1. 使用as给字段起别名 (as 可省略)
      1. select id as 序号 ,name as 名字,gender as 性别 from st;

    2. 通过as给表起别名
      1. select s.id,s.name from st as s;

  2. distinct关键字
    distinct 可以去除重复数据行
    1. select distinct 列,,,from 表名;

10. where条件查询

  1. where支持的运算符
    1. 比较运算符
    2. 逻辑运算符
    3. 模糊查询
    4. 范围查询
    5. 空判断
  2. 比较运算符
    1. 等于:=
    2. 大于:>
    3. 大于等于:>=
    4. 小于:<
    5. 小于等于:<=
    6. 不等于:!=或<>
  3. 逻辑运算符
    1. and
    2. or
    3. not
  4. 范围查询
    1. between…and…表示在一个连续的范围内查询
      1. select * from st where not id between 2 and 5;
    2. in 表示在一个非连续的范围内查询
      1. select * from st where id in(2,4);
  5. 模糊查询
    1. like 是模糊查询的关键字
    2. % 表示任意多个任意字符
      1. select * from where name like ‘张%’;
    3. _表示一个任意字符
      1. select * from where name like ‘张_’;
  6. 空判断查询
    1. 判断为空使用:is null
    2. 判断非空使用:is not null
    3. 不能使用 ’ ’ =null,null不等于 ’ ‘字符串

11.mysql高级查询

  1. 排序
    1. 排序查询语法:select * from 表名 order by 列1 asc(升)|desc(降),;
    2. 先按列1进行排序,若列1相同则按2,类推
    3. 默认按列值从小到大排序
  2. 分页查询
    由于数据特别多,一页显示不完的就采用分页查询进行一页一页显示
    1. 分页查询语法: select * from 表名 limit start,count
    2. 例: select * from st where gender=‘男’ limit 2,3;
    3. 例:每页显示m条数据,获取第n页数据: select * from st limit (n-1)*m,m;
    4. limit 是分页查询的关键字
    5. start 表示开始索引,默认为0,此处的值取不到
    6. count 表示查询条数
  3. 聚合函数
    聚合函数又叫组函数,通常是对表中的数据进行统计和计算,一般结合分组(group by) 来使用,用于统计和计算分组数据。
    1. 常用的聚合函数(聚合函数不对空值进行统计)
      1. count(col):表示求指定列的总行数 select count(age) from st;
      2. max(col):表示求指定列的最大值 select max(col) from st where gender=‘男’;
      3. min(col): 表示求指定列的最小值
      4. sum(col):表示求指定列的和
      5. avg(col): 表示求指定列的平均值
      6. ifnull函数:表示判断指定字段的是否为null,如果为空使用自己提供的值:select avg(ifnull(age,0)) from st;
  4. 分组查询
    分组查询就是将查询结果按照指定字段进行分组,字段中的数据相等的分为一组
    1. 分组查询的语法格式:GROUP BY 列名[HAVING 条件表达式] [ WITH ROLLUP]
      1. 列名:按照指定字段的值进行分组
      2. HAVING 条件表达式:用来过滤分组后的数据
      3. WITH ROLLUP:在所有记录的最后加上一条记录,显示select查询时聚合函数的统计和计算结果。
    2. group by的使用(查询字段与分组字段一致)
      1. group by可用于单个字段分组,也可用于多个字段分组 select gender,name from st group by gender,name;
    3. group by +group_concat()的使用
      1. group_concat(字段名):统计每个分组指定字段的信息集合,每个信息之间使用逗号分割
      2. select gender,group_concat(name) from st st group by gender;
        mysql数据库_第4张图片
      3. group by + 聚合函数的使用
        1. select gender,count(*) from st group by gender;(分别计算男女的个数)
        2. select gender,sum(age) from st group by gender;(分别计算男女的年龄之和)
      4. group by + having的使用
        1. having作用和where类似都是过滤数据的,但having 是过滤分组数据的,只能用于group by
        2. select gender,count() from st group by gender having count()>2;(分别计算男女个数找出大于2的)
      5. group by +with rollup的使用
        1. with rollup的作用:在最后记录后面增加一条显示select查询时聚合函数的统计和计算
        2. select gender,count(*) from st group by gender with rollup;
        3. select gender,group_concat(age) from st group by gender with rollup;
  5. 内连接查询
    1. 初识
      1. 连接查询可以实现多个查询,当查询的字段数据来自不同的表就可以使用连接查询来完成
    2. 连接查询分为:
      1. 内连接查询
      2. 左连接查询
      3. 右连接查询
      4. 自连接查询
    3. 内连接查询(取出两个表的交集)
      1. 查询两个表中符合条件的所有记录
      2. 语法:select 字段 from 表1 inner join 表2 on 表1.字段1=表2.字段2;
      3. 说明:inner.join 就是内连接查询的关键字 on 就是连接查询条件
  6. 左连接
    1. 初识
      1. 以左表为主根据条件查询右表数据,若右表数据不存在使用null填充
      2. 语法:select 字段 from 表1 left join 表2 on 表1.字段=表2.字段
      3. 说明: left,join 就是 左连接查询的关键字
      4. on 就是连接查询条件
      5. 表1 为左表
      6. 表2 为 右表
  7. 右连接
    1. 初识:
      1. 以右表为主,根据条件查询左表数据,若左表数据不存在使用null 填充
      2. 语法:select 字段 from 表1 right join 表2 on 表1.字段 =表2.字段
      3. 说明:right join就是右连接查询的关键字
      4. on 就是连接查询条件
      5. right 左边为左表 右边为右表
  8. 子查询
    1. 在一个select语句中,嵌入另一个select语句,那么被嵌入的select语句就是子查询语句,外部select语句则为主查询语句
    2. 主查询与子查询的关系
      1. 子查询就是嵌入到主查询
      2. 子查询就是辅助主查询的,要么充当条件,要么充当数据源
      3. 子查询是可以独立存在的语句,是一条完成的select语句
    3. 子查询的使用
      1. 查询大于平均年龄的学生 select * from st where age>(select avg(age) from st);

      2. 查询学生在班的所有班级名字 select name from class where id in (select c_id from st where c_id is not null);

      3. 查找年龄最大,身高最高的学生 select * from st where (age,height)=(select max(age),max(height) from st);

12.mysql高级操作

  1. 远程登录mysql数据库
    1. 注释服务端mysql下的主机地址:
      1. ~/etc/mysql/mysql.conf.d$ vim mysqld.cnf----》#bind-address = 127.0.0.1(要修改文件权限,否则保存不了)
    2. 登录mysql数据库–》进入系统数据库mysql—》修改其中的user表:update user set host=’%’ where user=‘root’; --》退出mysql --》重启:sudo service mysql restart;\
    3. 在本地新建连接mysql,地址为mysql服务端主机地址,端口号为3306
  2. 数据库设计之三范式
    1. 范式:对设计数据库提出的一些规范,目前有迹可循的共有8中范式,一般遵循3范式即可
    2. 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列(字段最小不可在分割)
    3. 第二范式(2NF):满足1NF,另外包含两部分内容,一是表必须有一个主键,二是非主键字段必须完全依赖于主键,而不能只依赖与主键的一部风。
    4. 第三范式(3NF):满足2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在非主键a依赖于非主键b,非主键b依赖于主键的情况。
  3. E-R模型
    1. E-R模型即实体-关系模型,E-R模型就是描述数据库存储数据的结构模型
    2. E-R使用场景:
      1. 对于大公司的开发项目,需要根据产品经理的设计,使用建模工具,如:power designer,db designer等软件设计来画出实体-关系模型(E-R模型);
      2. 然后根据三范式设计数据库表结构
    3. 说明:
      1. 实体–用矩形表示,并标注实体名称
      2. 属性–用椭圆表示,并标注属性名称;
      3. 关系–用菱形表示,并标注关系名称;一对一,一对多,多对多
      4. 关系也是一种数据,需要通过一个字段存储在表中
        1. 1对1–在表a或表b中创建一个字段,存储另一个表的主键值
        2. 1对多–在多的一方表中(学生表)创建一个字段,存储班级表的主键值
        3. 多对多–新建一张表c,这个表只有两个字段,一个用于存储a的主键值,一个用于存储b的主键值
  4. 外键SQL语句的编写
    1. 外键约束:对外键字段的值进行更新和插入时会和引用表中的字段的数据进行验证,数据如果不合法则更新和插入会失败,保证数据的有效性。(外键所使用的数据必需来源欲某个表中的主键)
    2. 对已经存在的字段添加外键约束 alter table st add foreign key(c_id) references class(id);
    3. 在创建数据表时设置外键约束
    4. 删除外键约束
--创建学校表
create table sc(
	id int not null primary key auto_increment,
	name varchar(10)
);
--创建老师表
create table teacher(
	id int not null primary key  auto_increment,
	name varchar(10),
	s_id int not null,
	foreign key(s_id) references sc(id)
);
--删除外键约束
--需要先获取外键约束名称,该名称系统会自动生成,可以通过查看表创建语句来获取名称
show create table teacher;
--获取名称之后就可以根据名称删除外键约束
alter table teacher drop foreign key 外建名;

5.分组和聚合函数的使用

--创建jd数据库
create database jing_dong charset=utf8;
--创建商品表goods decimal 浮点数
create table goods(
	id int unsigned primary key auto_increment not null,
	name varchar(150) not null,
	cate_name varchar(40) not null,
	brand_name varchar(40) not null,
	price decimal(10,3) not null default 0,
	is_show bit not null default 1,
	is_saleoff bit not null default 0

);
--表结构
--id 主键 自增
--name 商品名称 cate_name 分类名称 brand_name 品牌名称 price 价格 is_show 是否显示 is_saleoff 是否售完

--1.商品分类
select distinct cate_name from goods;
select cate_name from goods group by cate_name;
--2求所有电脑产品的平均价格,并保留两位小数
select round(avg(privr),2) from goods;
--3显示每种商品的平均价格
select cate_name,round(avg(price),2) from goods group by cate_name;
--4查询每种类型的商品种最贵的,最便宜的,平均价,数量
select cate_name,max(price),min(price),avg(price),count(*) from goods group by cate_name;
--5查询所有价格大于平均价格的商品,并且按价格降序排序
select * from goods where price>(select avg(price) from goods) order by price desc;

  1. 将查询结果插入到其他表中
--想要添加一个商品分类信息,还需创建一个商品分类表,将goods中的商品分类信息添加到该表中,
--将goods表中的分类名称更改为商品分类表中对应的分类id
--闯将商品分类表
create table good_cates(
	id int not null primary key auto_increment,
	name varchar(50) not null;
);
--将goods表中的商品分类添加到商品分类表
insert into good_cates(name) select cate_name from goods group by cate_name;
--添加移动设备分类信息
insert into good_cates(name) values("移动设备");

  1. 使用连接更新表中某个字段的数据
    1. 更新goods表中的商品分类信息,将商品分类名称改为id
--将goods表中的分类名称改为商品分类表中对应的分类id
--查看goods表中尚品分类名称对应的商品分类id
select * from inner join good_cates on goods.cate_name=good_cates.name;
--把该语句中from后的语句理解为一张表
update goods g inner join good_cate gc on g.cate_name=gc.name set g.cate_name=gc.id;
  1. 创建表并给某个字段添加数据
    1. 创建一个品牌表,把goods表中的品牌信息添加到该表中
    2. 将goods表中的品牌名称更改为品牌表中对应的品牌
    3. mysql中可以自动将整型转换为字符串,字符串转换整型
--查询品牌信息
select brand_name from goods group by brand_name;
--创建品牌表
--create table ..select 创建数据表并同时插入数据 插入字段名称要与表中字段一致
create table good_brands(
	id int unsigned primary key auto_increment,
	name varchar(40) not null) select brand_name as name from goods group by band_name;
);
--将goods表中的品牌更改为品牌表中对应的品牌id,连接更新表中的某个字段
update goods g inner join  goods_brands gs on g.brand_name=gs.name set g.brand_name=gd.id;
  1. 修改goods表结构
    1. 把goods表中cate_name和brand_name字段分别改成cate_id 和 brand_id 类型改为 int
    2. alter 可以一次修改多个字段
--查看表结构
desc goods;
--通过alter table 语句修改为表结构
alter table goods change cate_name cate_id int not null ,change brand_name brand_id int not null;

13.PyMySQL的使用

  1. 如何将10万条件数据插入到mysql?
    . 使用代码的发方式连接数据库,对数据库进行操作,实现插入。代码操作数据库称为数据库编程
  2. python程序操作MySQL数据库
    1. 安装 pymysql第三包 sudo pip3 install pymysql
    2. 说明
      1. 安装命令使用 sudo pip3 install 第三方包名
      2. 卸载命令 sudo pip3 uninstall 第三方包
      3. 查看第三方包信息: pip3 show pymysql
      4. 查看pip安装的第三方包列表 pip3 list
    3. 导包 import pymysql
    4. 创建连接对象
      1. 调用pymysql模块中的connect()函数来创建连接对象
      2. 连接对象操作说明:
        1. 关闭连接:conn.close()
        2. 提交数据:conn.commit()
        3. 撤销数据:conn.rollback()
conn=connect(参数列表)
host:连接mysql主机,本机是:localhost
port:连接mysql主机的端口,默认是3306
user:连接的用户名
password:连接的密码
database:数据库名称
charset:通信采用的编码格式,推荐使用utf8
		3.  获取游标对象
				获取游标对象的目标就是要执行sql语句,完成对数据的增删改查操作, 
				调用连接对象的**cursor()**方法获取游标对象
				cur=conn.cursor()
				游标操作说明:
					使用游标执行SQL语句:execute(operation[parameters])执行SQL语句,返回受影响的行数,主要用于执行insert,update,delete,select等语句
					获取查询结果集中的一条数据:cur.fetchone() 返回一个元祖,如(1,’张三‘)
					获取查询结果集中的所有数据,cur,fetchall()返回一个元祖,如(1,’张三‘),(2,'李四’)
					关闭游标:cur.close(),表示和数据库操作完成
		4. pymysql完成数据的操作,关闭连接
#1.导包
import pymysql
if __name__ == '__main__':
    #2.创建连接对象
    #connect =Connection=Connect 本质上是一个函数,使用其一都可以创建一个连接对象
    conn=pymysql.connect(
        host='localhost',
        port =3306,
        user='root',
        password='123456',
        database='pythontest',
        charset='utf8'
    )
    #3,获取游标,目的执行sql语句 游标好比一辆运输数据的车
    cur=conn.cursor()
        #准备sql,语法与mysql中一样
    sql='select * from user;'
    #4.执行sql语句
    cur.execute(sql)
    #5.获取执行结果
    row=cur.fetchone()# 返回数据类型是一个元组
    print(row)
    #6.关闭游标
    cur.close()
    #7.关闭连接
    conn.close()
3. pymysql对数据库的增删查改
def delete():
    #2.创建连接
    conn=pymysql.connect(
        host='localhost',
        port=3306,
        user='root',
        password='123456',
        database='pythontest',
        charset='utf8'
    )
    #获取游标
    cur=conn.cursor()
    #编写sql语句
    sql='delete from user where id=2;'
    try:
        #执行sql语句
        cur.execute(sql)
        #提交数据
        conn.commit()
    except Exception as e:
        #回滚数据
        conn.rollback()
    finally:
        #挂壁游标
        cur.close()
        #关闭连接
        conn.close()

14.sql注入和防止sql注入

什么是sql注入?
用户提交带有恶意的数据与SQL语句进行字符串方式的拼接,从而影响了SQL语句的语义,最终产生数据泄露的现象
如何防止?
SQL语句参数化
SQL语言中的参数使用%来占位,此处不是python中的字符串格式化操作
将SQL语句中%占位所需要的参数存在一个列表中,把参数列表传递给execute方法中的第二个参数
1.单个参数

#是select语句的条件语句为真,可查询所有语句 如:select * from user where name='%';"% 'ww' or 1=1 or ''";
#防注入 的sql语句 % 是sql语句的参数和字符串里面的%s不一样,不用加上引号
sql="select * from user where name=%s;"
cur.execute(sql,("'ww' or 1=1 or ' '",))#查出的是一条数据
  1. 多个参数
#sql防注入多个参数使用
insert into user(id,name,age) values(%s,%s,%s);
cur.execute(sql,[1,'dfd',54])

15.事务

  1. 初识
    1. 事务就是用户定义的一系列执行SQL语句的操作,这些操作要么完全执行,要么完全不执行,是一个不可分割的工作执行单元
  2. 使用场景:
    1. 在日常生活中,有时我们需要进行银行转账,这个银行转账操作背后就是需要执行多个SQL语句,假如这些SQL执行到一半突然停电,那么就会导致这个功能只完成一半,这种情况是不允许出现,要想解决就需要事务来玩成。
  3. 事务的三大特性:
    1. 原子性 (Atomicity)
      1. 一个事务必须被视为一个不可分割的最小工作单位
    2. 一致性(Consistency)
      1. 数据库总是从一个一致性的状态转转到另一个一致性的状态(一致性确保了即使转账过程中系统奔溃,支票账户也不会损失,因为事务最终没有提交,所以事务中所作的一切修改也不会保存在数据库中)
    3. 隔离性(laolation)
      1. 通常来说,一个事务所作的修改操作在提交事务之前,对于其他事务来说是不可见的。(一个事务执行转账操作,没有结束之前,另一个事务看到的此账户的余额是没有变化的)
    4. 持久性(Durabillty)
      1. 一旦事务提交,则其所做的修改会永久保存到数据库
    5. 说明:事务能够保证数据的完整性和一致性,让用户的操作更加的安全
  4. 事务的使用
    1. 使用事务之前,先确保表的存储引擎是InnoDB类型,只有这个类型才可以使用事务,MySQL数据库中表的存储引擎默认是InnoDB类型
    2. 表的存储引擎
      1. 表的存储引擎就是提供存储数据的一种机制,不同的表的存储引擎提供不同的存储机制
      2. 查看mysql数据库支持的表的存储引擎 show engines;
      3. 说明:
        1. 常用的表的存储引擎是InnoDB和MyISAM
        2. InnoDB是支持事务的
        3. MyISAM不支持事务,优势是访问速度快,对事务没有要求或以select,insert为主的都可以使用该存储引擎来创建表
        4. 修改表的存储引擎,:alter table 表名 engine=引擎类型;
    3. 开启事务 begin; 或者 start transaction;
      1. 说明
        1. 开启事务后执行修改命令,变更数据会保存到MySQL服务端的缓存文件中,而不维护到物理表中
        2. MySQL数据库默认采用自动提交(autocommit)模式,如果没有显示的开启一个事务,那么每条sql语句都会被当作一个事务执行提交的操作。
        3. 当设置autocommit=0就是取消了自动提交事务模式(临时的),直到显示的执行commit和rollback表示该事务结束 set autocommit=0; commit;
        4. 回滚事务使用 rollback;
        5. pymysql 里面的conn.commit() 就是提交事务
        6. pymysql 里面的conn.rollback() 就是回滚事务
        7. pymysql在执行sql语句前就自动开启了事务

16.索引

  1. 初识
    .索引在MySQL中也叫做’键’,它是一个特殊的文件,它保存着数据表里所有记录的位置信息。更通俗的是数据库索引好比一本书的目录,能加快数据库的查询速度
  2. 引用场景
    .当数据库中数据量很大时,查找数据就会变的很慢,我们就可以通过索引来提高数据库的查询效率
  3. 索引的使用
    .查看表中已有的索引 show index from 表名;
    .主键列会自动创建索引
    1. 索引的创建(索引名默认为列名)
      1. 语法:alter table 表名 add index 索引名[可选](列名。。。)
      2. 给name字段添加索引,例: alter table st add index my_name(name);
    2. 删除索引
      1. 语法: alter table 表名 drop index 索引名
      2. 若不知索引名,可查看创建表sql语句 show create table st;
      3. 例: alter table st drop index my_name;
  4. 案例——验证索引的查询性能
    1. 创建测试表 test create table test_index(title varchar(10));
    2. 插入10万条数据
def main():
    #创建连接对象
    conn=pymysql.connect(
        host='localhost',
        port=3306,
        user='root',
        password='123456',
        database='pythontest',
        charset='utf8'
    )
    #获取游标
    cur=conn.cursor()
    try:
        # 插入10万条语句
        for i in range(100000):
            cur.execute("insert into test_index values('h-%d')"%i)
        #提交数据
        conn.commit()
    except Exception as e:
        conn.rollback()
    finally:
        #关闭游标
        cur.close()
        #关闭连接
        conn.close()
		3. 验证索引性能
			开始运行时间监测 set profiling=1;
			查找第1万条数据 select * from test_index where title='h-9999';
			查看执行时间 show profiles
			给title字段创建索引 alter table test_index add index(title);
			再次执行查询语句
			再次查看执行时间
mysql> set profiling=1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> use pythontest;
Database changed
mysql> select * from test_index where title='h-9999';
+--------+
| title  |
+--------+
| h-9999 |
+--------+
1 row in set (0.11 sec)

mysql> show profiles;
+----------+------------+-----------------------------------------------+
| Query_ID | Duration   | Query                                         |
+----------+------------+-----------------------------------------------+
|        1 | 0.00028250 | SELECT DATABASE()                             |
|        2 | 0.11412100 | select * from test_index where title='h-9999' |
+----------+------------+-----------------------------------------------+
2 rows in set, 1 warning (0.00 sec)

mysql> alter table test_index add index(title);
Query OK, 0 rows affected (0.83 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from test_index where title='h-9999';
+--------+
| title  |
+--------+
| h-9999 |
+--------+
1 row in set (0.00 sec)

mysql> show profiles;
+----------+------------+-----------------------------------------------+
| Query_ID | Duration   | Query                                         |
+----------+------------+-----------------------------------------------+
|        1 | 0.00028250 | SELECT DATABASE()                             |
|        2 | 0.11412100 | select * from test_index where title='h-9999' |
|        3 | 0.82791925 | alter table test_index add index(title)       |
|        4 | 0.00059325 | select * from test_index where title='h-9999' |
+----------+------------+-----------------------------------------------+
4 rows in set, 1 warning (0.00 sec)

  1. 联合索引
    1. 联合索引又叫复合索引,即一个索引覆盖表中两个或多个字段,一般用在多个字段一起查询的时候
    2. 创建联合索引 alter table teacher add index(name,age);
    3. 联合索引的好处:
      1. 减少磁盘空间开销,因为每创建一个索引,其实就是创建了一个索引文件,那么会增加磁盘空间的开销
    4. 联合索引的最左原则
      1. 在使用联合索引的时候,遵循一个最左原则,即index(name,age)支持name,name和age组合查询,而不支持单独age查询,因为没有用到创建的联合索引
    5. mysql中的索引的优点和缺点及使用规则
      1. 优点:
        1. 加快数据的查询速度
      2. 缺点:
        1. 创建索引会耗费时间和占用磁盘空间,并且随数据量的增加所耗费的时间也会增加
      3. 使用原则
        1. 通过优点对比,不是索引越多越好,而是需要合理的使用
        2. 对经常更新的表就避免对其进行过多的索引的创建,对经常用于查询的字段应该创建索引
        3. 数据量小的表最好不要创建索引,因为由于数据较少,可能查询全部数据用的时间比遍历索引的时间还短。索引就可能不会产生优化效果
        4. 在一定字段上相同值比较多的不要建立索引,如在学生表的‘性别’字段上只有男,女两个不同的值,相反的,在一个字段上不同值较多可建立索引。




胃的上面是心,胃饱了,心才会暖。

你可能感兴趣的:(MySQL,mysql,big,data,数据库)