预期学习目标
- 书:高性能Mysql
- 熟练sql语句
- Mysql调优
- 数据库的配置
- 主从数据库
- 项目实战分库分表
- 学习笔记
- 读写分离
设置
特殊配置
sql_mode常用值
ONLY_FULL_GROUP_BY # 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
NO_AUTO_VALUE_ON_ZERO # 该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
STRICT_TRANS_TABLES # 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
NO_ZERO_IN_DATE # 在严格模式下,不允许日期和月份为零
NO_ZERO_DATE # 设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。
ERROR_FOR_DIVISION_BY_ZERO # 在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL
NO_AUTO_CREATE_USER # 禁止GRANT创建密码为空的用户
NO_ENGINE_SUBSTITUTION # 如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
PIPES_AS_CONCAT # 将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
ANSI_QUOTES # 启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
- 导入数据库时报出的 only_full_group_by 问题
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
查看 sql_mode
mysql> select @@global.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@global.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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
更改配置并重启服务
[root@centos7 etc]# vim my.cnf
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
[root@centos7 etc]# systemctl restart mysqld
- 导入数据时间为 0000-00-00 00:00:00 的问题
[Err] 1067 - Invalid default value for 'datetime'
同上
[root@centos7 etc]# vim my.cnf
sql_mode = ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
[root@centos7 etc]# systemctl restart mysqld
语法
基本语法
concatenate : vt. 把 (一系列事件、事情等)联系起来
adj. 连接的;联系在一起的
- 字段拼接
CONCAT(str1,str2...)
# 20180101
- 分隔符拼接
CONCAT_WS(separator,str1,str2,...)
2018-01-01
- 将分组拼接成字符串
GROUP_CONCAT(expr1,expr2)
# 2018-01,2019-01,2020-01
- 查询结果合并
要注意的是 UNION
的两个结果的列数要相同
SELECT
COLUMN
FROM
TABLE_1
WHERE
ISNULL('name')
UNION
ALL SELECT
COLUMN
FROM
TABLE_2
WHERE
'name' IS NOT NULL
查询命令
- 空值查询
#非空
SELECT
*
FROM
Table
WHERE
field IS NOT NULL;
#空
SELECT
*
FROM
Table
WHERE
field IS NULL;
- 多表查询
交叉连接得到的是表内元素的 笛卡儿积
,应避免使用这种查询方式
# 交叉连接
select * frome tableA cross join tableB
# 交叉连接
select * frome tableA , tableB
- 正则表达式
与like
类似,但是限制条件是满足正则表达式即可,RLIKE
是REGEXP
的同意关键字
SELECT * FROM data WHERE `id` REGEXP '[0-9]+';
SELECT * FROM data WHERE `id` RLIKE '[0-9]+';
- 处理IP
# 把ip转为无符号整型(4-8位)
inet_aton
# 把整型的ip转为ip地址
inet_ntoa
- 判断条件
# 类似三元运算符 第一个为真时返回第二个表达式的值 否则返回第三个表达式的值
IF(expr1, expr2, expr3)
# 匹配选择
SELECT CASE flag WHEN 1 THEN 'man'
WHEN 0 THEN 'woman'
WHEN -1 THEN 'bisexual'
ELSE 'unknown'
END
as gender
# 空判断(空返回第一个表达式 否则返回第二个表达式)
IFNULL(expr1, expr2)
方法
防止注入
# 低版本的 PHP 使用 mysql_query() 时可以使用以下函数进行转义,防止注入
mysql_real_escape_string()
相关文章
后端相关技能(一):数据库
后端相关技能(二):Vue框架
后端相关技能(三):正则表达式
后端相关技能(四):计算机网络
后端相关技能(五):Node.js
后端相关技能(六):压力测试
后端相关技能(七):依赖包管理