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

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.mzph.cn/news/129282.shtml

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

相关文章

学习笔记二十八:K8S控制器Daemonset入门到企业实战应用

DaemonSet控制器:概念、原理解读 DaemonSet概述DaemonSet工作原理:如何管理PodDaemonset典型的应用场景DaemonSet 与 Deployment 的区别DaemonSet资源清单文件编写技巧 DaemonSet使用案例:部署日志收集组件fluentdDaemonset管理pod&#xff1…

nexus搭建npm私有镜像

假设有一个nexus服务,地址为: http://10.10.33.50:8081/ 创建存储空间 登录后创建存储空间,选择存储类型为File,并设置空间名称为 npm-private 创建仓库类型 2.1 创建hosted类型仓库 创建一个名为 npm-hosted 的本地类型仓库 2.…

天空卫士在全球和中国两大报告中被Gartner列为推荐和代表性供应商

DLP连续五年被Gartner 列为推荐厂商的理由 Gartner2023年9月份发布的《Gartner全球企业数据防泄露市场指南》中,天空卫士被列为DLP领域代表供应商,包括EDLP、IDLP和云原生DLP。 这已经是天空卫士第五次入选《Gartner全球企业数据防泄露市场指南》。天空…

Java基础之类型(内涵面试题)

目录 一、自动类型转换: 二、强制类型转换: 1.强制类型转换可能造成数据丢失(溢出)。 2.浮点型强转成整型,直接丢掉小数部分,保留整数部分返回。 三、自增、自减(、--)有关面试题…

relectron框架——打包前端vue3、react为pc端exe可执行程序

文章目录 ⭐前言⭐搭建Electron打包环境💖 npm镜像调整💖 初始化项目💖 配置index.js ⭐打包vue3⭐打包react⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于使用electronjs打包前端vue3、react成exe可执行程序。…

[创业之路-85]:创业公司如何办理云服务器(PaaS)

目录 一、云服务 1.1 云服务器类型 1.2 云服务案例 二、搭建云服务器的基本步骤 二、云服务的架构(架构) 2.1 层次架构 2.2 云平台统一管理功能 2.3 管理工具 一、云服务 1.1 云服务器类型 云服务(Cloud Services)是一种…

【POI-EXCEL-下拉框】POI导出excel下拉框数据太多导致下拉框不显示BUG修复

RT 最近在线上遇到一个很难受的BUG,我一度以为是我代码逻辑出了问题,用了Arthas定位分析之后,开始坚定了信心:大概率是POI的API有问题,比如写入数据过多。 PS:上图为正常的下拉框。但是,当下拉…

微信小程序设计之页面文件pages

一、新建一个项目 首先,下载微信小程序开发工具,具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后,注册小程序账号,具体注册方法,可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…

【LeetCode刷题-链表】--146.LRU缓存

146.LRU缓存 方法一:哈希表双向链表 使用一个哈希表和一个双向链表维护所有在缓存中的键值对 双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久使用的哈希表即为普通的哈希映射&#xff0…

IntelliJ IDEA 安装mybaits当前运行sql日志插件在线与离线安装方法

先安装好idear 去网上找找这个安装包下载下来,注意版本要完全一致! 比如: https://www.onlinedown.net/soft/1233409.htm手动安装离线插件方法举例 提前下载好插件的安装包 可以去网上下载这个安装包 搜索离线安装包的资源,包…

Java与Redis的集成以及Redis中的项目应用

一、Java连接Redis Redis与MySQL都是数据库&#xff0c;java操作redis其实跟操作mysql的过程是一样的。 1.1 导入依赖 打开IDEA&#xff0c;进入Java项目&#xff0c;导入pom依赖&#xff0c;代码如下&#xff1a; <dependency><groupId>redis.clients</gro…

使用OBS Browser+访问华为云OBS存储【Windows】

背景 项目中使用华为云 S3 存储,java 代码中通过华为云 OBS 提供的esdk-obs-java 来访问文件。 但是,通过 JAVA SDK 方式不太方便运维,所以我们需要一款可视化的客户端软件。 华为云 OBS 自身也提供了一款客户端软件,名为 OBS Browser+。 OBS Browser+简介 OBS Browse…

摩托车商家做展示预约小程序的作用

摩托车与电动车是人们短距离出行的主要工具&#xff0c;而其使用寿命一般是3年左右及以上、一家可能有多个&#xff0c;市场人群庞大且复购属性强&#xff0c;所以其经营商家也非常多。 如今互联网深入&#xff0c;在品牌宣传、客户获取、信息承载、营销等方面需要车辆经营商家…

网络取证-Tomcat-简单

题干&#xff1a; 我们的 SOC 团队在公司内部网的一台 Web 服务器上检测到可疑活动。为了更深入地了解情况&#xff0c;团队捕获了网络流量进行分析。此 pcap 文件可能包含一系列恶意活动&#xff0c;这些活动已导致 Apache Tomcat Web 服务器遭到破坏。我们需要进一步调查这一…

若依笔记(四):代码生成器

已知使用MyBatisPlus代码生成器可以自动生成Entity、Mapper、Service、Controller代码&#xff0c;前提是数据库中有数据表&#xff0c;生成pojo类以及对于该数据表的增删改查命令的代码&#xff0c;若依更进一步能选择表后生成代码、预览、下载&#xff0c;同时可以生产前端代…

使用 C# 在Word中插入图表

Word中的图表功能将数据可视化地呈现在文档中。这为展示数据和进行数据分析提供了一种方便且易于使用的工具&#xff0c;使作者能够以直观的方式传达信息。要通过C#代码来实现在Word中绘制图表&#xff0c;可以借助 Spire.Doc for .NET 控件&#xff0c;具体操作参考下文。 目录…

初学Redis简介以及入门

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这…

详解Java经典数据结构——HashMap

Java 的 HashMap 是一个常用的基于哈希表的数据结构&#xff0c;它实现了 Map 接口&#xff0c;可以存储键值对。下面我们进行详细介绍&#xff1a; 基本结构&#xff1a;HashMap 底层是基于哈希表来实现的&#xff0c;每次插入一个键值对时&#xff0c;会先对该键进行 Hash 运…

Android Studio创建项目后Gradle(构建)项目很慢问题解决

Android Studio创建项目后Gradle(构建)项目很慢问题解决 在使用Android Studio创建项目时&#xff0c;会自动从网上下载相关依赖。由于是访问国外服务器&#xff0c;会出现构建项目时下载依赖很慢的问题。为了解决该问题&#xff0c;需要在settings.gradle(或者settings.gradl…

EthernetIP主站转EtherCAT协议网关采集电力变压器的 Ethernet IP 数据

怎么通过捷米JM-EIPM-ECT网关把ABB电力变压器的 Ethernet IP 数据&#xff0c;连接到欧姆龙PLC上&#xff0c;通过plc去监控电力设备的数据呢&#xff0c;下面是介绍简单的连接方法&#xff0c;采集Ethernet IP从站数据和EtherCAT协议 1 &#xff0c;捷米JM-EIPM-ECT网关连接Et…