MySQL常用及复杂sql

本文主要是总结一下我遇到过的常用的和复杂的sql语句

查询

  • 进行模糊查询的时候有三种方式
# 模糊查询name为'cs'的
    name like '%cs%' 全匹配
    
# 模糊查询name开头为'cs'的
    like '%cs' 左匹配
    
# 模糊查询name结尾为'cs'的
    like 'cs%' 右匹配

修改

  • 现在有两张表A和B,通过 A.uuid = B.aUuid关联,现在想要把b里的name字段赋值到A的name字段里,可以这样写
    update A a 
    left join B b on a.uuid = b.aUuid
    set a.name = b.name

Json 相关

  • 首先创建一个简单的
    CREATE TABLE `json_test` (
      `uuid` varchar(32) NOT NULL,
      `json1` text,
      `json2` text,
      `json3` text,
      PRIMARY KEY (`uuid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • json1:{“id”:“123”,“name”:“cs”}
# 读取Json里的某一个值,读取name如下

    select JSON_EXTRACT( json1, '$.name' ) as name from json_test;

-- 结果如下
    "cs"
  • json2:{“student”:{“id”:“123”,“name”:“cs”}}
# 读取Json中对象的某一个值,读取student的name如下

    select JSON_EXTRACT( json2, '$.student.name' ) as name from json_test;

-- 结果如下
    "cs"
  • json3:{“students”:[{“id”:“1”,“name”:“cs1”},{“id”:“2”,“name”:“cs2”}]}
# 读取Json中数组对象的值,并转换为行数据,读取students的name如下

    select JSON_EXTRACT( JSON_EXTRACT( json3, '$.students[*].name' ), CONCAT( '$[', idx, ']' )) as name
    from json_test
    # 注意这里连接的内部表最多可以读取32个
    JOIN (
	SELECT
		0 AS idx UNION
	SELECT
		1 AS idx
	) AS indexes
	# 不想读取出null值时就在where里做判断,不能写name is not null ,name值读取不到
	where JSON_EXTRACT( JSON_EXTRACT( json3, '$.students[*].name' ), CONCAT( '$[', idx, ']' )) is not null;
	
# 上述Json读取多个字段的时候只要连接一次内部表就行了
    select JSON_EXTRACT( JSON_EXTRACT( json3, '$.students[*].id' ), CONCAT( '$[', idx, ']' )) as id,
    JSON_EXTRACT( JSON_EXTRACT( json3, '$.students[*].name' ), CONCAT( '$[', idx, ']' )) as name
    from json_test
    JOIN (
	SELECT
		0 AS idx UNION
	SELECT
		1 AS idx
	) AS indexes;
	
-- 结果1如下
    "cs1"
    "cs2"
-- 结果2如下
    "1"|"cs1"
    "2"|"cs2"
  • 去除双引号
    #读取Json后会带有双引号可以使用下面两种函数去除双引号
    
    #1.替换字符
    REPLACEALL(str,'"','')
    
    #2.JSON_UNQUOTE():将原json的引号去掉,返回字符串,如果参数为null,则返回NULL。
    JSON_UNQUOTE((JSON_EXTRACT(json1, '$.name'))

  • 拼接Json(最好不要碰到这种情况)
#其实就是进行字符串的拼接,就是写起来很麻烦

    CONCAT(
        '{',
        CONCAT_WS(',',
            CONCAT('"','code', '":"', p.`code`, '"'),
            CONCAT('"','productName', '":"', p.name, '"')
            '}'
    )
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
转换 SQL Server 到 MySQL 的 DDL 语言可以使用一些工具,如 MySQL Workbench、SQL Server Migration Assistant 等。以下是一个使用 Java 编写的脚本,可以将 SQL Server 的 DDL 转换为 MySQL 的 DDL。 ``` import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class SQLServerToMySQLDDLConverter { public static void main(String[] args) { if (args.length != 2) { System.out.println("Usage: SQLServerToMySQLDDLConverter <inputfile> <outputfile>"); return; } String inputFile = args[0]; String outputFile = args[1]; String ddl = convertDDL(inputFile); writeFile(outputFile, ddl); } private static String convertDDL(String inputFile) { StringBuilder sb = new StringBuilder(); try (BufferedReader br = new BufferedReader(new FileReader(inputFile))) { String line; while ((line = br.readLine()) != null) { if (!line.trim().startsWith("CREATE TABLE")) { continue; } line = line.replaceAll("IDENTITY\\(\\d+\\)", "AUTO_INCREMENT"); line = line.replaceAll("\\[", "`"); line = line.replaceAll("\\]", "`"); sb.append(line).append("\n"); while ((line = br.readLine()) != null && !line.trim().startsWith(")")) { line = line.replaceAll("IDENTITY\\(\\d+\\)", "AUTO_INCREMENT"); line = line.replaceAll("\\[", "`"); line = line.replaceAll("\\]", "`"); sb.append(line).append("\n"); } sb.append(line).append("\n"); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } private static void writeFile(String outputFile, String ddl) { try { File file = new File(outputFile); if (!file.exists()) { file.createNewFile(); } FileWriter fw = new FileWriter(file); fw.write(ddl); fw.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 这个脚本假定输入文件是 SQL Server 的 DDL,输出文件是 MySQL 的 DDL。它将 `CREATE TABLE` 替换为 MySQL 的语法,将方括号替换为反引号,并将 `IDENTITY` 关键字替换为 MySQL 的 `AUTO_INCREMENT` 关键字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值