MySQL----复合查询 外连接

复合查询 内外连接

  • 复合查询
    • 基本查询
    • 多表查询
    • 自连接
    • 子查询
      • 单行子查询
      • 多行子查询
      • 多列子查询
      • from子句中进行子查询
      • 合并查询
  • 内外连接
    • 内连接
    • 外连接
      • 左外连接
      • 右外连接

复合查询

基本查询

注意:MySQL中,select出来的也是表,可以在查询语句中使用


有一张员工表emp:
MySQL----复合查询 外连接_第1张图片
例子:

  • 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
    MySQL----复合查询 外连接_第2张图片
  • 按照部门号升序而雇员的工资降序排序
    MySQL----复合查询 外连接_第3张图片
  • 使用年薪进行降序排序
    MySQL----复合查询 外连接_第4张图片
  • 显示工资最高的员工的名字和工作岗位
    MySQL----复合查询 外连接_第5张图片
  • 显示工资高于平均工资的员工信息
    MySQL----复合查询 外连接_第6张图片
  • 显示每个部门的平均工资和最高工资
    MySQL----复合查询 外连接_第7张图片
  • 显示平均工资低于2000的部门号和它的平均工资
    注意:此处不能select deptno, avg(sal) as 'avgsal' from emp group by deptno where avg(sal)<2000;where一定在group by 之前
    而where是最先进行的操作,显然不符合题意,应该使用having
    在这里插入图片描述
  • 显示每种岗位的雇员总数,平均工资
    MySQL----复合查询 外连接_第8张图片

多表查询

有一个数据库scott里面有三张表:dept emp salgrade
select count(*) from dept;
select count(*) from emp;
select count(*) from salgrade;
MySQL----复合查询 外连接_第9张图片
他们的笛卡尔积:
MySQL----复合查询 外连接_第10张图片
所谓的笛卡尔积,只是在数学层面,穷举了多个表的数据组合全部情况,但不意味着,所有新的数据记录,都是有意义的下一步做的是筛选
做完笛卡尔积,本质是我们把所有相关的数据,聚合到了一张表,接下来的问题,就变成了一个单表查询,根据题面,追溯需耍的数据都在哪些表里面+关联字段


例子:

  • 显示雇员名、雇员工资以及所在部门的名字
    MySQL----复合查询 外连接_第11张图片
  • 显示部门号为10的部门名,员工名和工资
    MySQL----复合查询 外连接_第12张图片
  • 显示各个员工的姓名,工资,及工资级别
    MySQL----复合查询 外连接_第13张图片

自连接

自连接:指在同一张表连接查询
例子:

  • 显示员工FORD的上级领导的编号和姓名
    在这里插入图片描述

子查询

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

单行子查询

同员工表
例子:

  • 显示SMITH同一部门的员工
    MySQL----复合查询 外连接_第14张图片

多行子查询

in关键字:在其中即可

  • 查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
    MySQL----复合查询 外连接_第15张图片

all关键字:必须满足任何一个

  • 显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
    MySQL----复合查询 外连接_第16张图片

any关键字:满足任意一个即可

  • 显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
    MySQL----复合查询 外连接_第17张图片

多列子查询

子查询中不止1个列名,如子查询where (ename, sal)=(select ename,sal from emp)
例子:

  • 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
    在这里插入图片描述

from子句中进行子查询

把一个子查询当做一个临时表使用(注意,先根据题目要求,先确定子查询的表)
例子:

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

    • 1.列出所有部门的平均工资: select deptno, avg(sal) from emp;
    • 2.从笛卡尔积中筛选出两个deptno相同的数据即有效数据
    • 3.MySQL----复合查询 外连接_第18张图片
  • 查找每个部门工资最高的人的姓名、工资、部门、最高工资
    在这里插入图片描述

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

    • 1.子查询
      在这里插入图片描述
    • 2.多表
      注意这里的坑,前面select有具体的列名,group by也一定要带上在这里插入图片描述

合并查询

合并多个select的执行结果,可以使用集合操作符union,union all


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

  • 例子: 将工资大于2500或职位是MANAGER的人找出来
    MySQL----复合查询 外连接_第19张图片

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

  • 例子:将工资大于25000或职位是MANAGER的人找出来
    MySQL----复合查询 外连接_第20张图片

内外连接

内连接

利用where子句对两种表形成的笛卡儿积进行筛选,也就是之前一直用的写法


标准写法:select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件

外连接

有两张表:
MySQL----复合查询 外连接_第21张图片

左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接
标准写法: select 字段名 from 表名1 left join 表名2 on 连接条件

  • 例子:查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
    MySQL----复合查询 外连接_第22张图片

右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接
标准写法:select 字段 from 表名1 right join 表名2 on 连接条件;
例子:

  • 对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来
    MySQL----复合查询 外连接_第23张图片
  • 列出部门名称和这些部门的员工信息,同时列出没有员工的部门
    right join同理,交换两表位置即可MySQL----复合查询 外连接_第24张图片

你可能感兴趣的:(mysql,数据库,sql)