由于在笔试中遇到写sql语句的题目,犯了低级错误,这里学习并总结一下,遇到相关的继续更新。。。

查找

以MySQL为例,制作一个简单的表profit如下:


1.GROUP BY


T1:分别求1991年以及1992年第一季度的金额总和,效果如下:

sql语句实现:

SELECT
    year,
    SUM(amount) amount 
FROM
    profit 
GROUP BY
    profit.year

其中用到了聚集函数SUM()以及GROUP BY子句,表示按照年份分组后求和展示。


T2:将一维表转变成二维表,效果如下:

sql语句实现:

SELECT
    year,
    ( SELECT amount FROM profit a WHERE a.year = b.year AND a.MONTH = 1 ) AS m1,
    ( SELECT amount FROM profit a WHERE a.year = b.year AND a.MONTH = 2 ) AS m2,
    ( SELECT amount FROM profit a WHERE a.year = b.year AND a.MONTH = 3 ) AS m3 
FROM
    profit b 
GROUP BY
    b.year 

2.ORDER BY


T3:按月分别求金额总和并按金额降序显示,效果如下:

sql语句实现:

SELECT
    month,
    SUM(amount) amount 
FROM
    profit 
GROUP BY
    profit.month
ORDER BY
    profit.amount DESC

ORDER BY子句默认按升序按指定字段排序结果,加DESC表示降序排列。
注意:ORDER BY与GROUP BY同时使用时,ORDER BY必须用在GROUP BY后面。


3.limit分页


select * from table limit M,N; 表示从表中取M之后的N条记录,不包含M。如果数据量很大导致M很大,则MySQL会先扫描前M条记录导致性能下降,所以需要优化。
limit优化通常是先用主键索引到初始位置M,再截取需要的记录。优化方法有三种:

  • 先通过条件限定主键位置,再从该位置开始截取后面的记录
    select * from table where table.id > M order by table.id limit N;
  • 使用子查询限定主键位置,再从该位置开始截取后面的记录
    select * from table where table.id > (select id from table limit M,1) limit N;
  • 如果主键有序不变,使用BETWEEN AND直接限定范围

版权声明:本文为pycrab原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/pycrab/p/9768126.html