15.3.1 INSERT
INSERT是将数据插入到数据库对象中的指令。
常用语法
INSERT [INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr },...),(...),...
[ ON DUPLICATE KEY UPDATE col_name=expr
[, col_name=expr] ... ] ORINSERT [INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... ]
语法限制
● 不支持INSERT DELAYED...;
● 不支持不包含拆分字段的INSERT;
● 暂不支持PARTITION 语法,建议不要使用partition表;
● INSERT操作不支持“datetime”字段取值1582年及之前年份;
● INSERT操作不支持插入拆分键值为DEFAULT关键字;
● 拆分表执行INSERT操作时如果指定了自增值,只影响该插入数据的自增值。后续 数据插入时如果不指定自增值,仍以原自增值为基础进行自增;
15.3.2 REPLACE
REPLACE用于往表中插入行或替换表中的行。
常用语法
replace into table(col1,col2,col3) values(value1,value2,value3)
语法限制
● 暂不支持PARTITION 语法;
● 当自增表格ID不存在时,使用REPLACE将会插入一条指定ID的数据,但不会自动 生成ID。
15.3.3 DELETE
DELETE指令为用于删除表中符合条件的行。
常用语法
DELETE [IGNORE]
FROM tbl_name [WHERE where_condition]
语法限制
● WHERE 条件中不支持子查询(相关子查询和非相关子查询);
● 不支持在多表删除中删除广播表中的数据(目标表列表中不可包含广播表)。
15.3.4 UPDATE
常用语法
UPDATE table_reference
SET col_name1={expr1} [, col_name2={expr2}] ...
[WHERE where_condition]
语法限制
● 不支持使用子查询(相关子查询和非相关子查询);
● UPDATE语句中的where_condition不支持计算表达式及其子查询;
● 不支持在多表更新中修改广播表(广播表中的列不可出现在 SET 中赋值语句的左 侧);
● 不支持更新逻辑表的拆分键字段,更新拆分键字段可能导致数据重新分布,DDM 暂不支持;
● UPDATE操作不支持“datetime”字段取值1582年及之前年份;
● UPDATE操作不支持更新拆分键值为DEFAULT关键字;
● UPDATE不支持在一个语句中对同一字段重复更新;
● UPDATE不支持关联更新拆分键;
● UPDATE不支持自关联更新;
● 关联更新中,不支持在目标列的赋值语句或表达式中引用其它目标列,将造成更 新结果不符合预期。例如:
update tbl_1 a,tbl_2 b set
a.name=concat(b.name,'aaaa'),b.name=concat(a.name,'bbbb') on a.id=b.id。
● 关联更新不支持不带关联条件的Join;
15.3.5 SELECT
SELECT通常用于查询一个或多个表中的数据。
常用语法
SELECT
[ALL | DISTINCT | DISTINCTROW ] select_expr
[, select_expr ...]
[FROM table_references [WHERE where_condition]
[GROUP BY {col_name | expr | position} [ASC | DESC], ...]
[HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
表15-24 说明信息
语法 说明
select_expr 每个select_expr都指示一个您想要查询的列。
FROM table_references 指您将从哪个或哪些表中查询。
WHERE 关键词WHERE其后跟一个表达式,用于表示被选择的 行所须满足的条件。
GROUP BY 语法中被使用的子句将按一定的顺序排列,GROUP BY 表示语句间关系,支持列名。如一个HAVING子句必须 位于GROUP BY子句之后,并在ORDER BY子句之前。
ORDER BY 语法顺序排列的一种方式,表示语句间关系,支持列 名和指定的排序方式(如ASC、 DESC)。
LIMIT/OFFSET 对输出结果集的偏移量及大小给予约束,如:LIMIT接 受一个或者两个数字参数。
语法说明
● 暂不支持以空字符串作为别名;
● 不支持select ... group by ... with rollup;
● 暂不支持 STRAIGHT_JOIN 和 NATURAL JOIN;
● select for update 仅支持简单查询,不支持 join、group by、order by、limit;
● 对于 UNION 中的每个 SELECT, DDM 暂不支持使用多个同名的列,如下:
# 如下 SQL 的 SELECT 中存在重复的列名,暂不支持SELECT id, id, name FROM t1 UNION SELECT pk, pk, name FROM t2。
15.3.6 SELECT JOIN Syntax
常用语法
table_references:
table_reference [, table_reference] ...
table_reference:
table_factor | join_table
table_factor:
tbl_name [[AS] alias]
| table_subquery [AS] alias
| ( table_references )
join_table:
table_reference [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
| table_reference [{LEFT|RIGHT} [OUTER]] JOIN table_factor
join_condition:
ON conditional_expr
| USING (column_list)
语法限制
不支持SELECT STRAIGHT_JOIN 和 NATURAL JOIN。
示例
select id,name from test1 where id=1;
select distinct id,name from test1 where id>=1;
select id,name from test1 order by id limit 2 offset 2;
select id,name from test1 order by id limit 2,2;
select 1+1,'test',id,id*1.1,now() from test1 limit 3;
select current_date,current_timestamp;
select abs(sum(id)) from test1;
15.3.7 SELECT UNION Syntax
常用语法
SELECT ...UNION [ALL | DISTINCT]
SELECT ...[UNION [ALL | DISTINCT] SELECT ...]
示例
select userid from user union select orderid from ordertbl order by userid;
select userid from user union (select orderid from ordertbl group by orderid) order by userid;
语法限制
对于UNION中的每个SELECT,不支持使用多个同名的列。
15.3.8 SELECT Subquery Syntax
The Subquery as Scalar Operand
示例
SELECT (SELECT id FROM test1 where id=1);
SELECT (SELECT id FROM test2 where id=1)FROM test1;
SELECT UPPER((SELECT name FROM test1 limit 1)) FROM test2;
Comparisons Using Subqueries
语法
non_subquery_operand comparison_operator (subquery) comparison_operator := > < >= <= <> != <=> like
示例
select name from test1 where id > (select id from test2 where id=1);
select name from test1 where id = (select id from test2 where id=1);
select id from test1 where name like (select name from test2 where id=1);
Subqueries with ANY, IN, NOT IN, SOME,ALL,Exists,NOT Exists
语法
operand comparison_operator SOME (subquery) operand comparison_operator ALL (subquery) operand comparison_operator ANY (subquery) operand IN (subquery)
operand not IN (subquery) operand exists (subquery) operand not exists (subquery)
示例
select id from test1 where id > any (select id from test2);
select id from test1 where id > some (select id from test2);
select id from test1 where id > all (select id from test2);
select id from test1 where id in (select id from test2);
select id from test1 where id not in (select id from test2);
select id from test1 where exists (select id from test2 where id=1);
select id from test1 where not exists (select id from test2 where id=1);
Derived Tables (Subqueries in the FROM Clause)
语法
SELECT ... FROM (subquery) [AS] tbl_name ...
示例
select id from (select id,name from test2 where id>1) a order by a.id;
语法限制
● Derived Tables 必须拥有一个别名。
● Derived Tables 不可以成为 Correlated Subqueries,即不能包含子查询外部表的 引用。
● 标量子查询在一些场景下当前不能得到正确结果,建议改写为join,同时可提高性 能。
● 不支持 HAVING 子句中的子查询,JOIN ON 条件中的子查询。
● 不支持Row Subqueries。
15.3.9 不支持的 DML 语法列举
不支持的 DML 语法
表15-25 DML 的语法限制 DML语法 限制条件
DELETE语句 不支持PARTITION子句。
UPDATE语句 ● 不支持跨分片子查询。
● 不支持拆分键的更新。
SELECT语句 不支持类似ORDER BY FIELD(id,1,2,3)这种自定义排序。
系统库查询 支持以下系统库查询:
SELECT version()
● information_schema.SCHEMA_PRIVILEGES
● information_schema.TABLE_PRIVILEGES
● information_schema.USER_PRIVILEGES
● information_schema.SCHEMATA
● information_schema.tables
● information_schema.columns
SHOW KEYS FROM `table ` FROM `database 说明
● 仅支持=、in、like三种操作符,和and条件关联。
● 不支持子查询、关联查询、排序、聚合查询、LIMIT等等复杂查询。
● information_schema.tables和information_schema.columns支持<>操作 符。