【SQL刷题】三个表查询时使用inner joinVS三表直接连接查询

返回顾客名称和相关订单号以及每个订单的总价【三表直接选择对应字段】

牛客 SQL97 返回顾客名称和相关订单号以及每个订单的总价
题:除了返回顾客名称和订单号,返回 Customers 表中的顾客名称(cust_name)和Orders 表中的相关订单号(order_num),添加第三列 OrderTotal,其中包含每个订单的总价,并按顾客名称再按订单号对结果进行升序排序。
在这里插入图片描述

SELECT
    a.cust_name,
    c.order_num,
    SUM(c.quantity * c.item_price) AS OrderTotal
FROM
    Customers a,
    Orders b,
    OrderItems c
WHERE
    a.cust_id = b.cust_id
    and b.order_num = c.order_num
GROUP BY
    a.cust_name,
    b.order_num
ORDER BY
    a.cust_name,
    b.order_num

这里GROUP BY需要两个字段,如果只有一个字段呢??
----按照客户编号分组的原因:每个顾客对应着一份订单。我们按照订单分组求总价,自然而然也要按照顾客分组,求出每个订单对应的顾客;
—更直观的讲,其实就是因为不按照顾客分组就不能在select中选择顾客姓名,所以被迫要用顾客分组。

group by和select的一些总结:

如果在有group by操作中,select后面接的结果集字段只有两种:要么就只有group by后出现的字段,要么就是group by后出现的字段+聚合函数的组合

(常用的五种聚合函数:min()求列中最小数值,max()求列中最大数值,avg()求平均值,sum()求列中字段对应数值的总和,count()求列的总条数)

一个错误例子来看

SELECT is_pause,user_id,pause_type,count(stu_id)
FROM call_task
WHERE is_pause='1'
GROUP BY is_pause,pause_type    //在分组中并没有user_id这个字段

如下图虽然pause_type和学生总数这两栏数据没有问题,但是user_id那一栏显示明显不对。为什么会出现这种情况呢???因为我们在分组的时候只把is_pause和pause_type这两个字段当做分组条件所以SQL只会对原数据库中的这两列的数据进行分组操作,其他列并不会参与到这个分组过程中(注意!!),但是在显示结果集时你非要让它显示没有进行分组操作的列,最后它采取的方式是选取满足where和分组条件时出现的第一组数据的user_id。

在这里插入图片描述

其实分组的思想很简单:就拿上面例子来说,把分组条件想成一个二维数组,满足这个数组就将个数加1。(is_pause,pause_type)就是一个简单的二维数组,结合筛选条件和数据库中的数据来看,(is_pause,pause_type)就分成下面三种情况:(1,2),(1,4),(1,5),遇到满足数组情况的count(stu_id)数值加1。同理,如果你的分组条件是3个,4个或者更多,就按照这个思路想。
参考自:博客

确定最佳顾客的另一种方式【INNER JOIN==直接在3表中选择】

牛客 SQL100 确定最佳顾客的另一种方式(二)
题:编写 SQL 语句,返回订单总价不小于1000 的客户名称和总额(OrderItems 表中的order_num)。
提示:需要计算总和(item_price 乘以 quantity)。按总额对结果进行排序,请使用INNER JOIN 语法。
在这里插入图片描述

SELECT
    cust_name,
    total_price
FROM
    Customers c
    INNER JOIN Orders o ON c.cust_id = o.cust_id
    INNER JOIN (
        SELECT
            order_num,
            SUM(item_price * quantity) AS total_price
        FROM
            OrderItems
        GROUP BY
            order_num
        HAVING
            total_price >= 1000
    ) t ON t.order_num = o.order_num
ORDER BY
    t.total_price ASC
SELECT
    cust_name,
    SUM(item_price * quantity) AS total_price
FROM
    OrderItems a,
    Orders b,
    Customers c
WHERE
    a.order_num = b.order_num
    and b.cust_id = c.cust_id
GROUP BY
    cust_name
HAVING
    sum(item_price * quantity) >= 1000
order by
    sum(item_price * quantity)

猜你喜欢

转载自blog.csdn.net/weixin_43629813/article/details/129483492