优化器
-
MySQL8.0之后对Json进行比较时将不会进行隐式转换
mysql> CREATE TABLE test (id INT, col JSON); mysql> INSERT INTO test VALUES (1, '{"val":true}'), (2, '{"val":false}'); mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE; +------+----------------+--------------+ | id | col | col->"$.val" | +------+----------------+--------------+ | 1 | {"val": true} | true | | 2 | {"val": false} | false | +------+----------------+--------------+
在之前只可能查出来第一行
如果想要达到以前的效果就需要显示转换,这个是我们后面使用Json会碰到的一个坑
mysql> SELECT id, col, col->"$.val" FROM test -> WHERE JSON_VALUE(col, "$.val" RETURNING UNSIGNED) IS TRUE; +------+---------------+--------------+ | id | col | col->"$.val" | +------+---------------+--------------+ | 1 | {"val": true} | true | +------+---------------+--------------+
-
NOT IN和NOT EXISTS将会使用反链接(反连接就是连接上了表中没有与这行满足连接条件的所有行),会提高NOT IN和NOT EXISTS的查询速度
-
DELETE和UPDATE可以有这种格式了:
UPDATE t1 SET t1.a=value WHERE t1.a IN (SELECT t2.a FROM t2) ELETE FROM t1 WHERE t1.a IN (SELECT t2.a FROM t2)
使用这种语法需要满足条件:
- 具有[NOT] IN或者[NOT] EXISTS的子查询
- 没有order by, limit
-
多表update支持"半一致"读操作,隔离级别低于REPEATABLE_READ
-
支持递归公共表达式,这个后面读到相关章节可以研究一下
-
窗口函数(像Excel一样)
-
横向派生表,简单来说就是from (子查询) a, b
b可以直接和a进行关联
SELECT salesperson.name, max_sale.amount, max_sale.customer_name FROM salesperson, -- find maximum size and customer at same time LATERAL (SELECT amount, customer_name FROM all_sales WHERE all_sales.salesperson_id = salesperson.id ORDER BY amount DESC LIMIT 1) AS max_sale;
这个功能感觉还是挺强大的
网友评论