首页 技术 正文
技术 2022年11月10日
0 收藏 975 点赞 3,912 浏览 2517 个字

子查询可以应用在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
)
上一篇: 快捷键&小技巧
下一篇: Sequel-Model
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,564
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,413
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,186
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905