1

预期学习目标

  • 书:高性能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
后端相关技能(六):压力测试
后端相关技能(七):依赖包管理


半斤桃花
83 声望8 粉丝

学无止境