MYSQL笔记 之 关联查询

查询两个或两个以上数据表的查询叫做连接查询,连接查询通常建立在存在相互关系的表之间

一、笛卡尔积

笛卡尔积指做关联操作的每个表的每一行都和其它表的每一行做组合,假设两个表的记录条数分别是X和Y,笛卡尔积将返回X*Y条记录
例:

select * from emp,dept_t;
会返回(emp行数 * dept_t 行数)条数据

二、等值查询

连接查询中最常见的一种,通常是在有主外键关联关系的表间建立,并将连接条件设定为有关系的列,使用等号“=”
例:

select * from emp e,dept_t t where e.Deptno = t.id;

三、内连接

与等值连接效果一样,内连接只会返回满足连接条件的数据记录

select e.ename, d.dname from emp e join dept d on(e.deptno = d.deptno);

四、外连接

外连接不仅返回满足条件的记录,还将返回不满足连接条件的记录,如果匹配不到值,返回 null
可以以某个表为主表,显示想要的内容
语法:

  • left 左外连接
  • right 右外连接
  • full 全外连接
select * from 表名一 left|right|full [outer] join 表名二 on 表名一.column1 = 表名二.column2;

例:以员工信息为主表查询员工的部门名称,如果没有该部门则部门为null

select e.Empno,e.Ename,t.name from emp e left join dept_t t on(e.Deptno = t.id);

五、自连接

自连接是种特殊的连接查询,数据来源是一张表,即关联关系来自于单表中的多个列
将表用别名虚拟成两个表的方式实现
例如:查询出每个职员的经理名字,以及他们的职员编码

select * from emp worker,emp manager where worker.mgr = manager.empno;

六、子查询

6.1 子查询在WHERE 子句中###

在where查询条件中的限制条件不是一个确定的值,而是来自于另外一个查询的结果
为了给查询提供数据而首先执行的查询语句叫做子查询
子查询是嵌入在其他SQL语句中的select语句,大部分时候出现在where子句中
子查询嵌入的语句称作主查询或父查询
主查询可以是select语句, 也可以是insert, update, delete

  • 例一 (查找和SCOTT同职位的员工)

     select e.ename,e.job
     from emp e
     where e.job = (select son.job from emp.son where son.ename = 'SCOT');
    
  • 例二 (查找薪水比整个机构平均薪水高的员工)

     select e.deptno,e. ename, e.sal
     from emp e
     where e.sal > (select avg(son.sal) from emp.son);
    
  • 例三 (子查询返回多行)
    多行比较符包括IN, ALL, ANY。其中ALL和ANY不能单独使用,需要配合单行比较操作符> , >= , < , <= 一起使用

    扫描二维码关注公众号,回复: 6034321 查看本文章
     /*查询出部门中有SALESMAN但职位不是SALESMAN的员工的信息*/
     select empno, ename, job, sal, deptno
     from emp
     where deptno in(select deptno from emp where job = 'SALESMAN')
     and job <> 'SALESMAN';
    
  • 例四 (EXISTS 关键字)

    • exists 中文意思是 存在
    • exists 后边的子查询至少返回一行数据,则整个条件返回TRUE
    • not exists 不存在
    /*举例: 列出来哪些有员工的部门信息*/
    select deptno, dname 
    from dept d
    where exists(select * from emp e where d.deptno = e.deptno);
    

6.2 子查询在HAVING 子句中

/*查询列出最低薪水高于部门30的最低薪水的部门信息*/
select deptno, min(sal) min_sal 
from emp
group by deptno
having min(sal) > (select min(sal) from emp where deptno=30);

子查询在FROM 部分 (理解)

  • from 子句用来指定要查询的表
  • 如果要一个子查询的结果中继续查询,则子查询出现在FROM 子句中,这个子查询也称作行内视图或者匿名视图
  • 把子查询当做视图对待,当视图没有名字,只能在当前的SQL语句中有效
    /*查询出薪水比本部门平均薪水高的员工信息*/
    select e.deptno, e.ename, e.sal from emp e,
    (select deptno, avg(sal) avg_sal from emp group by deptno) x
    where e.deptno = x.deptno and e.sal > x.avg_sal
    order by e.deptno;
    

猜你喜欢

转载自blog.csdn.net/woharen/article/details/89599526