mysql细节
Posted root_zhb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql细节相关的知识,希望对你有一定的参考价值。
mysql细节
case when then 用法 和null 的判断
SELECT id ,(CASE WHEN sex= '' THEN 'bbbbb'
WHEN sex IS NULL THEN 'aaaaa'
ELSE sex END ) AS sex FROM aa;
case when 判断条件最好连用,避免出现不必要的问题(例如 case xx when is null 无法使用 )
Sql子查询Not In 无结果
select * from ITEM where item_id not in (select parent_item_id from ITEM )
查询效果无任何匹配值
原因:not in 解析后的执行语句是(id!=1 and id!=2 and id!=null)
空值存在将会导致条件整体失败,所以无任何匹配数值。
解决:排除空值
select * from ITEM where item_id not in (select parent_item_id from ITEM where parent_item_id is not null)
not in 是and条件,不能有null值。
MySQL实现差集(Minus)和交集(Intersect)
https://www.linuxidc.com/Linux/2014-06/103551.htm
尽量用子查询,and 实现交集,not in 实现差集
TRUNCATE()函数
- TRUNCATE(X,D) 是MySQL自带的一个系统函数。
- 其中,X是数值,D是保留小数的位数。
- 其作用就是按照小数位数,进行数值截取(此处的截取是按保留位数直接进行截取,没有四舍五入)。
规则:
- 当 D 大于0,是对数值 X 的小数位数进行操作;
- 当 D 等于0,是将数值 X 的小数部分去除,只保留整数部分;
- 当 D 小于0,是将数值 X 的小数部分去除,并将整数部分按照 D 指定位数,用 0 替换。
SELECT TRUNCATE(123.4567, 2); # 123.45
SELECT TRUNCATE(123.4567, 0); # 123
SELECT TRUNCATE(123.4567, -2); # 100
SELECT TRUNCATE(123.4567, -3); # 0
and 和 or 同时使用
and的优先级是高于or的, 且是右先运算, 以where a=0 or b=0 and c=0为例,
先运行 b=0 and c=0 条件, 取出结果,
然后运行a=0条件, 取出结果, 并合并结果.
!!!删除注意
删除之前使用对应的select语句,查看是否是需要更新的数据。
数据更新
有专门的表
(自增主键 创建人 创建时间 更新人,更新时间)
复杂查询思路
遇到查询多列的复杂sql,看是否可以拆解,比如分为几部分,然后组合
count(1)、count(*)和count(字段名)
count(1)和count(*):都为统计所有记录数,包括null
count(字段):统计字段列的行数,不包括null
- 列名为主键,count(列名)会比count(1)快
- 列名不为主键,count(1)会比count(列名)快
- 如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
- 如果有主键,则 select count(主键)的执行效率是最优的
如果表只有一个字段,则 select count(*)最优。
MySQL的几种join方法
以上是关于mysql细节的主要内容,如果未能解决你的问题,请参考以下文章
连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段