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

这篇具有很好参考价值的文章主要介绍了[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(在事件发生之后)两种。

触发器一般和函数一起使用。我们直接看个例子文章来源地址https://www.toymoban.com/news/detail-596678.html

#创建一个函数

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;

到了这里,关于[SQL系列] 从头开始学PostgreSQL Union Null 别名 触发器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串&UNION与OR的使用注意事项

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2024年02月21日
    浏览(8)
  • PostgreSql 触发器

      触发器(Trigger)是由事件自动触发执行的一种特殊的存储过程,触发事件可以是对一个表进行INSERT、UPDATE、DELETE等操作。触发器经常用于加强数据的完整性约束和业务规则上的约束等。 参数说明: name :触发器的名称。这必须与同一个表上的任何其他触发器相区别。名

    2024年02月16日
    浏览(7)
  • 如何使用SQL系列 之 如何在SQL中使用比较运算符和IS NULL运算符

    在某些 结构化查询语言 (SQL)语句中, WHERE 子句可以用来限制给定操作会影响哪些行。他们通过定义特定的条件来做到这一点,这些条件被称为 搜索条件 ,每一行必须满足才会受到影响。搜索条件由一个或多个 谓词 组成,它们是特殊的表达式,计算结果为“true”、“false”

    2024年02月10日
    浏览(13)
  • 从头开始机器学习:逻辑回归

            本篇实现线性回归的先决知识是:基本线性代数,微积分(偏导数)、梯度和、Python (NumPy);从线性方程入手,逐渐理解线性回归预测问题。

    2024年02月07日
    浏览(11)
  • 【SQL开发实战技巧】系列(二十六):数仓报表场景☞聊聊ROLLUP、UNION ALL是如何分别做分组合计的以及如何识别哪些行是做汇总的结果行

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月12日
    浏览(13)
  • 应用实战|从头开始开发记账本2:基于模板快速开始

    应用实战|从头开始开发记账本2:基于模板快速开始

    上期视频我们创建好了BaaS服务的后端应用。从这期视频开始,我们将从头开发一个互联网记账本应用。本期视频我们介绍一下如何使用模板快速开启我们的应用开发之旅。 应用实战|从头开始开发记账本2:基于模板快速开始 本期视频我们介绍了如何通过模板快速开始MemFi

    2024年04月17日
    浏览(18)
  • 【PostgreSQL】数据查询-组合查询(UNION,INTERSECT,EXCEPT)

    PostgreSQL可以使用集合运算并集、交集和差值来组合两个查询的结果。语法是 其中 query1 和 query2 是可以使用到目前为止讨论的任何功能的查询。 UNION有效地将 query2 的结果追加到 query1 的结果(尽管不能保证这是实际返回行的顺序)。此外,它从其结果中消除重复的行,其方式

    2024年02月02日
    浏览(15)
  • 从头开始构建大语言模型(LLM)

    了解如何从头开始构建大语言模型,从而创建、训练和调整大语言模型! LLMs 在“从头开始构建大语言模型”中,你将了解如何从内到外LLMs工作。在这本富有洞察力的书中,畅销书作家塞巴斯蒂安·拉施卡 (Sebastian Raschka) 将指导您逐步创建自己的LLM阶段,并用清晰的文本、

    2024年02月01日
    浏览(10)
  • C语言——从头开始——深入理解指针(1)

    C语言——从头开始——深入理解指针(1)

     一.内存和地址 我们知道计算上CPU(中央处理器)在处理数据的时候,是通过地址总线把需要的数据从内存中读取的,后通过数据总线把处理后的数据放回内存中。如下图所示: 计算机把内存划分为⼀个个的 内存单元 ,每个内存单元的大小取1个字节( 1个字节(Byte)=8个比特

    2024年02月21日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包