先说心得:最近自己也在开发一个项目,用到了mysql的union、union

all、or、in。

union:

Java代码 收藏代码

SELECT column,... FROM table1

UNION [ALL]

SELECT column,... FROM table2

使用 UNION 要注意,2个select搜索的column

的长度也就是个数要相同且字段要一样。

结果是2个查询结果相加,去除相同内容,效率较低,推荐记录数不多的查询.

union all:

UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION。看自己需求吧

or:

Java代码 收藏代码

select *from table1 tt where tt.column=xx or

tt.column=yy

in:

Java代码 收藏代码

select *from table1 tt where tt.column in

(xx,yy)

结果是:查询的结果一样,都是取条件的并集。。注意,是并集。

实际应用中,in or 在我的项目中,我们组长是不推荐使用的,说是效率不高,但是就对于这2个语法相对来说,in

的效率高于or。

我是这么记住的:

in=intime,就是时尚,潮流,流行的东西传播速度肯定快,效率高的,特别是对于人很多的情况。

or = out,out过时的东西,你要流传推广就很累,效率相对低。特别是对于人很多的情况。

我的总结都加了这句:"人很多的情况"!

具体例子是网上找的。http://blog.chinaunix.net/uid-20639775-id-3416737.html飞鸿无痕大神的。我这里也摘录了,可以看下。做的相当深入浅出。有耐心的同学可以一起看看。没耐心的就看看我上面的心得

Java代码 收藏代码

#创建测试的test表

DROP TABLE IF EXISTS test;
CREATE TABLE test(
ID INT(10) NOT NULL,
`Name` VARCHAR(20) DEFAULT '' NOT NULL,
PRIMARY KEY( ID )
)ENGINE=INNODB DEFAULT CHARSET utf8;
#创建生成测试数据的存储过程
DROP PROCEDURE IF EXISTS pre_test;
DELIMITER //
CREATE PROCEDURE pre_test()
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
WHILE i<10000000 DO
INSERT INTO test ( ID,`Name` ) VALUES( i, CONCAT( 'Carl', i )
);
SET i = i+1;
IF i 00 = 0 THEN
COMMIT;
END IF;
END WHILE;
END; //
DELIMITER ;
#执行存储过程生成测试数据
CALL pre_test();
第二步:分三中情况进行测试,分别是:
第一种情况:in和or所在列为主键的情形。
第二种情况:in和or所在列创建有索引的情形。
第二种情况:in和or所在列没有索引的情形。
每种情况又采用不同的in和or的数量进行测试。由于测试语句的数据量有4种情况,我这里就称为A组、B组、C组、D组,其中A组为3个值,B组为150个值,C组为300个值,D组为1000个值。具体的测试语句如下:
点击(此处)折叠或打开
#A组
#in和or中有3条数据的情况
SELECT * FROM test WHERE id IN (1,23,48);
SELECT * FROM test WHERE id =1 OR id=23 OR
id=48;
#B组
#in和or中有150条数据的情况
SELECT * FROM test WHERE id IN
(59617932,98114476,89047409,26968186,56586105,35488201,53251989,18182139,71164231,57655852,7948544,60658339,50758185,66667117,34771253,68699137,27877290,44275282,1585444,71219424,90937482,83928635,24588528,81933207,9607562,12013895,84640278,85549596,53249244,8567444,85402877,15040223,54266509,17718135,91687882,22930500,94756430,66031097,13084573,18137443,89917778,46845456,43939093,35943480,18213703,46362815,49835919,83137546,2101409,74932951,11984477,93113331,77848222,68546065,33728734,90793684,44975642,61387237,52483391,97716233,49449060,22411182,30776331,60597240,6911731,45789095,62075344,8379933,97910423,86861971,81342386,93423963,83852896,18566482,22747687,51420625,75862064,26402882,93958561,85202979,97049369,67674725,9475653,92302381,78133617,49295001,36517340,81387142,15707241,60832834,93157830,64171432,58537826,70141767,7326025,36632075,9639624,8900056,99702164,35108945,87820933,57302965,16652391,41845132,62184393,70136913,79574630,32562398,94616790,61258220,73162018,81644480,19453596,97380163,1204733,33357040,84854495,13888863,49041868,89272326,38405345,571248,6349029,70755321,79307694,60619684,92624181,73135306,23279848,95612954,55845916,6223606,43836918,37459781,67969314,99398872,7616960,37189193,50151920,62881879,12364637,33204320,27135672,28441504,47373461,87967926,30631796,20053540,18735984,83406724);
SELECT * FROM test WHERE id=59617932 OR id=98114476 OR
id=89047409 OR id=26968186 OR id=56586105 OR id=35488201 OR
id=53251989 OR id=18182139 OR id=71164231 OR id=57655852 OR
id=7948544 OR id=60658339 OR id=50758185 OR id=66667117 OR
id=34771253 OR id=68699137 OR id=27877290 OR id=44275282 OR
id=1585444 OR id=71219424 OR id=90937482 OR id=83928635 OR
id=24588528 OR id=81933207 OR id=9607562 OR id=12013895 OR
id=84640278 OR id=85549596 OR id=53249244 OR id=8567444 OR
id=85402877 OR id=15040223 OR id=54266509 OR id=17718135 OR
id=91687882 OR id=22930500 OR id=94756430 OR id=66031097 OR
id=13