面试实题:No.6

1、有1000个苹果,有10个盒子,将1000个苹果放到这10个盒子中,客户要1000以内个苹果时,只需给客户十个盒子任意几个盒子就能满足用户的需求,这10个盒子每个盒子放几个苹果。
1   2   4   8   16  32  64  128 256 512
2、(程序员)在一个字符串中找到第一个只出现一次的字符,如输入abaccdeff,这输出b?
import java.util.HashMap;
import java.util.Map;
public class FirstCharactorDemo {
    public static void main(String[] args) {
       String s = "abaccdeff"; // d
       char c = getFirstSingleChar(s);
       System.out.println(c);
    }
    private static char getFirstSingleChar(String s) {
       char[] cs = s.toCharArray();
       Map<Character, Integer> map = new HashMap<Character,  Integer>();
       for (char c : cs) {
           Integer count = map.get(c);
           if (count == null) {
              count = 0;
           }
           count++;
           map.put(c, count);
       }
       for (char c : cs) {
           Integer count = map.get(c);
           if (count == 1) {
              return c;
           }
       }
       throw new RuntimeException("不存在出现次数为1次的字符");
    }
}
 
3、写sql语句,找出表product中code重复的数据行。
    表名:product
    字段:ID   code   name   spec   unit   price
    select code from product group by code having count(code) > 1
 
4、写出数据库查询语句
S{S#,SN,SD}学生表,内容分别代表:学生编号,学生姓名,学生部门
C{C#,SN}课程表 ,内容分别代表:课程编号,课程名称
SC {S#,C#,SCORE}分数表,内容代表:学生编号,课程编号,分数
题目
查出学了‘孤独九剑‘的学生
select * from s s
where
exists (select 1 from sc
left join c c on c.c# = sc.c#
where sc.s# = s.s# and c.c# = '孤独九剑'
)
查询学了所有课程的学生
select * from s s
where
exists
(
select 1 from c c
where
c.c# all in
(
select sc.c# from sc sc
where sc.s# = s.s#
)
)
查询学了5门以上课程的学生
select * from s s
where
exists
(
select 1 from sc sc where sc.s# = s.s# having count(sc.c#) > 5
)
两个表情况
表名:wu_plan
ID  plan   mode   corp_code  plannum       prixls
1   00001  exx22   nokia      2000       0
2   00002  1c001   sony       3000       0
表名:wu_bom
ID  plan   pact   amount
1   00001  aa1     300
2   00001  aa2     200
3   00002  bb1     500
4   00002  bb2     800
5   00002  bb3     400
查询这两个表中plan唯一,每一个plan中,amount最少的,plannum大于prixis的记
结果是:
ID  plan   model  corp_code  plannum       prixis pact   amount
1   00001  exx22   nokia      2000        0     a2     200
2   00002  1c001   sony       3000        0     bb3    400
select * from wu_plan wp
left join wu_born wb on wb.plan = wp.plan
where
wb.plan = (select min(iwp.amount) from wu_born iwp where iwp.plan = wp.plan)
5、写出数据库设计的三个范式。

数据库设计范式

什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些

什么是三大范式:

求,否则,将有很多基本操作在这样的关系模式中实现不了。

第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.

理解三大范式

   1、每一列属性都是不可再分的属性值,确保每一列的原子性

如果需求知道那个省那个市并按其分类,那么显然第一个表格是不容易满足需求的,也不符合第一范式。

第二范式

一个人同时订几个房间,就会出来一个订单号多条数据,这样子联系人都是重复的,就会造成数据冗余。我们应该把他拆开来。

第三范式

比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)

这样的表结构,我们应该拆开来,如下。

最后:

规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。

第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要

第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。

注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性

第一范式

   2、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。

显然第一个表结构不但不能满足足够多物品的要求,还会在物品少时产生冗余。也是不符合第一范式的。

每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。

这样便实现啦一条数据做一件事,不掺杂复杂的关系逻辑。同时对表数据的更新维护也更易操作。

数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c  属性之间含有这样的关系,是不符合第三范式的。

这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)

(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)

三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。

 
发布了441 篇原创文章 · 获赞 1021 · 访问量 53万+

猜你喜欢

转载自blog.csdn.net/A_BlackMoon/article/details/104561219