news 2026/1/3 4:12:59

SQL Server——约束与多表联查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL Server——约束与多表联查

数据库约束与多表联查

一、数据库约束

约束是作用于表中字段上的规则,用于限制存储在表中的数据

用于保证数据库中数据的正确性、有效性和完整性。

约束

  • 主键约束:值唯一且不为NULL,一张表只能有一个主键约束,用于唯一标识记录

  • 唯一约束:值必须唯一,允许有一个为null,确保列值唯一性

  • 非空约束:不能为null

  • 检查约束:限制列的取值范围,保证数据域的正确性

  • 默认值约束:给这一列设置一个默认值

  • 外键约束:从表的某个列的值来源于主表某列的值,维护表间引用完整性

1. 主键约束

三种设置方式

方法1:

//方法1: create table tb_teacher( tid int primary key, tname varchar(20) );

方法2:

create table tb_teacher( ​ tid int, ​ tname varchar(20), ​ primary key(tid) ​ );

方法3:修改表添加

create table tb_teacher( ​ tid int, ​ tname varchar(20) ​ ); ​ ALTER TABLE tb_teacher ​ ADD CONSTRAINT pk_teacher PRIMARY KEY (tid);

组合主键

多列共同构成主键,多对多关联表常用

create table tb_teacher( ​ tid int, ​ tname varchar(20), ​ cardno char(18), ​ primary key(tid, cardno) -- 组合主键 ​ );

*2. 检查约束

create table tb_teacher( ​ tid int primary key, ​ tname varchar(20) not null, ​ cardno char(18) unique, ​ sex char(2) check(sex='男' or sex = '女') ​ );

3. 外键约束

注意事项

· 创建表:先主表后从表

· 删除表:先从表后主表

· 已有数据的表添加外键可能失败

-- 修改表方式添加外键(与主键相同,有三种,创建方式相同,关键字不同)

ALTER TABLE 表名 ​ ADD CONSTRAINT 外键名称 ​ FOREIGN KEY (外键字段名) ​ REFERENCES 主表 (主表列名);

·一对一:外键加在任意一方

·一对多:外键加在"多"的一方

·多对多:需要中间表(命名:tb表1表2)

二、多表联查

1. 联合查询(集合操作)

1. UNION - 并集(去重)
-- 将薪资低于2000的员工和10号部门的员工全部查询出来 select * from emp where sal < 2000 ​ union ​ select * from emp where deptno = 10;
2. UNION ALL - 并集(不去重)
select * from emp where sal < 2000 ​ union all ​ select * from emp where deptno = 10;

注意事项

列名取自第一个查询结果集

3. INTERSECT - 交集
-- 查询既是10号部门又是CLERK的员工 ​ select * from emp where deptno = 10 ​ intersect ​ select * from emp where job = 'CLERK';

注意事项

  1. INTERSECT会自动去除重复行

  2. 所有查询必须有相同数量的列

  3. 对应列的数据类型必须兼容

  4. 结果集的列名取自第一个查询

4 .EXCEPT - 差集
-- 查询10号部门中不是CLERK的员工 ​ select * from emp where deptno = 10 ​ except ​ select * from emp where job = 'CLERK';

注意事项

  1. EXCEPT会自动去除重复行

  2. 所有查询必须有相同数量的列

  3. 对应列的数据类型必须兼容

2. 连接查询

连接类型使用场景特点
内连接需要完全匹配的数据只返回满足条件的记录· 查询结果必须满足连接条件
左外连接需要显示左表所有记录以左表为主表, 左表所有记录都会显示,右表不满足条件的显示NULL
右外连接需要显示右表所有记录以右表为主表, 左表所有记录都会显示,右表不满足条件的显示NULL
全外连接需要显示所有记录两边表记录都显示,不匹配为NULL
自连接查询层级关系(如上下级关系)表自身连接,需要别名
2.1 笛卡尔积(自然连接)

连接查询会产生笛卡尔积,即两个表的乘积(实际开发中不使用,无意义)

SELECT * FROM emp, dept;
内连接

标准写法

SELECT * FROM emp e JOIN dept d ON e.deptno=d.deptno;

非标准写法

SELECT e.ename,e.sal,e.comm,d.dname FROM emp AS e,dept AS d WHERE e.deptno=d.deptno;
24 外连接
2.4.1 左外连接(LEFT JOIN)
SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;
2.4.2 右外连接(RIGHT JOIN)
SELECT * FROM emp e ​ RIGHT OUTER JOIN dept d ​ ON e.deptno = d.deptno;
2.4.3 全外连接(FULL JOIN)
SELECT * FROM emp e ​ FULL JOIN dept d ​ ON e.deptno = d.deptno;
2.5 自连接(SELF JOIN)

表自身与自身连接

-- 查询员工及其所属领导的名字

-- 使用JOIN语法

SELECT 字段列表 FROM 表A 别名A JOIN 表B 别名B ON 条件 ...

;

  1. 连接不限与两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。

  2. 两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少有一个主外键条件,三张表连接至少有两个主外键条件。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/31 20:01:57

Forest框架:让Java HTTP调用像说话一样简单,新手必看!

还在为Java中的HTTP调用头疼吗&#xff1f;每次都要写大段的URL拼接、参数处理、响应解析代码&#xff1f;Forest声明式HTTP框架正是为你量身打造的解决方案&#xff01;它通过简单的注解配置&#xff0c;让HTTP请求变得像本地方法调用一样直观。本文将带你从零开始认识Forest&…

作者头像 李华
网站建设 2025/12/29 9:07:40

MacPass终极指南:免费开源密码管理神器

在数字安全日益重要的今天&#xff0c;MacPass作为macOS平台上原生的KeePass客户端&#xff0c;为用户提供了专业级的密码管理解决方案。这款开源密码管理器将强大的安全功能与优雅的用户体验完美结合&#xff0c;让密码管理变得简单而高效。 【免费下载链接】MacPass A native…

作者头像 李华
网站建设 2026/1/3 3:55:21

MacPass:为macOS用户打造的智能密码管家

在日常数字生活中&#xff0c;你是否曾为记忆众多密码而烦恼&#xff1f;MacPass作为一款专为macOS设计的原生KeePass客户端&#xff0c;为你提供安全便捷的密码管理体验。这款应用将密码安全与苹果生态完美融合&#xff0c;让密码管理变得轻松高效。 【免费下载链接】MacPass …

作者头像 李华
网站建设 2026/1/2 7:14:59

理解工业控制中数字电路的高低电平匹配问题图解说明

工业控制中的电平匹配&#xff1a;一个工程师踩过的坑与实战解法你有没有遇到过这种情况&#xff1f;调试了三天的PLC输入信号&#xff0c;MCU始终读不到状态变化。万用表一测——GPIO引脚电压3.8V&#xff0c;芯片手册却写着“最大输入电压不能超过3.6V”。再查电源轨……哦&a…

作者头像 李华
网站建设 2026/1/1 18:56:31

深度剖析c9511e错误日志中隐藏的toolkit搜索路径线索

深度破解 c9511e 错误&#xff1a;从日志中挖出 ARM 工具链的“寻路逻辑” 你有没有遇到过这种场景&#xff1f;在 CI 流水线里跑得好好的构建任务&#xff0c;换了个机器就突然崩了&#xff0c;终端只甩出一行冰冷的提示&#xff1a; error: c9511e: unable to determine…

作者头像 李华
网站建设 2026/1/2 16:11:59

Pock完全指南:MacBook Touch Bar终极Widget管理工具

Pock完全指南&#xff1a;MacBook Touch Bar终极Widget管理工具 【免费下载链接】pock Widgets manager for MacBook Touch Bar 项目地址: https://gitcode.com/gh_mirrors/po/pock 还在为MacBook Touch Bar功能单一而烦恼吗&#xff1f;Pock作为一款免费的Touch Bar增强…

作者头像 李华