mysql补充

having

  添加having语句(就像where指定条件一样,给每个组指定筛选条件一样,必须跟在group by后面)

    以“dept_id”为分类标志统计各单位的职工人数和工资平均数且工资平均数大于4000。

    select dept_id,avg(sal) from employee group by dept_id having avg(salary)>400;

on

  on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

  on是生成连接表起作用的,where是生成连接表之后对连接表在进行过滤

  当使用left join时,无论on的条件是否满足,都会返回左表的所有记录,对于满足的条件的记录,两个表对应的记录会连接起来,对于不满足条件的记录,那右表字段全部是null

  当使用right join时,类似,只不过是全部返回右表的所有记录

  当使用inner join时,功能与where完全相同。

on、where、having三者之间的区别:

  on最先执行,where次之,having最后。(on先把不符合条件的记录过滤后才进行统计,它可以减少中间运算要处理的数据,运算速度最快)、

  where的作用时间是在计算之前完成的,而having是在计算之后起作用的。

  在多表连接查询时,on比where更早起作用,系统首先根据各个表之间的连接条件把多个表合成一个临时表之后,再由where进行过滤,然后计算,计算之后再由having进行过滤。

连表操作

  inner join  

    内联满足交换定律:“A inner join B” 和 “B inner join A” 是相等的。

  outer join

      连接类型:        保留数据行:

      A left outer join B      all A rows

      A right outer join B      all B rows

      A full outer join B      all A and B rows

  cross join(交叉连接)

    交叉连接执行连个表的笛卡尔积(就是把A表和B表的数据进行一个N*M的组合),他匹配一个表另一个表的每一行,不能通过on子句在交叉连接指定谓词,但可以使用where语句

    实现相同的效果,这时交叉连接基本上是作为一个内部连接。

    交叉连接相对于内部连接使用效率低,而且两个大表不应该使用交叉连接

原文地址:https://www.cnblogs.com/jacky912/p/10528365.html