Mysql常见的你却不知道的⑩个问题

1> IFNULL语法

IFNULL只针对查询出来的结果集进行处理, 并不会改变本身的数据

eg:

  • SELECT departmentid FROM employees WHERE IFNULL(departmentid,1); //结果无改变

  • SELECT IFNULL(departmentid,0) FROM employees; //departmentid为null则显示的值为0


2> COUNT(expr)函数

COUNT(expr)函数只会对expr不为null的数据进行统计

eg:

  • SELECT department_id FROM employees; // 显示数据107条

  • SELECT COUNT(department_id) num FROM employees; //显示数据106条


3> ORDER BY语法

ORDER BY不仅能处理表的字段, 还能处理别名.

注意: ORDER BY 仅能处于SELECT语句的末尾

eg:

  • SELECT departmentid id FROM employees ORDER BY departmentid;

  • SELECT department_id id FROM employees ORDER BY id;


4> 分组函数的处理数据类型

可以对数值型数据使用AVG 和 SUM 函数;

可以对任意数据类型的数据使用 MIN 和 MAX 函数;

COUNT(*) 返回表中记录总数适用于任意数据类型。

  • max 最大值
  • min 最小值
  • sum 和
  • avg 平均值
  • count 计算个数

特点

  • ①语法

  • select max(字段) from 表名;

  • ②支持的类型 sum和avg一般用于处理数值型 max、min、count可以处理任何数据类型

  • ③以上分组函数都忽略null

  • ④都可以搭配distinct使用,实现去重的统计 select sum(distinct 字段) from 表;

  • ⑤count函数 count(字段):统计该字段非空值的个数 count(*):统计结果集的行数

  • ⑥ 和分组函数一同查询的字段,要求是group by后出现的字段


5>非法使用聚合函数

不能在 WHERE 子句中使用聚合函数。

可以在 HAVING 子句中使用聚合函数。

eg:

  • SELECT departmentid, AVG(salary) FROM employees WHERE AVG(salary) > 80 GROUP BY departmentid; //错误写法

  • SELECT departmentid, AVG(salary) FROM employees GROUP BY departmentid HAVING AVG(salary) > 80; //正确写法 

原因:

sql语句的执行顺序为

 from子句 --> where 子句 --> group by 子句 --> having 子句 --> order by 子句 --> select 子句

因为聚合函数是对查询出来的结果集运算的,当在where子句使用聚合函数时,此时根据group by 分割结果集的子句还没有执行,此时只有from 后的结果集。

所以无法在where子句中使用聚合函数。


6> SUM()和AVG()执行时是否计算null值呢?

答案是: 不计算。分组函数基本上都是不计算null值的, 我们知道求平均数是先求出所有数字的和再除以数字的数量, 而MySQL的AVG()函数会自动过滤掉null。那么问题来了,假如我们想要那些为null的也计入有效结果怎么办呢?很简单!使用IFNULL函数!

eg:

  • SELECT avg(salary), SUM(IFNULL(salary,0))/COUNT(*) FROM employees;

结果:


7> Mysql有两种存储引擎MYISAM和INNODB, 它们之间谁效率更高呢?为什么?

1、MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合。同样因为MYISAM自带计数器, 在执行COUNT(*)时效率较高.

2、InnoDB:支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。

详细比较推荐这篇博客: https://blog.csdn.net/s78365126/article/details/84584066


8> Mysql如何实现级联删除?

一、删除单表的记录

语法:delete from 表名 【where 筛选条件】【limit 条目数】

二、级联删除

语法: delete 别名1,别名2 from 表1 别名 inner|left|right join 表2 别名 on 连接条件 【where 筛选条件】


9> truncate与delete的区别?

  1. truncate删除后,如果再插入,标识列从1开始 delete删除后,如果再插入,标识列从断点开始

  2. delete可以添加筛选条件 truncate不可以添加筛选条件

  3. truncate效率较高

  4. truncate没有返回值 delete可以返回受影响的行数

  5. truncate不可以回滚 delete可以回滚


10> Mysql有哪些整型? 它们之间有什么区别?

类型 tinyint smallint mediumint int/integer bigint
字节数 1 2 3 4 8

特点:

  • ①都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号
  • ②如果超出了范围,会报out or range异常,插入临界值
  • ③长度可以不指定,默认会有一个长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号整型

猜你喜欢

转载自blog.csdn.net/s78365126/article/details/84670624