日期:2014-05-16  浏览次数:20500 次

Oracle数据库高级查询(一)子查询

欢迎转载,转载请指明出处http://blog.csdn.net/hncsy403,谢谢


在一个SQL语句中嵌套另外一个sql语句称为子查询

而这个查询语句作为另一个查询语句它的条件,其中包含其他sql语句的这个sql语句称为父查询

示例如下

如果需要查询商品类别中为图书的所有商品id,名称,价格

select id,name,price from es_product
where sort_id =(
select id from es_sort where sortname=
'图书' )

在where条件中子查询的一般实现步骤如下:
1.我们得先知道需要查询的是什么,明确要显示的结果

比如说我们上述的就是id,name,price


2.结果来源于哪里

显然这些商品的相关信息来自于商品表es_product


3.需要的查询条件是什么

这里需要的是查询分类为图书,就是sort_id=(图书类别id)


4.条件中需要的值来源于哪里

它来自于一个子查询

sort_id=(SELECT id FROM es_sort WHERE sortname =' 图书')


5.最后子查询的sql语句就自然而然出来了


又例如,我们要查询以李青青为下单人的订单号,收货方式以及订单状态

1.明确显示的结果    id,payment,status

2.结果来自于哪里  es_order

3.需要的条件   user_id=('李青青'的id)

4.这个条件需要的值来自于一个子查询

 user_id =(select id from es_user where realname='李青青')


以上说的子查询都是返回的是单行结果,因此使用了=的操作符,

其实我们可以使用>\>=\<\<=\<>\!=的操作符


例如,我们要编写sql语句,查询大于商品平均价格的商品id,名称,价格

select id,name,price from es_product
where price>(select avg(price) as 商品平均价格 from es_product)

但是有时子查询返回的结果可能不止一行

比如要查询一号订单下的所有商品id,商品名称和价格

我们使用=操作符的时候,会报一个错误



我们应进行这样的修改

将=操作符改为in,即

select id,name,price from es_product
where id in(select prod_id from es_orderdetail where order_id=1)

除了使用in我们还可以使用any,all,exists


另外我们需要查询商品表中前5条商品的id,商品名称以及上架时间

要实现这个需求,我们首先要知道有ROWNUM这个内容


知道了ROWNUM,SQL就出来了

select id,name,saledate from es_product where rownum<=5