[SQL系列] 从头开始学PostgreSQL 约束连接

news2024/11/23 22:03:43

上一篇的增删改查和基础筛选操作

[SQL系列] 从头开始学PostgreSQL 增删改查_Edward.W的博客-CSDN博客icon-default.png?t=N6B9https://blog.csdn.net/u013379032/article/details/131775853这篇大多是基于单张表的一些简单操作,但是我们经常要操作多张表一起查询,有些表的位置还必须要有限制,那怎么办呢?今天还是一起来学习学习。

约束

PostgreSQL的约束是用于规定表中的数据规则,如果违反了这个规则,行为就会被约束终止。

约束是针对表存在的,一般在建表和修改的时候规定,这样可以确保数据库中数据的准确性和可靠性。

一般有这些约束:

1. NOT NULL:用于保证表中某一列的值不为空。

CREATE TABLE my_table (  
 id SERIAL PRIMARY KEY,  
 name VARCHAR(255) NOT NULL  
);  

上面的句子使用了NOT NULL约束,插入数据的时候name不能为空。以下是一个反例:

INSERT INTO my_table (name, id) VALUES (NULL, 30);  

这个插入语句将被拒绝,因为"name"字段不能为空。


2. UNIQUE:用于保证表中某一列的值唯一。

CREATE TABLE my_table (  
 id SERIAL PRIMARY KEY,  
 name VARCHAR(255) UNIQUE NOT NULL  
);  

反例:

INSERT INTO my_table(name, id) VALUES ('Alice', 30);  
INSERT INTO my_table (name, id) VALUES ('Alice', 35);  

第二个插入语句将被拒绝,因为"name"字段的值已经存在,不能重复插入。


3. PRIMARY KEY:用于定义表的主键,保证表中每条记录的唯一性。

CREATE TABLE my_table (  
 id SERIAL PRIMARY KEY,  
 name VARCHAR(255)   
);  

反例:

CREATE TABLE my_table (  
 id SERIAL PRIMARY KEY,  
 name VARCHAR(255)   PRIMARY KEY
);  

这个建表的时候就会出错,因为出现了两个primary key。


4. FOREIGN KEY:用于定义表之间的关系,保证数据的一致性和完整性。

CREATE TABLE my_table (  
 id SERIAL PRIMARY KEY,  
 parent_id INTEGER NOT NULL REFERENCES another_table(id)  
);  

反例:在another_table里面插入一条记录

INSERT INTO another_table (id) VALUES (1);  

并且插入到my_table表

INSERT INTO my_table(parent_id) VALUES (1);  

这时候,如果删除another__table的记录的话:

DELETE FROM another_table WHERE id = 1;  

那么"foreign_key_example"表中的记录也将被自动删除。


5. CHECK:用于限制某一列的取值范围。

CREATE TABLE my_table (  
 id SERIAL PRIMARY KEY,  
 age INTEGER CHECK (age > 0 AND age < 100)  
);  

反例:

INSERT INTO my_table(age) VALUES (-1);  

这个插入语句将被拒绝,因为"age"字段的值不满足 CHECK 约束的条件


6. DEFAULT:用于定义某一列的默认值。

ALTER TABLE my_table ALTER COLUMN name SET DEFAULT 'unknown';

反例:

insert into my_table(name) value (NULL);

这个插入语句将插入一条记录,其中"name"字段的值为"unknown",因为"name"字段没有提供值,所以使用默认值。

连接

连接就是把两个表或者多个表结合起来,基于表共同的字段进行连接。

总共有以下几种连接:

内部连接(inner join)   全连接(full join)  左连接(left join) 右连接(right join) 交叉连接(cross join)

准备数据:

CREATE TABLE classes (  
   id SERIAL PRIMARY KEY,  
   name VARCHAR(50) NOT NULL UNIQUE  
);  

CREATE TABLE students (  
   id SERIAL PRIMARY KEY,  
   name VARCHAR(50) NOT NULL UNIQUE,  
   age INT NOT NULL,  
   gender VARCHAR(10) NOT NULL,  
   class_id INTEGER NOT NULL REFERENCES classes(id)  
);  

INSERT INTO classes (name) VALUES ('班级 1');  
INSERT INTO classes (name) VALUES ('班级 2');  
INSERT INTO classes (name) VALUES ('班级 3');  
INSERT INTO classes (name) VALUES ('班级 4');  
INSERT INTO classes (name) VALUES ('班级 5');  
INSERT INTO classes (name) VALUES ('班级 6');  
INSERT INTO classes (name) VALUES ('班级 7');  
INSERT INTO classes (name) VALUES ('班级 8');  
INSERT INTO classes (name) VALUES ('班级 9');  
INSERT INTO classes (name) VALUES ('班级 10');  


INSERT INTO students (name, age, gender, class_id) VALUES ('张三', 18, '男', 1);  
INSERT INTO students (name, age, gender, class_id) VALUES ('李四', 19, '女', 1);  
INSERT INTO students (name, age, gender, class_id) VALUES ('王五', 20, '男', 2);  
INSERT INTO students (name, age, gender, class_id) VALUES ('赵六', 18, '女', 2);  
INSERT INTO students (name, age, gender, class_id) VALUES ('陈七', 19, '男', 3);  
INSERT INTO students (name, age, gender, class_id) VALUES ('孙八', 20, '女', 3);  
INSERT INTO students (name, age, gender, class_id) VALUES ('周九', 18, '男', 4);  
INSERT INTO students (name, age, gender, class_id) VALUES ('吴十', 19, '女', 4);  
INSERT INTO students (name, age, gender, class_id) VALUES ('郑十一', 20, '男', 5);  
INSERT INTO students (name, age, gender, class_id) VALUES ('王十二', 18, '女', 5);  

cross join (交叉连接)

交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 行,则结果表有 x*y 行。

由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。

testdb=# SELECT * FROM classes CROSS JOIN students S;
 id |  name   | id |  name  | age | gender | class_id
----+---------+----+--------+-----+--------+----------
  1 | 班级 1  |  1 | 张三   |  18 | 男     |        1
  1 | 班级 1  |  2 | 李四   |  19 | 女     |        1
  1 | 班级 1  |  3 | 王五   |  20 | 男     |        2
  1 | 班级 1  |  4 | 赵六   |  18 | 女     |        2
  1 | 班级 1  |  5 | 陈七   |  19 | 男     |        3
  1 | 班级 1  |  6 | 孙八   |  20 | 女     |        3
  1 | 班级 1  |  7 | 周九   |  18 | 男     |        4
  1 | 班级 1  |  8 | 吴十   |  19 | 女     |        4
  1 | 班级 1  |  9 | 郑十一 |  20 | 男     |        5
  1 | 班级 1  | 10 | 王十二 |  18 | 女     |        5
  2 | 班级 2  |  1 | 张三   |  18 | 男     |        1
  2 | 班级 2  |  2 | 李四   |  19 | 女     |        1
  2 | 班级 2  |  3 | 王五   |  20 | 男     |        2
  2 | 班级 2  |  4 | 赵六   |  18 | 女     |        2
  2 | 班级 2  |  5 | 陈七   |  19 | 男     |        3
  2 | 班级 2  |  6 | 孙八   |  20 | 女     |        3
  2 | 班级 2  |  7 | 周九   |  18 | 男     |        4
  2 | 班级 2  |  8 | 吴十   |  19 | 女     |        4
  2 | 班级 2  |  9 | 郑十一 |  20 | 男     |        5
  2 | 班级 2  | 10 | 王十二 |  18 | 女     |        5
  3 | 班级 3  |  1 | 张三   |  18 | 男     |        1
  3 | 班级 3  |  2 | 李四   |  19 | 女     |        1
  3 | 班级 3  |  3 | 王五   |  20 | 男     |        2
  3 | 班级 3  |  4 | 赵六   |  18 | 女     |        2
  3 | 班级 3  |  5 | 陈七   |  19 | 男     |        3
  3 | 班级 3  |  6 | 孙八   |  20 | 女     |        3
  3 | 班级 3  |  7 | 周九   |  18 | 男     |        4
  3 | 班级 3  |  8 | 吴十   |  19 | 女     |        4
  3 | 班级 3  |  9 | 郑十一 |  20 | 男     |        5
  3 | 班级 3  | 10 | 王十二 |  18 | 女     |        5
  4 | 班级 4  |  1 | 张三   |  18 | 男     |        1
  4 | 班级 4  |  2 | 李四   |  19 | 女     |        1
  4 | 班级 4  |  3 | 王五   |  20 | 男     |        2
  4 | 班级 4  |  4 | 赵六   |  18 | 女     |        2
  4 | 班级 4  |  5 | 陈七   |  19 | 男     |        3
  4 | 班级 4  |  6 | 孙八   |  20 | 女     |        3
  4 | 班级 4  |  7 | 周九   |  18 | 男     |        4
  4 | 班级 4  |  8 | 吴十   |  19 | 女     |        4
  4 | 班级 4  |  9 | 郑十一 |  20 | 男     |        5
  4 | 班级 4  | 10 | 王十二 |  18 | 女     |        5
  5 | 班级 5  |  1 | 张三   |  18 | 男     |        1
  5 | 班级 5  |  2 | 李四   |  19 | 女     |        1
  5 | 班级 5  |  3 | 王五   |  20 | 男     |        2
  5 | 班级 5  |  4 | 赵六   |  18 | 女     |        2
  5 | 班级 5  |  5 | 陈七   |  19 | 男     |        3

left join(左连接)

        左连接是指将左表中的所有数据与右表中的数据进行匹配,如果右表中没有匹配的数据,则返回左表中的数据以及一个空值。左连接可以使用 left join 语句进行查询。

testdb=# SELECT * FROM classes C LEFT JOIN students S ON S.class_id = C.id;
 id |  name   | id |  name  | age | gender | class_id
----+---------+----+--------+-----+--------+----------
  1 | 班级 1  |  1 | 张三   |  18 | 男     |        1
  1 | 班级 1  |  2 | 李四   |  19 | 女     |        1
  2 | 班级 2  |  3 | 王五   |  20 | 男     |        2
  2 | 班级 2  |  4 | 赵六   |  18 | 女     |        2
  3 | 班级 3  |  5 | 陈七   |  19 | 男     |        3
  3 | 班级 3  |  6 | 孙八   |  20 | 女     |        3
  4 | 班级 4  |  7 | 周九   |  18 | 男     |        4
  4 | 班级 4  |  8 | 吴十   |  19 | 女     |        4
  5 | 班级 5  |  9 | 郑十一 |  20 | 男     |        5
  5 | 班级 5  | 10 | 王十二 |  18 | 女     |        5
 10 | 班级 10 |    |        |     |        |
  8 | 班级 8  |    |        |     |        |
  6 | 班级 6  |    |        |     |        |
  9 | 班级 9  |    |        |     |        |
  7 | 班级 7  |    |        |     |        |
(15 rows)

right join(右连接)

        右连接是指将右表中的所有数据与左表中的数据进行匹配,如果左表中没有匹配的数据,则返回右表中的数据以及一个空值。右连接可以使用 right join 语句进行查询。

testdb=# SELECT * FROM classes C RIGHT JOIN students S ON S.class_id = C.id;
 id |  name  | id |  name  | age | gender | class_id
----+--------+----+--------+-----+--------+----------
  1 | 班级 1 |  1 | 张三   |  18 | 男     |        1
  1 | 班级 1 |  2 | 李四   |  19 | 女     |        1
  2 | 班级 2 |  3 | 王五   |  20 | 男     |        2
  2 | 班级 2 |  4 | 赵六   |  18 | 女     |        2
  3 | 班级 3 |  5 | 陈七   |  19 | 男     |        3
  3 | 班级 3 |  6 | 孙八   |  20 | 女     |        3
  4 | 班级 4 |  7 | 周九   |  18 | 男     |        4
  4 | 班级 4 |  8 | 吴十   |  19 | 女     |        4
  5 | 班级 5 |  9 | 郑十一 |  20 | 男     |        5
  5 | 班级 5 | 10 | 王十二 |  18 | 女     |        5
(10 rows)

inner join(内连接)

        内连接是连接的两个表中的数据进行匹配,如果匹配不到数据,则不返回结果。内连接可以使用 select 语句进行查询。

testdb=# SELECT * FROM classes C inner JOIN students S ON S.class_id = C.id;
 id |  name  | id |  name  | age | gender | class_id
----+--------+----+--------+-----+--------+----------
  1 | 班级 1 |  1 | 张三   |  18 | 男     |        1
  1 | 班级 1 |  2 | 李四   |  19 | 女     |        1
  2 | 班级 2 |  3 | 王五   |  20 | 男     |        2
  2 | 班级 2 |  4 | 赵六   |  18 | 女     |        2
  3 | 班级 3 |  5 | 陈七   |  19 | 男     |        3
  3 | 班级 3 |  6 | 孙八   |  20 | 女     |        3
  4 | 班级 4 |  7 | 周九   |  18 | 男     |        4
  4 | 班级 4 |  8 | 吴十   |  19 | 女     |        4
  5 | 班级 5 |  9 | 郑十一 |  20 | 男     |        5
  5 | 班级 5 | 10 | 王十二 |  18 | 女     |        5
(10 rows)

full join(全连接)

        全连接是指将左表和右表中的所有数据进行匹配,如果左表或右表中没有匹配的数据,则返回空值。全连接可以使用 full outer join 语句进行查询。

testdb=# SELECT * FROM classes C FULL JOIN students S ON S.class_id = C.id;
 id |  name   | id |  name  | age | gender | class_id
----+---------+----+--------+-----+--------+----------
  1 | 班级 1  |  1 | 张三   |  18 | 男     |        1
  1 | 班级 1  |  2 | 李四   |  19 | 女     |        1
  2 | 班级 2  |  3 | 王五   |  20 | 男     |        2
  2 | 班级 2  |  4 | 赵六   |  18 | 女     |        2
  3 | 班级 3  |  5 | 陈七   |  19 | 男     |        3
  3 | 班级 3  |  6 | 孙八   |  20 | 女     |        3
  4 | 班级 4  |  7 | 周九   |  18 | 男     |        4
  4 | 班级 4  |  8 | 吴十   |  19 | 女     |        4
  5 | 班级 5  |  9 | 郑十一 |  20 | 男     |        5
  5 | 班级 5  | 10 | 王十二 |  18 | 女     |        5
 10 | 班级 10 |    |        |     |        |
  8 | 班级 8  |    |        |     |        |
  6 | 班级 6  |    |        |     |        |
  9 | 班级 9  |    |        |     |        |
  7 | 班级 7  |    |        |     |        |
(15 rows)

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

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

相关文章

HashSet 、LinkedHashSet 源码级详解

Set 集合类体系如下&#xff1a; HashSet -- 无序、不重复、无索引 LinkedHashSet -- 有序、不重复、无索引 TreeSet -- 可排序、不重复、无索引 HashSet HashSet 底层采用 哈希表 存储数据 哈希表组成 JDK8 之前 -- 数组 链表 JDK8 之后 -- 数组 链表 红黑树 一开始…

GitHub 上都有哪些值得关注学习的 javascript开源项目?

前言 下面是我整理的一些关于GitHub上的js的相关的项目&#xff0c;希望对你有所帮助 实用工具向 1.Exchart Star&#xff1a;55.6k Exchart提供了大量精美的图表&#xff0c;只有你想不到&#xff0c;没有你在它上面找不到的&#xff0c;同时点进相应的图标后便可以在线对它…

SpringCloud系列:负载均衡组件-Ribbon

作者平台&#xff1a; | CSDN&#xff1a;blog.csdn.net/qq_41153943 | 掘金&#xff1a;juejin.cn/user/651387… | 知乎&#xff1a;www.zhihu.com/people/1024… | GitHub&#xff1a;github.com/JiangXia-10… 本文一共4529字&#xff0c;预计阅读12分钟 前言 前面几…

【单谐波非线性振动问题求解器 GUI 】使用单个谐波表示解决 MDOF 非线性振动问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

音频驱动嘴形之CodeTalker

论文发版&#xff1a;CVPR2023 应用&#xff1a; Over the discrete motion space, a temporal autoregressive model is employed to sequentially synthesize facial motions from the input speech signal, which guarantees lip-sync as well as plausible facial expres…

TOWE智能PDU是如何帮助机房安然度夏的?

最近&#xff0c;全国各地纷纷进入高温“火炉”模式&#xff0c;炎炎夏日&#xff0c;数据中心的工作温度不应该超过一定的限度。数据中心机房不仅要确保在高温多雨天气下安全、稳定的运维&#xff0c;还要承受降低企业总体运营成本的压力。这种需求下&#xff0c;相较于传统基…

【C++修炼之路】类和对象(下)—— 完结篇

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、再谈构造函数1、初始化列表2、explicit 关键字 二、static 成员1、概念2、特性 三、友元1、友元函数2、友元类 四、内部类五…

C++笔试常用函数整理

数组 #include <vector> push_back&#xff1a;向量尾部增加一个元素 pop_back&#xff1a;删除向量中最后一个元素 empty&#xff1a;判断向量是否为空&#xff0c;若为空&#xff0c;则向量中无元素 size : 输出队列中数据元素的个数 vector初始化相关&#xff1a…

Java使用poi-tl1.9.1生成Word文档的几个小技巧

目录 前言 一、poi-tl简介 1、什么是poi-tl 2、常见的word生成对比 3、poi-tl功能点 二、poi-tl文档生成 1、模板准备 2、目标参数填充 3、生成效果 三、可能会遇到的问题 1、混合图表生成报错 2、图表参数设置技巧 总结 前言 也许在您的工作当中会碰到如下的一些场景…

python和django中安装mysqlclient失败的解决方案

在Pychram中和pip中安装mysqlclient都不成功&#xff0c;只能直接下载二进制包进行安装了&#xff0c;下载页面中根据python的版本选择对应WHL包下载&#xff0c;下载地址 mysqlclient PyPIhttps://pypi.org/project/mysqlclient/#files 通过pip命令进行安装 pip install d:\…

基于javascript的简单拖拽排序

基于javascript的简单拖拽排序 效果示例图代码示例 效果示例图 代码示例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">* {padding: 0px;margin: 0px;box-sizing:…

网工内推 | 数通网工专场,HCNP/CCNP认证优先

01 天津海展会议展览有限公司 招聘岗位&#xff1a;网络工程师&#xff08;数通方向&#xff09; 职责描述&#xff1a; 1、负责企业整体网络架构的设计、优化、部署及网络运维管理体系的的构建&#xff1b; 2、负责企业内网、外网、有线侧、无线侧网络策略的配置及调优&…

虚拟主播动捕设备,满足不同应用领域的3d虚拟主播直播需求

随着移动互联网的普及&#xff0c;直播行业迅速发展&#xff0c;用户规模持续上升&#xff0c;一度成为平台经济领域的中流砥柱&#xff0c;其中虚拟主播成为了直播赛道中一种新的内容形式。 3d虚拟主播是通过计算机生成的数字人&#xff0c;它们可以在直播中通过虚拟主播动捕…

Vue成绩案例实现添加、删除、显示无数据、添加日期、总分均分以及数据本地化等功能

一、成绩案例 ✅✅✅通过本次案例实现添加、删除、显示无数据、添加日期、总分均分以及数据本地化等功能。 准备成绩案例模板&#xff0c;我们需要在这些模板上面进行功能操作。 <template><div class"score-case"><div class"table">…

材料学博士生CSC资助德国联陪归来谈体会

作者许潇洒&#xff0c;为西北工业大学材料学院材料学专业博士研究生&#xff0c;受CSC高水平大学公派研究生项目&#xff0c;于2022年至2023年赴德国德累斯顿工业大学开展了为期12个月博士联合培养学习。访学归来&#xff0c;其撰文谈感受&#xff0c;知识人网小编转载如下&am…

润和软件与华秋达成生态共创合作,共同推动物联网硬件创新

7月11日&#xff0c;在2023慕尼黑上海电子展现场&#xff0c;江苏润开鸿数字科技有限公司(以下简称“润开鸿”)与深圳华秋电子有限公司(以下简称“华秋”)签署了生态共创战略合作协议&#xff0c;共同推动物联网硬件生态繁荣发展。当前双方主要基于润开鸿的硬件产品及解决方案开…

如何通过smardaten无代码开发平台快速搭建数据中台?

目录 一、数据中台是什么&#xff1f;二、数据中台的特点1、数据中台需要具备哪些特性&#xff1f;2、数据中台需要提供哪些服务&#xff1f; 三、数据中台搭建工具四、如何用无代码快速搭建数据中台1、多源数据接入2、数据流&#xff08;数据集成&#xff09;3、数据资产管理4…

el-table刷新后保持高亮并改变状态字段

一、需求&#xff1a; 1、点击左侧右边显示具体内容 2、点击右边确认 左侧依旧高亮并且改变启动状态颜色 3、点击刷新、重置、高级搜索等不高亮 右边也不显示具体内容 二、效果图&#xff1a; 三、具体实施 1、定义highlight-current-row 是否高亮行 <el-table ref&quo…

opencv -13 掩模

什么是掩膜&#xff1f; 在OpenCV中&#xff0c;掩模&#xff08;mask&#xff09;是一个与图像具有相同大小的二进制图像&#xff0c;用于指定哪些像素需要进行操作或被考虑。掩模通常用于选择特定区域或进行像素级别的过滤操作。 OpenCV 中的很多函数都会指定一个掩模&…

数据结构链表,结点的结构体定义以及增删改查的实现

一、单链表的定义和表示 线性表链式存储结构的特点是&#xff1a;用一组任意的存储单元存储线性表的数据元素&#xff08;这组存储单元可以是连续的&#xff0c;也可以是不连续的&#xff09;。因此&#xff0c;为了表示每个元素与其直接后继数据元素之间的逻辑关系&#xff0…