day49 Pyhton 数据库Mysql 06
多表查询
连表查询
要进行连接,那一定涉及两个表,两个表中要有关联条件才能进行连接
内连接 只有表一和表二中的连接条件都满足的时候才能显示出来
inner join on /where 条件
select * from t1 inner join t2 on t1.id =t2.t2_id;
select * from t1,t2 where t1.id = t2.t2_id
左外连接 一定显示左表中所有内容,如果右表中的内容没有符合连接条件就不显示
left join
select * from t1 left join t2 on t1.id = t2.t2_id;
右外连接
right join
select * from t1 right join t2 on t1.id = t2.t2_id
全外连接
select * from t1 left join t2 on t1.id = t2.t2_id
union
select * from t1 right join t2 on t1.id = t2.t2_id
所谓的连表,实际上就是把多张表通过条件的连接,变成一张大表,然后所有的查询条件都和原来一张表是一样的
但是我们要注意两张表中如果字段的名字不同,可以直接使用
但是我们要注意两张表中如果字段的名字相同,需要使用 表名.字段名来表示具体的字段
当表的名字过长的时候,可以对表进行一个临时重命名,重命名之后在本条sql中就可以使用新名字来代替原来的表名了
# table1 : id name sex
# table2 : id salary t1_id
# select table1.id,table2.id,name,salary from table1 inner join table2 on table1.id = table2.t1_id;
# select t1.id,t2.id from table1 t1 inner join table2 t2 on t1.id = t2.t1_id;
子查询
是先查一个表,得到一个结果,这个结果要么是n条,要么是1条,通常是一个字段
用这个结果作为条件去查另外一张表
子查询:结果在哪个表,最后你查的一定是那张表
如果结果是n条:在外层查询中你可能会用到in条件
如果结果是1条:在外层查询中你可以用 = != > < is
索引
加速查询速度
mysql的存储引擎的索引基于 b+树\hash做的
innodb b+树 聚集索引/聚簇索引 非聚簇索引
myisam b+树 非聚簇索引
memory hash
b+树做了那些事儿?为什么基于b+树的索引会快?
一颗平衡树
在非叶子节点不存储数据相关的信息,只存放指针 : 让树的高度降低了,所有的数据的寻找的时间是固定的
在叶子节点会直接存储数据或者数据的指针 : 能够直接找到对应的数据
叶子节点的各个数据块之间使用双向链表来连接 : 能够更好的进行范围\排序相关的操作
要想缩短树的高度,我们能做的事情
1.就是让每一列的宽度尽量的小
聚簇索引和非聚簇索引
聚簇索引
一张表只能有一个
只在innodb存储引擎中存在
b+树 : 在叶子节点会直接存储数据
所有的数据存储的物理地址是根据索引顺序: 排序快
非聚簇索引
每张表可以有多个
在myisam,innodb中都存在
b+树 : 在叶子节点会存储数据的指针
所有的数据存储的物理地址和索引顺序无关
如果创建多个非聚簇索引,那么insert delete数据都会非常慢,并且占用更多的硬盘和内存
今日内容
在创建表的时候创建索引
CREATE TABLE ind1(
id int primary key,
name char(12),
index ind_name(name)
);
在建表之后添加索引
CREATE TABLE ind2(
id int primary key,
email char(12)
);
CREATE INDEX ind_email on ind2(email);
alter table ind2 add index ind_email(email);
删除索引
DROP INDEX ind_email ON ind2;
索引的基础用法
你设置了哪个字段为索引,那么查找条件就使用这个字段,就能够加速查询
如果我们给id字段创建了索引,但是查找的确实email条件,那么就未命中索引,并不会加速查询
一次sql查询只能用上一个索引id = 1000 and email='eva1000@oldboy'
索引的正确使用
1.如果查询的结果是很多条数据的话我们仍然不能命中索引
> < >= <= != like between and
2. 当我们选定某一列作为索引的时候,这一列必须是区分度比较高的列
如果这一列的内容都是重复的,那么创建了索引也不会有任何的加速效果
3.索引列不能在条件中参与计算
4.对于sql中的or来说,即便找到一个为假的条件也还是要去判断另外的条件是否成立,所以mysql并没有进行优化
所有的查询都是从左向右一次进行的,所以使用了or的条件语句很难命中索引
对于sql中的and,由于只要找到一个为假的条件就可以放弃判断整个语句,所以mysql进行了优化
在所有的and条件中会找到第一个区分度最高的列来使用它的索引,来达到加快查询速度的效果
5.联合索引:最左前缀匹配原则
create index union_ind on s1(id,email,name)
联合索引,第一个索引项是这个索引的姓,每一次查询条件必须带着第一个索引项字段(例id),才能命中联合索引
如果条件中丢失了第一个索引项来创建条件,那么不能命中联合索引
create index union_ind on s1(id,email,name,sex)
id
email,id
id,email,name
id,email,name,sex
id,name # id,sex
id,name,sex
聚集索引
1.纪录的索引顺序与无力顺序相同
因此更适合between and和order by操作
2.叶子结点直接对应数据
从中间级的索引页的索引行直接对应数据页
3.每张表只能创建一个聚集索引
非聚集索引
1.索引顺序和物理顺序无关
2.叶子结点不直接指向数据页
3.每张表可以有多个非聚集索引,需要更多磁盘和内容
多个索引会影响insert和update的速度
使用python操作数据库
import pymysql
conn = pymysql.connect(
host = 'localhost',
port = 3306,
user = 'root',
password = '123',
database = 'homework',
charset='utf8'
)
cur = conn.cursor(pymysql.cursors.DictCursor) # 设置返回的数据类型是字典
cur = conn.cursor() # 默认返回的数据类型是元组
# cur 数据库操作符
# sql = 'drop table ind1;'
# sql = """CREATE TABLE EMPLOYEE (
# FIRST_NAME CHAR(20) NOT NULL,
# LAST_NAME CHAR(20),
# AGE INT,
# SEX CHAR(1),
# INCOME FLOAT )"""
try:
sql = 'select * from class'
ret = cur.execute(sql)
conn.commit()
except:
conn.rollback() print(ret)
res = cur.fetchone()
print(res)
ret = cur.fetchmany(2)
# res = cur.fetchall()
print(ret)
cur.close()
conn.close()
day49 Pyhton 数据库Mysql 06的更多相关文章
- day45 Pyhton 数据库Mysql 02
一.前期回顾 数据库 mysql的安装 配置环境 为什么要用数据库? 稳定性 一致性 并发 存取数据效率高 数据库的分类 关系型数据库 mysql oracle sqlserver 非关系型数据库 r ...
- day46 Pyhton 数据库Mysql 03
一内容回顾 存储引擎:主要描述的是数据存储的不同方式 innodb 支持事务\支持外键\行级锁\聚焦索引 myisam 不支持事务\不支持外键\表级锁\非聚焦索引 memory 只能在内存中存储表数据 ...
- day44 Pyhton 数据库Mysql
内容回顾 什么是进程? 就是为了形容执行中的程序的一种称呼 它是操作系统中资源分配的最小单位 进程之间是数据隔离的,占用操作系统资源相对多 独立存在的 谈谈你对并发的理解 同时有多个任务需要执行,但是 ...
- day48 Pyhton 数据库Mysql 05
一内容回顾 insert insert into 表名 (字段名) values (值) insert into 表名 values (有多少个字段写多少个值) insert into 表名 val ...
- day47 Pyhton 数据库Mysql 04
# 表结构 # 建表 - 表的增加 # create table # 删表 - 表的删除 # drop table # 改表 - 表的修改 # alter table 表名 # rename 新表名 ...
- 数据库MySQL的基本操作
1.MySQL数据库的安装: CentOS6上mysql服务端和客户端的安装和启动: #使用yum安装mysql数据库的服务端和客户端 yum install -y mysql mysql-serve ...
- 数据库MySQL经典面试题之SQL语句
数据库MySQL经典面试题之SQL语句 1.需要数据库表1.学生表Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学 ...
- MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限
1.新建用户 //登录MYSQL @>mysql -u root -p @>密码 //创建用户 mysql> insert into mysql.user(Host,User,Pas ...
- Robot Framework-DatabaseLibrary数据库(MySql)
Robot Framework-Mac版本安装 Robot Framework-Windows版本安装 Robot Framework-工具简介及入门使用 Robot Framework-Databa ...
随机推荐
- 转载:记录一次MySQL两千万数据的大表优化解决过程
地址:https://database.51cto.com/art/201902/592522.htm 虽然是广告文,但整体可读性尚可.
- Spring-代理模式
代理模式 目录 代理模式 1. 代理模式的分类 2. 静态代理 1. 角色分析 2. 代码步骤 3. 代理的好处 4. 进一步理解 3. 动态代理 1. 角色分析 2. 对动态代理的两个关键类的理解 ...
- webstorm中emmet展开a标签和行内元素不换行的解决办法
大家好我是木瓜太香,大家在使用 webstorm 编写 html 的时候可能会遇到展开部分标签挨在一起的情况,相信很多小伙伴都想解决这个问题,接下来我们就开始吧! 先来看看我们输入如下 emmet 代 ...
- docker下部署jira破解版
1. 制作Docker破解容器 在/opt/jira下新建一个Dockerfile文件 touch Dockerfile 编辑Dockerfile文件 vim Dockerfile FROM cpta ...
- xss构造--如何使用xss语句
XSS的构造 1.利用[<>]构造html/js 如[<script>alert(/xss/)</script>] 2.伪协议 使用javascript:伪协议来构 ...
- Hadoop之MapReduce开发总结
@ 目录 1.输入数据接口:InputFormat 2.逻辑处理接口:Mapper 3.Partitioner分区 4.Comparable排序 5.Combiner合并(可选) 6.Reduce端分 ...
- Java沙箱安全机制介绍【转载】
沙箱安全机制的应用层面:360沙箱.win10沙箱.包括VMware Workstation.Oracle VM VirtualBox都可以充当沙箱去使用,沙箱中的操作与本机无关,进而保证本机的安全性 ...
- 基本的PID算法整理(水缸的例子有问题!!)
一,先谈关于水缸漏水的问题 谈到PID原理入门的时候,大家经常会举的一个例子就是水缸漏水的例子.这里把一个解释水缸漏水的帖子放在这里:https://blog.csdn.net/qq_41736609 ...
- 记一次由selinux引起的使用cat查看文件报错Permission denied的问题排查
事件起因:如下 1.在服务器上root用户,定期会生成一个文件,到/tmp目录,如:qq_5201351.txt,给other加上了r读取 2.zabbix端会周期性取这台服务器/tmp/qq_520 ...
- 关于windows服务器创建一个ps1脚本的周期性定时任务
测试环境: Windows Server 2008 R2 Standard & Windows Server 2012 R2 Standard 周期运行的ps脚本:Clean_up_Secu ...