1.
User表用于记录用户相关信息, Photo表用于记录用户的照片信息, 两个表的定义如下:
CREATE TABLE User( --用户信息表
UserId bigint,   --用户唯一id
Account varchar(30)   --用户唯一帐号
);
CREATE TABLE Photo(   --照片信息表
PhotoId bigint, --照片唯一id
UserId bigint,   --照片所属用户id
AccessCount int,   --访问次数
Size bigint   --照片文件实际大小
)
1) 请给出SQL打印帐号为"dragon"的用户访问次数最多的5张照片的id;
2) 给出SQL打印拥有总的照片文件大小(total_size)最多的前10名用户的id, 并根据total_size降序排列
3) 为优化上面两个查询, 需要在User和Photo表上建立什么样的索引?2.
数据库中有表User(id, name, age):
表中数据可能会是以下形式:
id   name   age
001 张三   56
002 李四   25
003 王五   56
004 赵六   21
005 钱七   39
006 孙八   56
..............
由于人员年龄有可能相等, 请写出SQL语句, 用于查询age最大的人员中, id最小的一个记录

解决方案 »

  1.   

    1.select photoid from(
    select b.photoid,row_number()over(order by accesscount desc)rn
     from user a,photo b
    where a.user_id=b.user_id
    and a.account='dragon')
    where rn<=5
      

  2.   

    你这个是mysql的数据库。要用oracle的语法么,还是标准的通用语法。
      

  3.   

    1. 2)
    select user_id,s from(
      select user_id,sum(size)s,row_number()over(order by sum(size) desc)rn
      from photo
      group by user_id)
    where rn<=103)user表将UserId设为主键,photo表的UserId设为user表中UserId的外键
      

  4.   


    2.
    select * from user a
    where not exists(select 1 from user
      where age>a.age)
    and not exists(select 1 from user
      where id<a.id and age=a.age)
      

  5.   


    photo表的UserId设为user表中UserId的外键 
    这个还是要在photo表上建一个userid的index外键是约束,保证完整性,对性能没有作用。还需要注意,这里是Oracle的写法,你的数据库是Mysql的,如果这样运行是有问题的。
      

  6.   

    没有 人考虑 全的 么?标准的 sql?
    还有 索引 需要 哈希索引 等结构么?
      

  7.   


    没有简单不简单,关键看你要深入的程度。单纯从sql开发角度而言,而且是按标准实现,没有很多参考性,因为不同的数据库对于top有不同的处理
    比如sqlserver的top,oracle的rownum,mysql的limit看你的数据库应该是mysql,所以是不是以mysql的语法为主呀至于优化的话,mysql上也只有index这个方法了。
      

  8.   

    什么是RAC
    传说中的RAC,做为我们本文的主角,其全称是Real Application Cluster,官方的中译是真正应用集群,听起来和叫起来都很别扭是不是,我们还是就叫它RAC吧。RAC并非是个新技术,其前身叫OPS(Oracle Parallel Server),从9i开始才改名叫RAC(回头有空俺再写篇blog跟大伙数道数道rac的前世今生),这属于oracle的老把戏了,它的不少产品都是边做边改名,比如Oracle Data Guard在9i之前叫做Standby,对于这些知识大家不妨也多了解了解,如果你的就业经历足够长,俺觉着你就一定能理解俺所说的,有时候资深并不代表着技术有多牛,而是人家待的年头够久,对于历史那是相当熟悉啊,所以资深也能理解成资历的嘛,对于后来者而言怎样快速获得资历呢,黑黑,你也去熟悉历史呗(en,俺晓得,俺又跑题鸟)~~~RAC不仅仅是个组件,就我理解,它更应该被称之为一种体系,因为它不是单单由某项特性组成,而是一堆特性应用的集合。该体系实现了多个实例同时访问和管理同一数据库,多个实例可以存在于不同节点,也可以在相同的节点上(从提升性能的角度来看,并不推荐这样),彼此通过内网连接交换数据,并且能够自动平衡负载,如果其中某个节点发生故障,RAC能够通过后台的监控进程将连接自动切换到另外一个或多个节点上,从而实现应用的无缝切换,对实例的高可用提供保护。因此,我们也能够得出结论,RAC保护的是实例,而并非数据,这点一定要明确(对数据进行冗余的特性在oracle中叫Data guard,详细请见:一步一步学Dataguard)。
      

  9.   

    刚才给你 回复错了, 下面 的mysql 这么写,看看对不对?1.
      1)
           select b.PhotoId from User a, Photo b 
                            where b.UserId=a.UserId and a.Accuunt='dragon' 
                            order by AcessCount desc limit 0,5;
      2)  Select b.userid  sum(b.size) total_size from photo b 
                            group by b.userid order by sum(b.size) desc limit 0,10 
       
      3)  Uer表的 user id 主键索引, Phot表的 userid 作为外键,并且创建一个索引2.
           select * from User a  oder by a.age desc ,a.id  limit 1; 
      

  10.   

    没有 用过 mysql ,谁来帮我 检验下,楼上的写法。
      

  11.   

    1.
    User表用于记录用户相关信息, Photo表用于记录用户的照片信息, 两个表的定义如下:
    CREATE TABLE User( --用户信息表
    UserId bigint,   --用户唯一id
    Account varchar(30)   --用户唯一帐号
    );
    CREATE TABLE Photo(   --照片信息表
    PhotoId bigint, --照片唯一id
    UserId bigint,   --照片所属用户id
    AccessCount int,   --访问次数
    Size bigint   --照片文件实际大小
    )
    1) 请给出SQL打印帐号为"dragon"的用户访问次数最多的5张照片的id;
    select PhotoId
    from Photo inner join User using(UserId)
    where Account='dragon'
    order by AccessCount desc
    limit 5;2) 给出SQL打印拥有总的照片文件大小(total_size)最多的前10名用户的id, 并根据total_size降序排列
    select UserId,sum(Size)
    from Photo
    group by UserId
    order by 2 desc limit 10;3) 为优化上面两个查询, 需要在User和Photo表上建立什么样的索引?
    User(UserId) primary key
    Photo(UserId) index
    2.
    数据库中有表User(id, name, age):
    表中数据可能会是以下形式:
    id   name   age
    001 张三   56
    002 李四   25
    003 王五   56
    004 赵六   21
    005 钱七   39
    006 孙八   56
    ..............
    由于人员年龄有可能相等, 请写出SQL语句, 用于查询age最大的人员中, id最小的一个记录
    select * from User order by age desc,id limit 1;
      

  12.   


    你可以到官网下载一个MYSQL,15分钟连下载带安装就可以结束了。 当然表和数据你需要自己创建和准备了。
    http://dev.mysql.com/downloads/mysql/5.1.html