MySQL易忘常用的知识点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15096707/article/details/76061061

目录

前言

  这里介绍MySQL中不得不记却经常被我们遗忘的重要知识点。

WHERE

  • where条件中不能使用聚合函数,如:sum、max等,而针对分组而言,采用having设置分组条件,在having中可使用聚合函数。
  • 必须在GROUP BY 子句之前指定 WHERE 子句。(如果存在的话)

DISTINCT

  在MySQL中提供关键字distinct来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重复记录的所有值。其原因是除distinct目标字段外还查询其他字段,则distinct无法根据目标字段进行记录去重的操作。

GROUP BY

  • group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。
  • group by 一般和聚合函数一起使用才有意义,比如 count sum avg等,使用group by的两个要素:
    • select子句中查询的列名必须为分组列或列函数。列函数对于group by子句定义的每个组各返回一个结果。
    • 如果需要筛选结果,则可以先使用where 再用group by或者先用group by再用having。当然如果可以使用的话,具体场景具体分析。
  • 对于标准SQL而言,使用group by子句必须满足上述提到的第一个要素,即select子句中查询的列名必须为分组列或列函数。但是在MySQL中扩展了 GROUP BY 的功能:
    • 不加聚合函数的情况下,返回的结果是 GROUP BY 结果集中第一行;
    • select子句中选择的字段不必在 GROUP BY 中存在。
    • 但在版本5.7以上(包括5.7)的MySQL会标准一些,也就是上面的不标准使用不再被兼容。参考group by的常见错误-SQL-GROUP BY语句在MySQL中的一个错误使用被兼容的情况。在这种情况下,如果使用group by不遵循上述提到的两个要素,就将会发生错误。

SELECT语句完整的执行顺序

  1. from子句组装来自不同数据源的数据;
  2. where子句基于指定的条件对记录行进行筛选;
  3. group by子句将数据划分为多个分组;
  4. 使用聚集函数进行计算;
  5. 使用having子句筛选分组;
  6. 计算所有的表达式;
  7. 使用order by对结果集进行排序;
  8. select 集合输出。

NOT NULL、NULL和default默认值

  当前MySQL环境是5.6.7。
  字段设置为NOT NULL,当向该表插入一条记录,而记录没有包含该字段的数据时,并不会因为NOT NULL的字段而插入失败。针对字段类型,MySQL会自动插入值,如字符串类型的字段,此时会插入空字符串;int类型的字段会插入0;decimal 如 decimal(8,2) 的字段会插入 0.00,而 decimal(8,3) 的字段会插入 0.000。(这一点跟我以前认为的不太一样,可能是因为MySQL版本的问题。)当向该表插入一条记录时,NOT NULL的字段不能被插入 NULL 值。
  字段设置为NULL,当向该表插入一条记录,而记录没有包含该字段的数据时,该字段的值会被设置为NULL。
  字段设置为NOT NULL或NULL 并设置了default默认值,当向该表插入一条记录,而记录没有包含该字段的数据时,则该字段的值会被默认值。

MySQL中文字节问题

  MySQL 4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节) ;
  MySQL 5.0版本以上,varchar(50),指的是50字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个。

关于MYSQL Incorrect string value

参考

猜你喜欢

转载自blog.csdn.net/qq_15096707/article/details/76061061