[SQL系列] 从头开始学PostgreSQL Union Null 别名 触发器

初级的操作就是CRUD,但是高级的操作也是CRUD,只是语句写的更加复杂,不再是select * from table;这样简单,这次咱们学一些稍微高级点的。下面是上一篇文章。

[SQL系列] 从头开始学PostgreSQL 约束连接_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131796564

Union 和 Union all

        在 PostgreSQL 中,union 是一种集合运算符,用于将两个或多个 SELECT 语句的结果合并成一个结果集。union 可以接受两个或多个 SELECT 语句作为参数,并将它们返回的结果合并成一个单独的结果集。

        具体来说,union 运算符将两个 SELECT 语句的结果集合并,去除重复的行。合并的结果集将包含所有在至少一个 SELECT 语句中出现的行,但不包含在两个 SELECT 语句中都未出现的行。

testdb=# select * from students;
 id |  name  | age | gender | class_id
----+--------+-----+--------+----------
  1 | 张三   |  18 | 男     |        1
  2 | 李四   |  19 | 女     |        1
  3 | 王五   |  20 | 男     |        2
  4 | 赵六   |  18 | 女     |        2
  5 | 陈七   |  19 | 男     |        3
  6 | 孙八   |  20 | 女     |        3
  7 | 周九   |  18 | 男     |        4
  8 | 吴十   |  19 | 女     |        4
  9 | 郑十一 |  20 | 男     |        5
 10 | 王十二 |  18 | 女     |        5
(10 rows)


testdb=# select * from students where age < 20
union
select * from students where class_id < 4;
 id |  name  | age | gender | class_id
----+--------+-----+--------+----------
  5 | 陈七   |  19 | 男     |        3
 10 | 王十二 |  18 | 女     |        5
  2 | 李四   |  19 | 女     |        1
  1 | 张三   |  18 | 男     |        1
  4 | 赵六   |  18 | 女     |        2
  6 | 孙八   |  20 | 女     |        3
  7 | 周九   |  18 | 男     |        4
  3 | 王五   |  20 | 男     |        2
  8 | 吴十   |  19 | 女     |        4
(9 rows)

第一个表获取到了年龄20下的学生,第二个表获取了前3个班的学生,然后通过union合并后,可以看到,结果的表既有20岁的学生,也有4班的学生,也就是将前两张表合并起来,但是去除了重复的行。

这边另外介绍一下Union all

testdb=# select * from students where age < 20
union all
select * from students where class_id < 4;
 id |  name  | age | gender | class_id
----+--------+-----+--------+----------
  1 | 张三   |  18 | 男     |        1
  2 | 李四   |  19 | 女     |        1
  4 | 赵六   |  18 | 女     |        2
  5 | 陈七   |  19 | 男     |        3
  7 | 周九   |  18 | 男     |        4
  8 | 吴十   |  19 | 女     |        4
 10 | 王十二 |  18 | 女     |        5
  1 | 张三   |  18 | 男     |        1
  2 | 李四   |  19 | 女     |        1
  3 | 王五   |  20 | 男     |        2
  4 | 赵六   |  18 | 女     |        2
  5 | 陈七   |  19 | 男     |        3
  6 | 孙八   |  20 | 女     |        3
(13 rows)

        Union 会自动去除多个结果集合中的重复行,只返回一个结果集。而 Union All 则会将所有结果集合中的行都返回,不管它们是否重复。因此,如果需要返回所有行,而不管它们是否重复,则

可以使用 Union All。
        另外,Union 在合并结果时还会默认进行排序,而 Union All 则不会。如果需要对结果进行排序,可以使用 Order By 子句进行指定。
        在使用 Union 或 Union All 时,需要确保两个结果集的列数和数据类型相等,否则可能会出现错误。而在使用 Union All 时,还可以使用类似 Select 语句中的通配符(如 * )来指定要合并的列。

NULL

        NULL代表空值,插入数据的时候有些没插入的数据自然就是NULL,我们可以用IS NULL和NOT NULL来进行筛选。

我们建个表来看看:

testdb=# CREATE TABLE engineer (
   id INT PRIMARY KEY,
   name VARCHAR(50),
   age INT,
   gender CHAR(1),
   address VARCHAR(200),
   created_at TIMESTAMP
);
CREATE TABLE
testdb=# INSERT INTO engineer (id, name, age, gender, address, created_at) VALUES
(1, 'John', 30, 'M', 'New York', '2023-02-18 10:00:00'),
(2, 'Mary', 25, 'F', 'Los Angeles', '2023-02-18 10:00:00'),
(3, 'Peter', 35, 'M', 'Chicago', '2023-02-18 10:00:00'),
(4, 'Jane', 28, 'F', 'San Francisco', '2023-02-18 10:00:00'),
(5, 'Bob', 40, 'M', 'Boston', '2023-02-18 10:00:00'),
(6, ' NULL', 22, 'F', 'Washington DC', '2023-02-18 10:00:00'),
(7, ' NULL', 38, 'M', 'Atlanta', '2023-02-18 10:00:00'),
(8, ' NULL', 25, 'F', 'Miami', '2023-02-18 10:00:00'),
(9, ' NULL', 32, 'M', 'Philadelphia', '2023-02-18 10:00:00'),
(10, ' NULL', 28, 'F', 'Dallas', '2023-02-18 10:00:00');
INSERT 0 10

testdb=# select * from engineer;
 id | name  | age | gender |    address    |     created_at
----+-------+-----+--------+---------------+---------------------
  1 | John  |  30 | M      | New York      | 2023-02-18 10:00:00
  2 | Mary  |  25 | F      | Los Angeles   | 2023-02-18 10:00:00
  3 | Peter |  35 | M      | Chicago       | 2023-02-18 10:00:00
  4 | Jane  |  28 | F      | San Francisco | 2023-02-18 10:00:00
  5 | Bob   |  40 | M      | Boston        | 2023-02-18 10:00:00
  6 |  NULL |  22 | F      | Washington DC | 2023-02-18 10:00:00
  7 |  NULL |  38 | M      | Atlanta       | 2023-02-18 10:00:00
  8 |  NULL |  25 | F      | Miami         | 2023-02-18 10:00:00
  9 |  NULL |  32 | M      | Philadelphia  | 2023-02-18 10:00:00
 10 |  NULL |  28 | F      | Dallas        | 2023-02-18 10:00:00
(10 rows)

这边的NULL不是真的NULL值,只是名字叫做'NULL',我们修改下:

testdb=# update engineer set name = null, age = null where name = ' NULL';
UPDATE 5
testdb=# select * from engineer;
 id | name  | age | gender |    address    |     created_at
----+-------+-----+--------+---------------+---------------------
  1 | John  |  30 | M      | New York      | 2023-02-18 10:00:00
  2 | Mary  |  25 | F      | Los Angeles   | 2023-02-18 10:00:00
  3 | Peter |  35 | M      | Chicago       | 2023-02-18 10:00:00
  4 | Jane  |  28 | F      | San Francisco | 2023-02-18 10:00:00
  5 | Bob   |  40 | M      | Boston        | 2023-02-18 10:00:00
  6 |       |     | F      | Washington DC | 2023-02-18 10:00:00
  7 |       |     | M      | Atlanta       | 2023-02-18 10:00:00
  8 |       |     | F      | Miami         | 2023-02-18 10:00:00
  9 |       |     | M      | Philadelphia  | 2023-02-18 10:00:00
 10 |       |     | F      | Dallas        | 2023-02-18 10:00:00
(10 rows)

testdb=# select * from engineer where name is null;
 id | name | age | gender |    address    |     created_at
----+------+-----+--------+---------------+---------------------
  6 |      |     | F      | Washington DC | 2023-02-18 10:00:00
  7 |      |     | M      | Atlanta       | 2023-02-18 10:00:00
  8 |      |     | F      | Miami         | 2023-02-18 10:00:00
  9 |      |     | M      | Philadelphia  | 2023-02-18 10:00:00
 10 |      |     | F      | Dallas        | 2023-02-18 10:00:00
(5 rows)

testdb=# select * from engineer where age is not null;
 id | name  | age | gender |    address    |     created_at
----+-------+-----+--------+---------------+---------------------
  1 | John  |  30 | M      | New York      | 2023-02-18 10:00:00
  2 | Mary  |  25 | F      | Los Angeles   | 2023-02-18 10:00:00
  3 | Peter |  35 | M      | Chicago       | 2023-02-18 10:00:00
  4 | Jane  |  28 | F      | San Francisco | 2023-02-18 10:00:00
  5 | Bob   |  40 | M      | Boston        | 2023-02-18 10:00:00
(5 rows)

别名

这个很好说明,就是比如有些表的名字很长,所以我们就直接给个简称,依据上面的表我们给个例子。

testdb=# select * from engineer as e where age is null;
 id | name | age | gender |    address    |     created_at
----+------+-----+--------+---------------+---------------------
  6 |      |     | F      | Washington DC | 2023-02-18 10:00:00
  7 |      |     | M      | Atlanta       | 2023-02-18 10:00:00
  8 |      |     | F      | Miami         | 2023-02-18 10:00:00
  9 |      |     | M      | Philadelphia  | 2023-02-18 10:00:00
 10 |      |     | F      | Dallas        | 2023-02-18 10:00:00
(5 rows)


testdb=# select c.id as cid, c.name as cname, e.name as ename  from company as c, engineer as e where c.id = e.id;
 cid | cname | ename
-----+-------+-------
   2 | CC    | Mary
   4 | Eoe   | Jane
   3 | Dod   | Peter
   5 | Fof   | Bob
   6 | Gog   |
(5 rows)

触发器

        SQL 触发器是一种特殊的存储过程,它与普通的存储过程不同,它的执行是由事件来触发的,而不是由程序调用或手工启动的。当对 SQL 表进行操作(如 insert、delete、update 等)时,触发器会自动执行。触发器可以用于加强数据的完整性约束和业务规则等。
        触发器可以分为两种类型:语句级触发器和行级触发器。语句级触发器在触发事件时执行一次,无论是否有行发生变化,而行级触发器只会在发生变化的行上执行。触发器可以设置触发时间,包括 before(在事件发生之前)和 after(在事件发生之后)两种。

触发器一般和函数一起使用。我们直接看个例子

#创建一个函数

CREATE OR REPLACE FUNCTION update_all_students_view()  
RETURNS TRIGGER  
AS $$  
BEGIN  
 IF NEW.age > 0 THEN  
   INSERT INTO all_students (name, age)  
   VALUES (NEW.name, NEW.age);  
 END IF;
 RETURN NEW;  
END;  
$$ LANGUAGE plpgsql;  

#创建一个触发器

CREATE TRIGGER update_all_students  
AFTER INSERT  
ON students  
FOR EACH ROW  
WHEN (NEW.age > 0)  
EXECUTE FUNCTION update_all_students_view();  

#触发它
testdb=# INSERT INTO students (name, age) VALUES ('张三', 18);
INSERT INTO students (name, age) VALUES ('李四', 0);

#这时候第二行就无法插入成功,因为年龄必须大于0

#删除trigger
drop trigger update_all_students on students;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/40712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

划片机的作用将晶圆分割成独立的芯片

划片机是将晶圆分割成独立芯片的关键设备之一。在半导体制造过程中&#xff0c;晶圆划片机用于将整个晶圆切割成单个的芯片&#xff0c;这个过程被称为“晶圆分割”或“晶圆切割”。 晶圆划片机通常采用精密的机械传动系统、高精度的切割刀具和先进的控制系统&#xff0c;以确保…

【C++ 重要知识点总结】表达式

表达式 1 基础 组合运算 优先级结合律 类型转换 运算符重载 左值和右值 2 算数运算符 3 逻辑和关系运算法 短路求值 逻辑与&#xff0c;当第一个判定为否的时候&#xff0c;不再执行第二个判定&#xff0c;可以用来屏蔽第二步的计算&#xff0c;代替条件判断&#xff0…

rabbitmq延时队列自动解锁库存

一、库存服务自动解锁库存 使用了最终一致性来解决分布式事务 当order服务出现异常回滚&#xff0c;此时ware服务无法回滚&#xff0c;怎么办&#xff1f; 使用seata全局事务虽然能在order服务出现异常导致回滚时使其他服务的也能同时回滚&#xff0c;但在流量大的情况下是使用…

【SpringBoot】从零开始封装自己的starter并且引入到其他项目中使用

从零开始封装自己的starter并且引入到其他项目中使用 简介 本文将介绍如何从零开始封装自己的starter并且引入到其他项目中使用 为什么要自己封装starter&#xff1f; 这样可以对spring以及其他第三方提供的starter做二次封装或者封装一些自己需要的内容提供给其他项目使用&…

【milvus】向量数据库,用来做以图搜图+人脸识别的特征向量

1. 安装milvus ref:https://milvus.io/docs 第一次装东西&#xff0c;要把遇到的问题和成功经验都记录下来。 1.Download the YAML file wget https://github.com/milvus-io/milvus/releases/download/v2.2.11/milvus-standalone-docker-compose.yml -O docker-compose.yml看…

行为型模式 - 策略模式

概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然可以进行代码开发的工具有很多&#xff0c;可以选择Idea进行开发&…

准备WebUI自动化测试面试?这30个问题你必须掌握(二)

本文共有11000字&#xff0c;包含了后十五个问题&#xff0c;如需要前十五个问题&#xff0c;可查看文末链接~ 16. 在WebUI自动化测试中&#xff0c;你如何处理验证码或图像识别的问题&#xff1f; 1. 人工识别&#xff1a;一种简单但费时费力的方法是使用人工手动识别验证码。…

libbpf-bootstrap 开发指南:概念与如何安装

目录 概念 如何安装& 使用 git 地址 使用git clone 下载代码 安装依赖环境 安装libbpf 编译example 概念 libbpf-bootstrap 是一个项目&#xff0c;旨在帮助开发者快速启动和开发使用 eBPF (Extended Berkeley Packet Filter) 和 libbpf 的程序。eBPF 是一种可以在…

如何用Three.js + Blender打造一个web 3D展览馆

作者&#xff1a;vivo 互联网前端团队- Wei Xing 运营活动新玩法层出不穷&#xff0c;web 3D炙手可热&#xff0c;本文将一步步带大家了解如何利用Three.js和Blender来打造一个沉浸式web 3D展览馆。 一、前言 3D展览馆是什么&#xff0c;先来预览下效果&#xff1a; 看起来像…

element-ui message消息提示组件 ①延长提示消息在页面停留时间②提示消息换行

以实现下面的效果为示例 完整代码&#xff1a; let msgList ["数据1被引用", "数据2被引用"];// 使用html的换行标签拼接信息&#xff0c;默认行距太小&#xff0c;此处用两个<br/><br/>let message 以下数据不能删除&#xff0c;原因是&…

为什么很多公司都开始使用Go语言了?

越来越多的互联网大厂开始使用Go语言了&#xff0c;譬如腾讯、美团、滴滴、百度、Google、bilibili... 还有最初使用Python的字节跳动&#xff0c;甚至已经全面拥向Go了。这么多国内外首屈一指的公司&#xff0c;都在开始使用它了&#xff0c;它到底有什么优势呢&#xff1f;这…

Redis进阶底层原理-主从复制

Redis的主从节点都会记录对方的信息&#xff0c;核心还包括ReplicationID 和 offset &#xff0c; ReplicationID &#xff1a; 主从节点实例的ID &#xff0c;redis内部就是通过这个id去识别主从节点。offset&#xff1a;数据同步偏移量&#xff0c;也就是从节点每次从主节点同…

硬中断、软中断详解

文章目录 什么是中断&#xff1f; 什么是计算机的中断&#xff1f; 什么叫硬中断、什么叫软中断&#xff1f; 怎么查看硬中断、软中断 查看硬中断的运行情况 cat /proc/interrupts 查看软中断的运行情况 cat /proc/softirqs 怎么排查软中断过高的问题&#xff1f; 软中断注意事…

noSQL的小练习

目录 Redis&#xff1a; 1、 string类型数据的命令操作&#xff1a; 2、 list类型数据的命令操作&#xff1a; 3、 hash类型数据的命令操作&#xff1a; MongoDB&#xff1a; 1. 创建一个数据库 名字grade 2. 数据库中创建一个集合名字 class 3. 集合中插入若…

接入端口与中继端口

交换机端口是支持 IT 的基本组件&#xff0c;可实现网络通信。这些有线硬件设备负责连接并允许在不同设备和连接到其端口的网络部分之间进行数据传输。由于网络管理员在确保网络连接和可用性方面发挥着关键作用&#xff0c;因此网络管理员必须清楚地了解、映射和查看其网络交换…

从小白到大神之路之学习运维第64天--------Zabbix监控mysql、ftp服务以及自定义配置

第三阶段基础 时 间&#xff1a;2023年7月19日 参加人&#xff1a;全班人员 内 容&#xff1a; Zabbix监控mysql、ftp服务以及自定义 目录 一、Zabbix监控mysql数据库 二、Zabbix监控ftp服务 三、Zabbix自定义监控项 整体zabbix搭建完成&#xff0c;server端huyang1监…

SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文

场景 为防止数据泄露&#xff0c;需要在插入等操作时将某表的字段在数据库中加密存储&#xff0c;在需要查询使用时明文显示。 Sharding Sphere ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈&#xff0c; 它由Sharding-JDBC、Sharding-Proxy和Shardi…

确认应答机制与超时重发机制【TCP原理(笔记一)】

文章目录 通过序列号与确认应答提高可靠性正常的数据传输数据包丢失的情况确认应答丢失的情况发送的数据 重发超时如何确定 通过序列号与确认应答提高可靠性 在TCP中&#xff0c;当发送端的数据到达接收主机时&#xff0c;接收端主机会返回一个已收到消息的通知。这个消息叫做…

iOS 中支持点击网页scheme超链接打开其他app

网页内容如图所示 思路&#xff0c;点击网页中一个href 超链接的时候&#xff0c;会执行 decidePolicyForNavigationAction 方法&#xff0c;我们在改方法中截获URL&#xff0c; 判断如果是URL scheme类型的&#xff0c;则执行 [[UIApplication sharedApplication]openURL:URL…

Tabby - 本地化AI代码自动补全 - Windows10

参考&#xff1a; https://github.com/TabbyML/tabby 为什么选择Tabby 已经有好几款类似强劲的代码补全工具&#xff0c;如GitHub Copilot&#xff0c;Codeium等&#xff0c;为什么还要选择Tabby? Tabby除了和其他工具一样支持联网直接使用之外&#xff0c;还支持本地化部…