键值约束与扩展属性、ER关系图、三大范式、分组查询、多表联查

键值约束与扩展属性,ER关系图,三大范式,分组查询,多表联查
在这里插入图片描述

键值约束与扩展属性

键值约束与扩展属性:
	键值约束:约束表中指定字段的数据必须符合某种规则;
种类:
	非空约束:NOT NULL —— 约束指定字段数据不能为NULL
	唯一约束:UNIQUE —— 约束指定字段数据不能出现重复
	主键约束:primary key —— 数据非空且唯一,一个表中只能有一个主键
	外键约束:foreign key —— 表中指定字段数据受父表数据约束
			foreign key (字段名) references 主表名(字段名)
	默认值:DEFAULT —— 为指定字段设置默认值
	自增属性:AUTO_INCREMENT —— 整形字段数据自动+1(用于主键字段)

分组查询:group by —— having
分组查询的字段只能是分组依据字段以及聚合函数
分组查询中不能使用where,如果要用条件过滤使用having
select role,sum(salary),max(salary),min(salary),avg(salary) from tbname group by role having avg(salary)>1500;

聚合函数:针对结果中的数据的某个字段进行某种统计运算
count(*) ——统计数据条数
sum(fields) ——统计指定字段的和
max(字段) ——统计指定字段中最大值
min(fields) ——统计指定字段中最小值
avg(fields) ——统计指定字段的平均值

数据库中表的设计:ER,三大范式

ER关系图

ER关系图:
一对一:一个学生只有一个学生证
能唯一标识一个学生的字段就是主键

一对多:向学生实体(多的一方)添加一个班级id

在这里插入图片描述
一个学生能学多个课,一个课可以有多个学生上
多对多:设计一个中间表包含两个实体的ID,通过中间表将两个实体关联
在这里插入图片描述

三大范式

三大范式:数据库表设计的三大规范
第一范式:表中每个字段都必须具有不可分割的原子操作(第一范式是其他范式的前提)(确保每列保持原子性)
在这里插入图片描述
上表违反第一范式,后两栏可分割。
不遵循第一范式会导致按照某个非原子字段进行查询时效率降低。

第二范式:表中每个字段都应与主键完全关联,而不是部分关联(确保表中的每列都和主键相关)
在这里插入图片描述
上图不遵循第二范式标准品那个会出现大量数据冗余。
在这里插入图片描述
第三范式:表中每个字段都应该与主键直接关联,而不是间接关联
在这里插入图片描述
上图不遵循第三范式,班主任信息和学生信息间接关联,可拆分为下面
在这里插入图片描述
在这里插入图片描述

多表联查

多表联查:将多张表合在一起进行查询
将多张表合在一起:笛卡尔积
在这里插入图片描述

连接方式:内连接+外连接(左连接,右连接)
内连接:连接数据交集 inner join

class |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| stu
在这里插入图片描述
select stu.name,class.name from stu inner join class on class.id=stu.class_id
在这里插入图片描述
左连接:以左表为基表在右表中查询符合条件的进行连接
select stu.name,class.name from stu left join class on stu.class_id=class.id
在这里插入图片描述
右连接:以有表为基表在左表中查询符合条件的进行连接
select stu.name,class.name from stu right join class on stu.class_id=class.id

<think>嗯,用户想了解如何通过ER图进行张表的联查,还提到了SQL、关系型数据库的设计和实现。首先,我需要回忆一下ER图的基本概念,以及表联查在数据库中的常见场景。ER图是由实体、属性和关系组成的,用来描述数据库的结构。表联查通常涉及多个实体之间的关系,可能需要使用JOIN操作。 接下来,用户的问题可能涉及到如何设计这个表之间的关系,以及如何用SQL实现联查。比如,外键的设置、主键的选择,以及JOIN的具体用法。考虑到用户提到的引用,比如引用[4]中的外键示例,可能需要结合外键约束来说明表之间的关系。 然后,我需要考虑用户可能的实际应用场景。例如,学生、课程和成绩的表联查,或者订单、客户和产品的联查。通过具体的例子可以帮助用户更好地理解ER图和SQL查询的关系。 另外,用户提到的ER图到SQL的转换过程也很重要。需要分步骤解释,首先设计ER图,确定实体和关系,然后转化为表结构,最后编写联查的SQL语句。同时,可能需要提到JOIN的类型,如LEFT JOIN、INNER JOIN等,以及它们的使用场景。 还要注意用户可能的误区,比如没有正确设置外键导致联查失败,或者JOIN条件错误导致结果不正确。这时候需要强调外键约束的重要性和正确的ON条件。 最后,生成相关问题时要覆盖用户可能进一步想知道的内容,比如性能优化、多表联查的应用场景、设计原则等,确保问题具有连贯性和扩展性。</think>### 通过ER图设计表联查的步骤实现 #### 一、ER图设计阶段 1. **定义实体属性** 确定个核心实体(如`学生表(tb_stu)`、`课程表(tb_course)`、`成绩表(tb_score)`),每个实体需明确主键(如学生ID、课程ID)和属性[^4]。 2. **建立实体间关系** - **一对多关系**:学生成绩表通过`id`关联(1个学生对应多个成绩) - **多对多关系**:若课程学生需间接关联,可通过中间表(如成绩表)实现[^1]。 3. **绘制ER图示例** ``` [学生表] --< 成绩表 >-- [课程表] ``` #### 二、表结构实现(SQL) 1. **创建基础表** ```sql CREATE TABLE tb_stu ( id INT PRIMARY KEY, name VARCHAR(32) ); CREATE TABLE tb_course ( course_id INT PRIMARY KEY, title VARCHAR(50) ); ``` 2. **建立关联表** ```sql CREATE TABLE tb_score ( stu_id INT, course_id INT, score DECIMAL(5,2), FOREIGN KEY (stu_id) REFERENCES tb_stu(id), FOREIGN KEY (course_id) REFERENCES tb_course(course_id) ); ``` 通过外键约束保证数据完整性。 #### 表联查SQL实现 1. **使用JOIN操作** ```sql SELECT s.name, c.title, sc.score FROM tb_stu s INNER JOIN tb_score sc ON s.id = sc.stu_id INNER JOIN tb_course c ON sc.course_id = c.course_id; ``` 此查询会返回学生姓名、课程名称及对应成绩[^5]。 2. **筛选特定条件** ```sql SELECT s.name, c.title, sc.score FROM tb_stu s LEFT JOIN tb_score sc ON s.id = sc.stu_id LEFT JOIN tb_course c ON sc.course_id = c.course_id WHERE c.title = '数据库原理'; ``` `LEFT JOIN`可包含未选课学生的空值记录。 #### 四、设计原则 1. **主键设计** 复合主键需谨慎使用(如成绩表可能用`(stu_id, course_id)`),避免关联复杂度[^1]。 2. **全局表处理** 若涉及字典表(如院系表),可采用全局表策略,减少跨库查询[^3]。 3. **性能优化** 多表联查时,建议对WHERE条件字段建立索引,例如: ```sql CREATE INDEX idx_course_title ON tb_course(title); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值