MySql笔记

关键字

参考文章 :https://blog.csdn.net/weixin_43201975/article/details/88953903

关键字描述
ADD添加
ALL所有,全部
ALTER改变,改动,修改
ANALYZE解析
AND逻辑与
AS别名 alias 的缩写
ASC这里的ASC(ASCENDING)标识升序的意思,一般和 ORDER BY 配合使用
AVG平均
ASENSITIVE
BEFORE在……之前
BETWEEN在……中间
BIGINT大整形:0~18446744073709551615
BINARY二进制
BLOB二进制类型:0~65535字节
BOTH双方,两者
BY由,被
AUTO自动
AUTO_INCREMENT自动递增
CALL
CASCADE级联
CASE实例
CHANGE改变
CHAR字符型
CHARACTER
CHECK检查
COLLATE
COLUMN
CONDITION. 状况,状态
CONNECTION连接
CONSTRAINT约束
CONTINUE继续 连续
CONVERT转换 改变
CREATE创建
CROSS
CURRENT_DATE当前日期
CURRENT_TIME当前时间
CURRENT_TIMESTAMP当前时间戳
CURRENT_USER当前用户
ConcatConcat() 函数用来拼接两个列
CURSOR光标
COUNT计数
cartesian笛卡尔
DATABASE数据库
DATABASES数据库
DAY_HOUR小时
DAY_MICROSECOND微秒
DAY_MINUTE分钟
DAY_SECOND
DEC
DECIMAL十进制小数:-1.7976931348623157E+308~2.2250738585072014E-308
DECLARE
DEFAULT默认
DELAYED延误的,延迟的
DELETE删除
DESCDESCENDING 降序排列,通常和 ORFER BY 配合使用
DESCRIBE描述
DETERMINISTIC确定性
DISTINCT去重,返回不同的值
DISTINCTROW查询
DIV
DOUBLE浮点数据类型:-1.7976931348623157E+308~2.2250738585072014E-308
DROP删除:用于删除表
DUAL
EACH每个
ELSE否则
ELSEIF否则如果
ENCLOSED停业
ESCAPED
EXISTS存在
EXIT出口,退出
EXPLAIN解释说明
FALSE错误的
FETCH拿来,提取
FLOAT浮点数据类型:-3.402823466E+38~-1.175494351E-38
FOR循环 循环语句
FORCE暴力,强制
FOREIGN KEY外键:包含另一个表的主键,定义了两个表之间的关系
FROM指出检索数据的表名
FULLTEXT全文索引
GOTO跳转
GRANT授予
GROUP BY根据什么进行分组
HAVINGHAVING 过滤分组 ,和 GROUP BY 配合使用
HIGH_PRIORITY高优先级
IF如果
IGNORE如果用UPDATE语句更新多行,并且在更新这些行中的一行或多行时出一个现错误,则整个UPDATE操作被取消
IN在什么什么之内。IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配
INDEX索引
INFILE
INNER JOIN内连接
INOUT
INSENSITIVE
INSERT插入
INT数据类型 : 整型,整数:0~4294967295
INTEGER整数
INTERVAL间隔
INTO到…里面
IS
ITERATE迭代
JOIN连接(多表关联查询)
KEY钥匙🔑
KILL杀死
LABEL标签,标记
LEADING
LEAVE离开
LEFT JOIN左连接
LIKE模糊查询,配合通配符进行使用(百分号%通配符,下划线_通配符)
LIMIT限制结果
LINEAR线性
LINES线,行
LOAD加载,装载
LOCALTIME本地时间
LOCALTIMESTAMP日期和时间
LOCK
LONG长整型
LONGBLOB二进制类型:0~4294967295字节
LONGTEXT字符串类型:0~4294967295字节
LOOP环形
LOW_PRIORITY低优先级
LtrimLtrim()函数用来去除左边多余的空格
LowerLower()函数将字符串转换为小写
Length长度
MATCH
MEDIUMBLOB二进制类型: 0~16777215字节
MEDIUMINT中型整形数据类型:0~16777215
MEDIUMTEXT字符串类型:0~16777215字节
MIDDLEINT
MINUTE_MICROSECOND
MINUTE_SECOND
MOD
MODIFIES
MAX最大
MIN最小
NATURAL
NOT逻辑非,非
NO_WRITE_TO_BINLOG
NULL无值
NUMERIC数值型
ON
OFFSET偏移量,一般和 limit 配合使用
OPTIMIZE
OPTION选择 选项
OPTIONALLY可选择地
OR或,或者
ORDER BY以……排序,如果按照多个列进行排序的话使用逗号(,)进行分割
OUT输出
OUTER JOIN外连接
OUTFILE输出文件
PRECISION精度
PRIMARY KEY主键
PROCEDURE
PURGE
RAID0
RANGE范围
READ阅读
REAL实际存在的
REFERENCES参考文献
REGEXP正则表达式
RELEASE释放
RENAME重命名
RIGHTREPEAT
REPLACE替换
REQUIRE需要 要求
RESTRICT限制
RETURN返回
REVOKE撤销 吊销
RIGHT JOIN右连接
RLIKE正则表达式匹配
RtrimRtrim()函数用来删除数据右侧多余的空格来整理数据
SCHEMA架构
SELECT用途是从一个或多个表中检索信息
SENSITIVE
SEPARATOR分隔符
SET设置
SHOW显示
SMALLINT整数类型:短整型:0~65535
SPATIAL
SPECIFIC
SQLEXCEPTIONSQL异常
SQLSTATESQL状态
SQLWARNINGSQL警告
STARTING开始;出发
STRAIGHT_JOIN
SUM总和,求和,总数
TABLE
TEXT字符串类型:0~65535字节
TERMINATED终止
THEN然后 那么 当时 接着
TINYBLOB二进制类型 : 0~255字节
TINYINT整数类型:0~255
TINYTEXT字符串类型:0~255字节
TO
TRAILING
TRIGGER触发器
TRUE真实
trimtrim()函数用来去掉左右两边的空格
UNDO撤消
UNION组合查询:利用UNION,可给出多条SELECT语句,将它们的结果组合成单个结果集
UNIQUE独特
UNLOCK解锁
UNSIGNED无符号
UPDATE更新,更新语句
USAGE用法
USE用,使用
USING使用
UpperUpper()函数用于将文本转换为大写
VALUES
VARBINARY二进制数据
VARCHAR可变长字符串
VARCHARACTER
VARYING
VIEW视图
WHEN什么时候
WHERE过滤条件,只检索出符合条件的数据
WHILE当……的时候
WITH和……在一起
WRITE
ZEROFILL补零

数据类型

整数类型

数据类型字节数无符号数的取值范围有符号数的取值范围
TINYINT10~255-128~127
SMALLINT20~65535-32768~32768
MEDIUMINT30~16777215-8388608~8388608
INT40~4294967295-2147483648~ 2147483648
BIGINT80~18446744073709551615-9223372036854775808~9223372036854775808

位类型

数据类型
BIT

浮点型

数据类型字节数有符号的取值范围无符号的取值范围
FLOAT4-3.402823466E+38~-1.175494351E-380和1.175494351E-38~3.402823466E+38
DOUBLE8-1.7976931348623157E+308~2.2250738585072014E-3080和2.2250738585072014E-308~1.7976931348623157E+308

定点型

数据类型字节数有符号的取值范围无符号的取值范围
DECIMAL(M,D)M+2-1.7976931348623157E+308~2.2250738585072014E-3080和2.2250738585072014E-308~1.7976931348623157E+308

日期时间类型

数据类型字节数取值范围日期格式零值
YEAR11901~2155YYYY0000
DATE41000-01-01~9999-12-31YYYY-MM-DD0000-00-00
TIME3-838:59:59~ 838:59:59HH:MM:SS00:00:00
DATETIME81000-01-01 00:00:00~9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00
TIMESTAMP41970-01-01 00:00:01~2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00

字符串

数据类型储存范围
TINYTEXT0~255字节
TEXT0~65535字节
MEDIUMTEXT0~16777215字节
LONGTEXT0~4294967295字节

二进制数据

数据类型储存范围
TINYBLOB0~255字节
BLOB0~65535字节
MEDIUMBLOB0~16777215字节
LONGBLOB0~4294967295字节

枚举型

数据类型
ENUM

集合

数据类型
SET

SQL 语言规范

  • mysql对于SQL语句不区分大小写,SQL语句关键字尽量大写

  • 值,除了数值型,字符串型和日期时间类型使用单引号(’’)

  • 别名,尽量使用双引号(“”),而且不建议省略as

  • 所有标点符号使用英文状态下的半角输入方式

  • 必须保证所有(),单引号,双引号是成对结束的

  • 可以使用(1)#单行注释 (2)–空格单行注释 (3)/* 多行注释 */

命名规则:

  • 数据库、表名不得超过30个字符,变量名限制为29个

  • 必须只能包含 A–Z, a–z, 0–9, _共63个字符

  • 不能在对象名的字符间留空格

  • 必须不能和用户定义的其他对象重名

  • 必须保证你的字段没有和保留字、数据库系统或常用方法冲突

  • 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了

SQL分类

  • DDL(Data Definition Languages):数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。

    主要的语句关键字包括create、drop、alter等。

  • DML(Data Manipulation Language):数据操作语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。

    主要的语句关键字包括insert、delete、update、select等。

  • DCL(Data Control Language):数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。

    主要的语句关键字包括grant、revoke等。

插入数据(INSERT)

语法:

INSERT INTO 表名称  VALUES(1,值2......);
INSERT INTO 表名称  VALUES(1,值2......),(1,值2......),...;
INSERT INTO 表名称 (字段1,字段2......) VALUES(1,值2......);
INSERT INTO 表名称 (字段1,字段2......) VALUES(1,值2......),(1,值2......),.....;

修改数据(UPDATE)

语法:

UPDATE 表名称 SET 字段名1 =1, 字段名2=2,......WHERE  条件】; 
UPDATE1,表2,......   SET1.字段名1 =1,1.字段名2=2,2.字段1 =1,2.字段2=2......WHERE  条件】; 

删除数据(DELETE)

语法

delete from 表名 【where 条件】;
delete1,表2,.......   from1,表2......where 条件】;

查询书写顺序

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
    [HIGH_PRIORITY]
    [STRAIGHT_JOIN]
    [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
    [SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr] ...
    [into_option]
    [FROM table_references
      [PARTITION partition_list]]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
    [HAVING where_condition]
    [WINDOW window_name AS (window_spec)
        [, window_name AS (window_spec)] ...]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [into_option]
    [FOR {UPDATE | SHARE}
        [OF tbl_name [, tbl_name] ...]
        [NOWAIT | SKIP LOCKED]
      | LOCK IN SHARE MODE]
    [into_option]

into_option: {
    INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
  | INTO DUMPFILE 'file_name'
  | INTO var_name [, var_name] ...
}

sql 执行顺序

在这里插入图片描述

别名 AS (ALIAS)

运算符

  1. 算数运算符:+ - * / %

  2. 比较运算符:= > >= < <= !=

  3. 逻辑运算符:&&(逻辑与也可以写成and) ||(逻辑或也可以写成or) not(逻辑非) xor(逻辑异或)

  4. 范围: between … and … not between … and …

  5. 集合:in (值,值,值…) not in(值,值,值…)

  6. 模糊查询: LIKE NOT LIKE,通配符:%表示0-n个字符,_下划线代表一个字符

  7. 位运算符:&(按位与) |(按位或)^(按位异或)~(按位取反)>>(右移)<<(左移)

  8. NULL值判断,is null 或 is not null,如果使用null=null,null<>null,null=0,null<>0,null=false等都不对

    不过xxx is null 可以使用xxx <=> null ,xxx is not null 可以写成 not xxx <=> null

    结论:所有的运算符遇到NULL结果都是NULL,除了<=>

DISTINCT(去重)

SELECT DISTINCT 列名 FROM

LIMIT (限制结果)

LIMIT [位置偏移量,] 行数
SELECT * FROMLIMIT 5; 检索出前五条记录 
SELECT * FROMLIMIT 0,5; 检索出前五条记录 
SELECT * FROMLIMIT 5,10; 从下标5的位置检索出10条记录

ORDER BY(排序)

对一个或多个字段进行排序

默认是升序排列

多个字段时 使用逗号 ‘ ,’ 分割。

如果两个字段排序不一样时:

SELECT 字段1,字段2 FROMORDER BY 字段1 ASC,字段2 desc;
SELECT col_name FROMORDER BY col_name [ASC | DESC];

GROUP BY(分组查询)

[GROUP BY 字段] [HAVING <条件表达式>]

根据一个或多个列对结果集进行分组

在分组的列上可以配合使用聚集函数。()

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

注意事项:

  • GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
  • 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。
  • GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
  • 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。
  • 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
  • GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

HAVING(分组过滤)

  • WHERE 和 HAVING 区别
    • WHERE 过滤行,而 HAVING 过滤分组
    • where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据
    • where后面不能写分组函数,而having后面可以使用分组函数
    • having只用于group by分组统计语句

语法:

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING where_condition

JOIN(多表联合查询)

内连接(INNER JOIN)

在这里插入图片描述

SELECT [cols_list] from1  INNER JOIN2  ON [关联条件] where [其他筛选条件]
SELECT [cols_list] from1  CROSS JOIN2  ON [关联条件] where [其他筛选条件]
SELECT [cols_list] from1  JOIN2  ON [关联条件] where [其他筛选条件]

外连接

左连接(LEFT JOIN)

在这里插入图片描述

  • 说明

    返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

SELECT [cols_list] from1  LEFT JOIN2  ON [关联条件] where [其他筛选条件]

右连接(RIGHT JOIN)

在这里插入图片描述

  • 说明

    返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

SELECT [cols_list] from1  RIGHT JOIN2  ON [关联条件] where [其他筛选条件]

全连接(FULL JOIN)

mysql 不支持全连接,但可以通过 LEFT JOIN UNION RIGHT JOIN

SELECT [cols_list] from 表1  LEFT JOIN 表2  ON [关联条件] where [其他筛选条件]
UNION 
SELECT [cols_list] from 表1  RIGHT JOIN 表2  ON [关联条件] where [其他筛选条件]

UNION(联合,结合)

语法:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

WITH

说明:

如果一整句查询中多个子查询都需要使用同一个子查询的结果,那么就可以用with as,将共用的子查询提取出来,加个别名。后面查询语句可以直接用,对于大量复杂的SQL语句起到了很好的优化作用。

注意事项:

- 相当于一个临时表,但是不同于视图,不会存储起来,要与select配合使用。
- 同一个select前可以有多个临时表,写一个with就可以,用逗号隔开,最后一个with语句不要用逗号。
- with子句要用括号括起来。

语法:

with 别名 AS (查询语句) 查询语句

例子:

with t1 as (
    select year(hire_date) as hire_year, count(empno) as cnt from SQL_7 group by year(hire_date) order by hire_year
)
select *, sum(cnt) over(partition by null rows between unbounded preceding and current row) as sum from t1;

函数

文本处理函数

函数说明
Left(str, length)从左边开始截取str,length是截取的长度;
Right(str, length)从右边开始截取str,length是截取的长度;
Length(str)返回串的长度
Locate(substr , str )返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,则返回0;
INSTR(str,substr)INSTR()函数返回字符串中子字符串第一次出现的位置。如果在str中找不到子字符串,则INSTR()函数返回零(0)。
Lower()将串转换为小写
Upper()将串转换为大写
trim()去除前后空格
LTrim()去掉串左边的空格
RTrim()去掉串右边的空格
Soundex()返回串的SOUNDEX值
REVERSE()字符串反转
SubString(str ,n ,m)返回字符串str从第n个字符截取到第m个字符;
substring_index(str ,substr ,n)返回字符substr在str中第n次出现位置之前的字符串;
replace(str, n, m)将字符串str中的n字符替换成m字符;
CONCAT(string1,string2, … );字符串拼接,如果有个字段为null值,则函数返回一个null值
CONCAT_WS(seperator,string1,string2, … );函数在字符串参数之间添加分隔符,并返回单个字符串,并在字符串参数之间插入分隔符。
GROUP_CONCAT( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

时间处理函数

函数说明
AddDate()增加一个日期(天、周等)
AddTime()增加一个时间(时、分等)
CurDate()返回当前日期
CurTime()返回当前时间
Date()返回日期时间的日期部分
DateDiff(date1,date2)返回两个日期之间的天数
Date_Add()高度灵活的日期运算函数
Date_Format(date,format)返回一个格式化的日期或时间串
DayOfWeek()对于一个日期,返回对应的星期几
Now()返回当前日期和时间
Time()返回一个日期时间的时间部分
Year()返回一个日期的年份部分
Month()返回一个日期的月份部分
Day()返回一个日期的天数部分
Hour()返回一个时间的小时部分
Minute()返回一个时间的分钟部分
Second()返回一个时间的秒部分

日期加减操作

MySQL 为日期增加一个时间间隔:date_add()

now()       //now函数为获取当前时间
 
select date_add(now(), interval 1 day); -1select date_add(now(), interval 1 hour); -1小时
 
select date_add(now(), interval 1 minute); -1分钟
 
select date_add(now(), interval 1 second); -1select date_add(now(), interval 1 microsecond);-1毫秒
 
select date_add(now(), interval 1 week);-1select date_add(now(), interval 1 month);-1select date_add(now(), interval 1 quarter);-1select date_add(now(), interval 1 year);-1年
 
MySQL adddate(), addtime()函数,可以用date_add() 来替代。

MySQL 为日期减去一个时间间隔:date_sub()

MySQL date_sub() 日期时间函数 和date_add() 用法一致。
 
MySQL 中subdate(),subtime()函数,建议,用date_sub()来替代。

数值处理函数

函数说明
Mod()取余
round(x,d)四舍五入:x指要处理的数,d是指保留几位小数
truncate(x,d)截断:x指要处理的数,d是指保留几位小数
Ceil()向上取整
floor()向下取整
Rand()返回一个随机数
Sqrt()返回一个数的平方根
Sin()返回一个角度的正弦
Cos()返回一个角度的余弦
Tan()返回一个角度的正切
Abs()返回一个数的绝对值
Exp()返回一个数的指数值
Pi()圆周率

聚合函数

函数说明
AVG()返回某列的平均值
COUNT()返回某列的行数
MAX()在一组值中找到最大值。
MIN()在一组值中找到最小值。
SUM()计算一组值或表达式的总和。
group_concat()将分组中的字符串与各种选项进行连接。(如DISTINCTORDER BYSEPARATOR)的字符串。group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )

条件判断函数

函数说明
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 … [ELSE resultn] END相当于Java的if…else if…else…
if(value,value1,value2)如果value的值为TRUE,返回value1,否则返回value2
ifnull(value1, value2)如果value1不为NULL,返回value1,否则返回value2。
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1 … [ELSE 值n] END相当于Java的switch…case…

if

语法

IF(expr,result_true,result_false)

示例

SELECT COUNT(IF(sex=1,1,NULL)) 男生人数,COUNT(IF(sex=0,1,NULL))女生人数 FROM students

case when end else

语法1

CASE 字段 WHEN 预期值 THEN 结果1 ELSE 结果2 END

示例

SELECT name,score,(CASE 
	WHEN score>=90 THEN '优秀' 
	WHEN score>=80 THEN '良好' 
	WHEN score>=60 THEN '及格' 
	ELSE '不及格' END) level 
FROM score

IFNULL

语法

IFNULL(expression, alt_value)

说明

用于判断第一个表达式是否为NULL 。如果为NULL,则返回第二个参数,如果不为NULL,则返回第一个参数的值用于判断第一个表达式是否为NULL 。如果为NULL,则返回第二个参数,如果不为NULL,则返回第一个参数的值

示例

SELECT IFNULL(NULL, "RUNOOB");

窗口函数

在这里插入图片描述

名称描述
ROW_NUMBER为其分区中的每一行分配一个连续整数
RANK与DENSE_RANK()函数类似,只是当两行或更多行具有相同的排名时,排序值序列中存在间隙。
DENSE_RANK根据ORDER BY子句为其分区中的每一行分配一个排名。 它为具有相同值的行分配相同的排名。 如果两行或更多行具有相同的等级,则排序值序列中将没有间隙。
PERCENT_RANK计算分区或结果集中行的百分位数
CUME_DIST计算一组值中值的累积分布。
LAG返回分区中当前行之前的第N行的值。 如果不存在前一行,则返回NULL。
LEAD返回分区中当前行之后的第N行的值。 如果不存在后续行,则返回NULL。
FIRST_VALUE返回指定表达式相对于窗口框架中第一行的值。
LAST_VALUE返回指定表达式相对于窗口框架中最后一行的值。
NTH_VALUE返回窗口框架第N行的参数值
NTILE将每个窗口分区的行分配到指定数量的已排名组中。
  • 说明

    窗口函数也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据进行实时分析处理。

  • 作用

    • 解决排名问题,e.g.每个班级按成绩排名
    • 解决TOPN问题,e.g.每个班级前两名的学生
  • 语法

    select 窗口函数 over (partition by 用于分组的列名, order by 用于排序的列名)
    
  • 分类

    • 专用窗口函数:rank(),dense_rank(),row_number()
    • 汇总函数:max(),min(),count(),sum(),avg()

    ***注意:***窗口函数是对where后者group by子句处理后的结果进行操作,因此按照SQL语句的运行顺序,窗口函数一般放在select子句中。

rank()函数

  • 示例

    #按班级分类,将成绩降序排序
    SELECT*,
    	rank() over ( PARTITION BY 班级 ORDER BY 成绩 DESC)  AS ranking  
    FROM class;
    
  • 说明

    • rank()是排序函数,括号中不需要有参数;
    • 通过partition by将班级分类,相当于之前用过的group by子句功能,但是group by子句分类汇总会改变原数据的行数,而用窗口函数自救保持原行数;
    • 通过order by将成绩降序排列,与之前学的order by子句用法一样,后边可以升序asc或者降序desc;
  • 总结

    • 窗口函数这里的“窗口”表示范围,可以理解为将原数据划分范围,即分组,然后用函数实现某些目的
    • 窗口函数有分组和排序的功能
    • 不减少原表的行数

dense_rank()函数

用法 和 rank()函数相同

row_number()函数

用法 和 rank()函数相同

总结

这三个函数的区别是:如何处理并列的问题

  • 如下

    当成绩相同时,会存在并列的情况;

    • 在rank()函数,如果有并列情况,会占用下一个名次的位置,比如,成绩为100的学生有三个并列第一,那么99分的学生是第二名,通过rank()函数,名次是:1,1,1,4;
    • 在dense()函数中,如果有并列的情况,不会占用下一个名词,同用上个例子,名次是:1,1,1,2;
    • 在row_number()函数中,会忽略并列的情况,同用上述例子,名次是:1,2,3,4;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值