子查询可以应用在INSERT、UPDATE以及DELETE等语句中,合理的使用子查询将能够简化功能的实现并且极大的提高SQL语句执行的效率

用到的表:

CREATE TABLE `t_readerfavorite` (
  `FCategoryId` int(11) DEFAULT NULL,
  `FReaderId` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_readerfavorite
-- ----------------------------
INSERT INTO `t_readerfavorite` VALUES ('1', '1');
INSERT INTO `t_readerfavorite` VALUES ('5', '2');
INSERT INTO `t_readerfavorite` VALUES ('2', '3');
INSERT INTO `t_readerfavorite` VALUES ('3', '4');
INSERT INTO `t_readerfavorite` VALUES ('5', '5');
INSERT INTO `t_readerfavorite` VALUES ('1', '6');
INSERT INTO `t_readerfavorite` VALUES ('1', '7');
INSERT INTO `t_readerfavorite` VALUES ('4', '8');
INSERT INTO `t_readerfavorite` VALUES ('6', '9');
INSERT INTO `t_readerfavorite` VALUES ('5', '10');
INSERT INTO `t_readerfavorite` VALUES ('2', '11');
INSERT INTO `t_readerfavorite` VALUES ('2', '12');
INSERT INTO `t_readerfavorite` VALUES ('1', '12');
INSERT INTO `t_readerfavorite` VALUES ('3', '1');
INSERT INTO `t_readerfavorite` VALUES ('1', '3');
INSERT INTO `t_readerfavorite` VALUES ('4', '4');

1,子查询在INSERT语句中的应用

一般我们insert是一行数据,有时可能需要将数据批量插入表中,比如创建一个和T_ReaderFavorite表结构完全相同的表T_ReaderFavorite2,然后将T_ReaderFavorite中的输入复制插入到T_ReaderFavorite2表

创建T_ReaderFavorite2表

CREATE TABLE `t_readerfavorite2` (
  `FCategoryId` int(11) DEFAULT NULL,
  `FReaderId` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

批量插入,数据量大的时候提高效率 格式:INSERT……SELECT…… ,注意上下的列顺序必须是一一对应的

insert into t_readerfavorite2(fcategoryId,freaderid)
select fcategoryid,freaderid from t_readerfavorite

使用INSERT……SELECT……不仅能够实现简单的将一个表中的数据导出到另外一个表中的功能,还能在将输入插入目标表之前对数据进行处理

比如下面的SQL语句用于将T_ReaderFavorite表中的数据复制到T_ReaderFavorite2表中,但是如果T_ReaderFavorite表中的FReaderId列的值大于10,则将FReaderId的值减去FCategoryId的值后再复制到T_ReaderFavorite2表中

INSERT INTO t_readerfavorite2 (fcategoryId, freaderid) 
SELECT
    fcategoryid,
    CASE
        WHEN freaderid > 10 THEN freaderid - fcategoryid    
        ELSE
        freaderid
    END
FROM
    t_readerfavorite

使用这种插入前的数据处理可以完成诸如“将数据从A表导出到B表,并且将B表的主键全部加上bak前缀”、“将A公司的所有员工插入到我们的会员表,自动导入所有的客户信息,并且为其自动生成会员编号”等复杂的任务。

因为可以在插入目标表前可以对数据进行处理,所以INSERT……SELECT……语句不局限于同结构表间的数据插入,也可以实现异构表间输数据的插入。

 

2,子查询在UPDATE语句中的应用

在UPDATE语句中可以在更新列表中以及WHERE语句使用子查询。

下面演示一个将图书的出版日期全部更新为所有图书中的最新出版日期,SQL语句如下:

 

UPDATE t_book SET FYearPublished  = (SELECT max(FYearPublished) FROM t_book)

 

注意,在MYSQL中是不支持使用子查询来更新一个列的

下面的SQL语句用来将所有同类书本书超过3本的图书的出版日期更新为2005:

update t_book set fyearpublished = 2005 where fcategoryid in
(
select fcategoryid from t_book t group by t.fcategoryid having count(*)>3
)

3,子查询在DELETE语句中的应用

子查询在DELETE中唯一可以应用的位置就是WHERE子句,使用子查询可以完成复杂的数据删除控制。其使用方式与SELECT语句中的子查询基本相同,而且也可以使用相关子查询等高级的特性。下面的SQL语句用来将所有同类书本书超过3本的图书删除:

delete from  t_book  where fcategoryid in
(
select fcategoryid from t_book t group by t.fcategoryid having count(*)>3
)

 

欢迎关注个人公众号一起交流学习: