一select语句
1select语句的逻辑处理順序
from子句可以包含、视图、物化视图、分区或子分区、子查询
2处理联结语句按照下面的順序:
(1)交叉联结,也称为笛卡尔集
(2)内联结
(3)外联结
3标量子查询
标量子查询是指子查询返回的是单一值的标量,如一个数字或一个字符串,也是子查询中最简单的返回形式。
SELECT * FROM article WHERE uid = (SELECT uid FROM user WHERE status=1 ORDER BY uid DESC LIMIT 1)
注:标量查询在结果集中的每一行结果产生时都要执行一遍(如果结果集有几千行或上百万行数据效率很低)
4group by 注:select 列表中的任何非聚合字段都必须包括在group by表达式中。
group by子句中还可以包含两个附加的运算:ROLLUP和CUBE
比如按列customer_id分组,就意味着每一个唯一的customer_id只会返回一行值
注:group by子句并不确定结果数据的排序,要排序需加order by
5having 子句
将分组汇总后的查询结果限定为只有该子句中的条件为真的数据行。
6order by
排序是查询中排序相当大的处理步骤,尤其是当返回结果集很大的时候。需要排序的数据量会影响优化器决策,较小的排序可以在内存中实现,较大的排序要使用临时的磁盘空间完成,内存比磁盘空间排序要快。
排序数据量(结果集所包含的总字节数)估算:行数乘以每一行的字节数,每行所包含的字节数由每一列的平均长度相加确定。
二insert语句
1单表插入
要插入的数据可以显示列出,或通过子查询,子查询可返回一行或多行数据。
insert into table_a (列名1,列名2,...) values (值1,值2,...);
insert into table_a (列名1,列名2,...) select 值1,值2 from table_b;
2多表插入insert all
把同一批数据插入到不同的表中。
例:把表t中的数据分别插入到t1,t2
insert into t1(id,name) select * from t;
insert into t2(id,name) select * from t;
commit;
在两次insert过程中,有可能t表的数据发生了变化,从而导致t1,t2表得到的数据不一样。
insert all
into t1(id,name)
into t2(id,name)
select * from t;
commit;
详解:
(1)无条件插入 不带when
(2)有条件插入
insert all(当使用all关键字时,语句就会执行无条件的多表插入。每个when子句按照子查询所返回的每一行来确定值而不管前一个条件的输出结果是什么,例如在下面的例子中,如果使用when sum_orders<100000这个条件而不是列出范围,插入small_customers表中的行也会插入medium_customers表中)
insert first(只判断第一when)
三update语句
用法:
例2通过子查询更新一个单列的值
例4
例5
四delete
用法:
例2
例3
五merge
把多个insert,update,delete结合成一个。
语法:
merge<hint>
into<目标表>
using<源表>
on (<condition>)
when matched then <update_clause>
delete<where_clause>
when not matched then <insert_clause>
[LOG ERRORS <log_errors_clause><reject limit<integer|unlimited>];
例:
小结:
标量语句子查询和order by排序使用需要注意效率问题。