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 类型的数据。

  1. -> 操作符

    1. 功能:用于从 JSON 文档中提取 JSON 值,返回值是 JSON 类型。

    2. 示例

    3. SELECT json_column->'$.key' FROM your_table;

    4. 这里,结果将是一个 JSON 格式的值。

  2. ->> 操作符

    1. 功能:用于从 JSON 文档中提取文本(字符串)值。

    2. 示例

    3. SELECT json_column->>'$.key' FROM your_table;

    4. 在这个例子中,结果将是一个字符串,而不是 JSON 格式的值。

6.使用了聚合函数但没有group by可能会导致只查出来一条数据

如果select后面使用了聚合函数,那么如果没有配套的group by可能会导致只查出来一条数据

7.sql对json数据转义

1. 写数据库插入就送数据,插入结果转义符号/

我有一个json对象,原来没有转义符号,使用JSON_ARRAY_APPEND 添加到一个json_array里面以后就出现了转移符号,这是为什么?

  • 如果你在 JSON_ARRAY_APPEND 中使用的 JSON 对象实际上是字符串形式(比如用单引号包裹的),MySQL 可能会将其视为普通字符串,而不是 JSON。

  解决方案

  1. 确保 JSON 格式正确

    1. 使用 JSON_OBJECT 创建 JSON 对象,确保它的格式正确,而不是直接使用字符串。例如:

sql复制代码
UPDATE my_table
SET data = JSON_ARRAY_APPEND(data, '$', JSON_OBJECT('key1', 'value1', 'key2', 'value2'))
WHERE id = your_id;
  1. 检查数据类型

    1. 确保你要添加的 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