PostgreSQL 进阶 - 使用foreign key,使用 subqueries 插入,inner joins,outer joins

news/2024/7/9 22:43:43 标签: postgresql, 数据库

1. 使用foreign key 创建 table

CREATE TABLE orders(
order_id SERIAL PRIMARY KEY,
purchase_total NUMERIC,
timestamp TIMESTAMPTZ,
customer_id INT
REFERENCES customers(customer_id)
ON DELETE CASCADE);
  • “order_id”:作为主键的自增序列,使用 SERIAL 数据类型。
  • “purchase_total”:用于存储购买总额的数值类型。
  • “timestamp”:用于存储时间戳的 TIMESTAMPTZ 数据类型。
  • “customer_id”:用于存储指向“customers”表中“customer_id”的外键,使用 INT 数据类型。同时,定义了一个外键约束,指定了当“customers”表中对应的记录被删除时,与之相关的“orders”表中的记录也将被自动删除(使用 ON DELETE CASCADE)。
DELETE FROM customers
WHERE customer_id = 4
RETURNING *;
  • 用于从“customers”表中删除“customer_id”为4的记录。

2. 找出每个客户的交易总值

SELECT customer_id,
MAX(purchase_total)
AS top_order_amt
FROM orders
GROUP BY customer_id
ORDER BY top_order_amt DESC;
  • 按照“customer_id”分组,并找到每个客户的最大“purchase_total”值。
  • 使用“AS”关键字将最大“purchase_total”值的别名命名为“top_order_amt”。
  • 按照“top_order_amt”降序对结果集进行排序。

在这里插入图片描述

SELECT customer_id,
SUM(purchase_total::NUMERIC)
FROM orders
GROUP BY customer_id
ORDER BY sum DESC LIMIT 2;
  • 按照“customer_id”进行分组,并计算每个客户的“purchase_total”值的总和。
  • 在结果集中,它会显示客户ID以及对应的购买总额之和。
  • 它会按照计算出的购买总额之和进行降序排序,并只返回前两条记录(使用 LIMIT 2)。
    在这里插入图片描述

3. 使用 subqueries 插入

SELECT * FROM customers;

在这里插入图片描述

INSERT INTO orders(purchase_total, timestamp, customer_id)
VALUES('50.50', '2023-06-01 08:01:31.876335-07',
(SELECT customer_id FROM customers WHERE email='kdiamond@myemail.com'))
RETURNING *;

-使用子查询查找了与电子邮件为 ‘kdiamond@myemail.com’ 相对应的“customers”表中的“customer_id”值。

在这里插入图片描述

SELECT * FROM orders;

在这里插入图片描述

4. 处理重复的记录

SELECT * FROM bookmarks;

在这里插入图片描述

SELECT url, name, COUNT(*)
FROM bookmarks
GROUP BY url, name
HAVING COUNT(*) > 1;
  • 按照“url”和“name”分组,并统计每组中的记录数量。
  • 使用“HAVING”子句过滤出出现次数超过1次的记录组。
  • 最终返回“url”、“name”和对应的记录数量。
    在这里插入图片描述
SELECT * FROM bookmarks
WHERE id IN (
SELECT id FROM bookmarks
EXCEPT SELECT MAX(id)
FROM bookmarks
GROUP BY url, name, description)
ORDER BY url, name, description;

在这里插入图片描述

DELETE FROM bookmarks
WHERE id IN (
SELECT id FROM bookmarks
EXCEPT SELECT MAX(id)
FROM bookmarks
GROUP BY url, name, description)
RETURNING *;

在这里插入图片描述

SELECT * FROM bookmarks;

在这里插入图片描述

5. inner joins

在这里插入图片描述
在这里插入图片描述

SELECT o.order_id, o.purchase_total, c.email
FROM orders o
INNER JOIN customers c ON
o.customer_id = c.customer_id;
  • 内连接(INNER JOIN)是一种用于从两个或多个表中检索相关行的 SQL 查询。它基于两个表之间共享的值,将这些表中相匹配的行连接起来。内连接只返回两个表中共有的行,即满足连接条件的行。

在这里插入图片描述

6. outer joins

在这里插入图片描述
在这里插入图片描述

SELECT p.program_name,
COUNT(s.student_id) AS student_count
FROM programs p
LEFT OUTER JOIN students s ON
p.program_id = s.program_id
GROUP BY p.program_name;
  • 如果左表(programs表)中的行没有与右表(students表)中的行匹配,那么将会用 NULL 值填充右表中的列。
  • 左外连接(LEFT OUTER JOIN)是一种 SQL 连接操作,用于从两个表中检索相关行。左外连接返回左表中的所有行,以及右表中与左表匹配的行。如果右表中没有与左表匹配的行,则以 NULL 值填充右表中的列。这使得即使右表中没有匹配的行,左表中的所有行也会出现在结果集中。

在这里插入图片描述

7. 创建一个暂时的表格

CREATE TEMPORARY TABLE temp_customer_purchases AS
SELECT c.customer_id, c.email,
SUM(o.purchase_total) AS purchases
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.email;
  • 用于在数据库中创建一个临时表(temporary table),名为“temp_customer_purchases”。
  • 使用“INNER JOIN”根据“customer_id”将两个表中匹配的行进行连接。
SELECT * FROM temp_customer_purchases;

在这里插入图片描述


http://www.niftyadmin.cn/n/5148989.html

相关文章

4 Tensorflow图像识别模型——数据预处理

上一篇:3 tensorflow构建模型详解-CSDN博客 本篇开始介绍识别猫狗图片的模型,内容较多,会分为多个章节介绍。模型构建还是和之前一样的流程: 数据集准备数据预处理创建模型设置损失函数和优化器训练模型 本篇先介绍数据集准备&am…

0061【Edabit ★☆☆☆☆☆】【字符串模板:格式化1】Format I: Template String

0061【Edabit ★☆☆☆☆☆】【字符串模板:格式化1】Format I: Template String language_fundamentals strings Instructions Write a template string according to the following example: Examples const a "John"; const b "Joe"; co…

备忘录在电脑里叫什么?Win10系统自带的备忘录在哪打开?

对于每天都需要使用电脑来办公的职场人士来说,能够随手在电脑桌面上记录工作笔记、常用工作资料、工作注意事项等内容是非常有必要的。但是如果想要实现在电脑上随手记录事情,就需要先找到一款类似于备忘录或便签软件那样的记事软件。 那么备忘录在电脑…

生成第一个 Blazor 应用

前言:博主文章仅用于学习、研究和交流目的,不足和错误之处在所难免,希望大家能够批评指出,博主核实后马上更改。 概述:Blazor 是一个使用 Blazor 生成交互式客户端 Web UI 的框架使用 C# 创建丰富的交互式 UI。共享使…

FSCTF2023-MISC部分WP

FSCTF2023-MISC部分WP 前言:MISC:[FSCTF 2023]Simple Encryption:[FSCTF 2023]萧河:[FSCTF 2023]base套:[FSCTF 2023]行不行啊细狗:[FSCTF 2023]ez-osint:[FSCTF 2023]为什么不换换思路捏:[FSCT…

Pytorch从零开始实战08

Pytorch从零开始实战——YOLOv5-C3模块实现 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——YOLOv5-C3模块实现环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook,使用Python3.8&#xff0c…

Mybatis 概述

一、Mybatis 概述 1.Mybatis是什么? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0…

[笔记] 汉字判断

参考博客&#xff1a;如果判断一个字符是西文字符还是中文字符 结论&#xff1a; 汉字转数字后&#xff0c;会占两位字符位&#xff0c;两位都是负数。 参考下面代码 输入&#xff1a;你 输出&#xff1a;01 #include<bits/stdc.h> using namespace std; int main() {cha…