直接上例子。

user表:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`class_id` int(11) DEFAULT NULL,
`class_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'a', '1', '');
INSERT INTO `user` VALUES ('2', 'b', '2', '');
INSERT INTO `user` VALUES ('3', 'c', '1', '');
INSERT INTO `user` VALUES ('4', 'd', '1', '');
INSERT INTO `user` VALUES ('5', 'e', '2', '');
INSERT INTO `user` VALUES ('6', 'f', '2', '');
INSERT INTO `user` VALUES ('7', 'g', '3', '');
INSERT INTO `user` VALUES ('8', 'h', '2', '');
INSERT INTO `user` VALUES ('9', 'k', '2', '');
INSERT INTO `user` VALUES ('10', 'm', '3', '');

class表:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES ('1', '初级班');
INSERT INTO `class` VALUES ('2', '中级班');
INSERT INTO `class` VALUES ('3', '高级班');

要求:根据`user`.class_id查询class.name,并用其更新`user`.class_name。

注意:这里测试的是UPDATE 语句与 WHERE EXISTS 语句的执行顺序,所以请忽略表设计方面的问题吧。

语句如下:

UPDATE `user` u
SET u.class_name = (
SELECT
class.`name`
FROM
-- `user` u,
class
WHERE
u.class_id = class.id LIMIT 1
)
WHERE
EXISTS (
SELECT
1
FROM
-- `user`,
class
WHERE
u.class_id = class.id
)

结果表明:

UPDATE语句的WHERE语句如果是EXISTS,那每执行一条就会判断一下,成立则执行SET语句 -- 类似于遍历执行。
另外,UPDATE的表不能出现在FROM语句中。

这里的问题在于,EXISTS是bool判断,而SELECT则返回集合,容易让人一头雾水。

其实用PLSQL来写,逻辑更清晰一些。这里放上一个Oracle的PLSQL吧 -- MySQL的语法略有不同,暂没查到~~

-- 打开控制台输出
set serveroutput on
-- PLSQL
DECLARE
-- 设置光标
CURSOR c is SELECT id,`name` FROM class;
-- 定义光标变量
pid class.id%type;
pname class.name%type;
BEGIN
-- 打开光标
OPEN c; LOOP -- 循环取出光标中的数据
FETCH c INTO pid,pname; -- 取出的数据放入变量中
EXIT WHEN c%notfound; -- 退出条件 -- 更新数据
UPDATE `user` SET `user`.class_name = pname WHERE `user`.class_id = pid; END LOOP; CLOSE c; -- 对于ORACLE,默认的事务隔离级别是 read committed。所以需要commit
COMMIT; -- dbms_output.put_line('涨薪完毕'); -- 控制台输出完成提示
END;
/ -- 执行

当SQL UPDATE遇到EXISTS(SELECT ...)时的更多相关文章

  1. SQL Server判断对象是否存在 (if exists (select * from sysobjects )(转)

    1 判断数据库是否存在Sql代码 if exists (select * from sys.databases where name = ’数据库名’)    drop database [数据库名] ...

  2. SQL Server IF Exists 判断数据库对象是否存在的用法

    1 判断数据库是否存在Sql代码 if exists (select * from sys.databases where name = ’数据库名’)    drop database [数据库名] ...

  3. SQL update select

    SQL update select语句 最常用的update语法是: UPDATE TABLE_NAME SET column_name1 = VALUE WHRER column_name2 = V ...

  4. SQL update select语句

    SQL update select语句 最常用的update语法是:UPDATE <table_name>SET <column_name1> = <value>, ...

  5. 如何在PL/SQL Developer 中设置 在select时 显示所有的数据

    在执行select 时, 总是不显示所有的记录, 要点一下, 下面那个按钮才会显示所有的数据.     解决方法: Tools>Preferences>Window Types>SQ ...

  6. select 时进行update的操作,在高并发下引起死锁

    场景:当用户查看帖子详情时,把帖子的阅读量:ReadCount+1 select title,content,readcount from post where id='xxxx'   --根据主键查 ...

  7. SQL exists( select 1 from

    use UnlockIndustry select * from Info_Coordinate as A join Info_Employee on A.EmployeeId=Info_Employ ...

  8. MS SQL 当记录不存在时插入insert INTO not exists

    INSERT INTO dbo.[T_DabaoTemp]  ([PType]           ,[pID]           ,[NewVersion]           ,[ParentC ...

  9. sql子查询 嵌套SELECT语句

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

随机推荐

  1. javascript基础拾遗(十一)

    1.DOM操作 1)查找 //根据id查找 document.getElementById() //根据html标签查找 documnet.getElementByTagName() //根据样式cl ...

  2. Git GUI中文乱码问题解决方法

    使用Git GUI的查看代码的时候,会出现中文乱码: 在乱码的区域点击鼠标右键,选择Encoding,然后选择Unicode(UTF-8),乱码问题解决:

  3. 【转】Pycharm创建py文件时自定义头部模板

    File->settings->Editor->File and Code Templates->Python Script #!/usr/bin/env python # - ...

  4. LVS负载均衡模型及算法概述

    集群类型 LB: Load Balancing,负载均衡 HA:High Availability, 高可用 HP:High Performance, 高性能   负载均衡 负载均衡设备 Hardwa ...

  5. python-minidom模块【解析xml】

    1,xml的文档结构 1.1,XML文档包括XML头信息和XML信息体 1.1.1,XML文档头信息 <?xml version="1.0" encoding="u ...

  6. jQuery之自定义pagination控件

    slpagination 效果: slpagination.js (function($) { $.fn.slpagination = function(options, params) { if ( ...

  7. springboot 使用c3p0数据库连接池

    springboot 使用c3p0数据库连接池的方法  本文转自:http://www.cnblogs.com/xiaosiyuan/p/6255292.html 使用springboot开发时,默认 ...

  8. php多进程编程相关资料(以备参考)

    进程与线程的区别 要了解二者的区别与联系,首先得对进程与线程有一个宏观上的了解. 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位.每一个进程都 ...

  9. 从零写Java Web框架——请求的处理DispatcherServlet

    大概思路 继承 HttpServlet,实现 DispatcherServlet,拦截所有请求: DispatchServlet 重写 init()方法,负责初始化框架: 重写 service()方法 ...

  10. mongo 操作小结

    这里总结一下mongo常用操作语句,分享给大家和我自己~ 打印系统,数据库,集合的信息 db.stats()                                    打印数据库状态 db ...