一个查询,通常就是一个语句,但如果一个查询语句中,又嵌套了查询语句,其后者就称为”子查询”,前者就是”主查询”。
语法
selelct 字段或表达式或(子查询1) [as 别名] from 表名或(子查询2) where 字段或表达式或(子查询3) 的条件判断
其中每个位置所放置的子查询结果应该符合该位置的数据要求,子查询1应该是一个数据结果,子查询2可以是任意结果,此位置的查询结果通产作为数据源,可以设置一个别名,自查询3可以是一个数据或一列数据甚至是一行数据。
子查询按结果分类表子查询 : 一个子查询返回的结果理论上是“多行多列”的时候。此时可以当做一个“表”来使用,通常是放在from后面。行字查询 : 一个子查询返回的结果理论上是“一行多列”的时候。此时可以当做一个“行”来使用,通常放在“行比较语法”中。列子查询 : 一个子查询返回的结果理论上是“多行一列”的时候。此时可以当做“多个值”使用,类似这种:(5, 17, 8, 22)。标量子查询:一个子查询返回的结果理论上是“一行一列”的时候。此时可以当做“一个值”使用,类似这种: 5 as c1; 或 …where a = 17,或 … where b > 8;子查询按使用场合分作为主查询的结果数据: c1,( f1 from tab2) as f11 from tab1; #这里子查询应该只有一个数据(一行一列,标量子查询)作为主查询的条件数据: c1 from tab1 where c1 in ( f1 from tab2); #这里子查询可以是多个数据(多行一列,列子查询,以及标量子查询,实际上行子查询也可能,但极少)作为主查询的来源数据: c1 from ( f1 as c1, f2 from tab2) as t2; #这里子查询可以是任意查询结果(表子查询)。常见子查询和相关关键字
数据表1,下面案例会用到
数据表2,下面案例会用到
比较运算符中使用子查询:判断字段的值是否满足比较结果,形式一般写为:操作数 比较运算符 (标量子查询)。
案例:找出所有大于平均价的商品
//步骤://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);
使用in子查询:表示该操作数(字段值)等于该子查询的任意一个值就满足条件
案例:找出所有带”电”字的类别的ID
//1.找出所有带"电"字的类别IDselect 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 '%电');
使用any子查询:表示该操作数的值跟列子查询的任意一个值满足条件就行 。
案例:找出所有带”电”字的类别的产品
select * from product where protype_id=any( select protype_id from product_type where protype_name like '%电%');
使用all子查询:表示该操作数的值必须跟列子查询的所有值都满足给定的比较运算,才算满足了条件。
案例:找出产品表中的价格最高得产品
//法1:使用all子查询select * from product where price>=all( select price from product);//法2:select * from product where price = ( select price from product);
使用的子查询:如果该子查询有结果数据(无论什么数据,只要大于等于1行),则为true,否则为false
案例:找出具有在售商品的那些类别
select * from product_type where exists(select * from product where product.protype_id=product_type.protype_id);
使用not 的子查询:与的子查询相反
注意:使用或not 子查询,如果涉及到2个表,其内部其实会自动进行”连接查询”,且其逻辑过程较为负责,而且不明确。无法自行设置。