从入门到自闭之Python--MySQL数据库的多表查询
多表查询
- 连表:
- 内连接:所有不在条件匹配内的数据们都会被剔除连表
- select * from 表名1,表名2 where 条件;
- select * from 表名1 inner join 表名2 on 条件;
- 外连接:
- 左外连接:left join
- select * from 表名1 left join 表名2 on 条件;(显示表名1中的所有数据)
- 右外连接right join
- select * from 表名1 right join 表名2 on 条件;(显示表名2中的所有数据)
- 全外连接 full join
- select * from 表名1 left join 表名2 on 条件 union select * from 表名1 right join 表名2 on 条件;
- 左外连接:left join
- 子查询:建议分开做
- 内连接:所有不在条件匹配内的数据们都会被剔除连表
表的存储引擎:
show engines; 存储引擎
存储引擎:
- 表结构:存放在一个文件中(硬盘)
- 表数据:存放在另一个文件中(内存)
- 索引:为了方便查找设计的一个机制
种类:
innodb:索引+数据 表结构,持久化存储
支持事务begin:一致性,n条语句的执行状态是一致的
begin #开启事务
select ......
update/delete ......
commit; #提交事务,解锁被锁住的数据
支持行级锁:只对涉及到修改的行加锁,利用并发的修改,但是对于一次性大量修改效率低下(表级锁:一次性加一把锁就锁住了整张表,不利用并发的修改,但是加锁速度比行锁的效率高)
支持外键约束:被约束表中的数据不能随意的修改,删除,约束字段要根据被约束表来使用数据
myisam:索引,数据,表结构,支持持久化存储
- 支持表级锁
memory:表结构
- 支持断电消失
表的约束
- 非空约束:not null,默认不写的时候自动插入
- unsigned :无符号的数字
- 唯一约束:unique
- 联合唯一约束:unique(需要联合的列)
- 外键约束:foreign key(字段名) references
- 级联更新:on update cascade ,相关的数据会跟随变化
- 设置默认值:default xx
- 主键:primary key
- 第一个被设置了非空+唯一约束的字段会被定义成主键 primary key
- 对某一字段 自增:auto_increment
- (truncate table 表名; 清空表且重置auto_increment),
- (delete from 表名;清空表数据但不能重置auto_increment)
- alter table 表名 auto_increment=数值
表的修改 alter table
- 修改表明:alter table 表名 rename 表名;
- 修改编码:alter table 表名 charset 编码;
- 修改自增:alter table 表名 auto_increment 自增的位置;
- 添加字段约束:alter table 表名 add 约束条件;
- 修改约束:alter table 表名 add 字段名 类型(长度) 约束;
- 修改字段名:alter table 表名 drop 字段名;
- 修改字段名以及类型和约束条件:alter table 表名 change 字段名 新名字 类型(长度)约束
- 修改表中的字段:alter table 表名 modify 字段名 新类型(新长度)约束
- 修改字段名的位置:alter table 表名 add 字段名 类型(长度) 约束 first(备注:移动到第一个)/after 字段名(备注:移动到某个字段名之后)
- 修改原字段的类型:after table 表名 change 字段名1 字段名1 类型(长度) 约束;
表与表之间的关系
一对一:
create table class(id int primary key,cname char(26)); create table student(id int primary key,sname char(16),gid int unique,foreign key(gid) references guest(id));
一对多:foreign key
create table class(id int primary key,cname char(16)); create table student(id int primary key,sname char(16),cid int,foreign key(cid) references class(id));
多对多:
create table class(id int primary key,cname char(16)); create table teacher(id int primary key,tname char(16)); create table teacher_cls(id int,cid int,tid int,foreign key(cid) references class(id),foreign key(tid) references teacher(id));
索引原理
磁盘预读性原理
- linux 中一个block块大小是4096个字节
树:根节点root,分支节点branch,叶子节点:leaf
- b树:balance 树
- 数据存储在分支节点和叶子节点上
- 导致了树的高度增加,找到一个数据的时间不稳定
- 在查找范围的时候不够便捷
- b+树:mysql中innodb存储引擎的所有的索引树都是b+树,是为了更好的处理范围问题在b树的基础上有所优化
- 数据不再存储在分支节点了,而是存储在叶子节点上(树的高度降低,找到所有数据的时间稳定)
- 在叶子节点与叶子节点之间添加的双向指针提高了再查找范围的效率
- b树:balance 树
索引的两种存储方式:
- 聚集(簇)索引:叶子节点会存储整行数据--innodb的主键中才会有(主键只可以创建一个的原因)
- 非聚集索引(辅助索引):除了主键之外的普通索引都是辅助索引,一个索引没办法查询到整行数据,需要回聚集索引再查一次,俗称回表,数据不直接存储在索引的叶子节点
索引优缺点:
- 优点 :加快查询速度
- 缺点:降低写的效率,占用更多的磁盘空间
索引的创建:create index 索引名 on 表名(字段名);
索引的删除:drop index 索引名 on 表名;
正确的使用索引:
- 只有对创建了索引的列进行条件筛选的时候效率才可以提高
- 索引对应的列做条件不能参与运算,不能使用函数
- 当某一列的区分度非常小(重复率高),不适合创建索引
- 当范围作为条件的时候,查询结果的范围越大越慢,越小越快。
- like关键字:如果使用%/ _ 开头都无法命中索引
- 多个条件:如果只有一部分创建了索引,条件用and相连,那么可以提高查询效率,如果用or相连,不能提高效率
- 联合索引:
- 条件不能用or
- 要服从最左前缀原则
- 不能从使用了范围的条件开始之后的索引都失效
基础概念:
explain :执行计划
- explain
覆盖索引 using index:在查询的过程中不需要回表
从入门到自闭之Python--MySQL数据库的多表查询的更多相关文章
- MySQL数据库语法-多表查询练习一
MySQL数据库语法-多表查询练习一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的多表查询的外键约束,以及如何使用外链接和内连接查询数据信息. 一.数据表和测试 ...
- MySQL数据库之单表查询中关键字的执行顺序
目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...
- MySQL数据库语法-单表查询练习
MySQL数据库语法-单表查询练习 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要是对聚合函数和分组的练习. 一.数据表和测试数据准备 /* @author :yinz ...
- mysql数据库之单表查询多表查询
单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex e ...
- mysql数据库之单表查询
单标查询 单表查询语句 关键字执行的优先级 简单查询 where约束 group by 聚合函数 HAVING过滤 order by 查询排序 LIMIT限制查询的记录数 使用正则表达式查询 单表查询 ...
- nodejs MYSQL数据库执行多表查询
1.设计数据库 2.设计数据库表 genres表: books表: 3.安装MySQL模块 4. 代码编写 (1) 第一种方法: 在query中使用nextTables属性,将属性值设置为ture d ...
- mysql数据库之多表查询
准备 ...
- 关于Mysql数据库进行多表查询时设计编程思想
SQL代码:
- python 之 数据库(多表查询之连接查询、子查询、pymysql模块的使用)
10.10 多表连接查询 10.101 内连接 把两张表有对应关系的记录连接成一张虚拟表 select * from emp,dep: #连接两张表的笛卡尔积 select * from emp,de ...
- mysql数据库之联表查询
表准备: 这次我们用到5张表: class表: student表: score表: course表: teacher表: 表结构模型: 我们针对以下需求分析联表查询: 1.查询所有的课程的名称以及对应 ...
随机推荐
- 由 Vue 中三个常见问题引发的深度思考
为什么 data 要写成函数,而不允许写成对象? Vue 中常说的数据劫持到底是什么? Vue 实例中数组改变 length 或下标直接赋值什么不能更新视图? http://www.sohu.com/ ...
- maven上传jar包(oracle jdbc驱动)
由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库.一.首先要得到Oracle J ...
- java线程基础方法详解
一.线程状态转换 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行 ...
- 使用Spring基于应用层实现读写分离(一)基础版
背景 我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案, 其中一个是主库,负责写入数据,我们称之为:写库: 其它都是从库,负责读取数据 ...
- 带有时间间隔的dp
Uberwatch 题意:一个人打一群敌人,每间隔时间m能释放一次大招,消灭这个时刻上的所有敌人,起始时刻开始计算冷却时间 solution: dp[i]=max(dp[i],dp[i-m]); /* ...
- tornado框架学习
tornado是一个非阻塞的web服务器框架,每秒可以处理上千个客户端连接(都是在一个线程中,不需要为每个客户端创建线程,资源消耗少),适合用来开发web长连接应用,如long polling(轮询) ...
- React Native 日常报错
在学习React.js 或 React Native 过程中,有时看着别人的框架或代码,但总是会出现错误,因为React或之中用到的一些包经常更新,有些代码或教程就显得过旧了. 一.日常报错 'con ...
- [go]包管理
vendor方式 //包管理发展 go get(无版本概念) -> vendor(godep)(无版本概念) -> go modules go get github.com/tools/g ...
- LC 980. Unique Paths III
On a 2-dimensional grid, there are 4 types of squares: 1 represents the starting square. There is e ...
- MOCK服务小结
前言: 说到mock,大家会想到单测中的mock,测试同学会想到httpmock服务等. mock的作用:程序运行过程中,设定过滤规则及返回值,来满足固定的数据解析,解决不容易构造或者获取的数据对象. ...