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;

最新文章

  1. C3P0连接池配置和实现详解
  2. 关于div弹出层的实际应用心得
  3. youtube下载
  4. 如何判断PHP 是线程安全还是非线程安全的
  5. Andriod 按钮代码
  6. sharepoint 中用自带的download.aspx实现文件的下载,中文文件名编码的问题
  7. 引用JS表单验证大全 以后方便查看用
  8. hdu4585 &amp;amp; BestCoder Round #1 项目管理(vector应用)
  9. Installshield自动安装IIS组件
  10. luogu 1291 概率期望递推
  11. vb.net C# AtlAxGetControl 函数使用方法
  12. Linux系统常见内核问题修复(转发)
  13. nltk的使用
  14. Spring AOP介绍及源码分析
  15. 【java】一些零碎的知识点
  16. 解决Win7启动时出现“windows未能启动。原因可能是最近更改了硬件或软件”的问题
  17. iotBaidu问题小结
  18. Python Challenge 第 5 关攻略:peak
  19. CEF 各个版本适应的平台参考表
  20. php学习七:时间和日期

热门文章

  1. ssh试卷
  2. 去除两张img中间的间隙
  3. DataTable中的select()用法
  4. c#winform pictureBox使用url加载图片
  5. [转]Replace all UUIDs in an ATL COM DLL.
  6. SQL server T-SQL存储过程
  7. go 常见问题
  8. 个人常用Markdow语法代码备用
  9. mybatis 学习笔记(三):mapper 代理开发 dao 层
  10. bzoj 3864: Hero meet devil(dp套dp)