1017课后作业

1、找出所有从不订购任何东西的客户(提示: not in 外关联)

--customers表 
create table customers (
                        id   number       --用户id
                       ,name varchar2(10) --用户姓名
                       );
--插入数据                       
insert into customers values(1, 'joe');
insert into customers values(2, 'henry');
insert into customers values(3, 'sam');
insert into customers values(4, 'max');
--提交
commit;
--查询
select * from customers;

--orders表
create table orders (
                     order_id    number --订单id
                    ,customer_id number --顾客id
                    ,order_amt   number --订单金额
                    );
--插入                    
insert into orders values(111,3,300);
insert into orders values(222,1,50);
--提交
commit;
--查询
select * from orders;
select t1.id
      ,t1.name
from customers t1 
where t1.id not in(
                   select t.customer_id
                   from orders t
                  );
                  
select t1.id,t1.name
      ,t2.order_id
      ,t2.customer_id
      ,t2.order_amt
from customers t1 --zhubiao
left join orders t2 
       on t1.id = t2.customer_id
where t2.order_id is null;

2、查询只出现一次的最大数字

--my_numbers表
create table my_numbers (
                         num number
                        );
--插入数据                        
insert into my_numbers values (8);
insert into my_numbers values (8);
insert into my_numbers values (3);
insert into my_numbers values (3);
insert into my_numbers values (1);
insert into my_numbers values (4);
insert into my_numbers values (5);
insert into my_numbers values (6);
--提交
commit;
--查询
select * from my_numbers;
select max(t1.num)
from (
      select t.num
             --,count(1)
      from my_numbers t
      group by t.num
      having count(1) = 1
    ) t1;

3、

--cust_info表
create table cust_info (
                        cust_id   varchar2(20) --客户id
                       ,cust_name varchar2(10) --客户姓名
                       );
--插入数据                       
insert into cust_info values('00100010','张三');
insert into cust_info values('00100110','李四');
insert into cust_info values('00100210','王五');
insert into cust_info values('00100211','lee');
insert into cust_info values('00100201','sql');
--提交
commit;
--查询
select * from c;

—账户存款余额表
acct_id --账户号
cust_id --客户号
bal —存款余额

--acct_bal表
create table acct_bal (
                       acct_id varchar2(20) --账户id
                      ,cust_id varchar2(20) --客户id
                      ,bal     number       --存款余额 
                      );
--插入数据                      
insert into b values ('100010001001','00100010',100);
insert into b values ('100100100101','00100010',200);
insert into b values ('100011021001','00100110'100);
insert into b values ('102102100101','00100210',150);
insert into b values ('123014001001','00100211',200);
insert into b values ('150160108101','00100211',300);
--提交
commit;  
--查询
select * from b;

—答案
(1)请用一个sql写出当前总客户数及存款总金额
–客户总数是以 cust_info 这张表的为准
—方法:先过滤,其子查询结果集作为一个表,然后对该表进行聚合运算

select * from cust_info;
select * from acct_bal;

select count(distinct t1.cust_id)
      ,sum(t2.bal)
from cust_info t1 
left join acct_bal t2 
       on t1.cust_id = t2.cust_id;
     
select (
        select count(t.cust_id) 
        from cust_info t
       ) as count_cust
      ,(select sum(t1.bal) as sum_bal 
        from acct_bal t1
       )
      ,100
from dual;

(2)请用一个sql写出当前有存款余额的客户总数

select count(distinct t.cust_id) as count_cust
from acct_bal t 
where t.bal > 0;

4、

—学生成绩表-课程-教师表课后练习
select * from student;–学生表
select * from teacher;–教师表
select * from course;–课程表
select * from sc;–学生成绩表
查询每一门课程的课程编号、课程名称,该课程最高分,该课程最低分,该课程选修的人数

select t1.cno
      ,t1.cname
      ,max(t2.score) as max_score 
      ,min(t2.score) as min_score 
      ,count(1) as count_sno
from course t1 
inner join sc t2
        on t1.cno = t2.cno
group by t1.cno,t1.cname;

根据成绩表 sc 计算如下数据—子查询
学号 课程编号 成绩 这门课程的最高成绩 这门课程的最低成绩 这门课程的总成绩

select t.sno
      ,t.cno
      ,t.score
      ,t2.max_s
      ,t2.min_s
      ,t2.sum_s
from sc t
inner join (
            select t1.cno
                  ,max(t1.score) as max_s
                  ,min(t1.score) as min_s
                  ,sum(t1.score) as sum_s
            from sc t1 
            group by t1.cno
           ) t2 
        on t.cno = t2.cno;

5、思考题:
1 内关联和外关联的区别是什么:写法上的区别,数据上的区别

2 表关联过滤数据的条件写在 where 的后面和写在 on 的后面的区别是什么

3 谈谈自己多 group by 分组的理解

4 什么时候要用单列子查询,什么时候要用多行多列子查询

第二天 1、查询客户表,统计每个机构2000年之前开户、2000~2005开户(含头不含尾)、2005~2010开户(含头不含尾)、2010之后开户 展示字段:机构号、2000年之前开户、2000~2005年开户、2005~2010年开户、2010年之后开户 2、查询客户表,按年份统计,每年、每个机构开户占全年开户的占比 展示字段:年份、机构号、开户、开户占比百分比(百分比) 3、统计所有客户客户号、存款账户、2011.12.31日的存款余额、2011.12存款月日均、贷款账户、2011.12.31日的贷款余额、2011.12贷款月日均 备注:null置为0 第三天 1、统计所有客户的2011.12.31日的存款余额、存款比上日余额、存款比上月余额、、存款比上年余额 备注:存款比上日余额 = 2011.12.31日的存款余额-2011.12.30日的存款余额 存款比上月余额 = 2011.12.31日的存款余额-2011.11.30日的存款余额 存款比上年余额 = 2011.12.31日的存款余额-2010.12.31日的存款余额 只有2011.12.31这个日期可以写死,其他日期要通过2011.12.31这个日期来生成。 2、统计所有2011年存款年日均大于100的客户号、客户名称、存款账户、2011年年日均 第四天 1、统计所有2011年存款年日均和2011年贷款年日均都大于100的客户号、存款账户、2011年存款年日均、贷款账户、2011年贷款年日均 2、统计所有客户客户号、 存款标志(有存款账户的客户置为1、没存款账户的客户置为0)、 贷款标志(有贷款借据的客户置为1、没贷款借据的客户置为0)、 存款质量分类(2011年存款年日均>=10000置为优质、2011年存款年日均>=1000<10000 置为良好、2011年存款年日均=10000置为优质、2011年贷款年日均>=1000<10000 置为良好、2011年贷款年日均<1000置为普通)、 2011年贷款年日均 第五天 1、根据《事件表.xlsx》来建表,然后将excel中的据导入到目标表中 2、根据客户表、存款信息表、事件表,统计每个客户2017年的客户号、 交易账户客户下有多少个账户有交易就是多少)、 当年有交易的天(如果2017年有5天有过交易,则有交易天为5)、 当年有交易总月(如果2017的1、3、5月有交易,则有交易总月为3)、 最大的月交易总金额(按月统计交易金额,存放最大的月交易金额)、 最大月交易金额的月份(按月统计交易金额,存放交易金额最大的月份)、 年总交易金额、 年交易金额排名(按客户排名,如果总交易金额为0,则不参与排名,排名置为9999)、 年总手续费、 年总手续费排名(按客户排名,如果总手续费为0,则不参与排名,排名置为9999)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只会HelloWorld的华娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值