count主键和非主键的结果有什么不同?

count() 是一个聚合函数,函数的参数不仅可以是字段名,也可以是其他任意表达式,该函数作用是统计符合查询条件的记录中,函数指定的参数不为 NULL 的记录有多少个

1
2
3
select count(name) from t_order;

统计t_order表中,name不为null的字段有多少个
1
2
3
select count(1) from t_order;
统计t_order 表中,1 这个表达式不为 NULL 的记录有多少个
t_order 表中,1 这个表达式不为 NULL 的记录
  • 主键是不能存NULL值,因此会统计表中所有行数据的数量
  • 非主键可以存NULL值,因此会统计表中这个列的非NULL值得数量

MySQL内连接,外连接有什么区别

内连接(INNER JOIN)和外连接(LEFT JOIN和RIGHT JOIN)都是连表查询

内连接是返回两个表的匹配行,外连接可以返回匹配和不匹配的行,外连接主要分为左连接和右连接:

  • 左连接:返回左表中的所有行和右表中的匹配行,如果右表没有,用NULL值替代
  • 右连接:返回右表中的所有行和左表中的匹配行,如果左表没有,用NULL值替代

ON和WHERE过滤条件的区别

  • 对于内连接查询,WHERE和ON过滤条件等效
  • 对于外连接查询,ON中的过滤条件在执行时进行,WHERE中的过滤条件在连接操作后进行。用ON如果匹配不上会用NULL填充

WHERE和HAVING的区别

  • WHERE是在GROUP BY分组和聚集函数之前对数据行进行过滤
  • HAVING是在GROUP BY分组和聚集函数之后对分组之后的数据过滤

img

语法错误,因为WHERE是在分组和聚集函数之前进行过滤,WHERE执行的时候还没有分组函数

EXISTS和IN的区别是什么

1
2
3
4
5
A是外表,B是内表

seletct * from A where id in (selectt id from B)

select * from A where exists (select 1 from B where A.id = B.id)

工作原理区别:

  • in先遍历内表,会把查询到的数据缓存在内存中,然后遍历内表的数据再去查询外表
  • exists先遍历外表将数据缓存到内存中,然后遍历外表的数据再去查询内表

性能区别:

  • 如果两个表的记录大小相当,in和exists区别不大
  • 如果两个表,其中一个是大表,另外一个是小表,IN适合外表大内表小的情况,EXISTS适合外表小内表大的情况,遵循小表驱动大表
  • 假设B有10000条记录,A有100条,如果用IN, 那么与数据库交互的次数是10000 * log100次(log是因为在数据库中根据连接条件走的是B+树索引),而用EXISTS交互次数是100 * log10000次.差异体现在和数据库交互的次数

MySQL的约束有哪些

数据库有六大约束:

  • 主键约束:作用标识唯一一条记录,不能为NULL,也不能重复,一般设置id为主键
  • 外键约束:确保表之间记录的完整性
  • 唯一性约束:保证字段在表中的记录是唯一的,如果插入重复的字段,会出现唯一性约束错误
  • 非空约束:不允许字段为空
  • 默认约束:给字段设置默认值,如果插入字段时没有设置初值则有默认值
  • 检查约束:用于检查字段的取值是不是在取值范围内

但是MySQL只支持前5种

union和union all的区别

  • union在结果集合并后去重
  • union all在结果集合并后不去重

count(*)比coun(1)性能好吗

  • 不会, 因为MySQL会将*当作0来处理,所以二者性能一样
  • 除此之外,在性能上:count(*)= count(1)> count(主键)> count(子段)
  • MySQL 会对 count(*) 和 count(1) 有个优化,如果有多个二级索引的时候,优化器会使用key_len 最小的二级索引进行扫描。只有当没有二级索引的时候,才会采用主键索引来进行统计