SQL语法
count主键和非主键的结果有什么不同?
count() 是一个聚合函数,函数的参数不仅可以是字段名,也可以是其他任意表达式,该函数作用是统计符合查询条件的记录中,函数指定的参数不为 NULL 的记录有多少个
1 | select count(name) from t_order; |
1 | select count(1) from t_order; |
- 主键是不能存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分组和聚集函数之后对分组之后的数据过滤
语法错误,因为WHERE是在分组和聚集函数之前进行过滤,WHERE执行的时候还没有分组函数
EXISTS和IN的区别是什么
1 | A是外表,B是内表 |
工作原理区别:
- 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 最小的二级索引进行扫描。只有当没有二级索引的时候,才会采用主键索引来进行统计
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 cloud_fly blog!