我面试j2ee他问我数据库设计方面的问题,要求如下:1、有两张表:employee(员工) 和 skill(员工的技能)2、一个员工可能有多个技能也可能没有技能3、如何设计这两张表? 如何用sql查出每个员工的所有技能?我数据库太过薄弱这道题答不上来,有人能告诉我吗?
 

解决方案 »

  1.   

    创建员工表和员工技能表
    员工技能表中要包含员工表中的员工ID
    然后用外连接查询
    left join 或者right join
      

  2.   

    员工技能有或者没有  就是员工对技能的一个一对多的关系,一对多关系到数据库中表现为以下。
    多方保存 一方的主键作为外键就是员工技能表中需要包含一列为员工ID,并作为外键参照员工表的ID属性。
    查询外连接,和嵌套都可以
      

  3.   


    如果技能不是固定的,也就是说:不存在多个员工拥有同一个技能的话,可以采用这种方式设计数据库
    楼主说的问题并不是问题:select t1.ID,t1.员工姓名,t2。技能名 from 员工 t1
    left join 技能表 t2 on t1.ID = t2.员工ID
    这样查询出来的是一个list  楼主不是数据库太薄弱,你是根本就不会啊。
      

  4.   

    我的错了 。 应该是多对多的关系,所以可以设置3个表。
    一个是 员工表,一个技能表,一个对应关系表。
    一表主键为员工ID,二表主键为技能ID,三表主键为1表2表的主键。查询 直接在三表查询,select 技能ID from 表3 where 员工ID= ;
      

  5.   

    创建员工表如下:
    create table employee(id int primary key not null,name varchar(20),sex char(4),age smallint);
    创建技能表:
    create table skill(id int primary key not null,e_id int,skillName varchar(20),
    foreign key(e_id) references employee()
    )
    说明:e_id是外键,参照employee的id。
    查出每个员工的所有技能:
    select e.name,s.skillName  from employee e,skill s where e.id=s.e_id group by e.name;
      

  6.   

    你根本没弄清楚我说的,你的这句SQL我当时就是这么写的,但别人说我写的不对人家要的是什么? 是这样的  员工编号   员工姓名    员工技能(这个字段显示出来的是他所有的技能)
    例如 10001     张三   男    电脑  写作   游泳 一个字段表示出所有的技能   就是这个意思  所以我认为难度是设计上的问题 而不是sql的问题
      

  7.   


    你的group by 字句行不通啊   不给力哦
      

  8.   

    你根本没弄清楚我说的,你的这句SQL我当时就是这么写的,但别人说我写的不对人家要的是什么? 是这样的   员工编号 员工姓名  员工技能(这个字段显示出来的是他所有的技能)
    例如  10001 张三 男 电脑 写作 游泳 一个字段表示出所有的技能 就是这个意思 所以我认为难度是设计上的问题 而不是sql的问题哥们你是在玩笑么? 如果你需要这样 那更没难度了,
    就一个表就可以了员工编号 员工姓名  员工技能
    这就是你的 结果了 , 主键员工编号加员工技能, 这么设计全是冗余。如果你要说 员工技能一项存储多项信息, 那是不可能的, 你的设计连第一范式都达不到。他说你错了 很有可能是你把 多对多关系分析成一对多了  你可以看看我上面多对多给出的答案