往期精选
一文彻底搞懂cookie、session、token,和面试官扯皮就没问题了
Java面试高级篇—JavaIO流原理以及Buffered高效原理详解16期
高效开发:IntelliJ IDEA天天用,这些Debug技巧你都知道?
SELECT
子句中写下面 3 种内容:通过GROUP BY子句指定的聚合键、聚合函数(SUM 、AVG 等)、常量。我们来看个例子。
MySQL
服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于sql_mode
系统变量的值。DBA
可以设置全局SQL模式以匹配站点服务器操作要求,并且每个应用程序可以将其会话SQL模式设置为其自己的要求。MySQL
支持的SQL语法以及它执行的 数据验证检查,这使得在不同环境中使用MySQL
以及将MySQL
与其他数据库服务器一起使用变得更加容易。ServerSQLModes
。MySQL
版本不同,内容会略有不同(包括默认值),查阅的时候注意与自身的 MySQL
版本保持一致。SQL 模式主要分两类:语法支持类和数据检查类,常用的如下
语法支持类
GROUP BY
聚合操作,如果在 SELECT
中的列、HAVING
或者ORDER BY
子句的列,没有在GROUP BY
中出现,那么这个SQL是不合法的。ANSI_QUOTES
后,不能用双引号来引用字符串,因为它被解释为识别符,作用与 ` 一样。设置它以后,update t set f1="" …,会报Unknown column ‘’ in field list 这样的语法错误。Oracle
数据库是一样的,也和字符串的拼接函数CONCAT()
相类似。SHOW CREATE TABLE
时不会输出MySQL
特有的语法部分,如ENGINE
,这个在使用mysqldump
跨DB种类迁移的时候需要考虑。字面意思不自动创建用户。在给MySQL用户授权时,我们习惯使用GRANT … ON … TO dbuser
顺道一起创建用户。设置该选项后就与oracle操作类似,授权之前必须先建立用户。
数据检查类
NO_ZERO_DATE
自然满足。但如果是INSERT IGNORE
或UPDATE IGNORE
,’0000-00-00’依然允许且只显示warning
;NO_ZERO_DATE
,效果与上面一样,’0000-00-00’ 允许但显示warning;如果没有设置NO_ZERO_DATE
,no warning
,当做完全合法的值;NO_ZERO_IN_DATE
情况与上面类似,不同的是控制日期和天,是否可为 0 ,即 2010-01-00 是否合法;ALTER TABLE
或CREATE TABLE
指定ENGINE
时, 需要的存储引擎被禁用或未编译,该如何处理。启用NO_ENGINE_SUBSTITUTION
时,那么直接抛出错误;不设置此值时,CREATE用默认的存储引擎替代,ATLER不进行更改,并抛出一个warningSTRICT_TRANS_TABLES
不是几种策略的组合,单独指 INSERT
、UPDATE
出现少值或无效值该如何处理:Out Of Range
,变成插入最大边界值;3、当要插入的新行中,不包含其定义中没有显式DEFAULT子句的非NULL列的值时,该列缺少值;
默认模式
– 查看 MySQL 版本
SELECT VERSION();
– 查看 sql_mode
SELECT @@sql_mode;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
-- 宽松模式下 可以执行
SELECT cno,cname,count(sno),MAX(sno)
FROM tbl_student_class
GROUP BY cno;
cno
与cname
唯一对应的,如果cno
与cname
不是唯一对应,那么在“宽松模式下”cname
的值是随机的,这就会造成难以排查的问题,有兴趣的可以去试试。那为什么会有 ONLY_FULL_GROUP_BY 模式呢 ?我们继续往下看order
)是用来区分集合或谓词的阶数的概念。谓词逻辑中,根据输入值的阶数对谓词进行分类。= 或者BETWEEEN
等输入值为一行的谓词叫作"一阶谓词",而像EXISTS
这样输入值为行的集合的谓词叫作"二阶谓词"(HAVING
的输入值也是集合,但它不是谓词)。tbl_student_class
中的 cname
存储的是每位学生的班级信息,但需要注意的是,这里的 cname
只是每个学生的属性,并不是小组的属性,而GROUP BY
又是聚合操作,操作的对象就是由多个学生组成的小组,因此,小组的属性只能是平均或者总和等统计性质的属性,如下图GROUP BY
的作用是将一个个元素划分成若干个子集,使用GROUP BY
聚合之后,SQL 的操作对象便由 0 阶的"行"变为了 1 阶的"行的集合”,此时,行的属性便不能使用了。a ≠ {a}
SQL
中的WHERE
子句和HAVING
子句的区别。WHERE
子句用于处理"行"这种 0 阶的对象,而HAVING
子句用来处理"集合"这种 1 阶的对象。EXISTS
),也包括集合论中的层级(GROUP BY
);《SQL基础教程》
《SQL进阶教程》
作者:青石路
www.cnblogs.com/youzhibing/p/11516154.html
加入专业技术讨论QQ群:248148860 ^^
往期精选
一文彻底搞懂cookie、session、token,和面试官扯皮就没问题了
Java面试高级篇—JavaIO流原理以及Buffered高效原理详解16期
高效开发:IntelliJ IDEA天天用,这些Debug技巧你都知道?