MySQL-04——分组查询group by、子查询、关联查询

分组查询group by

  • 多字段分组 gourp by 字段1名,字段2名;

having

  • 结合 group by 使用
  • having后面写聚合函数的条件
    聚合函数:平均值avg 最大值 max 最小值min 求和sum 计数
  • where后面写普通字段的条件
  • 各个关键字的顺序
    select …… from 表名 where …… group by XXXX having XXXX order by XXXX limit XXXX;

group_ concat() 组连接

查询每个部门的员工姓名和工资要求一行显示:
select deptno,group_concat(ename,'-',sal) from emp group by deptno;

子查询可以写的位置

1.写在where或having后面当做查询条件的值。
2.写在创建表的时候
create table emp_10 as (select * from emp where deptno=10); 3.写在from后面 必须起别名
select ename from (select * from emp where deptno=20) newtable;

关联查询

同时查询多张表数据的查询方式称为关联查询.
关联查询必须写关联关系,如果不写关联关系会得到两张表的乘积,这种乘积称为笛卡尔积,工作中切记不要出现这种情况

  • 内连接查询:
    是指所有查询出的结果都是能够在连接的表中有对应记录的。
    SELECT e.ename,d.dname FROM t_emp e INNER JOIN t_dept d ON e.dept = d.id;
  • 左外连接查询:
    是指以左边的表的数据为基准,去匹配右边的表的数据,如果匹配到就显示,匹配不到就显示为null。
    SELECT e.ename,d.dname FROM t_emp e LEFT OUTER JOIN t_dept d ON e.dept = d.id;
  • 右外连接
    右外连接同理,但基准表的位置发生变化。
    SELECT e.ename,d.dname FROM t_emp e RIGHT OUTER JOIN t_dept d ON e.dept = d.id;
  • 全外连接
    顾名思义,把两张表的字段都查出来,没有对应的值就显示null,但是注意:mysql是没有全外连接的(mysql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接。例如:
    SELECT e.ename,d.dname FROM t_emp e LEFT JOIN t_dept d ON e.dept = d.id UNION SELECT e.ename,d.dname FROM t_empl e RIGHT JOIN t_dept d ON e.dept = d.id; 如果在oracle中,直接就使用full outer join关键字连接两表就行了
  • 自连接查询
    自连接查询就是当前表与自身的连接查询,关键点在于虚拟化出一张表给一个别名。
    例如:查询员工以及他的上司的名称,由于上司也是员工,所以这里虚拟化出一张上司表。
    SELECT e.ename,b.ename FROM t_emp e LEFT JOIN t_employee b ON e.bossId = b.id;

关联查询总结:

1.如果需要查询两张表的交集数据需要使用等值连接或内连接(推荐)
2.如果查询两张表中一张表的全部数据和对应一张表的交集数据使用外连接
如果是自关联查询数据时把一张表当成两张表