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 ...
随机推荐
- 20190923-11Linux crond 系统定时任务 000 019
crond 服务管理 1.重新启动crond服务 [root@hadoop101 ~]# service crond restart centOS7是 systemctl restart crond ...
- ThinkPHP6.0 判断是否有文件上传
有必要考虑不是post请求或没有指定enctype="multipart/form-data"的情况.如果是post请求还是设置了正确的编码,没有文件上传时 request()-& ...
- .NET性能排查
概述 1,性能参数 2,性能排查方式 3,.NET的性能分析工具 1,性能指标 一个系统的性能排查或者性能设计的前提就是要有明确的性能指标:常见的性能参数 1.响应时间(处理任务时的延迟,简称 RT, ...
- 学习STM32的一些记录_创建库函数版本的工程
1.新建一个文件夹,用于存放MDK的工程所有文件.例如新建文件夹Template. 2.在Template下新建一个USER文件夹,用于存放工程. 3.打开MDK5,新建工程,目录在USER下. 4. ...
- 故事:坐在我隔壁的小王问我什么是HyperLogLog
1 最近坐我隔壁的小王同志,心情真是糟透了.不但工作不顺心,被老板狠狠的批了一顿,连女朋友也跟别人跑了(Y 的让你天天在我面前秀). 真是不可谓不惨,我都快要同情他了. 看着他萎靡又迷离的眼神,我实在 ...
- Docker学习笔记,从原理到实践
什么是docker Docker是使用go语言基于LINUX内核的cgroup,namespace以及AUFS 类的 Union FS 等技术,对进程进行封装隔离的一种操作系统层面的虚拟化技术,由于隔 ...
- react学习 | 踩坑指南
react样式模块化的"omit -loader"坑 众所周知 react样式的模块化(css modules) 是自己模块中写自己的css,与其他模块互补影响,解决了命名冲突和全 ...
- Java 异常面试题(2020 最新版)
Java异常架构与异常关键字 Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制. Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程 ...
- hystrix熔断器之线程池
隔离 Hystrix有两种隔离方式:信号量和线程池. 线程池隔离:对每个command创建一个自己的线程池,执行调用.通过线程池隔离来保证不同调用不会相互干扰和每一个调用的并发限制. 信号量隔热:对每 ...
- ZooKeeper学习(一)了解ZooKeeper
一.什么是ZooKeeper ZooKeeper主要服务于分布式系统,可以用ZooKeeper来做:统一配置管理.统一命名服务.分布式锁.集群管理. 使用分布式系统就无法避免对节点管理的问题(需要实时 ...