
多表查询
显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自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 ):
-
根索引页 → 二分找「22 落在哪个子页」
-
中间索引页 → 继续二分 → 定位到 数据页号
-
加载该数据页到内存 → 页内二分(靠「页目录」)→ 找到行
二级索引
叶子节点存:索引列值+主键值,不存整行
查询:先在二级索引树找到主键--再去聚簇索引查行--回表

主键索引的特点:
一个表中,最多有一个主键索引,当然可以使符合主键
主键索引的效率高(主键不可重复)
创建主键索引的列,它的值不能为null,且不能重复
主键索引的列基本上是int
唯一索引的特点:
一个表中,可以有多个唯一索引
查询效率高
如果在某一列建立唯一索引,必须保证这列不能有重复数据
如果一个唯一索引上指定not null,等价于主键索引