MySQL学习日记14——阶段复习3

今日博主学习的课程地址:https://www.bilibili.com/video/BV1xW411u7ax?p=97
视频76、97集

连接查询

  1. 含义:
    当查询中涉及到了多个表的字段,需要使用多表连接
    select 字段1,字段2
    from 表1,表2,…;

笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决:添加有效的连接条件

  1. 分类 ( 按年代分类 )

(1)sql92 只支持内连接

内连接分为:
1.等值连接
	语法:
		select 查询列表
		form 表1 别名,表2 别名
		where 表1.key = 表2.key
		[and 筛选条件]
		[group by 分组字段]
		[having 分组后的筛选]
		[order by 排序字段]

	特点:
		1.一般为表起别名
		2.多表的顺序可以调换
		3.n 表连接至少需要 n-1 个连接条件
		4.等值连接的结果是多表的交集部分
		
2.非等值连接
	语法:
		select 查询列表
		form 表1 别名,表2 别名
		where 非等值的连接条件
		[and 筛选条件]
		[group by 分组字段]
		[having 分组后的筛选]
		[order by 排序字段]

3.自连接
	语法:
		select 查询列表
		form 表 别名1,表 别名2
		where 等值连接条件
		[and 筛选条件]
		[group by 分组字段]
		[having 分组后的筛选]
		[order by 排序字段]

(2)sql99【推荐使用】

1.内连接 ( 等值连接、非等值连接、自连接 )
	语法:
		select 查询列表
		from 表1 别名
		[inner] join 表2 别名 on 连接条件
		where 筛选条件
		group by 分组列表
		having 分组后的筛选
		order by 排序列表
		limit 子句;
	特点:
		1.表的顺序可以调换
		2.内连接的结果 = 多表的交集
		3.n 表连接至少需要 n - 1 个连接条件
	分类:
		等值连接
		非等值连接
		自连接

外连接 ( 左外、右外、全外 ( mysql不支持 ) )
	语法:
		select 查询列表
		from 表1 别名
		left|right|full [outer] join 表2 别名 on 连接条件
		where 筛选条件
		group by 分组列表
		having 分组后的筛选
		order by 排序列表
		limit 子句;
	特点:
		1.查询的结果 = 主表中所有的行,其中从表和它匹配的将显示匹配行,如果从表没有匹配的则显示 NULL
		2.left join 左边的就是主表,right join 右边的就是主表,full join 两边都是主表
		3.一般用于查询除了交集部分的剩余的不匹配的行
			
交叉连接 
	语法
		select 查询列表
		from 表1 别名
		cross join 表2 别名;

	特点:
		类似于笛卡尔乘积

子查询

  1. 含义:
嵌套在其它语句内部的select语句称为子查询或内查询,
外面的语句可以是 insert、update、select 等,一般 select 作外面语句较多
外面如果为 select 语句,则此语句称为 外查询 或 主查询
  1. 分类
1.按出现位置
	select 后面
		仅仅支持标量子查询
	from 后面
		表子查询
	where 或 having 后面
		标量子查询
		列子查询
		行子查询
	exists 后面
		标量子查询
		列子查询
		行子查询
		表子查询
	
2.按结果集的行列
	标量子查询 (单行子查询):结果集为一行一列
	列子查询 (多行子查询):结果集为多行一列
	行子查询:结果集为多行多列
	表子查询:结果集为多行多列
  1. 示例
where 或 having 后面
	1.标量子查询
	e.g.查询最低工资的员工姓名和工资
		(1) 最低工资
		select min(salary) from employees
		(2) 查询员工的姓名和工资,要求工资 = (1)
		select last_name,salary
		from employees
		where salary = (
			select min(salary) from employees
		);
	
	2.列子查询
	e.g.查询所有是领导的员工姓名
		(1) 查询所有员工的manager_id
		select manager_id
		from employees
		(2)查询姓名,employee_id 属于 (1) 列表的一个
		select last_name
		from employees
		where employee_id in(
			select manager_id
			from employees
		);

分页查询

  1. 应用场景:当要查询的条目数太多,一页显示不全

  2. 语法

select 查询列表
from 表
limit [offset,]size;

注意:
	offset 代表的是起始的条目索引,默认从 0 开始
	size 代表的是显示的条目数

公式:
	假如要显示的页数为page,每一页条目数为size
	select 查询列表
	from 表
	limit (page - 1)*size, size;

你可能感兴趣的:(MySQL学习日记,mysql)