本文主要为大家分享一篇关于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;

插入数据
单个插入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);
1ANULL2B13C14D25E26F37G3

显示层级,这里用到了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 level4from department as d1left join department as d2 on d2.parent_id = d1.dep_id left join department as d3 on d3.parent_id = d2.dep_idleft join department as d4 on d4.parent_id = d3.dep_idwhere d1.dep_name='A';

当存储好了部门的层级信息后,我们就开始设计一个部门人员的表。
创建表,并存储部门人员的信息
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;

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

查找二级部门为B的人,并且列出了他的上级部门信息
select p.id, p.name, d1.dep_name as level1, d2.dep_name as level2, d3.dep_name as level3from people as pleft join department as d1 on d1.dep_id = p.dep_idleft join department as d2 on d2.dep_id = d1.parent_idleft join department as d3 on d3.dep_id = d2.parent_idwhere d1.dep_name='B' or d2.dep_name='B' or d3.dep_name='B';

查找二级部门为B的总人数
DESTOON B2B网站
DESTOON B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分离,源码开放。模型化的开发思路,可扩展或删除任何功能;创新的缓存技术与数据库设计,可负载千万级别数据容量及访问。DESTOON B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分
648 查看详情
select count(*) as totalfrom people as pleft join department as d1 on d1.dep_id = p.dep_idleft join department as d2 on d2.dep_id = d1.parent_idleft join department as d3 on d3.dep_id = d2.parent_idwhere d1.dep_name='B' or d2.dep_name='B' or d3.dep_name='B';
1hgy4D2abc5E3def6F4ddd2B5eee2B
应该考虑到有的人在二级部门(可能没有三级部门,没有四级部门),有的人在一级部门,有的人在四级部门(有一级部门,二级部门,三级部门,四级部门)。 
第二题:简单的统计
题目描述:现在有一批学生的成绩,求四门学科总分大于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;

INSERT 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);

根据四门成绩的总分进行排序
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;

这里是一个不能直接用别名来排序的知识点,
以上就是实例详解MySQL数据库的设计问题的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/892545.html
微信扫一扫
支付宝扫一扫