day04数据库

昨日知识点回顾

1.单表操作

1.单表的操作
条件查询的优先级别:
where > group by >having > order by > limit; 分组:group by
select gender count(id) from xxx group by gender;
过滤筛选:having
select gender count(id) from xxx group by gender having count(id)>13;
排序:order by asc升序,默认,desc 降序
order by 要排序的字段名(id);
升序:asc 例子:order by id asc;
降序:desc 例子:order by id desc;
order by age asc,id desc;
先根据年龄升序,然后如果年龄一样的时候,再根据id进行降序。
分页:
limit offset,size;
offset:行数据的索引 size:取多少航数据
limit 起始值,终止值;
select * from 表名 limit 0,10; 取出前十条数据

2.多表关系

表与表之间的关系分为:一对多、一对一、多对多关系。
一对多:
create table department(
id int,
name varchar(32) not null default ''
)charset utf8; create table userinfo(
id int,
name varchar(32) not null default '',
depart_id int,
constraint 外键名 foreign key(depart_id) references department(id)
)charset utf8; 多对多:
create table boy(
id int,
bname varchar(32) not null default ''
)charset utf8; create table girl(
id int,
gname varchar(32) not null default ''
)charset utf8; create table boy2girl(
id int,
bid int,
gid int,
constraint 外键名 foreign key(bid) references boy(id),
constraint 外键名 foreign key(gid) references girl(id)
)charset utf8; 一对一关系:
create table userinfo(
id int,
name varchar(32)
)charset utf8; create table priv(
id int,
salary decimal(20,3),
pid int,
unique(pid),
constraint 外键名 foreign key(pid) references userinfo(id)
)charset utf8;

3.多表查询

多表查询中的语法:
left join......on
right join.....on
inner join......on
举例:
select * from department left join userinfo on department.id=userinfo.depart_id;

今日内容

2.python 操作MySQL数据库

​ 安装pymysql

sql注入问题
输入用户名:zekai 'or 1=1 #
输入密码:dsadsa
select * from user where name='zekai' or 1=1 #' and password='dsdfssdd''
直接就可以登录成功,产生问题的原因在于:
特殊符号没有过滤,以及使用的关键字没有过滤,没有任何的校验。#相当于是注释,or只要满足一个条件即可,and是需要同时满足两个条件。
解决sql注入问题的方法:
通过execute执行函数,这是Python内部封装好的方法,只需要拿来使用即可。
sql='select * from user where name=%s and password=%s'
cursor.execute(sql,(user,pwd)) 连接数据库:
conn=pymysql.connect(
host='localhost',
user='root',
password='root',
database='test',
charset='utf8'
) cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)##返回的是字典类型 查:
fetchall() :取出所有的数据,返回的是列表套字典
fetone() :取出一条数据,返回的是字典
fetchmany(size) :取出size条数据,返回的是列表套字典 增:
sql='insert into user(name,password) values(%s,%s)'
#cursor.execute(sql,('xxx','qwe'))这个是新增一条数据
下面是新增多条数据:
data=[
('zekai','qqq'),
('zekai2','www'),
('zekai3','eee'),
('zekai4','rrr'),
('zekai5','ttt')
] cursor.executemany(sql,data) 新增多条数据
conn.commit() 加上这句代码,表示提交数据 打印最后一行的ID值:
print(cursor.lastrowid) 修改:
sql='update user set name=%s where id=%s'
cursor.execute(sql,('huaheshang',300))
conn.commit()
cursor.close()
conn.close() 删除:
sql='delete from user where id=%s'
cursor.execute(sql,(2,))
conn.commit()
cursor.close()
conn.close()

索引

为啥使用索引以及索引的作用:

​ 使用索引就是为了提高查询效率的。

类比:

​ 字典中的目录

索引的本质:

​ 一个特殊的文件

索引的底层原理:

​ B+ 树

索引的种类:************************

分为:主键索引、唯一索引、联合唯一索引、普通索引

1.主键索引:加速查找+不能重复+不能为空 primary key

2.唯一索引:加速查找+不能重复 unique(字段名)

2.1联合唯一索引:unique(name,email) 就是这两个字段都是唯一并且不会重复的字段

联合唯一索引:unique(name,email)		就是这两个字段都是唯一并且不会重复的字段
例子如下: ​ zekai 123@qq.com ​ zekai 123@qq.com (error错误数据) 因为zekai 123@qq.com 已经存在了,所以下面的一条数据就不能重复再次出现,
所以执行的时候才会报错。

3.普通索引:加速查找 index(name)

3.1联合普通索引:index(name,email)

索引的创建:

​ 主键索引:

新增主键索引:
增加主键索引的3种方式:
1.
create table xxx(
id int auto_increment primary key,
)charset utf8; 2.
alter table xxx change id id int auto_increment primary key;
3.
alter table t1 add primary key(id); 删除主键索引:
alter table t1 drop primary key; 唯一索引:
增加索引的3种方式:
1.
create table t2(
id int auto_increment primary key,
name varchar(60) not null default '',
unique u_name(name) )charset utf8; 2.
create unique index 索引名 on 表名(字段名);
create unique index ix_name on t2(name);
3.
alter table t2 add unique index ix_name(name);
删除索引的sql命令:
alter table t2 drop index u_name;

普通索引:

新增的三种方式:
1.
create table t3(
id int auto_increment primary key,
name varchar(60) not null default '',
index u_name(name)
)charset utf8; 2.
create index 索引名 on 表名(字段名);
create index ix_name on t3(name); 3.
alter table t3 add index ix_name(name);
删除普通索引:
alter table t3 drop index u_name; 索引的优缺点:
通过观察*.ibd 文件可知:
1.索引加快了查询速度
2.但是在加了索引之后,会占用大量的磁盘空间 索引是不是加的越多越好?
不是!!!!!! 不会命中索引的情况:
1.不能在sql语句中,进行四则运算,会降低sql的查询效率
2.使用函数,也会降低sql的查询效率
select * from tb1 where reverse(email)='zekai';
3.查询的数据类型不一致,也会降低sql的查询效率
如果列是字符串类型,where条件必须用引号引起来,不然会被警告
select * from tb1 where email=999; #这里面正确的应该是email='999' 4.排序条件为索引,则select查询的字段name必须也是索引字段,否则无法命中
order by
select name from s1 order by name desc; ----快
当根据索引排序的时候,select查询的字段如果不是索引,则速度仍然很慢 select email from s1 order by email desc; ----慢 特别的:
如果对主键排序,则还是速度很快,如下:
select * from tb1 order by id desc; 5.我们使用count(列名)对要查询的分组计算数量,更加具有针对性,不推荐使用count(*) 6.组合索引最左前缀
什么时候会创建联合索引?
根据公司的业务场景,在最常用的几个列上添加索引!!!
select * from user where name='zekai' and email='zekai@qq.com';
如果遇到上述业务情况,错误的做法是添加两个普通索引:
index ix_name(name),
index ix_email(email) 正确的做法是创建联合索引:
index ix_name_email(name,email) ----这个才是正确的做法!!! 如果组合索引为:ix_name_email(name,email)*******
where name='zekai' and email='xxxx' ---命中索引
where name='zekai' ---命中索引
where email='zekai@qq.com' ---未命中索引
例子:
index(a,b,c,d)
where a=2 and b=3 and c=4 and d=5 ----命中索引,因为只要a存在就可以
where a=2 and c=3 and d=4 ---命中索引,因为只要a存在就可以
where c=3 and d=4 ---未命中索引,因为a不存在查询失败

explain解释sql查询语句

explain select * from user where name='zekai' and email='zekai@qq.com'\G
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ref 索引指向 all全部
possible_keys: ix_name_email 可能用到的索引
key: ix_name_email 确实用到的索引
key_len: 214 索引长度
ref: const,const
rows: 1 扫描的长度
filtered: 100.00
Extra: Using index 使用到了索引 索引覆盖:
select id from user where id=2000;

慢查询日志,查看慢sql的相关变量

展示sql慢查询的变量:

show variables like '%slow%';

                                +---------------------------+-----------------------------------------------+
| Variable_name | Value |
+---------------------------+-------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF ### 默认关闭慢SQl查询日志,on是开启 |
| slow_query_log_file | D:\mysql-5.7.28910UNQE-slow.log | ## 慢SQL记录的位置
+---------------------------+------------------------------------+
5 rows in set, 1 warning (0.08 sec)
展示sql慢查询的时间变量:
show variables like '%long%'; +----------------------------------------------+-----------+
| Variable_name | Value |
+----------------------------------------------------------+
| long_query_time | 10.000000 |

配置慢sql的变量:

固定语法为:
set global 变量名 = 值 设置慢sql查询日志打开:
set global slow_query_log = on; 设置慢sql查询文件的保存位置:
set global slow_query_log_file = "D:/mysql-5.7/day004"; 设置慢sql查询文件的时间:【sql查询时间超过1秒的sql语句,都会保存到指定的慢sql查询文件中】
set global long_query_time = 1;

MySQL高级查询之索引创建、删除、增加、修改、慢sql、explain解释sql的更多相关文章

  1. 第三章 MySQL高级查询(一)

    第三章 MySQL高级查询(一) 一.SQL语言的四个分类 1.       DML(Data Manipulation Language)(数据操作语言):用来插入,修改和删除表中的数据,如INSE ...

  2. MySQL 高级查询操作

    目录 MySQL 高级查询操作 一.预告 二.简单查询 三.显示筛选 四.存储过程 五.查询语句 1.作为变量 2.函数调用 3.写入数据表 备注 附表一 附表二 相关文献 博客提示 MySQL 高级 ...

  3. MySQL高级查询与编程作业目录 (作业笔记)

    MySQL高级查询与编程笔记 • [目录] 第1章 数据库设计原理与实战 >>> 第2章 数据定义和操作 >>> 2.1.4 使用 DDL 语句分别创建仓库表.供应 ...

  4. mysql 优化实例之索引创建

    mysql 优化实例之索引创建 优化前: pt-query-degist分析结果: # Query 23: 0.00 QPS, 0.00x concurrency, ID 0x78761E301CC7 ...

  5. 第四章 MySQL高级查询(二)

    第四章 MySQL高级查询(二) 一.EXISTS子查询 在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false.除此之外,exists ...

  6. python进阶09 MySQL高级查询

    python进阶09 MySQL高级查询 一.筛选条件 # 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空: ...

  7. MySQL高级查询与编程笔记 • 【目录】

    章节 内容 实践练习 MySQL高级查询与编程作业目录(作业笔记) 第1章 MySQL高级查询与编程笔记 • [第1章 数据库设计原理与实战] 第2章 MySQL高级查询与编程笔记 • [第2章 数据 ...

  8. C#操作Access的查询、添加、删除、修改源程序

    C#操作Access的查询.添加.删除.修改源程序 using System; using System.Collections.Generic; using System.ComponentMode ...

  9. mysql中一半会选择什么样的字段为索引?(含索引创建删除查看公式)

    一.数据量庞大的数据做索引 二.该字段经常出现在where的后面,以条件形式存在,经常被用户搜索的字段 三.很少被增删改的字段,因为增删改后,索引会重新排序 索引的创建 create index 索引 ...

随机推荐

  1. Itellij idea2019.2 激活码,有效期2020.5

    Itellij idea2019.2 激活码,有效期2020.5 MNQ043JMTU-eyJsaWNlbnNlSWQiOiJNTlEwNDNKTVRVIiwibGljZW5zZWVOYW1lIjoi ...

  2. 消除router-link 的下划线问题

    <div class="small-size"> <router-link to="/About"> <img src=" ...

  3. beta week 1/2 Scrum立会报告+燃尽图 02

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9912 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 ...

  4. python3 之 判断字符串是否只为数字(isdigit()方法、isnumeric()方法)

    Isdigit()方法 - 检测字符串是否只由数字组成 语法:   str.isdigit() 参数: 无 返回值: 如果字符串只包含数字,则返回True,否则返回False. 实例: 以下实例展示了 ...

  5. 图解 Spring:HTTP 请求的处理流程与机制【5】

    5. HTTP 请求处理相关配置文件说明 HTTP 请求穿越的整个空间是分层的,包括:Web 容器.Web 应用.Spring 框架等,它们每层都是通过配置文件配置初始化的,这是一种松耦合的架构设计. ...

  6. pymongo的基本操作和使用

    MongoDB简介 MongoDB是一个开源的文档类型数据库,它具有高性能,高可用,可自动收缩的特性.MongoDB能够避免传统的ORM映射从而有助于开发. 文档 在MongoDB中,一行纪录就是一个 ...

  7. 网页解析之BeautifulSoup

    介绍及安装 Beautiful Soup 是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. BeautifulSoup 用来解析 HTML 比较简单,API非常人 ...

  8. 关于HashMap容量的初始化,还有这么多学问。

    在<HashMap中傻傻分不清楚的那些概念>文章中,我们介绍了HashMap中和容量相关的几个概念,简单介绍了一下HashMap的扩容机制. 文中我们提到,默认情况下HashMap的容量是 ...

  9. MySQL查询字段类型为json的数据

    测试表如下: /* Navicat Premium Data Transfer Source Server : Source Server Type : MySQL Source Server Ver ...

  10. AVLTree的Python实现

    AVLTree 自己最近在学习数据结构,花了几天理解了下AVLTree的实现,简单一句话概括就是先理解什么是旋转,然后弄明白平衡因子在各种旋转后是如何变化的.最后整理了下学习的过程,并尽量用图片解释, ...