• 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;

  • 相关阅读:
    Game的基本元素.[小糊涂的灵感]
    J2ME图书介绍 [小糊涂的灵感]
    j2me 这个论坛好一点.[小糊涂的灵感]
    Frame rate test for tilebased games 测试结果.[小糊涂的灵感]
    源码方式在ubuntu系统上安装ruby1.9.2
    模块全解======>>ruby的类是单继承生物、所以出现了module、实现了多继承
    在ubuntu下安装rails3.0
    在ubuntu下编写运行shell脚本
    在linux下开远程桌面访问windows的解决方法
    在命令行中打开sqlite的数据库
  • 原文地址:https://www.cnblogs.com/qianqian528/p/7815097.html
Copyright © 2020-2023  润新知