sql语句学习总结
1. sql基础(强烈推荐)
w3school上供初学者使用足以,还有测试(点个赞)——链接: link.
2. sql加强
1. CASE…WHEN…THEN…ELSE…END
可以解决字段中已知数据与字段的互换,如下所示:
- 有一个表,如下所示:
学生 | 科目 | 成绩 |
---|---|---|
student1 | 语文 | 80 |
student1 | 数学 | 70 |
student1 | 英语 | 60 |
student2 | 语文 | 90 |
student2 | 数学 | 80 |
student2 | 英语 | 100 |
需求:通过sql语句实现以下数据展示。
学生 | 语文 | 数学 | 英语 |
---|---|---|---|
student1 | 80 | 70 | 60 |
student2 | 90 | 80 | 100 |
解答:
SELECT 学生,
SUM(CASE 科目 WHEN '语文' THEN 成绩 ELSE 0 END) AS '语文',
SUM(CASE 科目 WHEN '数学' THEN 成绩 ELSE 0 END) AS '数学',
SUM(CASE WHEN 科目='英语' THEN 成绩 ELSE 0 END) AS '英语'
FROM bb GROUP BY 学生;
2. 开窗函数
开窗函数的调用格式为:函数名(列) OVER(选项)
OVER keyword表示把函数当成开窗函数而不是聚合函数。SQL标准同意将全部聚合函数用做开窗函数,使用OVER keyword来区分这两种使用方法。
如:开窗函数COUNT(*) OVER()对于查询结果的每一行都返回全部符合条件的行的条数。OVER keyword后的括号里还常常加入选项用以改变进行聚合运算的窗口范围。假设OVER keyword后的括号里的选项为空,则开窗函数会对结果集中的全部行进行聚合运算。
注:开窗函数只能出现在 SELECT 或 ORDER BY 子句中。
-
COUNT(1),COUNT(),COUNT(col)的区别
——统计同一列中不同种类的数量占总数的比例
-COUNT() 返回组中的项数。包括 NULL 值和重复项。
-COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。
expression: 除 text、image 或 ntext 以外任何类型的表达式。不允许使用聚合函数和子查询。
-COUNT(col)为了去除col列中包含的NULL行,SQL Server必须读取该col的每一行的值,然后确认下是否为NULL,然后在进行计数。因此count(*)应该是比count(col)快的。 -
Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值
select * from (
select text,
lag(text, 1) over(order by rownum),
lag(text, 2) over(order by rownum),
lead(text, 1) over(order by rownum),
lead(text, 2) over(order by rownum)
from alert_log)
where text like 'ORA-%'
3. limit
-
limit n
显示前n项 -
limit n m-n
显示第n到m项
4.concat()是拼接函数
CONCAT( ROUND( COUNT(cph)/COUNT(1)*100 ,3 ),'%')
5. Round(number,N)是保留N位小数点函数
6.instr 类似like,用法如下:
select * from students where instr(address, ‘beijing’) > 0