SET 如果我的更新值Value是从一条select语句拿出来,而且有很多列的话,用这种语法就很麻烦 第一,要select出来放在临时变量上,有很多个哦 第二,再将变量进行赋值。 列多起来非常麻烦,能不能像Insert那样,把整个Select语句的结果进行插入呢?就好象下面 insert into table1 (c1, c2, c3) (select v1, v2, v3 from table2) 答案是可以的,具体的语法如下: UPDATE SET ( WHERE 注意:最后面的括号后面一定是查询才可以。 两个 表:lm_bbs_posts、lm_bbs_reposts,数据量差不多一样大,都是800条左右。 里面的列:id有索引。 1、优化前执行语句: UPDATE `lm_bbs_posts` , lm_bbs_reposts SET rpnum = ( SELECT count( * ) FROM lm_bbs_reposts WHERE lm_bbs_reposts.pid = lm_bbs_posts.id ) WHERE 1 结果: Query took 703.9829 sec 2、优化添加索引。 因为只用到id和pid的条件,而在lm_bbs_posts里面的id已经有索引了,所以只加一个: update `lm_bbs_posts`,lm_bbs_reposts set rpnum=(select count(*) from lm_bbs_reposts where lm_bbs_reposts.pid=lm_bbs_posts.id) WHERE 1 结果: Query took 7.4888 sec 结论: 效率直接提高差不多100倍! mysql中把一个查询结果插入到另外一个表中 引用 insert into best_quote( quote_id, product_id, quote_type, quote_price, quote_amount, quote_time, company_id ) select quote_id, product_id, quote_type, quote_price, quote_amount, quote_time, company_id from quote where product_id = 4 and quote_type = 1; 现在有张表为student,我想将这个表里面的数据复制到一个为dust的新表中去,虽然可以用以下语句进行复制,总觉得不爽,希望各位帮助下我,谢谢。 answer 01: create table dust select * from student;//用于复制前未创建新表dust的情况下 answer 02: insert into dust select * from student;//已经创建了新表dust的情况下 MYSQL不支持: Select * Into new_table_name from old_table_name; 替代方法: Create table new_table_name (Select * from old_table_name); mysql 各种级联查询后更新(update select). CREATE TABLE `tb1` ( `id` int(11) NOT NULL, `A` varchar(100) default NULL, `B` varchar(100) default NULL, `C` varchar(20) default NULL, PRIMARY KEY (`id`), KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `tb2` ( `id` int(11) NOT NULL, `A` varchar(100) default NULL, `B` varchar(100) default NULL, PRIMARY KEY (`id`), KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 级联更新1: update tb1, tb2 set tb1.a=tb2.a,tb1.b=tb2.b where tb1.id=tb2.id 级联更新2: update tb1, (select * from tb2) as tb2 set tb1.a=tb2.a,tb1.b=tb2.b where tb1.id=tb2.id 级联更新3: update (select * from tb1 group by C) as temp, tb2, tb1 set tb1.a = tb2.a, tb1.b = tb2.b where tb1.id = tb2.id and temp.id = tb2.id 许多人都觉得MySQL不支持嵌套查询,其实MySQl从4.11版后已经完全支持嵌套查询了,那么下面我举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): 1. SELECT语句的子查询: 语法: SELECT ... FROM (subquery) AS name ... 先创建一个表: CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT); INSERT INTO t1 VALUES (1,'1',1.0); INSERT INTO t1 VALUES (2,'2',2.0); 我们就可以进行以下的嵌套查询了: SELECT sb1,sb2,sb3 FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb WHERE sb1 > 1; 结果是: 2, '2', 4.0. 我们知道下面语句是不会得到正确结果的,因为对经过Group by排序的集合进行求均值是不能得到正确答案的: SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1 所以我们可以通过下面的嵌套查询实现同样的效果: SELECT AVG(sum_column1) FROM (SELECT SUM(column1) AS sum_column1 FROM t1 GROUP BY column1) AS t1; 2.行的子查询(Row Subquery): 看下面的例子: SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2); 这个查询是返回column1等于column2的结果行。Row函数中的1和2相当于构造参数。想必Blogjava上的同志对这些应该比较清楚,也不去详细介绍了。 3.使用Exist和Not Exist参数 这里的Exist和Not Exist用途及用法和在其他没有什么大的区别,我就简单举几个范例好了: 范例一: SELECT DISTINCT store_type FROM Stores WHERE EXISTS (SELECT * FROM Cities_Stores WHERE Cities_Stores.store_type = Stores.store_type); 范例二: SELECT DISTINCT store_type FROM Stores WHERE NOT EXISTS (SELECT * FROM Cities_Stores WHERE Cities_Stores.store_type = Stores.store_type); 范例三: 这个例子中嵌套使用了Not Exist语法,稍微注意一下: SELECT DISTINCT store_type FROM Stores S1 WHERE NOT EXISTS ( SELECT * FROM Cities WHERE NOT EXISTS ( SELECT * FROM Cities_Stores WHERE Cities_Stores.city = Cities.city AND Cities_Stores.store_type = Stores.store_type)); 4.条件关联关系查询: 解释起来麻烦,直接看例子吧: SELECT column1 FROM t1 AS x WHERE x.column1 = (SELECT column1 FROM t2 AS x WHERE x.column1 = (SELECT column1 FROM t3 WHERE x.column2 = t3.column1)); 跟其他数据库做法是一样的。 5.其他使用方法和注意: 除了上面这些还有很多很多,不过就不去细讲了,因为这些跟别的数据库差不多,只是为了给大家一个参考,提提就够了。 SELECT (SELECT s1 FROM t2) FROM t1; SELECT (SELECT s2 FROM t1); 支持子查询的语法有:SELECT,INSERT,UPDATE,DELETE,SET和DO。 子查询可以使用任何普通查询中使用的关键词:如DINSTINCT,GROUP BY,LIMIT,ORDER BY,UNION,ALL,UNION ALL等。可以使用<,>, <=, >=, =, <>运算符进行比较,也可以使用ANY ,IN和SOME进行集合的匹配 因篇幅问题不能全部显示,请点此查看更多更全内容