今天笔试遇到的数据库题目,大家来看看,怎么做?
有student和class两个学生信息和班级信息的表,写出SQL查询语句,求各班中年龄最小的十位同学,并从小排到大。

解决方案 »

  1.   

    oracle 用rownum
    mysql 用limit 
      

  2.   

    select top 10 ..... from student a,class b
     where b.id=a.班级ID
    order by b.age 
    sqlserver select ... from (
    select ... from student a,class b
     where b.id=a.班级ID
    order by b.age 
    )a where rownum <=10oracle 
      

  3.   

    顶  欢迎加入 2987841   java交流群  共同交流面试 心得 和数据库 心得
      

  4.   


    mysql> select * from class;
    +------+-----------+
    | id   | name      |
    +------+-----------+
    |    1 | 信计052班 |
    |    2 | 信计051班 |
    +------+-----------+
    2 rows in set (0.00 sec)mysql> select * from student;
    +------+------+------+------+
    | id   | name | age  | cid  |
    +------+------+------+------+
    |    1 | 张1  |   18 |    1 |
    |    2 | 张2  |   20 |    1 |
    |    3 | 张3  |   17 |    1 |
    |    4 | 张4  |   18 |    1 |
    |    5 | 张5  |   16 |    1 |
    |    6 | 张6  |   19 |    1 |
    |    7 | 张7  |   15 |    1 |
    |    8 | 刘1  |   16 |    2 |
    |    9 | 刘2  |   19 |    2 |
    |   10 | 刘3  |   21 |    2 |
    |   11 | 刘4  |   20 |    2 |
    |   12 | 刘5  |   15 |    2 |
    |   13 | 刘6  |   17 |    2 |
    |   14 | 刘7  |   20 |    2 |
    |   15 | 刘8  |   21 |    2 |
    +------+------+------+------+
    15 rows in set (0.00 sec)
    mysql> select s.name,s.age,c.name
        -> from student s,class c
        -> where s.cid=c.id and
        -> 6>=(select count(*) from student st
        -> where st.age<=s.age and st.cid=c.id)
        -> order by c.id,s.age;
    +------+------+-----------+
    | name | age  | name      |
    +------+------+-----------+
    | 张7  |   15 | 信计052班 |
    | 张5  |   16 | 信计052班 |
    | 张3  |   17 | 信计052班 |
    | 张1  |   18 | 信计052班 |
    | 张4  |   18 | 信计052班 |
    | 张6  |   19 | 信计052班 |
    | 刘5  |   15 | 信计051班 |
    | 刘1  |   16 | 信计051班 |
    | 刘6  |   17 | 信计051班 |
    | 刘2  |   19 | 信计051班 |
    | 刘4  |   20 | 信计051班 |
    | 刘7  |   20 | 信计051班 |
    +------+------+-----------+
    12 rows in set (0.00 sec)mysql数据库,由于测试数据没那么多,这里只算了前六位同学。
      

  5.   


    mysql> select s.name,s.age,c.name,
        -> (select count(*) from student
        -> where cid=s.cid and age<=s.age) rank
        -> from student s,class c
        -> where s.cid=c.id and
        -> 6>=(select count(*) from student st
        -> where st.age<=s.age and st.cid=c.id)
        -> order by c.id,s.age;
    +------+------+-----------+------+
    | name | age  | name      | rank |
    +------+------+-----------+------+
    | 张7  |   15 | 信计052班 |    1 |
    | 张5  |   16 | 信计052班 |    2 |
    | 张3  |   17 | 信计052班 |    3 |
    | 张1  |   18 | 信计052班 |    5 |
    | 张4  |   18 | 信计052班 |    5 |
    | 张6  |   19 | 信计052班 |    6 |
    | 刘5  |   15 | 信计051班 |    1 |
    | 刘1  |   16 | 信计051班 |    2 |
    | 刘6  |   17 | 信计051班 |    3 |
    | 刘2  |   19 | 信计051班 |    4 |
    | 刘4  |   20 | 信计051班 |    6 |
    | 刘7  |   20 | 信计051班 |    6 |
    +------+------+-----------+------+
    12 rows in set (0.00 sec)
      

  6.   

    请问zhoupuyue:6>=(select count(*) from student st
         where st.age<=s.age and st.cid=c.id)
    这句话怎么确定最小的前6位呢?st.age<=s.age 表示自己跟自己比较吗?怎么比较的呢?谢谢!
      

  7.   


    哥们  你信计的??哈哈!!!me  too
      

  8.   

    6>=(select count(*) from student st 
        where st.age <=s.age and st.cid=c.id

    st是student表的别名,s也是student表的别名。
    这部分语句表示在student表中比s表中某一条记录的age小的记录的数量。
      

  9.   


    mysql> select s.name,s.age,c.name,
        -> (select count(*)+1 from student
        -> where cid=s.cid and age<s.age) rank
        -> from student s,class c
        -> where s.cid=c.id and
        -> 6>=(select count(*) from student st
        -> where st.age<=s.age and st.cid=c.id)
        -> order by c.id,s.age;
    +------+------+-----------+------+
    | name | age  | name      | rank |
    +------+------+-----------+------+
    | 张7  |   15 | 信计052班 |    1 |
    | 张5  |   16 | 信计052班 |    2 |
    | 张3  |   17 | 信计052班 |    3 |
    | 张1  |   18 | 信计052班 |    4 |
    | 张4  |   18 | 信计052班 |    4 |
    | 张6  |   19 | 信计052班 |    6 |
    | 刘5  |   15 | 信计051班 |    1 |
    | 刘1  |   16 | 信计051班 |    2 |
    | 刘6  |   17 | 信计051班 |    3 |
    | 刘2  |   19 | 信计051班 |    4 |
    | 刘4  |   20 | 信计051班 |    5 |
    | 刘7  |   20 | 信计051班 |    5 |
    +------+------+-----------+------+
    12 rows in set (0.00 sec)修改一下。
      

  10.   

    回复zhoupuyue:
    mysql> select s.name,s.age,c.name,
        -> (select count(*)+1 from student
        -> where cid=s.cid and age<s.age) rank
        -> from student s,class c
        -> where s.cid=c.id and
        -> 6>=(select count(*) from student st
        -> where st.age<=s.age and st.cid=c.id)
        -> order by c.id,s.age;

    我有点糊涂了,理一理逻辑:原表,S表,c表 ,st表,
    可不可以不要st表,换成原表跟s表比较呢?如下:
    where s.cid=c.id and
        6>=(select count(*) from student 
        where age<=s.age and cid=c.id)
        
      

  11.   

    select * from class,student  
    where class.sname=student.sname and student.id in//数据库的链接
       (select top 10 * from student//去前10
           where id in
               (select * from student group by sage)//排序
              )