上条记录和下一条记录

在展示博客文章时,在文章底部需要展示上一篇文章和下一篇文章,文章的排序当然是按照时间排序的。

选定下一条时可以用limit 1来实现,选取上一条时可以倒序limit 1实现

(SELECT * FROM article WHERE create_time<now_article_time ORDER BY create_time DESC LIMIT 1)
UNION
(SELECT * FROM article WHERE create_time>now_article_time ORDER BY create_time ASC LIMIT 1)

显示行号

Select a.*,(@rowNum:=@rowNum+1) as rowNo
From a,(Select (@rowNum :=3) ) b

通过变量rowNum来表示行号,在from子句中通过select语句给rowNum赋初值。这个过程涉及到SQL的执行顺序:即先执行from子句再执行select子句。

这种写法效率比较高,使用复合SQL语句的方式实现效率比较低(行号通过select语句来实现)。

MySQL打印学生成绩单

学生成绩单有语文、数学、英语三门成绩,如下所示:

语文 数学 英语

1 2 3

3 4 10

10 2 8

20 5 1

7 4 8

10 8 2

10 7 2

要求打印“rank(名次) sum(总分)”两列的成绩单(总分降序排列)。

SELECT 1 + (SELECT COUNT(1)  FROM
stu AS y WHERE
y.chinese + y.math + y.english > x.chinese + x.math + x.english) AS rank,
(x.chinese + x.math + x.english) AS sum_score
FROM
stu AS x ORDER BY sum_score DESC;

这里用到了if函数,也可以通过SQL条件语句来实现:

case 表达式 when 取值1 then 答案1 when 取值2 then 答案2 else 答案3 end

这样写复杂度较高,下面这种方法比较简单。

SELECT  rank, sum_score FROM
(SELECT
IF(@last_sum = x.chinese + x.math + x.english, @rank, @rank:=@rank + 1) AS rank,
(x.chinese + x.math + x.english) AS sum_score,
(SELECT @last_sum:=x.chinese + x.math + x.english) AS yy
FROM
stu AS x, (SELECT @last_sum:=- 1, @rank:=0) AS nothing
ORDER BY sum_score DESC) AS haha;

这里用到的技巧如下:

1、通过创建临时表、两重select来只选中某些列

2、在where子句中执行变量的初始化

3、在select子句中执行变量的更新

4、通过定义变量last_sum来记录上一条记录 的信息

5、通过比较上一条记录的总分跟当前记录的总分来决定是否让rank增加

SQL中的case语句

语法:

case [input_expression]
when when_expression then result_expression
[...n]
[else else_result_expression]
end

注:[]表示可选内容。

1、demo1:case后带表达式

select *,
case sgroup
when 1 then N'组1'
when 2 then N'组2'
when 3 then N'组3'
else N'未知' end groupname
from @stuinfo

2、demo2:case后不带表达式

select *,
case
when sgroup = 1 and gender = 'm' then N'第一组男生'
when sgroup = 1 and gender = 'f' then N'第一组女生'
when sgroup = 2 and gender = 'm' then N'第二组男生'
when sgroup = 2 and gender = 'f' then N'第二组女生'
when sgroup = 3 and gender = 'm' then N'第三组男生'
when sgroup = 3 and gender = 'f' then N'第三组女生'
else N'未知' end comment
from @stuinfo

3、demo3:在order by子句中使用case语句

select * from @stuinfo
order by
case when @orderby = 1 then id end desc,
case when @orderby = 2 then id end

这里要用多个case,因为desc需要放在end 后面,否则会有语法错误。

由此可以构造一道题:对一群学生成绩单进行排序,如果是男生按照数学成绩降序排列,如果是女生按照语文成绩降序排列,最终得到全体学生的成绩和名次。

这个问题不使用case语句也能实现,但是使用case 语句更简洁、效率更高。

一言以蔽之,case语句可以用在任何表达式中,有表达式的地方就可以有case语句。order by后面其实跟的也是表达式而不是列名。

SQL语句实现数据库表的数据迁移

国家标准分为强制性标准和推荐性标准,这两种标准的字段完全一致,当时建表时一时糊涂,分成了两个表。现在想合并force_standard、recommend_standard两张表为standard表,并加上字段is_force来表示该标准是否强制性标准。

当然可以通过一段代码,for循环实现,但那样麻烦,用SQL只需要一句话。

insert into standard(列名,列名,列名...is_force)
select 列名,列名,列名...,true from force_standard union
select 列名,列名,列名...,false from recommend_standard

几道比较难的SQL题的更多相关文章

  1. SQL题(子文章)(持续更新)

    -----> 总文章 入口 文章目录 [-----> 总文章 入口](https://blog.csdn.net/qq_37214567/article/details/90174445) ...

  2. 在论坛中出现的比较难的sql问题:24(生成时间段)

    原文:在论坛中出现的比较难的sql问题:24(生成时间段) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必要记录下来 ...

  3. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  4. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  5. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  6. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  7. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  8. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  9. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

随机推荐

  1. Arduino + SmartAirFilter 制作智能感应的 PM 空气净化器

    先说 SmartAirFilters 知道 SmartAirFilters 源自微博上转发的非常火的那个帖子,和动辄七八千元的商用产品比,几百元的 SmartAirFilters(下面简称电扇) 确实 ...

  2. VC++ 改动VMware BIOS、uuid_location、ethernet0_address等

    VC++ 改动VMware BIOS.uuid_location.ethernet0_address等.主要问题例如以下 (1)随机产生16进制数. (2)改动vmx相应项.依据规则一般仅仅改动最后三 ...

  3. 关于Java的一些NIO框架的一点想法

    闲着有点无聊想写点东西. 问题:生活中工作中,会有人问我javaNIO框架里面 Netty Mina  xSocket Grizzly 等等哪个比较好? 在这里写一下自己的感受,也算是总结一下吧 在我 ...

  4. C#中属性PropertyInfo的使用

    昨天编程遇到一个问题两个类字段都是二十多个,其中有十多个是相同的,需要将一个类的字段赋值给另外一个类,开始的自己想手动的一个个去赋值,后来想来一下C#基础知识,用PropertyInfo就可以解决类似 ...

  5. 火速提升Android仿真器的运行速度 ——仿真器Genymotion

    一.问题概述 Android开发中会使用仿真器测试应用,但不管你使用Eclispe ADT还是Android Studio仿真器都是基于arm架构的,运行起来都很慢,光启动就要花费很多时间,都不知道它 ...

  6. scala 学习笔记九 定义操作符

    Scala中方法名可以包含几乎所有字符,还可以对操作符+赋予新的含义 上面例子中136行,用下划线来表示“缺省初始化值” 上面151行和153行都是通过圆点表示法进行调用 157行和159行用中缀表示 ...

  7. 【转】NativeScript的工作原理:用JavaScript调用原生API实现跨平台

    原文:https://blog.csdn.net/qq_21298703/article/details/44982547 -------------------------------------- ...

  8. 【5】基于Log4Net的日志系统

    阅读目录 日志系统应具备的特性  Log4Net 配置文件:log4net.config 初始化 输出信息 对Log4Net的封装 log4net.config复杂配置   不管是Web应用程序还是W ...

  9. [Node.js] Availability and Zero-downtime Restarts

    It might be possible for our node server has some downtime, no matter it is because server update or ...

  10. Java从零开始学三十一(DATE和Calendar类)

    一.Date类 Date类是一个相对较为简单的操作类,在使用中直接使用java.util.Date类的构造方法并进行输出就可以得到一个完整的日期 二.Calendar类 Calendar类可以将取得的 ...