oracle关联分组查询,oracle中关联查询、分组查询

高级查询

1.关联查询

作用:可以跨越多表查询

--查询出员工的名字和他所在部门的的名字

//古老的写法

select first_name,name from s_emp,s_dept where s_emp.dept_id = s_dept.id;

//现在的写法

select e.first_name,s.name from s_emp e join s_dept s on e.dept_id = s.id;

语法:

select 列,列,列

from 表1 join 表2

on 表1外键=表2主键

案例:

-- 找出Sales 部门的所有员工

select * from s_emp e

join s_dept d on e.dept_id = d.id

where d.name = ‘Sales‘;

-- 找出在 Asia 地区工作的员工

select * from s_emp e

join s_dept d on e.dept_id=d.id

join s_region r on d.region_id=r.id

where r.name=‘Asia‘;

--找出客户‘Hamada Sport‘ 的所有订单号、费用、下订日期

select o.id,o.total,o.date_ordered from s_ord o

join s_customer c on o.customer_id = c.id

where c.name = ‘Hamada Sport‘;

--找出所有在‘Asia‘客户的信息

select * from s_customer s

join s_ord o on s.id = o.customer_id

join s_region r on s.region_id = r.id

where r.name = ‘Asia‘;

练习:

--查询出客户名字叫unisports的订单信息

select o.* from s_customer s

join s_ord o on s.id = o.customer_id

where lower(s.name) = lower(‘unisports‘);

--查询出设在北美的的部门名称

select s.name from s_dept s

join s_region r on s.region_id = r.id

where r.name=‘North America‘;

--查询出在北美工作的员工姓名、工资、入职日期和职位

select s.first_name,s.salary,s.start_date,s.title from s_emp s

join s_dept d on d.id = s.dept_id

join s_region r on r.id = d.region_id

where r.name=‘North America‘;

--查询出所有客户名,及其订单号

select s.name,o.id from s_customer s

left join s_ord o on s.id = o.customer_id;

2.外联接

左外联[left outer join]

以关联的左边为准,即使右边没有与之匹配的记录,则左边的记录也要

出现在结果集中,右边全部以NULL值显示。

右外联[right outer join]

以关联的右边为准,即使左边没有与之匹配的记录,则右边的记录也要

出现在结果集中,左边全部以NULL值显示。

补充 :全外联,交叉外联

--查询出所有客户名,及其订单号

select s.name,o.id from s_customer s

left join s_ord o on s.id = o.customer_id;

--查询所有订单号,订单费用以及订单所对应的客户名

select c.name,o.id,o.total from s_customer c

right join s_ord o on o.customer_id = c.id;

--找出Womansport所购买的订单信息(订单编号,费用,支付方式)

select o.id,o.total,o.payment_type from s_customer c

left join s_ord o on o.customer_id = c.id

where lower(c.name) = lower(‘Womansport‘);

--找出Operations部门工作的员工名,工资,并且按照工资降序排列

select s.first_name,s.salary,d.name from s_emp s

left join s_dept d on d.id=s.dept_id

where lower(d.name)=lower(‘Operations‘)

order by s.salary desc;

自关联:

-- 查询出所有的员工名以及员工的上司名

select s.first_name,e.first_name from s_emp s

left join s_emp e on s.manager_id=e.id;

----

注:关联的条件不一定总是做等值比较的。

==========================

3分组查询

定义:利用内置的分组函数来查询

所谓分组,就是看待数据的“角度”不同。

也就是把某类值相同的看做一组。

语法:

select 列名,组函数(列名)...from 表名

where 条件

group by 列

having 字句

order by 列

分组函数:

SUM([distinct] 列|表达式|值) 求和

AVG([distinct] 列|表达式|值) 求平均值

MAX(列|表达式|值) 求最大值

MIN(列|表达式|值) 求最小值

COUNT([distinct] 列|*) 求个数(包含null)

如:

-- 找出员工的最高、最低、平均、以及工资总和

select max(salary),min(salary),avg(salary),sum(salary) from s_emp;

-- 找出各部门员工的最高、最低、平均、以及工资总和

select dept_id,max(salary),min(salary),avg(salary),sum(salary) from s_emp

group by dept_id

order by dept_id;

-- 找出41,42,50部门员工的最高、最低、平均、以及工资总和

select dept_id,max(salary),min(salary),avg(salary),sum(salary) from s_emp

group by dept_id

having dept_id in (41,42,50)

order by dept_id;

注意1:只有出现在group by 后面的列[用来做为分组条件的列],才有资格

写在SELECT的后面,除非使用组函数进行修饰。

注意2:having 和where 都是条件

区别:

WHERE 子句中是不能使用 组函数的,因为它在GROUP BY 之前。

但是,HAVING 子句中可以使用组函数,因为它在GROUP BY 之后。

-- 统计各个职称中工资高于1100的各有多少人。

select count(*) from s_emp where salary >1100

group by title;

-- 找出订单数量超过>=2个的客户

select c.name

from s_customer c join s_ord o on o.customer_id=c.id

group by c.name

having count(o.id)>=2;

-- 统计共计多少个员工

select count(id) from s_emp;

-- 统计共计多少个职称[不能重复]

select count(distinct title) from s_emp;

--练习:

--1.找出超过(含)4个员工的部门id及部门名称

select d.id,d.name,count(*) from s_emp e

left join s_dept d on e.dept_id=d.id

group by d.id,d.name

having count(*)>=4;

--2.找出订单总费用超过10000元的客户

select c.name,o.total from s_ord o right join s_customer c on o.customer_id=c.id

where o.total>10000

group by c.name,o.total;

--3.统计各区域的客户数量,按它的降序排序

select count(c.name),r.id from s_customer c join s_region r on c.region_id=r.id

group by r.id

order by count(c.name) desc;

--4.统计各经理的所管理的员工数

select s.manager_id,count(s.first_name) from s_emp s left join s_emp e on s.manager_id=e.id

group by s.manager_id;

--5.统计订单中各种支付的费用

select sum(total),payment_type from s_ord

group by payment_type;

oracle中关联查询、分组查询

标签:利用   部门   外键   显示   join   date   min   asi   ==

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:http://www.cnblogs.com/qianqian528/p/7815097.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值