重学MYSQL之组合查询

数据库 2020-09-09 892

1.组合查询

多数SQL查询只包含从一个或多个表中返回数据的单条SELECT语句,但是,SQL也允许执行多个查询(多个SELECT语句),并将结果作为查询结果集返回。这些组合查询通常称为并(union)或者复合查询。

主要有两种情况需要使用组合查询:

  • 在一个查询中从不同的表返回结构数据
  • 对一个表执行多个查询,按一个查询返回数据

2. 创建组合查询

2.1使用UNION

使用UNION很简单,只是给出每条SELECT语句,在各条语句之间放上关键字UNION

例子:我想直到商品表中那些属于商品类别为(7, 15, 20)的商品,还想知道商品名包含‘牛奶’的商品信息

首先,查询出属于商品类别为(7, 15, 20)的商品

SELECT id, name, category_id FROM `goods_goods` WHERE category_id IN (7, 15, 20);

其次,查询出商品包含‘牛奶’字段

SELECT id, name, category_id FROM goods_goods WHERE name LIKE '%牛奶%';

最后组合在一起:

SELECT id, name, category_id FROM `goods_goods` WHERE category_id IN (7, 15, 20) UNION SELECT id, name, category_id FROM goods_goods WHERE name LIKE '%牛奶%';

添加id时显示所有商品,不添加id,会以name去重。

结果:

上条sql语句的效果等于

SELECT id, name, category_id FROM `goods_goods` WHERE category_id IN (7, 15, 20) OR name LIKE '%牛奶%';

这说明,使用UNION有时并不合适,但是对于从多表中检索数据,UNION可能更简单

2.2 UNION的规则

  • UNION必须由两条由两条或者两条以上的SELECT语句组成,语句之间用关键字UNION分隔
  • UNION中的每个查询必须包含相同的列、表达式或聚集函数
  • 列数据类型必须兼容:类型不必完全相同,但必须是数据库可以隐含转换的类型(如int,flaot;datetime,date)

2.3 包含或取消重复的行

UNION从查询结果集中自动去除了重复的行。换句话说,它的行为与一条SELECT语句中使用WHERE子句条件一样。如果你想返回所有匹配的行,可以使用UNION ALL。

2.4 对组合查询结果排序

在使用UNION组合查询时,只能使用一条ORDER BY 子句,它必须位于最后一条SELECT 语句之后。对于结果集,不存在用一种方式排序一部分,又使用一种方式排序另一部分的情况

SELECT name, category_id, shop_price FROM `goods_goods` WHERE category_id IN (7, 15, 20) UNION ALL SELECT name,
 category_id, shop_price FROM goods_goods WHERE name LIKE '%牛奶%' ORDER BY shop_price;

标签:数据库

文章评论

评论列表

已有0条评论