旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

实例详解MySQL数据库的设想题目【MySQL教程】,MySQL,数据库,设计

作者:搜教程发布时间:2019-11-27分类:MySQL教程浏览:31评论:0


导读:本文主要为人人分享一篇关于MySQL数据库的设想问题,具有很好的参考价值,愿望对人人有所协助。一同追随小编过来看看吧,愿望能协助到人人。第一题:层级数据库设想问题形貌:如今...

本文主要为人人分享一篇关于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);
dep_id dep_name parent_id
1 A NULL
2 B 1
3 C 1
4 D 2
5 E 2
6 F 3
7 G 3


显现层级,这里用到了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';


当存储好了部门的层级信息后,我们就最先设想一个部门职员的表。
建立表,并存储部门职员的信息

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 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';


查找二级部门为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';
id name department_id departname
1 hgy 4 D
2 abc 5 E
3 def 6 F
4 ddd 2 B
5 eee 2 B

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

第二题:简朴的统计

问题形貌:如今有一批门生的结果,求四门学科总分大于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数据库的设想问题的细致内容,更多请关注ki4网别的相干文章!

标签:MySQL数据库设计


欢迎 发表评论: