Oracle数据库-----------------综合实战:DML&DDL(数据操作)

关于Oracle数据的学习记录:

四十三、综合实战:DML&DDL(数据操作)
3、用SQL语句完成下列查询:
(1)、求购买了供应商“宝洁”产品的所有顾客;
**确定要使用的数据表
|-customer表:顾客信息;
|-product表:供应商信息;
|-purchase表:需要连接商品和顾客信息
**确定已知的关联字段  
第一步:找到供应商“宝洁”提供的所有商品编号
SELECT productid
FROM product
WHERE provider='宝洁';
第二步:根据商品编号查询出所有购买过此商品的顾客编号
SELECT customerid
FROM purchase
WHERE productid IN(
    SELECT productid
    FROM product
    WHERE provider='宝洁';
);
第三步:有了编号,查询顾客表就可以查询顾客详细信息
SELECT DISTINCT *
FROM customer
WHERE customerid IN(
    SELECT customerid
    FROM purchase
    WHERE productid IN(
        SELECT productid
        FROM product
        WHERE provider='宝洁';
    )
);

(2)、求购买的商品包含了顾客"Dennis"所购买的所有商品的顾客(姓名)  
分析:需要知道顾客“Dennis”到底买过哪些商品,可以通过查询实现,假设就让它显示出所有的购买的商品编号
SELECT p.productid
FROM purchase p
WHERE p.customerid=(
    SELECT customerid
    FROM customer WHERE name='Dennis'
);
此时经过分析,发现该用户购买了三个商品(M01,M05,M08),只要其他用户购买的商品同时包含有这3个内容,就认为他满足了条件要求
现在如果使用IN表示只要包含一个就可以满足条件,而现在的要求是三个都满足,只有包含这三个内容的数据才可以显示(不包含“Dennis”顾客信息)
现在迫切需要解决的问题:如果都满足了条件可以出来,如果不满足信息不能够显示出来,这需要对顾客信息进行一个循环的判断,如果想要实现这样一个要求,使用“NOT EXISTS()”判断
EXISTS()操作
IN操作是进行一个范围的验证,并且IN要求是一个数值,IN只是针对于一个数据列的验证,而EXISTS是针对于一个数据行的验证,并且EXISTS在验证的时候,所有的数据行信息都要进行验证
范例:验证通过
SELECT * FROM emp WHERE EXISTS(
    SELECT 1 FROM dual WHERE 1=1);
使用EXISTS之后相当于将emp表的每行记录都分别取出来与子查询的结果进行比较,现在的程序只是判断子查询里面是否有数据返回,如果有数据返回,那么比较就通过,当前行的数据就自动显示
范例:验证不通过
SELECT * FROM emp WHERE EXISTS(
    SELECT 1 FROM dual WHERE 1=2);
现在由于子查询之中没有任何的结果返回,所以EXISTS会认为不存在任何的结果,那么每一行数据进行判断的时候不满足条件,就不显示了

问题解决:可以使用EXISTS尽心个判断,判断是否有满足条件的内容出现,如果没有满足条件的内容,那么返回的就是null,如果是null,就不显示数据
SELECT * FROM customer ca
WHERE [NOT] EXISTS(是否可以匹配的查询);
下面完成一个判断
第一点:判断C02和C01的购买信息
SELECT productid FROM purchase WHERE customerid='C01';
SELECT productid FROM purchase WHERE customerid='C02';
现在第一行记录返回了"M01","M05","M08",第二行查询返回了"M02","M06",如果这两个记录做了一个差:
SELECT productid FROM purchase WHERE customerid='C01'
    MINUS
SELECT productid FROM purchase WHERE customerid='C02';
差值的结果是"M01","M05","M08",那么接着来一个交运算
SELECT productid FROM purchase WHERE customerid='C01'
    MINUS
SELECT productid FROM purchase WHERE customerid='C02'
    INTERSECT
SELECT productid FROM purchase WHERE customerid='C01';
第二点:判断C03和C01的信息
将C01和C03的购买记录做一个差集
SELECT productid FROM purchase WHERE customerid='C01'
    MINUS
SELECT productid FROM purchase WHERE customerid='C03';
最终没有任何记录,因为C03购买过了C01购买过的所有内容,随后再做一个交集(上面的结果只剩一个null)
SELECT productid FROM purchase WHERE customerid='C01'
    MINUS
SELECT productid FROM purchase WHERE customerid='C03'
    INTERSECT
SELECT productid FROM purchase WHERE customerid='C01';
未选定行  这是我们最终需要的记录

实现查询:
SELECT * FROM customer ca
WHERE NOT EXISTS((
    SELECT p1.productid
    FROM purchase p1
    WHERE p1.customerid=(
        SELECT customerid
        FROM customer
        WHERE name='Dennis'))
        MINUS (
        SELECT p2.productid
        FROM purchase p2
        WHERE p2.customerid=ca.customerid)        
) AND ca.name<>'Dennis';

3、求牙膏卖出数量最多的供应商
**确定要使用的数据表
|-product表:找到牙膏类型的商品编号;
|-purchase表:找到所有的购买记录;
**确定已知的关联字段
|-商品与购买记录:product.productid=purchase.productid
第一步:将商品表与购买记录表做多表查询
SELECT pro1.provider,p1.quantity
FROM purchase p1,product pro1
WHERE p1.productid=pro1.productid
    AND pro1.category='牙膏';
第二步:统计每个供应商的销售总量
SELECT pro1.provider,SUM(p1.quantity) sum
FROM purchase p1,product pro1
WHERE p1.productid=pro1.productid
    AND pro1.category='牙膏'
GROUP BY pro1.provider;
第三步:如果要查询总量最高,一定是要使用统计函数嵌套,但是嵌套后的统计查询里面不能再出现分组字段
SELECT pro1.provider,SUM(p1.quantity) sum
FROM purchase p1,product pro1
WHERE p1.productid=pro1.productid
    AND pro1.category='牙膏'
GROUP BY pro1.provider
HAVING SUM(p1.quantity)=(
    SELECT MAX(SUM(p1.quantity))
    FROM purchase p1,product pro1
    WHERE p1.productid=pro1.productid
        AND pro1.category='牙膏'
GROUP BY pro1.provider
);

4、将所有的牙膏商品单价增加10%
UPDATE product SET unitprice=unitprice*1.1 WHERE category='牙膏';
5、删除从未被购买的商品记录
如果没有商品的编号,那么就删除
DELETE FROM product WHERE productid NOT IN(
    SELECT productid FROM purchase) ;

总结:查询比更新麻烦

猜你喜欢

转载自blog.csdn.net/amuist_ting/article/details/80778523
今日推荐