您的位置:首页 > 数据库 > MySQL

关乎mysql中union、union all 的使用

2016-03-24 14:37 686 查看
一、在写sql语句时如果想要将两组差不读相同的数据同时返回就会用到union 、union all 

1、首先它俩的区别:union 去重、排序、效率稍慢;union all 不去重、不排序、效率比union 快

所以如果并的两组数据没有重复数据用 union all 效率快

2、两组数据对应的字段必须名称相同,如果一个有、一个没有,可以用占位表示‘’

但是如果外面要套select * from 的话就不能用占位‘’表示了,必须全部对应显示

SELECT* FROM(SELECT g.id,g.createUser,g.goodUser,
CASE IFNULL(u.image,'') WHEN '' THEN '' ELSE CONCAT('"+getImageUsersPath()+"',u.image) END AS image,
u.isMember vip, CASE u.usertype WHEN '1' THEN '个人' ELSE '企业' END AS usertype, r.grade,sp.region_name startProvince,sc.region_name startCity,
ep.region_name endProvince,ec.region_name endCity,CAST(g.loadingtime AS CHAR) loadingTime ,
g.longGoodType,g.weightVolumeValue,g.models,g.price,g.longCarLength carsLength,g.startAddr,g.endAddr, g.echolocationAddr,
CAST(g.echolocationTime AS CHAR) echolocationTime,g.longitude,g.latitude, g.isLongdis,g.recDistance,g.expectTime ,t.startPrice,t.unitPrice,gp.typeName,
(SELECT IF(COUNT(*)=0,'0','1') FROM trorderinfo td WHERE td.driver=18 AND td.orderStatus=2 AND orderType=1 AND td.goodSourceId=g.id )isRob,
IFNULL(ROUND((6378.138*2*ASIN(SQRT(POW(SIN((89*PI()/180-g.latitude*PI()/180)/2),2)+COS(89*PI()/180)*COS(g.latitude*PI()/180)*POW(SIN((108*PI()/180-g.longitude*PI()/180)/2),2)))),1),0) AS distance
FROM `goodssource` g LEFT JOIN trend_region sp ON g.startProvince=sp.region_id
LEFT JOIN trend_region sc ON g.startCity=sc.region_id
LEFT JOIN trend_region ep ON g.endProvince=ep.region_id
LEFT JOIN trend_region ec ON g.endCity=ec.region_id
LEFT JOIN blue_sys_user2 u ON u.id=g.createUser
LEFT JOIN (SELECT CONCAT (IFNULL(b.carModel,''),IFNULL(a.carModel,'')) AS models ,a.id AS carTypeId ,
a.carLength AS carsLength ,a.startPrice AS startPrice,a.unitPrice AS unitPrice
FROM same_city_car_type a LEFT JOIN same_city_car_type b ON a.pid=b.id ) t ON t.carTypeId = g.sameModels
LEFT JOIN goodstypeset gp ON gp.id=g.goodType
LEFT JOIN reputationgrade r ON u.creditGrade=r.id WHERE g.isLongdis=1 AND g.createUser=1
UNION ALL
SELECT g.id,g.createUser,g.goodUser, CASE IFNULL(u.image,'') WHEN '' THEN '' ELSE CONCAT('http://10.58.178.81:8018/WKWL/upload/image/sj/',u.image) END AS image,
u.isMember vip, CASE u.userType WHEN '1' THEN '个人' ELSE '企业' END AS userType, r.grade,sp.region_name startProvince,sc.region_name startCity,
ep.region_name endProvince,ec.region_name endCity,CAST(g.loadingTime AS CHAR) loadingTime ,
g.longGoodType,g.weightVolumeValue,t.models,g.price,t.carsLength carsLength,g.startAddr,g.endAddr, g.echolocationAddr,
CAST(g.echolocationTime AS CHAR) echolocationTime,g.longitude,g.latitude, g.isLongdis,g.recDistance,g.expectTime,t.startPrice,t.unitPrice,gp.typeName,
(SELECT IF(COUNT(*)=0,'0','1') FROM trorderinfo td WHERE td.driver=18 AND td.orderStatus=2 AND orderType=2 AND td.goodSourceId=g.id )isRob,
IFNULL(ROUND((6378.138*2*ASIN(SQRT(POW(SIN((89*PI()/180-g.latitude*PI()/180)/2),2)+COS(89*PI()/180)*COS(g.latitude*PI()/180)*POW(SIN((108*PI()/180-g.longitude*PI()/180)/2),2)))),1),0) AS distance FROM goodssource g LEFT JOIN trend_region sp ON g.startProvince=sp.region_id
LEFT JOIN trend_region sc ON g.startCity=sc.region_id
LEFT JOIN trend_region ep ON g.endProvince=ep.region_id
LEFT JOIN trend_region ec ON g.endCity=ec.region_id
LEFT JOIN blue_sys_user2 u ON u.id=g.createUser
LEFT JOIN (SELECT CONCAT (IFNULL(b.carModel,''),IFNULL(a.carModel,'')) AS models ,a.id AS carTypeId ,
a.carLength AS carsLength ,a.startPrice AS startPrice,a.unitPrice AS unitPrice
FROM same_city_car_type a LEFT JOIN same_city_car_type b ON a.pid=b.id ) t ON t.carTypeId = g.sameModels
LEFT JOIN goodstypeset gp ON gp.id=g.goodType
LEFT JOIN reputationgrade r ON u.creditGrade=r.id WHERE g.isLongdis=2 AND g.createUser=1) tt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: