後端相關技能(一):數據庫

預期學習目標html

  • 書:高性能Mysql
  • 熟練sql語句
  • Mysql調優
  • 數據庫的配置
  • 主從數據庫
  • 項目實戰分庫分表
  • 學習筆記
  • 讀寫分離

設置

特殊配置

sql_mode經常使用值mysql

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)

更改配置並重啓服務sql

[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 的兩個結果的列數要相同vim

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;

交叉鏈接獲得的是表內元素的 笛卡兒積,應避免使用這種查詢方式segmentfault

# 交叉鏈接
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
後端相關技能(六):壓力測試
後端相關技能(七):依賴包管理centos

相關文章
相關標籤/搜索