子查询可以应用在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 ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');
INSERT INTO `t_readerfavorite` VALUES ('', '');

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
)

sql子查询在insert、update、delete中的应用的更多相关文章

  1. SQL基础语法select|insert|update|delete(增删改查) 简单使用

    以下案列以此表举例 1.select(查询) select简单的查询分为两种 注:字段也就是表结构中的列的名称 第一种: select  字段名  from  表名 此种查询只列出你所需要查询的字段, ...

  2. sql中同一个Trigger里同时包含Insert,Update,Delete

    sql中同一个Trigger里同时包含Insert,Update,Delete SQLServer是靠Inserted表和Deleted表来处理的,判断一下就可以了,只不过比ORACLE麻烦一点 cr ...

  3. PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)

    原文: PHP5: mysqli 插入, 查询, 更新和删除  Insert Update Delete Using mysqli (CRUD) PHP 5 及以上版本建议使用以下方式连接 MySQL ...

  4. LINQ体验(9)——LINQ to SQL语句之Insert/Update/Delete操作

    我们继续讲解LINQ to SQL语句,这篇我们来讨论Insert/Update/Delete操作.这个在我们的程序中最为常用了.我们直接看例子. Insert/Update/Delete操作 插入( ...

  5. [sql Server]除非另外还指定了TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效

    今天遇到一个奇怪的问题,项目突然要从mysql切换到sql server数据库,包含order by 子句的嵌套子查询报错. 示例:select top 10 name,age,sex from ( ...

  6. sql子查询 嵌套SELECT语句

    嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在sele ...

  7. Sql Server的艺术(六) SQL 子查询,创建使用返回多行的子查询,子查询创建视图

    子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...

  8. SQL子查询/嵌套查询

    sql子查询 嵌套SELECT语句 嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为 ...

  9. SQL Server温故系列(3):SQL 子查询 & 公用表表达式 CTE

    1.子查询 Subqueries 1.1.单行子查询 1.2.多行子查询 1.3.相关子查询 1.4.嵌套子查询 1.5.子查询小结及性能问题 2.公用表表达式 CTE 2.1.普通公用表表达式 2. ...

随机推荐

  1. java web eclipse中项目的加载过程

    java web eclipse中项目的加载过程: Tomcat默认从WEB-INF/目录下加载资源,Eclipse在发布程序的时候,并没有把User Libraries的相关资源拷贝到WEB-INF ...

  2. [H5-Compress-Image]利用canvas实现 javascript 图片压缩处理_基于requirejs模块化的代码实现

    // 还存在有问题的代码,问题在于processFile()中// 问题:在ipone 5c 下,某些图片压缩处理后,上传到服务器生成的文件size为0,即是空白 ;define(['mod/tool ...

  3. Ajax请求php返回json对象数据中包含有数字索引和字符串索引,在for in循环中取出数据的顺序问题

    //php中的数组数据格式 Array ( [all] => Array ( [title] => ALL [room_promotion_id] => all ) [best_av ...

  4. Create Index语句的Include作用

    在 SQL Server 2005 中,可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能.通过包含非键列,可以创建覆盖更多查询的非聚集索引.这是因为非键列具有下列优点: 它们可以是不允许 ...

  5. .NET Core MemoryCache缓存获取全部缓存键

    在Core中不能使用原HttpRuntime.Cache缓存,改为MemoryCache(Microsoft.Extensions.Caching.Memory). 现MemoryCache新版为2. ...

  6. cmd命令使用笔记

    使用资源管理器打开当前路径 explorer %cd%

  7. C# 实现邮件代发

    由于自己很好奇,有一些推广之类的 邮件,发件人后面,都有一个 由 .... 代发. 所以,查找了一些资料,来验证了一下实现方法. 咱们先来看看,实现代发的 理想效果图 当然,这一种,是利用 代发的 邮 ...

  8. c# 协变与抗变

    定义 协变:与原始类型转换方向相同的可变性称为协变. 抗变:与派生类型转换方向相同的可变性称为抗变. 补充: 参数是协变的,可以使用派生类对象传入需要基类参数的方法,反之不行 返回值是抗变的,不能使用 ...

  9. foreach写失效的问题

    本文由作者张远道授权网易云社区发布. 坦白讲身为程序员,bug在所难免.有人讲,bug越多,说明程序员越伟大.这句话有它一定的道理. 因为从某方面讲,bug多了说明他的代码量也多. 言归正传,这里我记 ...

  10. 201621123018《Java程序设计》第4周学习报告

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 继承.多态.子类.父类.抽象类.abstract.super.object 1.2 尝试使用思维导图将这些关键词组织起来.注:思 ...