数据库多表关系、查询与约束 - 指南

news/2025/11/19 9:14:06/文章来源:https://www.cnblogs.com/ljbguanli/p/19240634

数据库多表关系、查询与约束 - 指南

引言

在数据库设计与开发中,很多业务场景 ,都需要通过多表协作实现。而要让多表 “有序配合”,就必须掌握表间关系维护、多表查询技巧和数据约束规则这三大核心能力。本文将从多表关系的建立入手,逐步深入讲解多表查询的常用方法,并补充数据约束的关键知识点,帮助读者构建完整的数据库多表操作知识体系。

多表关系

在数据库的多表查询中,维护表之间的关系主要依靠表间关联(如一对多、多对多等)和SQL 的连接查询语法来实现。

  1. 一对多 案例:如部门(dept)与员工(emp)的关系(一个部门有多个员工,一个员工属于一个部门)。 维护方式在 “多” 的一方(员工表emp)建立外键,指向 “一” 的一方(部门表dept)的主键

  2. 多对多 如学生(student)与课程(course)的关系 维护方式:需通过中间表来实现,中间表包含两个外键,分别指向两个主表的主键。 例如:创建student_course中间表,包含student_id(关联student表的id)和course_id(关联course表的id)两个外键。 作用:通过中间表的外键约束,保证学生和课程的关联是合法的

  3. 一对一 案例:如用户(user)与用户详情(user_detail)的关系 维护方式:可在任意一方建立外键,且外键设置为唯一(UNIQUE); 例如:user_detail表的userId字段作为外键(且唯一),关联user表的id主键。

create table user_detail(
userId int unique comment '用户id',
constraint fk_userId foreign key(userId) references user(id)
);

多表查询

笛卡尔积

笛卡尔积(Cartesian Product)是数学中的一个概念,SQL 正是从数学里借用过来的。
给定两个集合 A 和 B,它们的笛卡尔积是:
A × B = {(a, b) | a ∈ A, b ∈ B}
即:把 A 的每个元素和 B 的每个元素配成一对。

在 SQL 里,如果你写:
SELECT *
FROM TableA, TableB;
而 不加任何 WHERE 条件,
数据库就会执行笛卡尔积操作,也就是“把 A 表的每一行和 B 表的每一行组合在一起”。

假设有两张表:表 A(学生):

idname
1张三
2李四

表 B(课程):

idcourse
101数学
102英语
103计算机

执行select * from A,B;后,结果为:

A.idA.nameB.idB.course
1张三101数学
1张三102英语
1张三103计算机
2李四101数学
2李四102英语
2李四103计算机

一共产生了 2 × 3 = 6 行。这就是典型的笛卡尔积:每个学生都和每一门课程匹配一次。注意:真实场景中很少直接用笛卡尔积(会产生大量无意义数据),需通过条件过滤出有效关联。

内连接

内连接:相当于查询两个表(如 A 和 B)的交集部分数据,只有当两个表中存在匹配的记录时,才会返回结果。

笛卡尔积 + WHERE 条件 → 隐式内连接(JOIN)

笛卡尔积 + WHERE 条件 → 连接(JOIN)
在真实查询中,我们不会直接使用笛卡尔积,因为它会产生很多无意义的组合。
我们通常会加上条件来筛选出“有关联的行”。
例如,假设我们要找选课表:


这时,WHERE 条件就起到了“过滤笛卡尔积”的作用,
只留下真正相关的匹配行。
这其实就是 内连接(INNER JOIN) 的原始形式。

显式内连接(INNER JOIN 语法)
除了隐式写法,也可使用 inner join ... on... 明确表示内连接,可读性更强:

外连接

左外连接:查询左表(如 A)的所有数据,以及两张表的交集部分数据。即使右表(如 B)中没有匹配的记录,左表的记录也会被返回,右表对应字段显示为NULL。

右外连接:查询右表(如 B)的所有数据,以及两张表的交集部分数据。即使左表(如 A)中没有匹配的记录,右表的记录也会被返回,左表对应字段显示为NULL。

自连接

自连接:当前表与自身进行连接查询,必须使用表别名来区分同一个表的不同 “实例”。

自连接既可以是内连接,也可以是外连接,常用于处理表中存在 “层级关系” 或 “自身关联关系” 的场景

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;。
例如:
select from emp a,emp b where a.managerid=b.id;

子查询

子查询是指在 SQL 语句中嵌套 SELECT 语句的查询方式,也称为嵌套查询。 其核心是用一个查询的结果作为另一个查询的条件或数据源,外部语句可以是INSERT、UPDATE、DELETE、SELECT中的任意一种。

按子查询位置分类

  • WHERE 之后:子查询作为筛选条件的一部分,如SELECT * FROM t1 WHERE column1 = (子查询)
  • FROM 之后:子查询结果作为 “临时表” 参与关联,如SELECT * FROM (子查询) AS temp JOIN t2 ON ...
  • SELECT 之后:子查询作为字段的一部分,如SELECT name, (SELECT COUNT(*) FROM t2 WHERE t2.id = t1.id) AS count FROM t1
标量子查询

子查询返回单个值

例子:查询在‘amaidou'入职之后的员工信息

先通过子查询获取 “amaidou” 的入职日期:select entrydate from emp where name = 'amaidou';
​
再以该日期为条件,查询入职更晚的员工:select * from emp where entrydate > (select entrydate from emp where name = 'amaidou');
列子查询

列子查询是子查询的一种类型,其返回结果为一列(可包含多行数据) 它常通过特定操作符实现复杂筛选,例如: int not in any 子查询返回列表中任意一个满足条件即可 SOME 与 ANY 等同,使用场景完全替代 ANY ALL 子查询返回列表的所有值都必须满足条件

1. ALL操作符(需满足子查询所有结果)

案例:查询比 “财务部” 所有人员工资都高的员工信息
===>
步骤 1:先获取财务部的所有工资:select salary from emp where dept_id = (select id from dept where name = '财务部');
步骤 2:用ALL筛选工资高于上述所有值的员工:select * from emp where salary > all ( select salary from emp where dept_id = (select id from dept where name = '财务部') );
说明:salary > all (...)表示员工工资需大于财务部所有人员的工资,只有同时满足 “比财务部最高工资还高” 的记录才会被选中

2. ANY操作符(只需满足子查询任意一个结果)

案例:查询比 “研发部” 任意一人工资高的员工信息
步骤 1:先获取研发部的所有工资:select salary from emp where dept_id = (select id from dept where name = '研发部');
步骤 2:用ANY筛选工资高于上述任意一个值的员工:select * from emp where salary > any ( select salary from emp where dept_id = (select id from dept where name = '研发部') );
说明:salary > any (...)表示员工工资只需大于研发部任意一人的工资(即只要比研发部最低工资高即可),就能被选中。
行子查询

其返回结果为一行(可包含多列数据),常用于多条件匹配的场景,常用操作符包括=、<> 、IN、NOT IN。

案例:查询与 “jay” 薪资及直属领导相同的员工信息

步骤一:获取jay的薪资和直属领导信息(行子查询的核心部分)
sql
select salary, managerid from emp where name = 'jay';
该子查询返回一行两列的结果(如(12500, 1)),代表jay的薪资和直属领导 ID。
步骤二:匹配与该结果相同的员工信息
sql
select * from emp where (salary,managerid) = (select salary, managerid from emp where name = 'jay');
这里通过(salary,managerid)多列匹配的方式,筛选出与jay “薪资和直属领导都相同” 的所有员工记录,体现了行子查询在多条件关联场景下的应用价值。
表子查询

子查询返回的结果是多行多列

案例:查询入职时间是'2021-02-07'之后的员工信息,及其部门信息

select e.*,d.* from (select * from emp where entrydate>'2021-02-07') e left join d on
e.dept_id=d.id;

这里将 “入职日期筛选后的员工子查询” 作为临时表e,再与部门表de

pt左连接,实现了 “筛选特定员工后,同时获取其部门信息” 的需求,体现了子查询与连接查询结合的灵活用法。

约束

  1. 非空约束(NOT NULL)

  2. 唯一约束(UNIQUE)作用:保证字段的值在表中是唯一的(但允许为NULL,且NULL可重复)。

  3. 主键约束(PRIMARY KEY)作用:是NOT NULL和UNIQUE的组合,用于唯一标识表中的每一条记录。

  4. 默认约束(DEFAULT)作用:为字段指定一个默认值,当插入记录时若未显式赋值,将使用该默认值。 gender char(1) default '男' comment '性别' -- 若插入时未指定性别,默认值为'男'

  5. 检查约束(CHECK)作用:通过自定义条件,限制字段值的范围(如年龄必须大于 0)。

create table user(
id int auto_increment primary key comment 'id唯一标识',
name varchar(10)not null unique  comment '姓名',
age int check(age>0&&age<=120) comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别'
);

外键约束

外键约束是用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。 子表(从表):具有外键 父表(主表):外键关联的表

语法:

1)创建表时添加外键:

CREATE TABLE 从表(   字段名 数据类型,   ...   [CONSTRAINT 外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表主键/唯一键字段名)
);

2)已有表添加外键:

ALTER TABLE 从表 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表主键/唯一键字段名);
​
alter table emp add constraint fk_emp_dept foreign key(dept_id) references dept(id);
​
constraint fk_emp_dept 为外键指定了名称(规范命名通常以 fk_ 开头,体现从表和主表的关联);
foreign key(dept_id) 明确了从表(emp)的外键字段;
references dept(id) 正确关联了主表(dept)的主键字段(id)

3)删除外键

alter table 表名 drop foreign key 外键名称;

级联操作

外键可配置级联更新(ON UPDATE CASCADE)和级联删除(ON DELETE CASCADE),示例:

ALTER TABLE emp ADD CONSTRAINT fk_emp_dept
FOREIGN KEY (dept_id) REFERENCES dept(id)
ON UPDATE CASCADE  -- 主表主键更新时,从表外键自动同步更新
ON DELETE CASCADE; -- 主表记录删除时,从表关联记录自动删除
​
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null ;
===>
on update set null:当主表(dept)的 id 被更新时,从表(emp)中所有关联的 dept_id 会被设为 NULL。
​
on delete set null:当主表(dept)的某条记录被删除时,从表(emp)中所有关联的 dept_id 会被设为 NULL。

注意事项:

1)主表的关联字段必须是主键或唯一键(保证值唯一,才能被从表引用)。
2)外键字段与主表关联字段的数据类型必须完全一致(如主表是int,外键也必须是int)。
3)并非所有场景都需外键:若系统通过业务逻辑即可保证数据一致性,也可不用(但外键能从数据库层面强制约束,更可靠)。

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

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

相关文章

2025年热门的儿童游乐安全带厂家最新热销排行

2025年热门的儿童游乐安全带厂家最新热销排行行业背景与市场趋势随着中国游乐设施行业的快速发展,儿童游乐安全带作为关键安全防护设备,市场规模持续扩大。根据中国游乐设施协会最新发布的《2024-2025年中国游乐设备…

2025年广东RBA验厂认证机构权威推荐榜单:SEDEX验厂认证/高新认定/ISO9001认证咨询机构精选

随着全球供应链社会责任标准的不断提升,RBA(责任商业联盟)验厂认证已成为电子行业及其他制造业接轨国际采购的必备资质。根据行业调研数据显示,超过85%的国际品牌采购商将RBA认证作为供应商准入的核心评估标准,中…

2025年11月石墨烯地暖安装品牌推荐排行榜单权威解析

摘要 随着新能源技术的快速发展,石墨烯地暖作为新一代采暖解决方案,在2025年迎来了爆发式增长。根据中国建筑节能协会数据显示,2025年石墨烯地暖市场规模预计突破200亿元,年增长率达35%。本文基于市场调研、用户口…

第十节:Jemeter的基本用法及线程数的特别说明

一. 二. 三. !作 者 : Yaopengfei(姚鹏飞) 博客地址 : http://www.cnblogs.com/yaopengfei/ 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人…

react 中 component 和 pureComponent 区别是什么?

在 React 中,Component 和 PureComponent 的核心区别就在于 是否自动进行浅层比较 (shallow compare),从而决定组件是否需要重新渲染。 1. React.Component Component 不会自动比较 props 或 state,只要父组件重新渲…

2025年电子站牌品牌前十排名:江苏兰太智能装备有限公司领跑行业

摘要 2025年电子站牌行业持续高速发展,受益于智慧城市建设和公共交通智能化趋势,市场规模预计年增长率超过15%。行业注重环保、定制化和技术创新,企业纷纷通过模块化生产和国际认证提升竞争力。本文基于权威数据和分…

2025年电子站牌厂家综合实力排行榜:江苏兰太智能装备领跑行业

摘要 随着智慧城市建设的加速推进,电子站牌作为城市公共交通智能化的重要组成部分,在2025年迎来了新一轮发展机遇。本文基于市场调研数据和技术评估,对当前电子站牌品牌进行综合排名分析,为行业采购决策提供参考。…

2025年电子站牌品牌综合实力排行榜:江苏兰太智能装备领跑行业

摘要 随着智慧城市建设的加速推进,电子站牌作为城市公共交通智能化的重要组成部分,其市场需求持续增长。2025年电子站牌行业将迎来技术升级与环保转型的双重机遇,各大厂商纷纷加大研发投入。本文基于市场调研数据与…

2025 年最新水基石墨源头厂家优质企业推荐排行榜:覆盖多品类石墨产品,助力企业精准选型可膨胀/阻燃/导电石墨/石墨导热板/石墨纸/润滑石墨粉/铸造石墨粉公司推荐

引言 在冶金、机械、电子、新能源等行业高速发展的当下,水基石墨作为核心基础材料,其品质稳定性、性能适配性与供应可靠性直接影响下游企业的生产效率与产品质量。当前市场中,水基石墨厂家数量繁杂,部分企业存在原…

2025 最新推荐石墨粉厂家排行榜:超细 / 导电 / 高纯 / 电池 / 金刚石专用等高性能优质品牌权威甄选超细/蠕虫/电池石墨粉公司推荐

引言 随着电子制造、新能源、高端机械等行业的技术升级,石墨粉作为关键基础材料的市场需求持续扩大,对其纯度、粒度精度及特殊性能的要求日益严苛。然而行业内产品品质参差不齐,采购者常面临选型困惑。本次排行榜依…

2025年热门的电动反弹器厂家最新TOP排行榜

2025年热门的电动反弹器厂家最新TOP排行榜行业背景与市场趋势随着智能家居和高端定制家具市场的蓬勃发展,电动反弹器作为现代家具五金的核心部件,正迎来前所未有的增长机遇。据中国五金制品协会最新数据显示,2024年…

《梦幻西游2》最新法宝合成攻略

《梦幻西游2》最新法宝合成攻略 点击订阅作者:野猪纯纯 2014-01-16字号: 《梦幻西游2》问世后,梦幻里一个重要的PK道具—法宝是很多玩家非常关注的焦点,如何正确的合出对应的法宝?如何减少法宝合成的失败率?下面…

剑指offer-39、平衡⼆叉树

题⽬描述 输⼊⼀棵节点数为 n ⼆叉树,判断该⼆叉树是否是平衡⼆叉树。 在这⾥,我们只需要考虑其平衡性,不需要考虑其是不是排序⼆叉树 平衡⼆叉树( Balanced Binary Tree ),具有以下性质:它是⼀棵空树或它的左右…

2025年口碑好的在线硬度计热门厂家推荐榜单

2025年口碑好的在线硬度计热门厂家推荐榜单行业背景与市场趋势随着制造业向智能化、数字化方向快速发展,硬度测试作为材料性能评估的关键环节,其重要性日益凸显。根据《2024-2029全球与中国在线硬度计市场现状及未来…

2025 最新压花辊源头厂家权威推荐榜:国际测评认证 + 全品类适配,优选高性价比实力制造商皮革压花辊/塑胶压花辊/塑木地板压花辊/PVC 压花辊/布料压花辊/木材压花辊厂家推荐

引言 在压花辊采购市场中,“源头直采” 已成为制造企业控制成本、保障品质的关键路径,但市场中中间商加价、劣质产品冒充优质货源等乱象,严重阻碍了采购效率与生产稳定性。为破解这一痛点,本次榜单依托国际压花设备…

计划成立一个反隐私组织

计划成立一个反隐私组织成员之间所有信息是通过一定的方式公开、共享、透明的

第5章 生成式AI项目的管理新挑战

第5章 生成式AI项目的管理新挑战作为对前文所述AI项目管理新范式的深化与扩展,本章聚焦于生成式AI这一迅猛发展的领域。生成式AI项目继承了传统AI项目的数据驱动、不确定性等核心特征,同时在其基础上,对项目管理的四…

2025年热门的硬度计硬度块厂家推荐及采购参考

2025年热门的硬度计硬度块厂家推荐及采购参考行业背景与市场趋势硬度测试作为材料性能评估的关键指标,在制造业、科研机构和质量检测领域扮演着不可或缺的角色。根据中国仪器仪表行业协会最新发布的《2024-2025年中国…

2025 最新推荐!权威测评认证光选机厂家榜:AI 多模态 + 高光谱技术,覆盖全场景分选需求废塑料/薄膜/高光谱材质/日杂分选/整瓶分选/餐盒分选光选机厂家推荐

引言 在再生资源循环与固废处理行业升级浪潮中,光选机的技术迭代成为提升资源回收率的核心引擎。据国际再生资源回收协会(BIR)最新测评数据显示,全球优质光选机品牌需通过材质识别精度、连续运行稳定性、能耗控制三…

实用指南:Android Studio新手开发第二十二天

实用指南:Android Studio新手开发第二十二天2025-11-19 08:53 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…