记录在Oracle中查询按主表分组的记录(oracle中按主表查询)
在Oracle中查询按主表分组的记录
当我们需要查询主表下的子表记录时,往往需要按照主表的某个字段进行分组查询。在Oracle中,我们可以使用GROUP BY语句来实现按主表分组查询操作。
GROUP BY语句的基本语法如下:
SELECT
column_name(s)
FROM
table_name
WHERE
condition
GROUP BY
column_name(s)
HAVING
condition;
其中,column_name(s)表示需要查询的字段;table_name为查询的表名;condition为查询条件;column_name(s)为分组的字段;HAVING子句为分组后的过滤条件。
下面以一个订单订单详情为例来演示如何在Oracle中进行按主表分组查询。
我们需要建立两个表,分别为:
CREATE TABLE orders (
order_id NUMBER(5) PRIMARY KEY,
customer_name VARCHAR2(50) NOT NULL,
order_date DATE NOT NULL
);
CREATE TABLE order_detls (
detl_id NUMBER(5) PRIMARY KEY,
order_id NUMBER(5) NOT NULL,
product_name VARCHAR2(50) NOT NULL,
unit_price NUMBER(10,2) NOT NULL,
quantity NUMBER(5) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id)
);
在orders表中,我们记录了订单id,客户姓名和下单时间;在order_detls表中,我们记录了订单详情id,订单id,商品名称,商品单价和商品数量,并且通过外键约束将两个表关联起来。
接下来,我们往两个表中插入测试数据:
INSERT INTO orders VALUES (1, ‘张三’, TO_DATE(‘2022-01-01’, ‘YYYY-MM-DD’));
INSERT INTO orders VALUES (2, ‘李四’, TO_DATE(‘2022-01-02’, ‘YYYY-MM-DD’));
INSERT INTO orders VALUES (3, ‘王五’, TO_DATE(‘2022-01-03’, ‘YYYY-MM-DD’));
INSERT INTO order_detls VALUES (1, 1, ‘商品A’, 10.00, 2);
INSERT INTO order_detls VALUES (2, 1, ‘商品B’, 20.00, 3);
INSERT INTO order_detls VALUES (3, 2, ‘商品C’, 30.00, 4);
INSERT INTO order_detls VALUES (4, 3, ‘商品D’, 40.00, 5);
INSERT INTO order_detls VALUES (5, 3, ‘商品E’, 50.00, 6);
这里我们插入了3个订单和5个订单详情记录,并且针对每个订单插入了不同的订单详情。
接着,我们可以使用GROUP BY语句来查询每个订单的总金额:
SELECT
o.order_id,
o.customer_name,
sum(od.unit_price * od.quantity) AS total_amount
FROM
orders o
JOIN order_detls od ON o.order_id = od.order_id
GROUP BY
o.order_id,
o.customer_name;
这里我们使用了JOIN语句将两个表关联起来,并使用GROUP BY语句按照订单id和客户姓名进行分组查询。最后我们使用sum函数计算每个订单的总金额,并将结果显示出来:
ORDER_ID CUSTOMER_NAME TOTAL_AMOUNT
1 张三 70.00
2 李四 120.00
3 王五 490.00
可以看到,我们成功地查询到了每个订单的总金额,并且按照订单id和客户姓名进行了分组。
通过上面的例子,我们可以发现在Oracle中进行按主表分组查询操作非常简单。如果我们需要查询某个主表下的所有子表记录,并且需要按照主表的某个字段进行分组,那么我们可以使用GROUP BY语句来实现。
参考代码:
CREATE TABLE orders (
order_id NUMBER(5) PRIMARY KEY,
customer_name VARCHAR2(50) NOT NULL,
order_date DATE NOT NULL
);
CREATE TABLE order_detls (
detl_id NUMBER(5) PRIMARY KEY,
order_id NUMBER(5) NOT NULL,
product_name VARCHAR2(50) NOT NULL,
unit_price NUMBER(10,2) NOT NULL,
quantity NUMBER(5) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id)
);
INSERT INTO orders VALUES (1, ‘张三’, TO_DATE(‘2022-01-01’, ‘YYYY-MM-DD’));
INSERT INTO orders VALUES (2, ‘李四’, TO_DATE(‘2022-01-02’, ‘YYYY-MM-DD’));
INSERT INTO orders VALUES (3, ‘王五’, TO_DATE(‘2022-01-03’, ‘YYYY-MM-DD’));
INSERT INTO order_detls VALUES (1, 1, ‘商品A’, 10.00, 2);
INSERT INTO order_detls VALUES (2, 1, ‘商品B’, 20.00, 3);
INSERT INTO order_detls VALUES (3, 2, ‘商品C’, 30.00, 4);
INSERT INTO order_detls VALUES (4, 3, ‘商品D’, 40.00, 5);
INSERT INTO order_detls VALUES (5, 3, ‘商品E’, 50.00, 6);
SELECT
o.order_id,
o.customer_name,
sum(od.unit_price * od.quantity) AS total_amount
FROM
orders o
JOIN order_detls od ON o.order_id = od.order_id
GROUP BY
o.order_id,
o.customer_name;