MySQL中的复合查询和索引

多表查询

显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询

显示部门号为10的部门名,员工名和工资

显示各个员工的姓名,工资,及工资级别

自连接

自连接是指在同一张表连接查询

显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

在where中包含子查询

显示SMITH同一部门的员工

in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自 己的

all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门 的员工)

在from中包含子查询

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

查找每个部门工资最高的人的姓名、工资、部门、最高工资

显示每个部门的信息(部门名,编号,地址)和人员数量

合并查询

union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行

将工资大于2500或职位是MANAGER的人找出来

union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行

将工资大于25000或职位是MANAGER的人找出来

内连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连 接,也是在开发过程中使用的最多的连接查询。

select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

显示SMITH的名字和部门名称

外连接

左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接。

select 字段名 from 表名1 left join 表名2 on 连接条件

查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来

右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接。

select 字段名 from 表名1 right join 表名2 on 连接条件

对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要 显示出来

索引

本质 :一种有序的数据结构,将索引列的值与对应行数据的物理位置(或主键)关联起来,避免全表扫描。

页(Page)是交互最小单位

InnoDB默认的页大小:16KB

磁盘-内存 只按页交换,不会只读取一行

数据、索引都存储在页中:数据页+索引页(目录页)

Page(页)

MySQL 中要管理很多数据表文件,而要管理好这些文件,就需要 成一个个独立文件是有一个或者多个Page构成的。

不同的Page,在 MySQL 中,都是 16KB ,使用 因为有主键的问题, prev 和 next 构成双向链表 MySQL 会默认按照主键给我们的数据进行排序,从上面的Page内数据记录可以看 出,数据是有序且彼此关联的。

多个Page

目录页的本质也是页,普通页中存的数据是用户数据,而目录页中存的数据是普通页的地址。

索引就是页的目录

InnoDB所有索引(主键/普通/联合)底层都是B+树,节点就是页

聚簇索引(主键索引)

叶子节点=数据页:存整行数据,按主键有序

非叶子节点=索引页(目录页):只存最小主键,用来找数据页

查询过程(比如 id=22 ):

  1. 根索引页 → 二分找「22 落在哪个子页」

  2. 中间索引页 → 继续二分 → 定位到 数据页号

  3. 加载该数据页到内存 → 页内二分(靠「页目录」)→ 找到行

二级索引

叶子节点存:索引列值+主键值,不存整行

查询:先在二级索引树找到主键--再去聚簇索引查行--回表

主键索引的特点:

一个表中,最多有一个主键索引,当然可以使符合主键

主键索引的效率高(主键不可重复)

创建主键索引的列,它的值不能为null,且不能重复

主键索引的列基本上是int

唯一索引的特点:

一个表中,可以有多个唯一索引

查询效率高

如果在某一列建立唯一索引,必须保证这列不能有重复数据

如果一个唯一索引上指定not null,等价于主键索引

相关推荐
我也不曾来过11 小时前
MYSQL的基本查询
数据库·mysql
czhc11400756631 小时前
数据库517 数据注入
数据库
六月雨滴1 小时前
Oracle 数据库安全审计
数据库·oracle·dba
小江的记录本1 小时前
【MySQL】MySQL日志体系:redo log/undo log/binlog 三者区别、两阶段提交、如何保证数据一致性
java·数据库·后端·python·sql·mysql·面试
BD_Marathon1 小时前
mysql8.0启动报错
mysql
CC城子1 小时前
EtherCAT研究之物理层PHY(一)
linux·运维·数据库
yyuuuzz1 小时前
国际云服务器的技术特点与使用经验
运维·服务器·网络·数据库·云计算·aws
TDengine (老段)2 小时前
TDengine VNode 生命周期 — 从创建到销毁的完整旅程
大数据·数据库·重构·系统架构·负载均衡·tdengine·涛思数据
2301_783848652 小时前
JavaScript中利用Symbol实现单例模式的属性锁定
jvm·数据库·python