Q:有一个学生成绩表,表名 stu(学生表),字段有:id(主键),name(学生姓名),subject(学科),score(分数)

1、查询该表中,所有科目都及格的学生

select name from stu group by name having MIN(score) >= 60;

说明:都及格的话,就是最低分是60以上

2、查询该表中,每门科目的前两名

select a.* from (
select *,@num := if(@subject = subject and @score>score, @num := @num + 1, IF(@score=score,@num := @num,1)) as num,@subject := subject,@score := score from stu order by subject,score desc
) as a
where num <= 2;

说明:使用存储过程处理,不过该方法风险不可控

3、查询该表中,每门科目的前 N 名

select a.* from (
select *,@num := if(@subject = subject and @score>score, @num := @num + 1, IF(@score=score,@num := @num,1)) as num,@subject := subject,@score := score from stu order by subject,score desc
) as a
where num <= N;

说明:同第二题

使用存储过程的话可能会出现一些不可避免的问题,后面的人不太好维护,不方便调试,出现错误的话也很难排查,而且报错的话很少有提示,也少有日志可以排查错误,无法适应数据库的切割,只能用于简单的业务上

《阿里巴巴java编码规范》有这样一条

其实用不用存储过程要根据业务来确定,而不能因为阿里禁止我就绝对不能使用,要把握好风险,MySQL对SQL编程和复杂查询性能优化的支持实在太烂,而使用SQL Server少有这种问题,SQL Server在2008版本的时候Transact-SQL编程已经相当成熟

附:

DROP TABLE IF EXISTS `stu`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `stu` (
`id` int(11) NOT NULL,
`name` varchar(45) DEFAULT NULL,
`subject` varchar(45) DEFAULT NULL,
`score` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */; --
-- Dumping data for table `stu`
-- LOCK TABLES `stu` WRITE;
/*!40000 ALTER TABLE `stu` DISABLE KEYS */;
INSERT INTO `stu` VALUES (1,'A','',60),(2,'A','',30),(3,'B','',60),(4,'B','',60),(5,'C','',70),(6,'C','',80);
/*!40000 ALTER TABLE `stu` ENABLE KEYS */;
UNLOCK TABLES;

mysql 查询 TOP N 问题的更多相关文章

  1. MySQL查询top N记录

    下面以查询每门课程分数最高的学生以及成绩为例,演示如何查询 top N记录.下图是测试数据,表结构和相关 insert 脚本见<常用SQL之日期格式化和查询重复数据>. 使用自连接[推荐] ...

  2. MYSQL查询语句大全集锦

    MYSQL查询语句大全集锦 1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:2.创建一个数据库MYSQLDATA mysql> C ...

  3. php面试专题---MYSQL查询语句优化

    php面试专题---MYSQL查询语句优化 一.总结 一句话总结: mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存) ...

  4. mysql查询性能优化

    mysql查询过程: 客户端发送查询请求. 服务器检查查询缓存,如果命中缓存,则返回结果,否则,继续执行. 服务器进行sql解析,预处理,再由优化器生成执行计划. Mysql调用存储引擎API执行优化 ...

  5. Mysql查询——深入学习

    1.开篇 之前上一篇的随笔基本上是单表的查询,也是mysql查询的一个基本.接下来我们要看看两个表以上的查询如何得到我们想要的结果. 在学习的过程中我们一起进步,成长.有什么写的不对的还望可以指出. ...

  6. Mysql 查询练习

    Mysql 查询练习 ---创建班级表 create table class( cid int auto_increment primary key, caption ) )engine=innodb ...

  7. mysql 查询去重 distinct

    mysql 查询去重 distinct   待完善内容..

  8. MySQl查询区分大小写的解决办法

    通过查询资料发现需要设置collate(校对) . collate规则: *_bin: 表示的是binary case sensitive collation,也就是说是区分大小写的 *_cs: ca ...

  9. 【转】mysql查询结果输出到文件

    转自:http://www.cnblogs.com/emanlee/p/4233602.html mysql查询结果导出/输出/写入到文件 方法一: 直接执行命令: mysql> select ...

随机推荐

  1. 01 git 概念

    本文转自“廖雪峰的git教程” 集中式版本控制系统:版本库是集中存放在中央服务器的,中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆. 分布式版 ...

  2. Python基础-4

    目录 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 1.列表生成式,迭代器&生成器 看列表[0, 1, 2, 3, 4, 5, 6, 7, ...

  3. Maven 项目使用开源中国镜像

    从maven中央库下载jar非常缓慢甚至有时候会下载不下来. 可以采用中国的maven镜像.目前主要是 开源中国的镜像. 找到maven配置文件setting.xml,打开 中间添加开源中国的配置: ...

  4. MongoDB整理笔记のReplica oplog

    主从操作日志oplog MongoDB的Replica Set架构是通过一个日志来存储写操作的,这个日志就叫做"oplog".oplog.rs是一个固定长度的capped coll ...

  5. Android Studio2.3更换默认的ConstraintLayout布局

    1.在as安装目录\plugins\Android\lib\templates\activities\common\root\res\layout下,找到simple.xml.ftl文件 2.用以下布 ...

  6. delphi TString使用(取有规律的字符串中某一项内容)

    {目的,取得下面字符串中的每一项内容,如s:='a,b,c,d',要去的用逗号隔开的每一项内容这时采用Tstring,会方便很多,TString是继承TStringList带有List所有属性.} v ...

  7. JavaScript对象(持续更新中)

    1Array对象 2.Boolean对象 3.Date对象 4.Math对象 5.Number对象 6.String对象 ※String.replace():替换字符串 实例: str.replace ...

  8. SharePoint 2013报错之“指定的文件不是有效的电子表格或者没有包含要导入的数据”

    当你尝试用SharePoint 2013中的“导入电子表格”功能时,可能会遇到报错“指定的文件不是有效的电子表格或者没有包含要导入的数据” 解决方法:只需要将你的SharePoint网址添加到浏览器的 ...

  9. Ext中setValue和setRawValue

    Ext.getCmp('modifyStatus').setValue(record.get('status').trim()); Ext.getCmp('modifyStatus').setRawV ...

  10. C# Winform 加载窗体/对象时的等待页面设计

    在设计应用程序过程中,有时候加载对象需时较长,我们可以显示一个Loading等待页面,对用户来说就比较友好了. 这个还是涉及到多线程,下面是步骤. 一.创建好Loading窗体: 一个Panel用于显 ...