`
xzuse
  • 浏览: 43263 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

(转)mysql 在update中实现子查询的方式

阅读更多

---测试代码---------------

drop table if exists tb;
create table IF NOT EXISTS tb (Name varchar(10),Time1 datetime,Time2 datetime,Time3 varchar(8),Time4 varchar(8) );
insert tb (name,time1,time2)
select '1','2010-08-04  05:06:26 ','2010-08-04  05:06:29 ' union all
select '1','2010-08-04  05:06:33 ','2010-08-04  09:53:32 ' union all
select '1','2010-08-04  06:06:26 ','2010-08-04  07:06:29 ' union all
select '1','2010-08-05  09:43:10 ','2010-08-05  12:43:50 ' union all
select '1','2010-08-05  05:43:56 ','2010-08-05  07:23:33 ' union all
select '1','2010-08-06  09:43:56 ','2010-08-06  14:55:59 ' union all
select '1','2010-08-07  09:04:56 ','2010-08-07  17:43:56 ' union all
select '1','2010-08-08  08:56:10 ',null;

update tb set time3=timediff(time2,time1);
select * from tb;

update tb a,
(select SEC_TO_TIME(sum(TIME_TO_SEC(time3))) col,max(time1) time,name
from tb group by DATE_FORMAT(time1, '%Y-%m-%d'))b
set time4=b.col
where a.name=b.name and a.time1=b.time;
select * from tb;

---以下为运行过程------------------------------


mysql> create table IF NOT EXISTS tb (Name varchar(10),Time1 datetime,Time2 date
time,Time3 varchar(8),Time4 varchar(8) );
Query OK, 0 rows affected (0.03 sec)

mysql> insert tb (name,time1,time2)
    -> select '1','2010-08-04  05:06:26 ','2010-08-04  05:06:29 ' union all
    -> select '1','2010-08-04  05:06:33 ','2010-08-04  09:53:32 ' union all
    -> select '1','2010-08-04  06:06:26 ','2010-08-04  07:06:29 ' union all
    -> select '1','2010-08-05  09:43:10 ','2010-08-05  12:43:50 ' union all
    -> select '1','2010-08-05  05:43:56 ','2010-08-05  07:23:33 ' union all
    -> select '1','2010-08-06  09:43:56 ','2010-08-06  14:55:59 ' union all
    -> select '1','2010-08-07  09:04:56 ','2010-08-07  17:43:56 ' union all
    -> select '1','2010-08-08  08:56:10 ',null;
Query OK, 8 rows affected (0.00 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql>
mysql> update tb set time3=timediff(time2,time1);
Query OK, 7 rows affected (0.00 sec)
Rows matched: 8  Changed: 7  Warnings: 0

mysql> select * from tb;
+------+---------------------+---------------------+----------+-------+
| Name | Time1               | Time2               | Time3    | Time4 |
+------+---------------------+---------------------+----------+-------+
| 1    | 2010-08-04 05:06:26 | 2010-08-04 05:06:29 | 00:00:03 | NULL  |
| 1    | 2010-08-04 05:06:33 | 2010-08-04 09:53:32 | 04:46:59 | NULL  |
| 1    | 2010-08-04 06:06:26 | 2010-08-04 07:06:29 | 01:00:03 | NULL  |
| 1    | 2010-08-05 09:43:10 | 2010-08-05 12:43:50 | 03:00:40 | NULL  |
| 1    | 2010-08-05 05:43:56 | 2010-08-05 07:23:33 | 01:39:37 | NULL  |
| 1    | 2010-08-06 09:43:56 | 2010-08-06 14:55:59 | 05:12:03 | NULL  |
| 1    | 2010-08-07 09:04:56 | 2010-08-07 17:43:56 | 08:39:00 | NULL  |
| 1    | 2010-08-08 08:56:10 | NULL                | NULL     | NULL  |
+------+---------------------+---------------------+----------+-------+
8 rows in set (0.00 sec)

mysql>
mysql> update tb a,
    -> (select SEC_TO_TIME(sum(TIME_TO_SEC(time3))) col,max(time1) time,name
    -> from tb group by DATE_FORMAT(time1, '%Y-%m-%d'))b
    -> set time4=b.col
    -> where a.name=b.name and a.time1=b.time;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 5  Changed: 4  Warnings: 0

mysql> select * from tb;
+------+---------------------+---------------------+----------+----------+
| Name | Time1               | Time2               | Time3    | Time4    |
+------+---------------------+---------------------+----------+----------+
| 1    | 2010-08-04 05:06:26 | 2010-08-04 05:06:29 | 00:00:03 | NULL     |
| 1    | 2010-08-04 05:06:33 | 2010-08-04 09:53:32 | 04:46:59 | NULL     |
| 1    | 2010-08-04 06:06:26 | 2010-08-04 07:06:29 | 01:00:03 | 05:47:05 |
| 1    | 2010-08-05 09:43:10 | 2010-08-05 12:43:50 | 03:00:40 | 04:40:17 |
| 1    | 2010-08-05 05:43:56 | 2010-08-05 07:23:33 | 01:39:37 | NULL     |
| 1    | 2010-08-06 09:43:56 | 2010-08-06 14:55:59 | 05:12:03 | 05:12:03 |
| 1    | 2010-08-07 09:04:56 | 2010-08-07 17:43:56 | 08:39:00 | 08:39:00 |
| 1    | 2010-08-08 08:56:10 | NULL                | NULL     | NULL     |
+------+---------------------+---------------------+----------+----------+
8 rows in set (0.00 sec)

mysql>

总结:

      在写这段代码前,好了sql server的。但是转到mysql里始终不能成功,在不断的看帮助、查资料、测试后发现mysql的update的一些特点

1、update 时,更新的表不能在set和where中用于子查询;

2、update 时,可以对多个表进行更新(sqlserver不行);

         如:update ta a,tb b set a.Bid=b.id ,b.Aid=a.id;  

3、update 后面可以做任意的查询,这个作用等同于from;

分享到:
评论

相关推荐

    MySQL锁类型以及子查询锁表问题、解锁1

    在实际应用中,可能会遇到死锁问题,特别是在涉及子查询的更新语句中。如描述中所示,如果一个事务在更新时对子查询中的表进行锁定,可能导致其他事务尝试获取已被锁定的资源,从而引发死锁。MySQL在检测到死锁时会...

    MySQL数据库update更新子查询

    总的来说,理解并掌握如何在`UPDATE`语句中正确使用子查询是MySQL数据库操作中的一个重要技能。合理利用`JOIN`或并列子查询,可以有效地避免`1093`错误,实现对数据的准确更新。在设计和编写这类语句时,要确保遵循...

    MySql数据库中的子查询与高级应用浅析

    MySQL数据库中的子查询是一种强大的工具,它允许在一个SQL查询中嵌套另一个查询,以此来获取更复杂的查询结果。子查询可以被用作查询条件或数据源,帮助开发者编写出更灵活且精确的查询语句。 1. **子查询作为查询...

    MySQL嵌套查询的例子

    MySQL中的嵌套查询(也称为子查询)是指在一个查询中嵌套另一个查询。子查询可以出现在SELECT、INSERT、UPDATE或DELETE语句中,通常用于返回一个结果集,该结果集可以作为外部查询的一部分进行进一步处理. 嵌套查询...

    MySQL 数据库考核选择题 带答案 测试题 期末题.docx

    - **子查询**:在SELECT语句中嵌套另一个SELECT语句。 - **联接查询**:INNER JOIN、LEFT JOIN、RIGHT JOIN等。 - **分组与排序**:GROUP BY、ORDER BY等。 以上是MySQL数据库考核选择题中可能涉及的主要知识点,...

    MySql高级Sql查询

    例如,你可以用子查询来找出某个字段的最大值,然后在主查询中找到所有与此最大值相等的记录。 3. **聚合函数**:如COUNT(), SUM(), AVG(), MAX()和MIN(),这些函数用于对一组值进行统计计算。例如,COUNT()可以...

    MySql 中查询树形结构的全部子项列表 Function

    本文将深入探讨如何在MySQL中查询树形结构的全部子项列表,结合提供的`MySql_Link_Function.sql`文件,我们将探讨一种有效的方法来实现这一功能。 首先,树形结构在数据库中的存储通常采用自引用的方式,即每个节点...

    MySQL中文参考手册

    5. **查询优化**:学习如何编写高效的SQL查询,包括使用JOIN操作合并多个表的数据,利用子查询解决问题,以及如何避免全表扫描以提升性能。 6. **存储引擎**:MySQL支持多种存储引擎,如InnoDB(事务处理,支持外键...

    MySql常用查询命令操作大全

    以上是MySQL的一些基础查询和操作命令,实际上MySQL支持更复杂的查询语法,如JOIN、GROUP BY、HAVING、子查询等,以及视图、存储过程、触发器等高级功能,这些都可以帮助用户更高效地管理和处理数据库中的数据。在...

    mysql api查询手册

    1. **MySQL API介绍**:MySQL API是用于在各种编程语言中与MySQL数据库交互的一系列函数和接口。它允许开发者编写SQL语句,执行查询,处理结果集,并进行事务管理。主要的API包括C API、PHP MySQLi和PDO_MySQL、...

    C#连接本地MySQL实现增删改查

    在本文中,我们将深入探讨如何使用C#编程语言与本地MySQL数据库进行交互,实现基本的增删改查(CRUD)操作。对于初学者来说,这是掌握数据库编程的基础,也是许多应用程序开发的核心部分。我们将使用Visual Studio ...

    mysql各种语句多表查询+ mysql视图 mysql数据库管理+ select语句+ 创建

    外连接允许你在结果集中包含不匹配的记录,而子查询是在一个查询中嵌套另一个查询,用于获取满足特定条件的数据。例如,你可以使用子查询来找出某个部门薪水最高的员工,然后再用这个结果去与其他部门的员工比较。 ...

    5天玩转MySQL(资料完整)day5.rar

    - **子查询与嵌套查询**:学习如何在查询中嵌套查询,以及子查询在复杂查询中的作用。 - **聚合函数与GROUP BY**:掌握COUNT、SUM、AVG、MAX和MIN等聚合函数,以及GROUP BY和HAVING子句的用法,进行分组统计。 3....

    MySQL_4.1.0 中文参考手册.chm MySQL 4.1.0 中文参考手册

    这包括支持子查询,使得在SQL语句中嵌套查询成为可能,大大增强了数据处理的灵活性。此外,4.1.0版本还引入了联接(JOIN)优化,使得复杂查询的执行效率显著提升,特别是对于大数据量的表,这种优化至关重要。 在...

    mysql语句集合包括模糊查询索引函数

    1. **数据查询.sql**:可能包含各种查询示例,如JOIN操作、子查询、聚合函数的使用等。 2. **mysql.sql**:可能是一个包含常见MySQL语句的脚本文件,可以学习和参考。 3. **主外键约束.txt**:这是数据库关系模型的...

    MySQL 5.1中文手冊

    2.7. 在其它类Unix系统中安装MySQL 2.8. 使用源码分发版安装MySQL 2.8.1. 源码安装概述 2.8.2. 典型配置选项 2.8.3. 从开发源码树安装 2.8.4. 处理MySQL编译问题 2.8.5. MIT-pthreads注意事项 2.8.6. 在Windows下从...

    mysql中文参考手册

    手册会详细介绍SELECT、INSERT、UPDATE、DELETE等基本操作,以及JOIN、子查询、事务处理、视图、存储过程和触发器等高级概念。 3. **数据库和表的管理**:创建、修改和删除数据库及表的命令,如CREATE DATABASE、...

    解析mysql与Oracle update的区别

    总结来说,MySQL和Oracle在多表更新上有不同的实现方式,Oracle的更新方式更为严格,需要使用子查询,而MySQL则直接在`UPDATE`语句中使用`JOIN`。除此之外,两者在数据类型、事务处理、性能、权限管理等多个方面都有...

    Mysql数据库中子查询的使用

    在MySQL中,子查询通常被包含在圆括号中,它可以在SELECT、INSERT、UPDATE、DELETE语句中作为表达式的一部分出现。 我们来看一个子查询的例子: ```sql SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2)...

Global site tag (gtag.js) - Google Analytics