多表查询

连表查询

  要进行连接,那一定涉及两个表,两个表中要有关联条件才能进行连接

  内连接 只有表一和表二中的连接条件都满足的时候才能显示出来

    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的更多相关文章

  1. day45 Pyhton 数据库Mysql 02

    一.前期回顾 数据库 mysql的安装 配置环境 为什么要用数据库? 稳定性 一致性 并发 存取数据效率高 数据库的分类 关系型数据库 mysql oracle sqlserver 非关系型数据库 r ...

  2. day46 Pyhton 数据库Mysql 03

    一内容回顾 存储引擎:主要描述的是数据存储的不同方式 innodb 支持事务\支持外键\行级锁\聚焦索引 myisam 不支持事务\不支持外键\表级锁\非聚焦索引 memory 只能在内存中存储表数据 ...

  3. day44 Pyhton 数据库Mysql

    内容回顾 什么是进程? 就是为了形容执行中的程序的一种称呼 它是操作系统中资源分配的最小单位 进程之间是数据隔离的,占用操作系统资源相对多 独立存在的 谈谈你对并发的理解 同时有多个任务需要执行,但是 ...

  4. day48 Pyhton 数据库Mysql 05

    一内容回顾 insert insert into 表名 (字段名)  values (值) insert into 表名 values (有多少个字段写多少个值) insert into 表名 val ...

  5. day47 Pyhton 数据库Mysql 04

    # 表结构 # 建表 - 表的增加 # create table # 删表 - 表的删除 # drop table # 改表 - 表的修改 # alter table 表名 # rename 新表名 ...

  6. 数据库MySQL的基本操作

    1.MySQL数据库的安装: CentOS6上mysql服务端和客户端的安装和启动: #使用yum安装mysql数据库的服务端和客户端 yum install -y mysql mysql-serve ...

  7. 数据库MySQL经典面试题之SQL语句

    数据库MySQL经典面试题之SQL语句 1.需要数据库表1.学生表Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学 ...

  8. MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限

    1.新建用户 //登录MYSQL @>mysql -u root -p @>密码 //创建用户 mysql> insert into mysql.user(Host,User,Pas ...

  9. Robot Framework-DatabaseLibrary数据库(MySql)

    Robot Framework-Mac版本安装 Robot Framework-Windows版本安装 Robot Framework-工具简介及入门使用 Robot Framework-Databa ...

随机推荐

  1. 转载:记录一次MySQL两千万数据的大表优化解决过程

    地址:https://database.51cto.com/art/201902/592522.htm 虽然是广告文,但整体可读性尚可.

  2. Spring-代理模式

    代理模式 目录 代理模式 1. 代理模式的分类 2. 静态代理 1. 角色分析 2. 代码步骤 3. 代理的好处 4. 进一步理解 3. 动态代理 1. 角色分析 2. 对动态代理的两个关键类的理解 ...

  3. webstorm中emmet展开a标签和行内元素不换行的解决办法

    大家好我是木瓜太香,大家在使用 webstorm 编写 html 的时候可能会遇到展开部分标签挨在一起的情况,相信很多小伙伴都想解决这个问题,接下来我们就开始吧! 先来看看我们输入如下 emmet 代 ...

  4. docker下部署jira破解版

    1. 制作Docker破解容器 在/opt/jira下新建一个Dockerfile文件 touch Dockerfile 编辑Dockerfile文件 vim Dockerfile FROM cpta ...

  5. xss构造--如何使用xss语句

    XSS的构造 1.利用[<>]构造html/js 如[<script>alert(/xss/)</script>] 2.伪协议 使用javascript:伪协议来构 ...

  6. Hadoop之MapReduce开发总结

    @ 目录 1.输入数据接口:InputFormat 2.逻辑处理接口:Mapper 3.Partitioner分区 4.Comparable排序 5.Combiner合并(可选) 6.Reduce端分 ...

  7. Java沙箱安全机制介绍【转载】

    沙箱安全机制的应用层面:360沙箱.win10沙箱.包括VMware Workstation.Oracle VM VirtualBox都可以充当沙箱去使用,沙箱中的操作与本机无关,进而保证本机的安全性 ...

  8. 基本的PID算法整理(水缸的例子有问题!!)

    一,先谈关于水缸漏水的问题 谈到PID原理入门的时候,大家经常会举的一个例子就是水缸漏水的例子.这里把一个解释水缸漏水的帖子放在这里:https://blog.csdn.net/qq_41736609 ...

  9. 记一次由selinux引起的使用cat查看文件报错Permission denied的问题排查

    事件起因:如下 1.在服务器上root用户,定期会生成一个文件,到/tmp目录,如:qq_5201351.txt,给other加上了r读取 2.zabbix端会周期性取这台服务器/tmp/qq_520 ...

  10. 关于windows服务器创建一个ps1脚本的周期性定时任务

    测试环境: Windows Server 2008 R2 Standard  & Windows Server 2012 R2 Standard 周期运行的ps脚本:Clean_up_Secu ...