程序员

MySQL连接查询:子查询

2017-02-22  本文已影响0人  kangyiii

一个查询,通常就是一个select语句,但如果一个select查询语句中,又嵌套了select查询语句,其后者就称为"子查询",前者就是"主查询"。

语法

selelct 字段或表达式或(子查询1) [as 别名] from 表名或(子查询2) where 字段或表达式或(子查询3) 的条件判断

其中每个位置所放置的子查询结果应该符合该位置的数据要求,子查询1应该是一个数据结果,子查询2可以是任意结果,此位置的查询结果通产作为数据源,可以设置一个别名,自查询3可以是一个数据或一列数据甚至是一行数据。

子查询按结果分类

  1. 表子查询 : 一个子查询返回的结果理论上是“多行多列”的时候。此时可以当做一个“表”来使用,通常是放在from后面。
  2. 行字查询 : 一个子查询返回的结果理论上是“一行多列”的时候。此时可以当做一个“行”来使用,通常放在“行比较语法”中。
  3. 列子查询 : 一个子查询返回的结果理论上是“多行一列”的时候。此时可以当做“多个值”使用,类似这种:(5, 17, 8, 22)。
  4. 标量子查询:一个子查询返回的结果理论上是“一行一列”的时候。此时可以当做“一个值”使用,类似这种:select 5 as c1; 或select ...where a = 17,或select ... where b > 8;

子查询按使用场合分

  1. 作为主查询的结果数据:select c1,(select f1 from tab2) as f11 from tab1; #这里子查询应该只有一个数据(一行一列,标量子查询)
  2. 作为主查询的条件数据:select c1 from tab1 where c1 in (select f1 from tab2); #这里子查询可以是多个数据(多行一列,列子查询,以及标量子查询,实际上行子查询也可能,但极少)
  3. 作为主查询的来源数据:select c1 from (select f1 as c1, f2 from tab2) as t2; #这里子查询可以是任意查询结果(表子查询)。

常见子查询和相关关键字

数据表1,下面案例会用到 数据表2,下面案例会用到
  1. 比较运算符中使用子查询:判断字段的值是否满足比较结果,形式一般写为:操作数 比较运算符 (标量子查询)。
    案例:找出所有大于平均价的商品
//步骤:
//1.找平均价
select avg(price) as avg_price from product;
//2.找商品
select * from product where price > xxxxx;
//合并起来一起写
select * from product where price >(select avg(price) as avg_price from product);
  1. 使用in子查询:表示该操作数(字段值)等于该子查询的任意一个值就满足条件
    案例:找出所有带"电"字的类别的ID
//1.找出所有带"电"字的类别ID
select protype_id from product_type where protype_name like '%电';
//2.根据结果找出这些类别的产品
select * from product where protype id in xxx
//使用in子查询
select * from product where protype id in 
(
select protype_id from product_type where protype_name like '%电'
);
  1. 使用any子查询:表示该操作数的值跟列子查询的任意一个值满足条件就行 。
    案例:找出所有带"电"字的类别的产品
select * from product where protype_id=any
(
  select protype_id from product_type where protype_name like '%电%'
);
  1. 使用all子查询:表示该操作数的值必须跟列子查询的所有值都满足给定的比较运算,才算满足了条件。
    案例:找出产品表中的价格最高得产品
//法1:使用all子查询
select * from product where price>=all
(
  select price from product
);
//法2:
select * from product where price = 
(
  select price from product
);
  1. 使用exists的子查询:如果该子查询有结果数据(无论什么数据,只要大于等于1行),则为true,否则为false
    案例:找出具有在售商品的那些类别
select * from product_type where exists
(
select * from product where product.protype_id=product_type.protype_id
);
  1. 使用not exists的子查询:与exists的子查询相反
    注意:使用exists或not exists子查询,如果涉及到2个表,其内部其实会自动进行"连接查询",且其逻辑过程较为负责,而且不明确。无法自行设置。
上一篇下一篇

猜你喜欢

热点阅读