INSERT语句用法
INSERT INTO 语句后面可以跟一个SELECT语句
当INSERT INTO 语句后面可以跟一个SELECT语句时,会把SELECT语句的查询结果全部插入到表里。
例如,我们创建一个和表qw_zoetis_user结构完全一样的新表qw_zoetis_user2。
CREATE TABLE `qw_zoetis_user2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT '0' COMMENT '用户微信ID',
`donate_unit` int(11) DEFAULT '0' COMMENT '捐赠对象',
`total_price` decimal(8,2) DEFAULT '0.00' COMMENT '总捐赠金额',
`created_time` int(11) DEFAULT NULL COMMENT '创建时间',
`updated_time` int(11) DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_by_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后就可以用下面这条语句把表qw_zoetis_user的全部数据插入到表qw_zoetis_user2里。
// 清空qw_zoetis_user2里的现有数据
TRUNCATE qw_zoetis_user2;
INSERT INTO qw_zoetis_user2
SELECT * FROM qw_zoetis_user;
因为表qw_zoetis_user和qw_zoetis_user2的列数和顺序完全相同,所以我们不需要指定字段的列的排序,但当两个表的字段数不同或顺序不一致时和普通insert语句一样需要指定column的顺序。
INSERT INTO qw_zoetis_user2 (user_id, donate_unit, total_price, created_time, updated_time)
SELECT user_id, donate_unit, SUM(total_price), UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM qw_zoetis_donate
GROUP BY user_id
ORDER BY user_id ASC;
UPDATE语句
首先UPDATE语句的执行结果反馈信息里包含三个值:Rows matched,Changed和Warnings。其中Warnings表示有警告信息的列数,Rows matched和Changed的区别是Rows matched表示满足更新条件的记录数量,而Changed表示实际更新的记录数量。如下面这个语句执行两遍,Rows matched相同,但Changed不一样。
UPDATE语句也可以跟ORDER BY和LIMIT子语句。
UPDATE qw_zoetis_donate
SET qw_zoetis_donate.donate_unit=0
WHERE qw_zoetis_donate.donate_unit=1
ORDER BY qw_zoetis_donate.user_id
LIMIT 10;
网上有人说UPDATE语句带LIMIT时像SELECT语句一样是带两个值,可能是我使用的MySQL版本是5.7.16的原因,只支持带一个参数。
UPDATE语句跟JOIN语句(JOIN语句和ORDER BY LIMIT不能同时用)
UPDATE qw_zoetis_donate
INNER JOIN qw_zoetis_user ON qw_zoetis_donate.user_id=qw_zoetis_user.user_id
SET qw_zoetis_donate.donate_unit=0
WHERE qw_zoetis_donate.donate_unit=1 AND qw_zoetis_user.total_price>300
ORDER BY qw_zoetis_donate.id;
DELETE语句
DELETE语句跟ORDER BY和LIMIT子语句。
DELETE
FROM qw_zoetis_user
WHERE user_id > 1000
ORDER BY user_id DESC
LIMIT 10;
DELETE语句跟JOIN语句(JOIN语句和ORDER BY LIMIT不能同时用)
DELETE
FROM qw_zoetis_user
USING qw_zoetis_user
LEFT JOIN qw_zoetis_donate ON qw_zoetis_donate.user_id=qw_zoetis_user.user_id
WHERE qw_zoetis_user.user_id > 1000 AND qw_zoetis_donate.city_id=0
网上很多人说DELETE JOIN时上面这行代码应把USING写成FROM,但经本人测试改成FROM会提示语法错误。另外,MySQL官网给的示例代码也是USING。
素材文件:链接: https://pan.baidu.com/s/1bpEJ82F 密码: ktfs