多表查询

连表查询

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

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

    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. 使用dbUnit的 IDataSet 因乱序造成assert失败而采取的措施

    本例源码下载:https://files.cnblogs.com/files/xiandedanteng/dbUnitTest20200211.zip 在做IDataSet比较时,特殊情况下会有期盼的 ...

  2. python格式化输出当前时间

    import time def get_now_time(): now_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.tim ...

  3. springboot2.x基础教程:动手制作一个starter包

    上一篇博客介绍了springboot自动装配的原理.springboot本身有丰富的spring-boot-starter-xx集成组件,这一篇趁热打铁加深理解,我们利用springboot自动装配的 ...

  4. 给编程小白的java JDK安装教程

    对刚开始学习编程的新手朋友们来说,安装开发环境可谓是一件头疼的事了,为了不让刚准备入门java的朋友还没写出自己的Hello World就被安装开发环境劝退,所以本篇文章诞生了. 下载JDK 打开浏览 ...

  5. 关于如何设置IDEA中的servlet的模板

    关于如何设置IDEA中的servlet的模板 点击左上角的File: Setting --> Editor --> File and Code Templates --> Other ...

  6. 安卓自动化测试工具Monkey简单使用

    一.首先安装adb 地址:http://www.downza.cn/soft/219906.html安装到D盘下,安装的过程中自己注意下不要安装上全家桶.找到这个压缩包:解压到当前文件夹: 二.将ad ...

  7. C++ Templates (2.3 类模板的局部使用 Partial Usage of Class Templates)

    返回完整目录 目录 2.3 类模板的局部使用 Partial Usage of Class Templates 2.3.1 Concepts 2.3 类模板的局部使用 Partial Usage of ...

  8. 原来写插件还可以选MEF

    MEF是微软提供的一个轻量级的ICO容器,可以轻易的解除程序集的依赖关系,最近想写个类似插件试的软件所以搜索了一下,终于淘到宝了. 下面我们看看MEF是如何解耦的 新建一个控制台项目两个类库 Ites ...

  9. openstack (共享服务) 消息队列rabbitmq服务

    云计算openstack共享组件——消息队列rabbitmq(3)   一.MQ 全称为 Message Queue, 消息队列( MQ ) 是一种应用程序对应用程序的通信方法.应用程序通过读写出入队 ...

  10. Mybatis接口Mapper内的方法为啥不能重载吗?

    动态代理的功能:通过拦截器方法回调,对目标target方法进行增强. 言外之意就是为了增强目标target方法.上面这句话没错,但也不要认为它就是真理,殊不知,动态代理还有投鞭断流的霸权,连目标tar ...