SQL语句
由于在笔试中遇到写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直接限定范围