mysql数据库的分析设计题_实例详解MySQL数据库的设计问题

本文详细介绍了如何设计MySQL数据库中的层级结构,以解决部门及人员统计问题。首先创建了DEPARTMENT表用于存储部门信息,接着创建PEOPLE表存储人员数据。通过LEFT JOIN查询实现了层级展示、特定部门人员查找和人数统计。此外,还展示了对学生成绩进行总分统计的例子,强调了在SQL排序中不能直接使用别名列的注意事项。
摘要由CSDN通过智能技术生成

本文主要为大家分享一篇关于MySQL数据库的设计问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。

第一题:层级数据库设计

题目描述:现在有10万条左右的数据,记录一个部门的员工。大部门下是层级结构,有许多个子部门。比如,一级部分A,二级部门A’,B’,C’,三级部门A”,B”,C”。试问如何设计数据库,我们需要统计二级部分A’下的所有人数。

分析:

这里用到了一个层级数据库的设计。CREATE TABLE DEPARTMENT(

DEP_ID INT UNSIGNED AUTO_INCREMENT,

DEP_NAME VARCHAR(10) NOT NULL,

PARENT_ID INT,

PRIMARY KEY(DEP_ID)

)CHARSET=utf8;

4c961571ab200b0bc9f6c41d4482a14f.png

插入数据单个插入

INSERT INTO DEPARTMENT (DEP_NAME, PARENT_ID)

VALUES

('A',NULL);

或者批量插入

INSERT INTO department VALUES(1,'A',NULL),(2,'B',1),(3,'C',1),

(4,'D',2),(5,'E',2),(6,'F',3),(7,'G',3);dep_iddep_nameparent_id1ANULL

2B1

3C1

4D2

5E2

6F3

7G3

a0c05a78b9fb1c2946c67f0d0f43ff3e.png

显示层级,这里用到了left join,根据这一级的dep_id,寻找它的parent_id,然后通过左连接进行连接,得到当前部门以及他的父部门。select d1.dep_name as level1, d2.dep_name as level2, d3.dep_name as level3, d4.dep_name as level4

from department as d1

left join department as d2 on d2.parent_id = d1.dep_id

left join department as d3 on d3.parent_id = d2.dep_id

left join department as d4 on d4.parent_id = d3.dep_id

where d1.dep_name='A';

57addf2ce48a01892e7df2d5ca0574c4.png

当存储好了部门的层级信息后,我们就开始设计一个部门人员的表。

创建表,并存储部门人员的信息create table people(

id INT UNSIGNED AUTO_INCREMENT,

name varchar(10) not null,

dep_id INT UNSIGNED,

departname varchar(10),

FOREIGN KEY (dep_id) REFERENCES department(dep_id),

primary key(id)

)charset=utf8;

bb489f2e7c628aad0d4644e2edbd3e77.png

插入相关的测试数据。INSERT INTO people VALUES(1,'hgy',4,'D'),(2,'abc',5,'E'),(3,'def',6,'F'),

(4,'ddd',2,'B'),(5,'eee',2,'B');

c66b6ce3973e6270d5b9518e1480ea3c.png

查找二级部门为B的人,并且列出了他的上级部门信息select p.id, p.name, d1.dep_name as level1, d2.dep_name as level2, d3.dep_name as level3

from people as p

left join department as d1 on d1.dep_id = p.dep_id

left join department as d2 on d2.dep_id = d1.parent_id

left join department as d3 on d3.dep_id = d2.parent_id

where d1.dep_name='B' or d2.dep_name='B' or d3.dep_name='B';

0dd7f3282ce8ff365f1933fc74ca368d.png

查找二级部门为B的总人数select count(*) as total

from people as p

left join department as d1 on d1.dep_id = p.dep_id

left join department as d2 on d2.dep_id = d1.parent_id

left join department as d3 on d3.dep_id = d2.parent_id

where d1.dep_name='B' or d2.dep_name='B' or d3.dep_name='B';idnamedepartment_iddepartname1hgy4D

2abc5E

3def6F

4ddd2B

5eee2B

应该考虑到有的人在二级部门(可能没有三级部门,没有四级部门),有的人在一级部门,有的人在四级部门(有一级部门,二级部门,三级部门,四级部门)。

69c9ccc2d029ee84fd53676ffe8efec8.png

第二题:简单的统计

题目描述:现在有一批学生的成绩,求四门学科总分大于200的学生,并且按逆序排列。CREATE TABLE STUDENT(

ID INT UNSIGNED AUTO_INCREMENT,

SCORE1 INT NOT NULL,

SCORE2 INT NOT NULL,

SCORE3 INT NOT NULL,

SCORE4 INT NOT NULL,

PRIMARY KEY(ID)

)CHARSET=utf8;

e0d38231ba5ca14000ba9c339a31a9b4.pngINSERT INTO STUDENT VALUES(1,100,98,10,4),(2,100,9,10,4),(3,70,0,180,40),(4,10,98,1,4),(5,30,7,10,4),(6,8,88,1,43);

2266dd484cffad2669fc47e8e3b60a61.png

根据四门成绩的总分进行排序SELECT id, score1,score2,score3,score4, score1+score2+score3+score4 as total

FROM STUDENTwhere score1+score2+score3+score4 > 200 order by score1+score2+score3+score4 desc;

8953ca22433fe9e2aa6c39e3bb213d9d.png

这里是一个不能直接用别名来排序的知识点,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值