1.mysql内连接和外连接的区别
连接语法:join xx on xx(可以在一个语句中多次使用)
内连接(inner join):取出两张表中匹配到的数据,匹配不到的不保留
外连接(outer join):其中外连接又分为左外连接(left outer join)和右外连接(right outer join)即以某一个表为主表,进行关联查询,取出连接表中匹配到的数据,匹配不到的也会保留,其值为NULL(先拿出主表的所有数据,然后到关联的那张表去找有没有符合关联条件的数据,关联不上的以NULL显示)
自连接:当想将表中行与同一表中的其他行组合时,可以使用自连接。要执行自联接操作必须使用表别名来帮助MySQL在单个查询中区分左表与同一张表的右表。就是说相当于是两张表,以第一张表为主表,去匹配与它对应的第二张表的内容。
2.having的使用
having:用于对where和group by查询出来的分组经行过滤,查出满足条件的分组结果。它是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作。
sql语句执行顺序如下:
S-F-W-G-H-O 组合
select –>where –> group by–> having–>order by
当一个语句中同时含有where、group by 、having及聚集函数时,执行顺序如下:
1)执行where子句查找符合条件的数据;
2)使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;
3)最后用having 子句去掉不符合条件的组。
所以having的使用需要注意以下几点:
having只能用于group by(分组统计语句中)
where 是用于在初始表中筛选查询,having用于在where和group by 结果分组中查询
having语句可以使用聚合函数
count(*):按行获取数量
sum():求和(这里要注意求和是忽略null值的,null与其他数值相加结果为null,所以可以通过ifnull(xxx,0)将null的值赋为0)
avg():求平均数
max():求最大值
min():求最小值,而where不使用。
having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。
MySQL 索引的最左原则
InnoDB 和 MyIsam 引擎的区别?
有哪些优化数据库性能的方法?
如何定位慢查询?
MySQL 支持行锁还是表锁?分别有哪些优缺点?