Welcome 微信登录

首页 / 数据库 / MySQL / Oracle数据库高级查询

在一个SQL语句中嵌套另外一个sql语句称为子查询而这个查询语句作为另一个查询语句它的条件,其中包含其他sql语句的这个sql语句称为父查询示例如下如果需要查询商品类别中为图书的所有商品id,名称,价格
  1. select id,name,price from es_product  
  2. where sort_id =(  
  3. select id from es_sort where sortname=  
  4. "图书" )
在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,status2.结果来自于哪里  es_order3.需要的条件   user_id=("李青青"的id)4.这个条件需要的值来自于一个子查询 user_id =(select id from es_user where realname="李青青")
以上说的子查询都是返回的是单行结果,因此使用了=的操作符,其实我们可以使用>>=<<=<>!=的操作符例如,我们要编写sql语句,查询大于商品平均价格的商品id,名称,价格
  1. select id,name,price from es_product  
  2. where price>(select avg(price) as 商品平均价格 from es_product)   
但是有时子查询返回的结果可能不止一行 比如要查询一号订单下的所有商品id,商品名称和价格我们使用=操作符的时候,会报一个错误

我们应进行这样的修改将=操作符改为in,即
  1. select id,name,price from es_product  
  2. where id inselect prod_id from es_orderdetail where order_id=1)
除了使用in我们还可以使用any,all,exists另外我们需要查询商品表中前5条商品的id,商品名称以及上架时间要实现这个需求,我们首先要知道有ROWNUM这个内容
知道了ROWNUM,SQL就出来了
  1. select id,name,saledate from es_product where rownum<=5  
需求继续升级,我们这次要查询最新上架的前五条商品的记录,很可能大家会这样写
但这是错误的,错误的原因是select的执行顺序它总是先执行where子句再执行order by语句而我们的要求是先对表的记录进行排序,再取前五条记录其思路如下
如果有排序,先把排序后的表当成一个虚拟表,再进行操作上述需求的SQL语句如下
  1. select id,name,saledate,rownum fromselect * from es_product order by saledate desc) where rownum<=5 
select id,name,saledate,rownum from(select * from es_product order by saledate desc) where rownum<=5切记rownum是动态生成的,在表物理中不存在,所以诸如saledate.rownum并不存在
  • 1
  • 2
  • 3
  • 4
  • 5
  • 下一页
【内容导航】
第1页:子查询第2页:分页查询
第3页:连接查询第4页:子查询和连接查询的综合案例
第5页:集合查询
探究Oracle分页查询利用dbstart和dbshut脚本自动启动和停止数据库的问题相关资讯      Oracle数据库高级查询  本文评论 查看全部评论 (0)
表情: 姓名: 字数