|
|
|
|
移动端

2.2 数据库设计

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍数据库设计。

作者:猿媛之家来源:机械工业出版社|2017-12-07 11:13

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


2.2 数据库设计

【真题 307】一个人存在于社区中,会有各种各样的身份,和不同的人相处会有不同的关系。请自行设计数据库(表结构、个数不限),保存一个人的名字、关系(包括父亲、朋友们),并尽可能少的时间空间开销组织好每个人和其他人的关系,组织好后尝试取出一个人的关系结构。其中涉及的 SQL语句请详细写出。涉及的数据结构、数据组织形成也请描述清楚,代码可以用伪代码或你熟悉的任何代码给出。

答案:

这道题要求存储三类信息:用户信息、关系信息、用户之间的关系信息。涉及的表如下所示:

(1)用户表:储存用户基本信息

create table user_info(user_id int primary key, user_name varchar(30) ,user_age int);(这个主键可以使用数据库自增的方式来实现,不同的数据库定义的方法有所不同)

(2)用户关系定义表:主要存储用户之间所有可能的关系

create table relation_define(relation_id int primary key, relation_name varchar2(32));

(3)用户关系信息表:储存用户关系信息

create table user_relation(user_id int, rel_user_id int,relation_id int );

上表中数据表示 1(James)和 2(Ross)是同事关系。 3(Jack)和 2(Ross)是父子关系。 1(James)和 3(Jack)是朋友关系。

示例:查询用户 1 的社会关系

select a.user_name,b.relation_name from user_info a, relation_define b,

(select user_id,relation_id from user_relation where rel_user_id =1 union select rel_user_id as user_id,relation_id from

user_relation where user_id =1) c

where a.user_id=c.user_id and b.relation_id=c.relation_id

运算结果见下表:

【真题 308】有如下学生信息:

学生表 student(stu_id,stu_name);

课程表 course(c_id,c_name);

成绩表 score(stu_id,c_id,score);

1.写出向学生表中插入一条数据的 SQL语句。

2.查询名字为

James的学生所选的课程。

3.查询

stu_id为 4的学生所学课程的成绩。
答案:

1.向数据库中插入一条记录用的是 insert语句,可以采用如下两种写法:

1)insert into student(stu_id,stu_name) values(1,'james')

2)insert into student values(1, 'james')

如果这个表的主键为 stu_id,并且采用数据库中自增的方式生成的,那么在插入的时候就不能显式地指定 stu_id这一列,在这种情况下,添加记录的写法为:

  1. insert into student(stu_name) values('james') 

2.在数据库中查询用到的关键字为 select,由于 student表中只存放了学生相关的信息, course表中只存放了课程相关的信息,学生与课程是通过 score表来建立关系的,一种思路为:首先找到名字为 Tom的学生的 stu_id,然后在成绩表( score)中根据 stu_id找出这个学生所选课程的 c_id,最后就可以根据 c_id找出这个学生所选的课程。

1)可以使用下面的

select语句来查询:

select c_name from course where c_id in (select c_id from score where stu_id in (select std_id from student where stu_name='James'))

2)当然也可以根据题目要求,根据三张表的关系,直接执行 select操作,写法如下:

  1. select c_name from student st, course c,score sc where st. stu_id=sc. stu_id and sc. cc_id=c.c_id and st.  
  2. stu_name='James' 

3)当然也可以把

2)的写法改为对三个表做 join操作。

3.成绩都存在表

score中,而课程名存储在表 course中,因此,需要访问这两张表来找出课程与成绩,实现方法如下:

  1. select c.c_name, s. score from course c,score s where s. stu_id =4 and c. c_id=s. c_id 


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

八万里路云和月——一个国家扶贫开发工作重点县的

通榆,这个距离各个交通枢纽都十万八千里的偏僻小县城,搭载着电子商务的快车,踏上了云高速,开辟了如火如荼的电商致富的新战场,实现了一...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊