经典五张表之部门中的不同工作的人员的数量统计

本文通过具体案例介绍了如何使用SQL进行部门工作类型的人员统计。首先确定各部门员工的工作内容,接着按工作类型对员工进行分组计数,特别关注了如何区分不同部门中从事相同工作的员工数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--部门对应的工作有几人
--第一步其实是求 十部门中的每个人是做什么工作的
--第二步是在十部门每个人的基础上按照工作类型来进行人员统计
--case 针对的是后面的 列进行计算的 when是筛选条件

--count针对的是case后面的列



--先看部门中有几个人,然后根据要求按照部门的工作进行分组划分

select job ,
count (case  deptno  when 10  then '属于十部门'  end) "十部门", 
count (case  deptno  when 20  then '属于廿部门' end )"二十部门对应的各种工作有几人" ,
count (case  deptno  when 30 then '属于仨部门' end) "三十部门拥有的工作有几人"
from emp   
group by job 


--**和李** 
--关键点是以什么来划分
--按照工作来划分**和李**都属于助教 所以这分工作有两个人做.看的重点是这份工作
--按照人来划分,两个人**李**两个具体的人在做同一份工作
--所以最模糊点是在进行划分的时候按照什么来进行划分
<think>嗯,用户的问题是关于数据库中五张的设计或操作方法,可能涉及数据库设计原则或分片技术。首先,我需要回顾一下用户提供的引用内容。引用[1]提到了分库分的直接访问方式,需要业务层控制分片信息,而引用[2]讨论了数据库设计中的范式与冗余的平衡。 用户提到可能与数据库设计或操作有关,涉及五张的结构或关系。我需要先考虑五张常见的应用场景,比如电商系统可能有用户、商品、订单、订单详情、库存等。设计时需要遵循第三范式,但也要考虑性能优化,适当冗余。 接着,结构设计方面,主键、外键的设置很重要,确保数据一致性。比如订单需要引用用户和商品的外键。然后,索引优化,对经常查询的字段建立索引,比如订单的用户ID和创建时间。 分库分的策略,根据引用[1],如果数据量太大,可能需要水平分片,比如按用户ID哈希分片。但跨分片操作复杂,需要业务层处理,这可能影响性能,所以如非必要,应避免分布式改造。 另外,操作方面,事务管理是关键,尤其是跨操作,比如下单需要减库存、生成订单,需用事务保证原子性。联查询时,如果分片了,跨分片join困难,可能需要冗余字段或应用层处理。 还需要考虑引用[2]中的建议,适当冗余以减少join次数,比如在订单详情中冗余商品名称,避免每次查询都联查商品。但冗余会导致更新麻烦,需权衡利弊。 可能用户的实际场景是设计一个包含五张的系统,需要高效操作。要综合范式与冗余,分片策略,事务和查询优化。此外,分片后的查询要尽量在单一分片内完成,避免跨分片访问,如引用[1]所述。 最后,生成相关问题时要覆盖设计原则、范式应用、分片策略、性能优化和事务处理等方面,帮助用户深入理解多设计的考量。</think>### 数据库中五张的设计与操作方法 #### 1. **结构设计原则** - **遵循范式与冗余平衡** 根据引用[^2],五张的设计需尽量满足第三范式(例如消除传递依赖),但为提升查询效率可适当冗余。例如: - 若存在频繁关联查询的字段(如订单中的“商品名称”),可冗余存储以避免多连接。 - 主键设计需唯一且稳定,例如用户使用自增ID,订单使用分布式唯一ID(如雪花算法)。 - **分片策略(若涉及分布式)** 若五张需要分库分,需按引用[^1]的单元化原则设计分片键(如按用户ID哈希分片),确保跨操作在单分片内完成。 #### 2. **五关联的典型场景** **示例:电商系统五模型** - **用户(`user`)**:存储用户信息,主键`user_id`。 - **商品(`product`)**:存储商品信息,主键`product_id`。 - **订单(`order`)**:记录订单基本信息,外键`user_id`关联用户。 - **订单详情(`order_detail`)**:记录商品购买明细,外键`order_id`和`product_id`。 - **库存(`inventory`)**:跟踪商品库存,外键`product_id`关联商品。 ```sql CREATE TABLE user ( user_id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) ); CREATE TABLE product ( product_id INT PRIMARY KEY, name VARCHAR(100), price DECIMAL(10,2) ); CREATE TABLE order ( order_id BIGINT PRIMARY KEY, user_id INT, total_amount DECIMAL(10,2), FOREIGN KEY (user_id) REFERENCES user(user_id) ); ``` #### 3. **关键操作方法** - **事务管理** 涉及多操作时(如创建订单需同时更新订单和库存),需使用数据库事务保证原子性: ```sql BEGIN TRANSACTION; INSERT INTO order (...) VALUES (...); UPDATE inventory SET stock = stock - 1 WHERE product_id = 100; COMMIT; ``` - **联查询优化** 使用`JOIN`时需注意索引有效性。例如查询用户订单历史: ```sql SELECT o.order_id, p.name FROM order o JOIN order_detail od ON o.order_id = od.order_id JOIN product p ON od.product_id = p.product_id WHERE o.user_id = 123; ``` 建议为`user_id`、`order_id`等字段建立索引。 #### 4. **分库分的实现(若适用)** - **垂直分片**:将五张按业务模块拆分(如用户相关与商品相关分离)。 - **水平分片**:对单数据量过大的(如订单)按分片键(如`user_id % 4`)分布到不同数据库节点[^1]。 - **跨分片查询限制**:需避免跨分片事务,例如订单生成需确保用户与订单在同一分片。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值