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语句
实现相同的效果,这时交叉连接基本上是作为一个内部连接。
交叉连接相对于内部连接使用效率低,而且两个大表不应该使用交叉连接