1.表连接的ON语句
在表连接里,on条件后面要放两个表的连接条件,而不要放只和一个表有关的筛选条件,筛选条件放到where里。例如下面的on语句中的sd1.extra->'$.templateId != null 就不会发挥作用:
on sd1.type_id = @print_type_dict_id and sd1.extra->'$.templateId' is not null
and sd1.extra->'$.templateId' = sd2.id and sd1.delete_flag=0 and sd2.delete_flag=0正确用法:在on后面只需要保留 sd1.extra->'$.templateId' = sd2.id 就够了,其他条件全部转移到where后。
2.起别名后要使用别名
给表起了别名后要使用别名,还用表原来的名字会不起作用。
3.sql语句句末写分号;
不写分号会让前后两条sql语句连在一起导致报错!
4.Join 和 left join 的区别
用A join B on condition 举例 :
join是笛卡尔积,condition必须成立会有这条连表数据,condition不成立,就没有这条连表数据。
Left join则是,就算condition不成立,也会有一条“A+空B”的连表数据。
5.-> 和 ->>的区别
在 MySQL 中,-> 和 ->> 的用法也类似,但它们主要用于 JSON 类型的数据。
->操作符功能:用于从 JSON 文档中提取 JSON 值,返回值是 JSON 类型。
示例:
SELECT json_column->'$.key' FROM your_table;这里,结果将是一个 JSON 格式的值。
->>操作符功能:用于从 JSON 文档中提取文本(字符串)值。
示例:
SELECT json_column->>'$.key' FROM your_table;在这个例子中,结果将是一个字符串,而不是 JSON 格式的值。
6.使用了聚合函数但没有group by可能会导致只查出来一条数据
如果select后面使用了聚合函数,那么如果没有配套的group by可能会导致只查出来一条数据
7.sql对json数据转义
1. 写数据库插入就送数据,插入结果转义符号/
我有一个json对象,原来没有转义符号,使用JSON_ARRAY_APPEND 添加到一个json_array里面以后就出现了转移符号,这是为什么?
如果你在
JSON_ARRAY_APPEND中使用的 JSON 对象实际上是字符串形式(比如用单引号包裹的),MySQL 可能会将其视为普通字符串,而不是 JSON。
解决方案
确保 JSON 格式正确:
使用
JSON_OBJECT创建 JSON 对象,确保它的格式正确,而不是直接使用字符串。例如:
sql复制代码
UPDATE my_table
SET data = JSON_ARRAY_APPEND(data, '$', JSON_OBJECT('key1', 'value1', 'key2', 'value2'))
WHERE id = your_id;检查数据类型:
确保你要添加的 JSON 数据是
JSON类型,而不是VARCHAR或其他类型。你可以使用CAST来确保类型:
sql复制代码
UPDATE my_table
SET data = JSON_ARRAY_APPEND(data, '$', CAST('{"key1": "value1", "key2": "value2"}' AS JSON))
WHERE id = your_id;2. Navicat 查询json字符串的某个属性结果展示为空:
其实是查出来了,只是navicat的bug,他展示不出来
3.(sd.extra -> '$.gridCode') 取不出来里面的属性,结果为null
查询json字符串的某个属性,用(sd.extra -> '$.gridCode') 取不出来里面的属性,结果为null:
解决方法:
CONVERT((sd.extra -> '$.gridCode'), SIGNED)
4.->操作符获得的结果是没有解包的字符串
-> 操作符返回的是 JSON 类型的值,而不是普通的字符串。如果你希望获取可读的字符串结果,可以使用 ->> 操作符
5.使用->>解析json字符串中的某个属性,得到“null”
如果该属性为空,那么可能得到结果是字符串null,
可以使用以下sql直接获得null:
CASE
WHEN json_data->>'code' = 'null' THEN NULL
ELSE json_data->>'code'
END