当前位置:网站首页>数据库-SQL
数据库-SQL
2022-07-30 14:53:00 【temperamentalkj】
数据库-SQL
1、排序 order by
查询所有员工薪资
1.1 默认是升序
select
ename,sal
from
emp
order by
sal; // 默认是升序!!!
1.2 指定降序:
select
ename,sal
from
emp
order by
sal desc;
1.3 指定升序:
select
ename,sal
from
emp
order by
sal asc;
1.4 两个字段排序或者多个字段排序
// 查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,
// 再按照名字升序排列。
select
ename,sal
from
emp
order by
sal asc, ename asc; // sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。
1.5 关键字顺序
select
...
from
...
where
...
order by
...
以上语句的执行顺序:
第一步:from
第二步:where
第三步:select
四步:order by(排序总是在最后执行!)
2、limit
2.1 limit作用
将查询结果集的一部分取出来。通常使用在分页查询当中。
百度默认:一页显示10条记录。
分页的作用是为了提高用户的体验,因为一次全部都查出来,用户体验差。
可以一页一页翻页看。
2.2 用法
【注:mysql当中limit在order by之后执行!!!!!!】
完整用法:limit startIndex, length
- startIndex是起始下标,length是长度。
- 起始下标从0开始。
缺省用法:limit 5; 这是取前5
// 按照薪资降序,取出排名在前5名的员工?
select
ename,sal
from
emp
order by
sal desc
limit 5; //取前5
select
ename,sal
from
emp
order by
sal desc
limit 0,5;
// 取出工资排名在[3-5]名的员工?
// 2表示起始位置从下标2开始,就是第三条记录。
// 3表示长度。
select
ename,sal
from
emp
order by
sal desc
limit
2, 3;
分页
每页显示3条记录
第1页:limit 0,3 [0 1 2]
第2页:limit 3,3 [3 4 5]
第3页:limit 6,3 [6 7 8]
第4页:limit 9,3 [9 10 11]
每页显示pageSize条记录
第pageNo页:limit (pageNo - 1) * pageSize , pageSize
public static void main(String[] args){
// 用户提交过来一个页码,以及每页显示的记录条数
int pageNo = 5; //第5页
int pageSize = 10; //每页显示10条
int startIndex = (pageNo - 1) * pageSize;
String sql = "select ...limit " + startIndex + ", " + pageSize;
}
记公式:
limit (pageNo-1)*pageSize , pageSize
3、去除重复记录distinct
把查询结果去除重复记录
注意:原表数据不会被修改,只是查询结果去重。
去重需要使用一个关键字:distinct
// distinct只能出现在所有字段的最前方。
// 这样编写是错误的,语法错误。
mysql> select ename,distinct job from emp;
// distinct出现在job,deptno两个字段之前,表示两个字段联合起来去重。
mysql> select distinct job,deptno from emp;
4、数据处理函数
数据处理函数又被称为单行处理函数。
单行处理函数的特点:一个输入对应一个输出。
和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)
4.1 ifnull
ifnull可以将 null 转换成一个具体值ifnull是空处理函数。专门处理空的。
在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL。
【注:NULL只要参与运算,最终结果一定是NULL。为了避免这个现象,需要使用ifnull函数。
ifnull函数用法:ifnull(数据, 被当做哪个值)如果“数据”为NULL的时候,把这个数据结构当做哪个值。】
mysql> select ename, sal + comm as salcomm from emp;
+--------+---------+
| ename | salcomm |
+--------+---------+
| SMITH | NULL |
| ALLEN | 1900.00 |
| WARD | 1750.00 |
| JONES | NULL |
| MARTIN | 2650.00 |
| BLAKE | NULL |
| CLARK | NULL |
| SCOTT | NULL |
| KING | NULL |
| TURNER | 1500.00 |
| ADAMS | NULL |
| JAMES | NULL |
| FORD | NULL |
| MILLER | NULL |
+--------+---------+
// 计算每个员工的年薪?
// 年薪 = (月薪 + 月补助) * 12
select ename, (sal + comm) * 12 as yearsal from emp;
+--------+----------+
| ename | yearsal |
+--------+----------+
| SMITH | NULL |
| ALLEN | 22800.00 |
| WARD | 21000.00 |
| JONES | NULL |
| MARTIN | 31800.00 |
| BLAKE | NULL |
| CLARK | NULL |
| SCOTT | NULL |
| KING | NULL |
| TURNER | 18000.00 |
| ADAMS | NULL |
| JAMES | NULL |
| FORD | NULL |
| MILLER | NULL |
+--------+----------+
// 补助为NULL的时候,将补助当做0
select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;
+--------+----------+
| ename | yearsal |
+--------+----------+
| SMITH | 9600.00 |
| ALLEN | 22800.00 |
| WARD | 21000.00 |
| JONES | 35700.00 |
| MARTIN | 31800.00 |
| BLAKE | 34200.00 |
| CLARK | 29400.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
| TURNER | 18000.00 |
| ADAMS | 13200.00 |
| JAMES | 11400.00 |
| FORD | 36000.00 |
| MILLER | 15600.00 |
+--------+----------+
5、窗口函数
窗口函数作用:
在日常工作中,经常会遇到需要在每组内排名,比如下面的业务需求:
- 排名问题:每个部门按业绩来排名
- topN问题:找出每个部门排名前N的员工进行奖励
面对这类需求,就需要使用sql的高级功能窗口函数了。
什么是窗口函数?
窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。
5.1 窗口函数的基本语法:
<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>)
5.2 窗口函数都有哪些
<窗口函数>的位置,可以放以下两种函数:
- 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。
- 聚合函数,如sum. avg, count, max, min等。
因为窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中。
5.2.1 专用窗口函数
5.2.1.1 rank() over(业务逻辑)
作用:查出指定条件后的进行排名,条件相同排名相同,排名间断不连续。
说明:例如学生排名,使用这个函数,成绩相同的两名是并列,下一位同学空出所占的名次。即:1 1 3 4 5 5 7
SELECT id, name, score, rank() over(ORDER BY score DESC) AS 'rank' FROM student

5.2.1.2 dense_rank() over(业务逻辑)
作用:查出指定条件后的进行排名,条件相同排名相同,排名间断不连续。
说明:和rank() over 的作用相同,区别在于dense_rank() over 排名是密集连续的。例如学生排名,使用这个函数,成绩相同的两名是并列,下一位同学接着下一个名次。即:1 1 2 3 4 5 5 6
SELECT id, name, score, dense_rank() over(ORDER BY score DESC) AS 'rank' FROM student

5.2.1.3 row_number() over(业务逻辑)
作用:查出指定条件后的进行排名,条件相同排名也不相同,排名间断不连续。
说明:这个函数不需要考虑是否并列,即使根据条件查询出来的数值相同也会进行连续排序。即:1 2 3 4 5 6
SELECT id, name, score, row_number() over(ORDER BY score DESC) AS 'rank' FROM student

边栏推荐
- 1700. 无法吃午餐的学生数量
- 针对 MySQL/InnoDB 刷盘调优
- 4 senior experts share the insider architecture design and implementation principles of Flink technology with years of experience in large factories
- 类和对象(下篇)
- 基于FPGA的DDS任意波形输出
- About the data synchronization delay of MySQL master-slave replication
- 转换OTU表和序列文件为PICRUST2需要的格式
- B+树索引页大小是如何确定的?
- 90后人大硕士为学医竟重新高考,成功被首医大录取
- Configuration - Notes
猜你喜欢

Redis 缓存穿透、击穿、雪崩以及一致性问题

Configuration - Notes

【云原生】服务行业案例-不可预测的并发场景解决方案

Example of video switching playback (video switching example) code

ECCV2022 | FPN错位对齐,实现高效半监督目标检测 (PseCo)

Flink实时仓库-DWS层(关键词搜索分析-自定义函数,窗口操作,FlinkSql设置水位线,保存数据到Clickhouse)模板代码

阿里CTO程立:阿里巴巴的开源历程、理念和实践

本地事务与分布式事务

华为「天才少年」计划招募的博士们,迎来首秀!

nodejs环境变量设置
随机推荐
ISELED---氛围灯方案的新选择
canal scrape data
[Cloud native] Alibaba Cloud ARMS business real-time monitoring
websocket flv 客户端解封包
Distributed pre-course: MySQL implements distributed locks
软件包 - 笔记
超T动力 盈运天下——中国重汽黄河/豪沃WP14T产品首发荣耀上市!
MongoDB starts an error Process: 29784 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)
华为云重磅发布开源软件治理服务——软件成分分析
localhost with 127.0.0.1
【云原生】灰度发布、蓝绿发布、滚动发布、灰度发布解释
哨兵
postgresql的普通字符串和转义字符串
【重磅来袭】教你如何在RGBD三维重建中获取高质量模型纹理
Sleuth+Zipkin(可视化) 服务链路追踪
90后人大硕士为学医竟重新高考,成功被首医大录取
Use of SLF4J
【嵌入式】适用于Cortex-M3(STM32F10x)的IQmath库
GeoServer
About the data synchronization delay of MySQL master-slave replication