[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 | 男     |        12 | 李四   |  19 | 女     |        13 | 王五   |  20 | 男     |        24 | 赵六   |  18 | 女     |        25 | 陈七   |  19 | 男     |        36 | 孙八   |  20 | 女     |        37 | 周九   |  18 | 男     |        48 | 吴十   |  19 | 女     |        49 | 郑十一 |  20 | 男     |        510 | 王十二 |  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 | 男     |        310 | 王十二 |  18 | 女     |        52 | 李四   |  19 | 女     |        11 | 张三   |  18 | 男     |        14 | 赵六   |  18 | 女     |        26 | 孙八   |  20 | 女     |        37 | 周九   |  18 | 男     |        43 | 王五   |  20 | 男     |        28 | 吴十   |  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 | 男     |        12 | 李四   |  19 | 女     |        14 | 赵六   |  18 | 女     |        25 | 陈七   |  19 | 男     |        37 | 周九   |  18 | 男     |        48 | 吴十   |  19 | 女     |        410 | 王十二 |  18 | 女     |        51 | 张三   |  18 | 男     |        12 | 李四   |  19 | 女     |        13 | 王五   |  20 | 男     |        24 | 赵六   |  18 | 女     |        25 | 陈七   |  19 | 男     |        36 | 孙八   |  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 10testdb=# select * from engineer;id | name  | age | gender |    address    |     created_at
----+-------+-----+--------+---------------+---------------------1 | John  |  30 | M      | New York      | 2023-02-18 10:00:002 | Mary  |  25 | F      | Los Angeles   | 2023-02-18 10:00:003 | Peter |  35 | M      | Chicago       | 2023-02-18 10:00:004 | Jane  |  28 | F      | San Francisco | 2023-02-18 10:00:005 | Bob   |  40 | M      | Boston        | 2023-02-18 10:00:006 |  NULL |  22 | F      | Washington DC | 2023-02-18 10:00:007 |  NULL |  38 | M      | Atlanta       | 2023-02-18 10:00:008 |  NULL |  25 | F      | Miami         | 2023-02-18 10:00:009 |  NULL |  32 | M      | Philadelphia  | 2023-02-18 10:00:0010 |  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:002 | Mary  |  25 | F      | Los Angeles   | 2023-02-18 10:00:003 | Peter |  35 | M      | Chicago       | 2023-02-18 10:00:004 | Jane  |  28 | F      | San Francisco | 2023-02-18 10:00:005 | Bob   |  40 | M      | Boston        | 2023-02-18 10:00:006 |       |     | F      | Washington DC | 2023-02-18 10:00:007 |       |     | M      | Atlanta       | 2023-02-18 10:00:008 |       |     | F      | Miami         | 2023-02-18 10:00:009 |       |     | M      | Philadelphia  | 2023-02-18 10:00:0010 |       |     | 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:007 |      |     | M      | Atlanta       | 2023-02-18 10:00:008 |      |     | F      | Miami         | 2023-02-18 10:00:009 |      |     | M      | Philadelphia  | 2023-02-18 10:00:0010 |      |     | 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:002 | Mary  |  25 | F      | Los Angeles   | 2023-02-18 10:00:003 | Peter |  35 | M      | Chicago       | 2023-02-18 10:00:004 | Jane  |  28 | F      | San Francisco | 2023-02-18 10:00:005 | 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:007 |      |     | M      | Atlanta       | 2023-02-18 10:00:008 |      |     | F      | Miami         | 2023-02-18 10:00:009 |      |     | M      | Philadelphia  | 2023-02-18 10:00:0010 |      |     | 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    | Mary4 | Eoe   | Jane3 | Dod   | Peter5 | Fof   | Bob6 | 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;

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

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

相关文章

【Redis】高可用之三:集群(cluster)

本文是Redis系列第6篇&#xff0c;前5篇欢迎移步 【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型&#xff0c;各个文章总有些小不同&#xff0c;我们这里讨论的是Redis 7.0&#xff0c;为确保准确&#xf…

字幕切分视频

Whisper 仓库地址&#xff1a; https://github.com/openai/whisper 可用模型信息&#xff1a; 测试视频&#xff1a;18段&#xff0c;总共447S视频&#xff08;11段前&#xff1a;有11段开头有停顿的视频&#xff09; Tiny: 跑完&#xff1a;142S &#xff0c;11段前&#xf…

在线乞讨系统 Docker一键部署

begger乞讨网 在线乞讨 全球要饭系统前端界面后端界面H2 数据库 console运行命令访问信息支付平台 在线乞讨 全球要饭系统 在线乞讨全球要饭项目,支持docker一键部署&#xff0c;支持企业微信通知&#xff0c;支持文案编辑 前端界面 后端界面 H2 数据库 console 运行命令 项…

PID算法

PID&#xff0c;就是“比例&#xff08;proportional&#xff09;、积分&#xff08;integral&#xff09;、微分&#xff08;derivative&#xff09;”&#xff0c;是一种很常见的控制算法。 需要将一个物理量保持在稳定状态&#xff08;比如维持平衡&#xff0c;温度、转速的…

《微服务架构设计模式》第十三章 微服务架构的重构策略

微服务架构的重构策略 一、重构到微服务需要考虑的问题1、为什么重构2、重构形式3、重构策略 二、设计服务与单体的协作方式三、总结 一、重构到微服务需要考虑的问题 1、为什么重构 单体地狱造成的业务问题&#xff1a; 交付缓慢充满故障的软件交付可扩展性差 2、重构形式 …

前端 | (六)CSS盒子模型 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;元素的显示模式&#x1f407;CSS长度单位&#x1f407;元素的显示模式⭐️块元素&#xff08;block&#xff09;⭐️行内元素&#xff08;inline&#xff09…

浅谈电能分项计量在节能降耗中的应用

摘要&#xff1a;随着电力企业改革活动的持续推进&#xff0c;要想加快改革进程、优化改革效果&#xff0c;应该提高对节能降耗问题的关注度。在应用电力计量技术的过程中巧妙地渗透节能降耗这一理念&#xff0c;以此提高技术应用率&#xff0c;充分体现技术应用价值&#xff0…

selenium-多窗口和frame处理

1.切换窗口 适用场景&#xff1a;点击按钮后&#xff0c;重新打开一个窗口&#xff0c;想要在新的窗口定位操作&#xff0c;就需要切换窗口 原理&#xff1a;获取窗口的唯一标识就是句柄&#xff0c;获取到句柄&#xff0c;就可以切换到对应的窗口了 处理方法&#xff1a; …

S3C2440点亮LED(裸机开发)

文章目录 前言一、环境介绍一、GPIO介绍二、点亮开发板的LED1.预备动作2.led代码 总结 前言 本期和大家主要分享的是使用S3C2440开发板点亮一个LED灯&#xff0c;可能大家拿到开发板之后做的第一件事情都是点灯&#xff0c;这是为什么呢&#xff1f;因为点灯这件事情不仅能够检…

curl操作

下载路径&#xff1a;https://curl.se/windows/ 参考&#xff1a;https://blog.csdn.net/weixin_45191386/article/details/130652821 操作&#xff1a; curl http://localhost:8085/api/v1/aaa/bbbb/?ccc 652781344055627776

如何在PADS Logic中查找器件

PADS Logic提供类似于Windows的查找功能&#xff0c;可以进行器件的查找。 &#xff08;1&#xff09;在Logic设计界面中&#xff0c;将菜单显示中的“选择工具栏”进行打开&#xff0c;如图1所示&#xff0c;会弹出对应的“选择工具栏”的分栏菜单选项&#xff0c;如图2所示。…

【ArcGIS Pro二次开发】(46):要素类从上到下、从左到右排序

要素类经过编辑之后&#xff0c;【OBJECTID】字段会变得不规律。应部分网友要求&#xff0c;做了这个从上到下、从左到右排序的工具。 不过后来在ArcGIS Pro中发现了一个【排序】工具&#xff0c;已经可以完美实现这个功能需求&#xff0c;发现自己做了个白工。 不过做了不能白…