搜索
您的当前位置:首页正文

子查询

2020-01-09 来源:好土汽车网
最常用的update语法是: UPDATE

SET = , SET =

如果我的更新值Value是从一条select语句拿出来,而且有很多列的话,用这种语法就很麻烦

第一,要select出来放在临时变量上,有很多个哦 第二,再将变量进行赋值。

列多起来非常麻烦,能不能像Insert那样,把整个Select语句的结果进行插入呢?就好象下面

insert into table1 (c1, c2, c3)

(select v1, v2, v3 from table2)

答案是可以的,具体的语法如下:

UPDATE

SET (, ) = ( SELECT (, ) FROM

WHERE = ) 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进行集合的匹配

因篇幅问题不能全部显示,请点此查看更多更全内容

Top