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,等价于主键索引

相关推荐
Super 含4 小时前
Android 启动优化(五):线程、GC 与 IO 为什么会拖慢启动?
java·服务器·数据库
ltl4 小时前
向量检索引擎选型:决策树、RAG 回链与开放问题
数据库
坚持学习前端日记4 小时前
Python SQLAlchemy ORM 从0到1精通实战手册(基础到复杂高阶)
数据库·python·oracle
灯澜忆梦4 小时前
【MySQL17】进阶篇 | InnoDB引擎
数据库·mysql
anxiao_m5 小时前
2026制造业云桌面选型攻略,不同生产场景适配方案汇总
大数据·网络·数据库
许彰午5 小时前
# 数据库配拦截器,不用改BPMN
数据库
lv__pf6 小时前
redis【msb 2026金三银四redis上】
数据库·redis·缓存
布莱克6056 小时前
理解数据库聚簇索引:原理、优势与适用场景
数据库·mysql
Nturmoils7 小时前
只面对一张表:KingbaseES 超表如何简化海量时序数据管理
数据库