`
yuanyu5237
  • 浏览: 162792 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一道淘宝的考察sql语句的面试题

阅读更多
有一张表t_stu;其中三个字段:name,gender,grade;要求用一条sql语句查出男生前5名和女生前五名。

小弟当时没做出来,只用最笨的办法解决:
select name,grade from t_stu m where gender = 1 order by grade limit 1,2 union select name,grade from t_stu f where gender = 0 order by grade limit 1,2;

但回来后,发现这个也是错的,说union和order by错误用法,想了很久,终于有一个答案:
select f.name,f.gender,f.grade,m.name,m.gender,m.grade,(f.grade+m.grade) gg from t_stu m, t_stu f where m.gender != f.gender m.name != f.name group by gg order by gg limit 1,3;

运行这个之后,感觉很不爽。希望看到这篇文章的朋友能给我找到一个好的答案。
还有,如果用oracle数据库怎么实现,还没试过,下面是我在mysql中的建表语句:
CREATE TABLE `t_stu` (
  `id` int(4) NOT NULL DEFAULT '0',
  `name` varchar(16) DEFAULT NULL,
  `gender` int(2) DEFAULT NULL,
  `grade` int(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
)DEFAULT CHARSET=utf8 |

插入测试数据:
insert into t_stu values(1,"Alex",1,91);
insert into t_stu values(2,"Elena",0,92);


附另外一道在别处碰到的sql题:
有一张表t_game,记录了游戏玩家的id,游戏玩家名name,和每个玩家玩的游戏game,请找出玩游戏最多的那个玩家,我用的子查询,先count每个游戏玩家玩的游戏数,然后max最大游戏数的玩家名。

分享到:
评论
70 楼 布鲁斯 2011-05-26  
Select * From (Select * From t_stu s Where s.gender = 'f'Order By grade Desc) Where Rownum <=5
Union
Select * From (Select * From t_stu s Where s.gender = 'm'Order By grade Desc) Where Rownum <=5;
69 楼 guizhou851213 2011-05-25  
select t3.* from (  
                    select t.* from (select name,grade,gender from t_stu t where gender = 0 order by grade desc limit 0, 5) t
                    union all
                    select t2.* from (select name,grade,gender from t_stu t where gender = 1 order by grade desc limit 0, 5) t2
                    ) t3 order by t3.gender,t3.grade desc
试试这个。
68 楼 cxw03403 2011-05-24  
db2数据库:t_stu;其中三个字段:name,gender,grade
select * from  ( select info2.*  from  t_stu info2 where gender='1' order by grade asc fetch first 5 rows only ) as tb
union 
select  * from (select info1.* from  t_stu  info1 where gender='2' order by grade asc fetch first 5 rows only ) as tb1
67 楼 advantech 2011-05-24  
kenny_no2 写道
没必要分性别啊,除了男不就女么?难道还有人要?所以我感觉性别是误导你的。

人才啊,运动会也别分男女了,大家一起比吧。
66 楼 xzuse 2011-05-23  
kenny_no2 写道
没必要分性别啊,除了男不就女么?难道还有人要?所以我感觉性别是误导你的。


人才!
65 楼 pengshan 2011-05-22  
这个题的本意应该是要用UNION合并两个查询,得到的效率也是最高的。如果不用UNION,我给了一个例子,在SQL SERVER中测试成功过的。

declare @t_stu table(
	id int primary key identity(1,1),
	name varchar(100),
	sex int,
	grade int
)

insert into @t_stu(name, sex, grade) values('xiaoming01', 0, 100)
insert into @t_stu(name, sex, grade) values('xiaoming2', 1, 99)
insert into @t_stu(name, sex, grade) values('xiaoming03', 0, 90)
insert into @t_stu(name, sex, grade) values('xiaoming04', 0, 80)
insert into @t_stu(name, sex, grade) values('xiaoming5', 1, 10)
insert into @t_stu(name, sex, grade) values('xiaoming6', 1, 100)
insert into @t_stu(name, sex, grade) values('xiaoming07', 0, 70)
insert into @t_stu(name, sex, grade) values('xiaoming8', 1, 50)
insert into @t_stu(name, sex, grade) values('xiaoming011', 0, 100)
insert into @t_stu(name, sex, grade) values('xiaoming12', 1, 99)
insert into @t_stu(name, sex, grade) values('xiaoming013', 0, 90)
insert into @t_stu(name, sex, grade) values('xiaoming014', 0, 80)
insert into @t_stu(name, sex, grade) values('xiaoming15', 1, 10)
insert into @t_stu(name, sex, grade) values('xiaoming16', 1, 100)
insert into @t_stu(name, sex, grade) values('xiaoming017', 0, 70)
insert into @t_stu(name, sex, grade) values('xiaoming18', 1, 50)

select * from @t_stu a where a.id in (select top 5 id from @t_stu b where a.sex = b.sex order by grade DESC)
	order by a.sex ASC, a.grade DESC


得到的结果如下:
id   name    sex         grade
------------------------------------
1    xiaoming01     0    100
9    xiaoming011    0    100
3    xiaoming03     0    90
11   xiaoming013    0    90
4    xiaoming04     0    80
6    xiaoming6      1    100
14   xiaoming16     1    100
10   xiaoming12     1    99
2    xiaoming2      1    99
8    xiaoming8      1    50

64 楼 kenny_no2 2011-05-20  
没必要分性别啊,除了男不就女么?难道还有人要?所以我感觉性别是误导你的。
63 楼 yutuer 2011-05-19  
xiangzi21 写道
(select * from t_stu where gender = 0 order by grade desc limit 5)
union all
(select * from t_stu where gender = 1 order by grade desc limit 5)
这个不是想要的结果吗?



我也发现了...只要加上括号就可以了
62 楼 bobocici 2011-05-18  
这个不就是很简单的分析函数么?
select * from (
select name,grade,gender ,rank() over (partition by gender order by grade desc nulls last) rnk from t_stu
) where rnk<=5
61 楼 wf1006 2011-05-18  
SELECT ROWNUM, V.*
   FROM (select * from t_stu t1 where t1.gender = 'M' order by t1.grade asc) V
  WHERE ROWNUM < 6
UNION ALL
SELECT ROWNUM, V.*
   FROM (select * from t_stu t1 where t1.gender = 'F' order by t1.grade asc) V
  WHERE ROWNUM < 6

-- Create table
create table T_STU
(
  ID     NUMBER,
  NAME   VARCHAR2(50),
  GENDER VARCHAR2(1),
  GRADE  NUMBER
)
tablespace PIP_DATA
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
60 楼 sbkyv 2011-05-17  
MySQL
SELECT a.* FROM `t_stu` a INNER JOIN ((SELECT gender,grade FROM `t_stu` WHERE gender=0 group BY grade DESC LIMIT 4,1) UNION ALL (SELECT gender,grade FROM `t_stu` WHERE gender=1 group BY grade DESC LIMIT 4,1)) b ON a.grade>=b.grade AND a.gender=b.gender ORDER BY gender,grade DESC


这样不行,当分数出现少于五个的情况
59 楼 jackcfan 2011-05-17  
grantliping 写道
SELECT * FROM(SELECT * FROM T_STU WHERE GENDER=1 ORDER BY GRADE DESC) where rownum<=5 
UNION  
SELECT * FROM (SELECT * FROM T_STU WHERE GENDER=0 ORDER BY GRADE DESC )where rownum<=5;

正解



莫非也是第一次发帖 。。。。
58 楼 grantliping 2011-05-17  
SELECT * FROM(SELECT * FROM T_STU WHERE GENDER=1 ORDER BY GRADE DESC) where rownum<=5 
UNION  
SELECT * FROM (SELECT * FROM T_STU WHERE GENDER=0 ORDER BY GRADE DESC )where rownum<=5;

正解
57 楼 jackcfan 2011-05-17  
select * from t_stu a where 5>(select count(*) FROM t_stu where gender=a.gender AND grade>a.grade) order by a.grade desc

刚看到这个sql时还觉得很新颖   思路很特别

我新建了一个张表 并插入了 26万多行数据

结果用 union all 一秒不到就出结果

但 上面的那个sql 过了十五分钟还没出结果  果断中断执行。。。
56 楼 sebatinsky 2011-05-17  
..好复杂,从来没有尝试过,看来跟不上这里步伐
55 楼 case0079 2011-05-16  
引用
select * from t_stu a where 5>(select count(*) FROM t_stu where gender=a.gender AND grade>a.grade) order by a.grade desc


这个效率差的.
还是用union all好
54 楼 p2world 2011-05-15  
<div class="quote_title">isaacfu_454 写道</div>
<div class="quote_div">
<p> </p>
<pre name="code" class="sql"> select * from t_stu a where 5&gt;(select count(*) FROM t_stu where gender=a.gender AND grade&gt;a.grade) order by a.grade desc</pre>
 </div>
<p>++</p>
<p>高手</p>
53 楼 jetseter 2011-05-14  
我认为结果 应该小于等于 5行
最后显示的结果应该是这样的:
    姓名 性别 成绩  姓名 性别 成绩
1  女一  女   99   男一  男   98
2  女二  女   98   男二  男   97
3  女三  女   97   男三  男   96
4  女四  女   96   男四  男   95
5                  男五  男   94


这样才能给取结果时比较方便

而这种显示方式
    姓名 性别 成绩 
1  女一  女   99  
2  女二  女   98  
3  女三  女   97  
4  女四  女   96  
5  男一  男   98
6  男二  男   97
7  男三  男   96
8  男四  男   95
9  男五  男   94

在取值的时候会出现问题,后续要增加程序的判断(尤其是当其中 比如 女生根本不足五人的时候)
我觉得 这条SQL题目 应该考的就是这方面的考虑。之前有附上 sql。不知是否想多了。
52 楼 sbkyv 2011-05-13  
MYSQL,之前已经发表一个查询,不过没人回应,在来一个
SELECT * FROM `t_stu` WHERE grade>=IFNULL((SELECT grade FROM `t_stu` WHERE gender=0 order BY grade DESC LIMIT 4,1),0) AND gender=0
UNION ALL
SELECT * FROM `t_stu` WHERE grade>=IFNULL((SELECT grade FROM `t_stu` WHERE gender=1 order BY grade DESC LIMIT 4,1),0) AND gender=1

---------------------------------------------------------------------
简化
SELECT * FROM `t_stu` a WHERE grade>=IFNULL((SELECT grade FROM `t_stu` WHERE gender=a.gender order BY grade DESC LIMIT 4,1),0)

不过还是觉得下面的好些
---------------------------------------------------------
附上之前的SQl
SELECT a.* FROM t_stu a INNER JOIN ((SELECT GROUP_CONCAT(Id) AS Id FROM t_stu where gender=1 GROUP BY grade DESC LIMIT 5) union all (SELECT GROUP_CONCAT(Id) AS Id FROM t_stu where gender=0 GROUP BY grade DESC LIMIT 5)) b ON FIND_IN_SET(a.id,b.Id)>0 ORDER BY grade DESC
51 楼 babaoqi 2011-05-13  
一、先找出每种gender的第N个的grade的值minGrade
二、再查询相同gender中grade>= minGrade的记录

SELECT  t.`name`, t.`gender`, t.`grade` FROM `t_stu` AS t,
(SELECT u2.gender,MIN(u2.grade) AS minValue FROM
(SELECT u1.`gender`, u1.`grade` FROM `t_stu` AS u1 WHERE u1.gender=1 ORDER BY u1.grade DESC LIMIT 5) AS u2
GROUP BY u2.gender
) AS tb1,
(SELECT u2.gender,MIN(u2.grade) AS minValue FROM
(SELECT u1.`gender`, u1.`grade` FROM `t_stu` AS u1 WHERE u1.gender=0 ORDER BY u1.grade DESC LIMIT 5) AS u2
GROUP BY u2.gender
) AS tb2
WHERE (t.gender=tb1.gender AND t.grade>=tb1.minValue) OR (t.gender=tb2.gender AND t.grade>=tb2.minValue)
ORDER BY t.gender,t.grade DESC

相关推荐

    sql语句的内联外联 经典面试题

    在面试中,SQL语句的内联外联经典面试题是一个非常重要的考察点。本文将对SQL语句的内联外联进行详细的介绍和分析,并提供了一些经典的面试题和答案,以便读者更好地理解和掌握SQL语句的内联外联。 一、SQL语句的...

    java私塾面试题----SQL语句2

    在Java私塾面试中,SQL语句是必不可少的考察点,因为SQL是数据操作和管理的核心语言,尤其对于Java开发者来说,理解并熟练运用SQL至关重要。以下是对SQL语句的一些关键知识点的详细解释: 1. **SQL基础概念**:SQL...

    oracle 数据库sql 语句面试题,北京一家软件公司的面试题,难度中等

    ### Oracle数据库SQL语句面试题解析 #### 题目一:两个表的连接与比较 **题目背景:** 给出两个表`T1`和`T2`,每个表都只包含一个字段`ID`(整数类型)。`T1`中有4条记录:1,2,3,4;`T2`中有3条记录:2,4,5。...

    SQL经典面试题及答案 CASE

    《SQL经典面试题及答案解析》 SQL是Structured Query Language的缩写,是用于管理和处理关系数据库的标准语言。在面试中,SQL问题通常涉及到数据查询、聚合、分组、条件判断等多个方面,考察应聘者对数据库操作的...

    sql server面试题

    以下是一些可能的SQL Server面试题及详细解答: 1. **SQL基本操作** - **查询语句**:询问如何使用SELECT语句进行复杂查询,如JOIN、子查询、聚合函数(COUNT, SUM, AVG, MAX, MIN)。 - **DML操作**:如何插入...

    SQL经典面试题及答案

    这些面试题展示了SQL在数据分析和查询中的灵活性和实用性。理解并熟练掌握`SELECT`, `GROUP BY`, `CASE WHEN`, `JOIN`, `DATEDIFF`等核心概念对于任何IT专业人员,尤其是数据分析师或数据库管理员来说都是至关重要的...

    数据分析面试题-SQL面试题汇总.docx

    数据分析面试题-SQL面试题汇总 本文档汇总了两道数据分析面试题,涵盖了 SQL 编程语言的多个方面,包括建表、插入数据、排序、连接、分组、聚合函数、日期操作等。通过这两道题目,我们可以了解数据分析师需要具备...

    SQL经典面试题-很有用

    以下是基于给定的面试题及其解决方案的详细解析: 1. **分组计数问题**: 这个问题旨在考察对`GROUP BY`、`CASE`语句以及聚合函数的理解。题目要求统计每天胜利和失败的次数。有三种不同的解决方案: - 第一种...

    SQL面试题2

    尤其在面试中,数据库相关问题常常是考察候选人技术水平和经验的重要部分。以下将对提供的文件内容中提及的SQL知识点进行详细说明。 首先,文件描述中提到了几个基础的SQL命令,分别是DROP、TRUNCATE和DELETE,它们...

    sql考试面试题大全(真的很全)

    在SQL面试中,考察点通常包括SQL语句的编写、数据库操作、存储...以上就是对SQL面试题的详细解答,涵盖了SQL语句编写、聚合函数、存储过程、函数以及复杂查询等多个方面,旨在帮助理解和掌握SQL在实际问题中的应用。

    SQL面试题目-sqlServer

    解释:这道题目考察了候选人对 SQL 语句的掌握程度,特别是使用 NOT IN 语句来排除某些条件。这里我们使用了两条SELECT语句,第一条SELECT语句查询出所有大于等于 80 分的学生姓名,然后使用NOT IN语句排除这些学生...

    校招sql 面试题

    ### SQL面试题解析 #### 背景介绍 在IT行业的招聘过程中,SQL技术作为数据处理的核心工具之一,经常被用作考核应聘者能力的重要环节。对于即将步入职场的应届毕业生来说,掌握一定的SQL技能是必不可少的。下面将对...

    net sql java 面试技巧 个公司的面试题 简历模板

    在IT行业中,面试是检验求职者技能和...通过深入了解.NET、SQL和Java的核心概念,熟悉常见的面试题,以及准备一份详实的简历,你将在面试中展现出自己的专业能力和潜力。不断学习和实践,将是IT行业持续发展的关键。

    Sql面试题大全

    ### SQL面试题解析 #### 一、数据库部分 ##### 1. 根据部门号从高到低,工资从低到高列出每个员工的信息 **题目解析:** 此题考查了SQL中的`ORDER BY`子句,特别是多字段排序的能力。`ORDER BY`允许我们按照一个...

    数据库 sql 面试题大全

    10. **性能优化**:了解如何分析查询性能,使用EXPLAIN分析查询执行计划,以及调整SQL语句和数据库配置以提升性能。 11. **数据库安全**:包括用户权限管理、角色、权限分配以及如何保护数据库免受恶意攻击。 12. ...

    sql 面试题.rar

    在SQL(Structured Query Language)面试中,面试官通常会考察候选人的数据操作、查询优化、数据库设计、事务处理、并发控制、存储引擎以及安全性等方面的知识。以下是对这些关键知识点的详细解析: 1. **数据操作*...

    SQL常见面试题-程序员面试总结出来的宝贵经验

    SQL常见面试题 SQL 是 Structured Query Language 的缩写,作为一种标准的数据库语言,广泛应用于关系数据库管理系统中。在面试中, SQL 问题是必考题之一,本文总结了常见的 SQL 面试题,旨在帮助即将找工作的同学...

    sql数据库常见面试题

    数据库面试中,面试官经常通过一些常见面试题来考察应聘者对SQL语言的熟练程度,理解程度以及实际应用能力。本文将介绍一些SQL数据库的常见面试题,它们不仅覆盖了基础知识点,也包含了一些实际操作中的应用技巧。 ...

    sql面试题,JAVA常见面试题120道

    10. **面试技巧**:除了技术知识,面试官还会考察解决问题的能力、团队协作、沟通技巧等软技能。 对于SQL: 1. **基本查询**:掌握SELECT语句,包括WHERE子句、JOIN操作、子查询、聚合函数(COUNT, SUM, AVG, MAX,...

    程序员sql面试题

    以上SQL面试题不仅涵盖了基础的查询语句,还涉及到了复杂的子查询、数据关联、聚合函数等高级特性,是检验程序员SQL技能的有效方式。理解和熟练掌握这些知识点,对于提升数据库操作能力、优化查询效率具有重要意义。

Global site tag (gtag.js) - Google Analytics