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

news2024/12/24 12:52:23

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.coloradmin.cn/o/1168173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch集群环境搭建

1、准备三台服务器 这里准备三台服务器如下: IP地址主机名节点名192.168.225.65linux1node-1192.168.225.66linux2node-2192.168.225.67linux3node-3 2、准备elasticsearch安装环境 (1)编辑/etc/hosts(三台服务器都执行) vim /etc/hosts 添加如下内…

uniapp subNvue 写的视频播放

文件下载地址 https://download.csdn.net/download/weixin_47517731/88500016https://download.csdn.net/download/weixin_47517731/88500016 1:在pages.json中配置视频播放页面 {/* 视频详情页面 */"path": "pages/detail-video/detail","style&q…

一键解决 AirPods Pro 的沙沙声

每次我都以为是因为耳机受潮了,但每次这个方法都有效 [笑哭] 1、打开苹果手机,蓝牙连接 AirPods Pro 后,打开“设置”找到: 2、点进去,点击“关闭”: 瞬间,整个世界安静了!

[已解决]AttributeError: module ‘numpy‘ has no attribute ‘float‘

1、问题: AttributeError: module numpy has no attribute float np.float was a deprecated alias for the builtin float. To avoid this error in existing code, use float by itself. Doing this will not modify any behavior and is safe. If you specifica…

基本微信小程序的拼车自助服务小程序-网约车拼车系统

项目介绍 拼车自助服务小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与拼车自助服务小程序的设计与开发的实际需求相结合,讨论了拼车自助服务小程序的设计与开发的使用。 开发环境 开发说明:前…

虹科荣誉 | 喜讯!虹科成功入选“广州首届百家新锐企业”!!

文章来源:虹科品牌部 阅读原文:虹科荣誉 | 喜讯!虹科成功入选“广州首届百家新锐企业”!! 近日,由中共广州市委统战部、广州市工商业联合会、广州市工业和信息化局、广州市人民政府国有资产监督管理委员会…

第G7周:Semi-Supervised GAN 理论与实战

🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍦 参考文章:365天深度学习训练营-第G7周:Semi-Supervised GAN 理论与实战(训练营内部成员可读) 🍖 原作者:K同学啊|接…

非递归方法实现二叉树前、中、后序遍历

文章目录 非递归实现二叉树前、中、后序遍历一、非递归实现前序遍历1.思路2.代码 二、非递归实现二叉树的中序遍历1.思路2.代码 三、非递归实现二叉树的后序遍历1.思路2.代码 非递归实现二叉树前、中、后序遍历 一、非递归实现前序遍历 1.思路 前序遍历的顺序是 :根…

【Linux】僵尸进程、孤儿进程的理解与验证

僵尸进程 概念 僵尸进程(Zombie Process)是指一个已经终止执行的子进程,但其父进程尚未调用 wait() 或 waitpid() 函数来获取子进程的退出状态。 Linux 中,僵尸进程会保留一些资源,如进程 ID、进程表项和一些系统资源…

C++11 initializer_list 轻量级初始化列表的使用场景(让自定义类可以用初始化列表的形式来实例化对象)

initializer_list 是 C11 中的一个特性&#xff0c;它允许你使用花括号 {} 中的值列表来初始化容器或数组。通常用于初始化标准库容器&#xff0c;比如 std::vector、std::set、std::map 以及数组。 场景一&#xff1a;用初始化列表初始化容器 std::vector<int> arr {…

JavaScript基础知识点速通

0 前言 本文是近期我学习JavaScript网课的笔记&#xff0c;一是方便自己速查回忆&#xff0c;二是希望帮到同样有需求的朋友们。 1 介绍 1.1 基本情况 JavaScript是一种编程语言&#xff0c;运行在客户端&#xff08;浏览器&#xff09;上&#xff0c;实现人机交互效果&…

【扩散模型】不同组件搭积木,获得新模型

学习地址&#xff1a; https://github.com/huggingface/diffusion-models-class/tree/main/unit3 VAE The Tokenizer and Text Encoder UNet In-Painting 例如&#xff1a;基于contrlnet做的校徽转图片

vue项目使用vite设置proxy代理,vite.config.js配置,解决本地跨域问题

vue3vite4项目&#xff0c;配置代理实现本地开发跨域问题 非同源请求&#xff0c;也就是协议(protocol)、端口(port)、主机(host)其中一项不相同的时候&#xff0c;这时候就会产生跨域 vite的proxy代理和vue-cli的proxy大致相同&#xff0c;需要在vite.config.js文件中配置&…

一、Linux开机、重启、关机和用户登录注销

1.【关机】 shutdown shutdown now 表示立即关机 shutdown -h now 表示立即关机 shutdown -h 1 表示1分钟后关机 halt 用来关闭正在运行的Linux操作系统 2.【重启】 shutdown -r now 表示立即重启 reboot 重启系统 sync …

设计模式之装饰模式--优雅的增强

目录 概述什么是装饰模式为什么使用装饰模式关键角色基本代码应用场景 版本迭代版本一版本二版本三—装饰模式 装饰模式中的巧妙之处1、被装饰对象和装饰对象共享相同的接口或父类2、当调用装饰器类的装饰方法时&#xff0c;会先调用被装饰对象的同名方法3、子类方法与父类方法…

中国人民大学与加拿大女王大学金融硕士—重要的是,你一直在努力

人虽然生下来就分三六九等&#xff0c;不同的人过着不同的生活&#xff0c;我的生活没办法选择&#xff0c;我只能尽我所能的让自己变得优秀。中国人民大学与加拿大女王大学金融硕士是我们无论怎样都可以变优秀的优质渠道。V13146152701 那么我们为什么要读研&#xff0c;读研…

串口通信代码整合1

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

OLE DB 访问接口所需的(最大)数据长度为 18,但返回的数据长度为 6。

sqlserver查询oracle链接服务器视图,报错 给最终返回的字符串进行类型转换,字符串大小按返回值最大的那个oracle源本字段类型长度 aaaaaa AS yljgbmcast(aaaaaa AS varchar(10)) AS yljgbm

Proteus仿真--1602LCD显示仿手机键盘按键字符(仿真文件+程序)

本文主要介绍基于51单片机的1602LCD显示仿手机键盘按键字符&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中左下角12个按键模拟仿真手机键盘&#xff0c;使用方法同手机键一样&#xff0c;长按自动跳动切换键值&#xff0c;松手后确认选择&#xff…