SQL--查詢JSON、時間、字符串的高級用法
本文章總結SQL的JSON、時間格式、字符串判斷轉換的使用。核心點還是在於Json字段的提取(1.5)、時間的比較(2.2,2.3)以及字符串的查詢(3.1),其他都算是優化和補充點。
@
🔥1.SQL--JSON使用
解釋一下爲什麼SQL要用到JSON存儲和查詢,因爲很多時候前端展示內容或者後端存儲無用字段過多,所以沒必要後臺新建太多字段。並且爲了方便項目上線後快速排查問題反饋解決辦法給用戶,故而引入了JSON來存儲和查詢,實際開發中庫表字段設計成JSON的情況也比較多。
先給出基本建庫查詢操作
# SQL--建庫
CREATE TABLE t_base_info (
id BIGINT NOT NULL PRIMARY KEY auto_increment,
content json
);
# SQL--入庫
INSERT INTO t_base_info (content)
VALUES
(
'{
"author": "huyuqiao-A",
"blog": "https://www.cnblogs.com/meditation5201314/",
"content": [
{"name": "Empirefree-01",
"age": 18
},
{"name": "Empirefree-02",
"age": 19
},
{"name": "Empirefree-03",
"age": 19
}
]
}'
);
1.1.JSON_ARRAY--轉成數組
# SQL--查詢
# json--對象轉數組
select json_array(content) from t_base_info
1.2.JSON_OBJECT--轉成json對象
#json--對象轉json格式--自定義
select json_object('name', 'huyuqiao', 'age', '18', 'profession','Java開發工程師')
1.2.JSON_QUOTE--轉成json
#json--引用字符串作爲json值
select json_quote('"huyuqiao"')
1.3.JSON_MERGE--合併json
#json--合併字符串
select json_merge('{"blog": "www.baidu.com"}', '{"name":"huyuqiao"}')
1.4.JSON_VALID--判斷是否爲json
#json--判斷json格式是否有效--0 表示無效,1 表示有效,NUll 表示參數爲null
select json_valid("huyuqiao"), json_valid('"huyuqiao"'), json_valid(null)
1.5.JSON_EXTRACT--提取json(重點*)
#json--查詢json內容(重點)
SELECT
JSON_EXTRACT(content, '$.blog' ) AS '個人博客',
JSON_EXTRACT(content, '$.content' ) AS '個人信息'
FROM
t_base_info
1.6.JSON完整內容
官方文檔:https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html
官網上給的語句很多,我挑的是比較常用的幾個,主要還是JSON_EXTRACT
用的很常見
分類 | 函數 | 描述 |
---|---|---|
創建json | json_array | 創建json數組 |
json_object | 創建json對象 | |
json_quote | 將json轉成json字符串類型 | |
查詢json | json_contains | 判斷是否包含某個json值 |
json_contains_path | 判斷某個路徑下是否包json值 | |
json_extract | 提取json值 | |
column->path | json_extract的簡潔寫法,MySQL 5.7.9開始支持 | |
column->>path | json_unquote(column -> path)的簡潔寫法 | |
json_keys | 提取json中的鍵值爲json數組 | |
json_search | 按給定字符串關鍵字搜索json,返回匹配的路徑 | |
修改json | json_append | 廢棄,MySQL 5.7.9開始改名爲json_array_append |
json_array_append | 末尾添加數組元素,如果原有值是數值或json對象,則轉成數組後,再添加元素 | |
json_array_insert | 插入數組元素 | |
Json_insert | 插入值(插入新值,但不替換已經存在的舊值) | |
json_merge | 合併json數組或對象 | |
json_remove | 刪除json數據 | |
json_replace | 替換值(只替換已經存在的舊值) | |
json_set | 設置值(替換舊值,並插入不存在的新值) | |
json_unquote | 去除json字符串的引號,將值轉成string類型 | |
返回json屬性 | json_depth | 返回json文檔的最大深度 |
json_length | 返回json文檔的長度 | |
json_type | 返回json值得類型 | |
json_valid | 判斷是否爲合法json文檔 |
🔥2.SQL--時間計算比較
SQL裏面最常見的就是時間的查詢比較了,下面列出自己平時用的比較多的SQL時間比較
2.1.時間--添加、減少
#現在時間增加1分鐘
SELECT date_add(now(), interval 1 HOUR_MINUTE)
#現在時間減少1分鐘
SELECT date_sub(now(), interval 1 HOUR_MINUTE)
2.2時間格式轉換
#時間格式轉換--年月日 時分秒
select DATE_FORMAT(now(), '%Y-%m-%d')
select DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s')
2.3統計本年/本月/本週/本日(重點*)
SQL時間比較中最多的應該就是統計本年/本月/本週/本日的時間了
#統計本年/本月/本週/本日數據
#注:這裏統計本週的時候多個1是因爲美國時間和中國時間不是一樣的,需要進行校正,網上很多都沒有校正
SELECT
now( ),
to_days( now( ) ),
YEARWEEK( date_format( now( ), '%Y-%m-%d' ), 1 ),
YEAR ( now( ) )
WHERE
to_days( now( ) ) = to_days( now( ) )
OR YEARWEEK( date_format( now( ), '%Y-%m-%d' ), 1 ) = YEARWEEK( now( ), 1 )
OR DATE_FORMAT( now( ), '%Y%m' ) = DATE_FORMAT( CURDATE( ), '%Y%m' )
OR YEAR ( now( ) ) = YEAR ( now( ) )
2.4 時間格式總結
注意:SQL時間如下這種
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,MICROSECOND
而且類似這種interval '1 2 3 4'day_second
都是從右往左根據時間類型看,這種就是1天2小時3分鐘4秒,比如如下這種
#比當前時間減少了1天2小時3分鐘4秒
select now(), now() - interval '1 2 3 4' DAY_SECOND
#比當前時間減少了1分鐘
select now(), now() - interval '1' HOUR_MINUTE
下面是SQL中時間的所有格式
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
🔥3.SQL--字符串
3.1.Concat--模糊查詢
select now() where now() like CONCAT('%', 'huyuqiao ','%')
3.2.locate--查找字符串
#子串在字符串中第一次出現索引(從1開始數,沒找到則返回0)
select locate('qiao', 'huyuqiaoqiao')
3.3.If、Case、Round--優化顯示與字段計算
下面這些是用於優化查詢字段的,1可以改成table.column。
# 判斷字段: Round(number,保留幾位有效數字,默認四捨五入)
SELECT
IF
( 1 = 1, '是', '否' ) AS '狀態',
CASE
1
WHEN 1 THEN
'扣款'
WHEN 2 THEN
'獎勵'
WHEN 3 THEN
'投訴'
END 申請類型,
CONCAT( CASE 1 WHEN 1 THEN '-' WHEN 2 THEN '+' WHEN 3 THEN '-' END, ROUND( 200 / 100, 2 ) ) AS 金額
書山有路勤爲徑,學海無涯苦作舟。程序員不僅要懂代碼,更要懂生活,關注我,一起進步。