获得徽章 0
- #挑战每日一条沸点#
day 18
##### 开窗函数
###### sum over
在 SQL 中,开窗函数是一种强大的查询工具,它允许我们在查询中进行对分组数据进行计算、 **同时保留原始行的详细信息** 。
开窗函数可以与聚合函数(如 SUM、AVG、COUNT 等)结合使用,但与普通聚合函数不同,开窗函数不会导致结果集的行数减少。
打个比方,可以将开窗函数想象成一种 "透视镜",它能够将我们聚焦在某个特定的分组,同时还能看到整体的全景。
###### sum over order by
之前的教程中,我们讲到了 sum over 开窗函数,并且用它实现了分组统计。
本节教程我们将学习 sum over 函数的另一种用法:sum over order by,可以实现同组内数据的 **累加求和** 。
###### rank
Rank 开窗函数是 SQL 中一种用于对查询结果集中的行进行 **排名** 的开窗函数。它可以根据指定的列或表达式对结果集中的行进行排序,并为每一行分配一个排名。在排名过程中,相同的值将被赋予相同的排名,而不同的值将被赋予不同的排名。
> 当存在并列(相同排序值)时,Rank 会跳过后续排名,并保留相同的排名。
Rank 开窗函数的常见用法是在查询结果中查找前几名(Top N)或排名最高的行。
###### row_number
Row_Number 开窗函数是 SQL 中的一种用于为查询结果集中的每一行 **分配唯一连续排名** 的开窗函数。
它与之前讲到的 Rank 函数,Row_Number 函数为每一行都分配一个唯一的整数值,不管是否存在并列(相同排序值)的情况。每一行都有一个唯一的行号,从 1 开始连续递增。
###### lag/lead
开窗函数 Lag 和 Lead 的作用是获取在当前行之前或之后的行的值,这两个函数通常在需要比较相邻行数据或进行时间序列分析时非常有用。
1)Lag 函数
Lag 函数用于获取 **当前行之前** 的某一列的值。它可以帮助我们查看上一行的数据。
Lead 函数
Lead 函数用于获取 **当前行之后** 的某一列的值。它可以帮助我们查看下一行的数据。展开评论点赞 - #挑战每日一条沸点#
day 17
##### 子查询
子查询是指在一个查询语句内部 **嵌套** 另一个完整的查询语句,内层查询被称为子查询。子查询可以用于获取更复杂的查询结果或者用于过滤数据。
当执行包含子查询的查询语句时,数据库引擎会首先执行子查询,然后将其结果作为条件或数据源来执行外层查询。
###### EXISTS
之前的教程讲到,子查询是一种强大的查询工具,它可以嵌套在主查询中,帮助我们进行更复杂的条件过滤和数据检索。
其中,子查询中的一种特殊类型是 "exists" 子查询,用于检查主查询的结果集是否存在满足条件的记录,它返回布尔值(True 或 False),而不返回实际的数据。
之前的教程讲到,子查询是一种强大的查询工具,它可以嵌套在主查询中,帮助我们进行更复杂的条件过滤和数据检索。
其中,子查询中的一种特殊类型是 "exists" 子查询,用于检查主查询的结果集是否存在满足条件的记录,它返回布尔值(True 或 False),而不返回实际的数据。
和 exists 相对的是 not exists,用于查找不满足存在条件的记录。
在子查询中,我们只关心该子查询是否有结果,而不需要具体的数据值。因此,选择一个常量值1是一种简洁的方式。这个常量值没有实际意义,只是用作一个占位符来表示子查询的结果存在与否。
当子查询返回结果时,任何非空的结果集都会被视为"存在",触发主查询中的条件。如果子查询没有结果,或者结果集为空,那么主查询中的相关记录将被排除。
实际上,你可以使用任何非空的常量值,如`SELECT 'Hello'`或`SELECT 42`都可以达到同样的效果,只要确保子查询的结果集非空即可。
##### 组和查询
在 SQL 中,组合查询是一种将多个 SELECT 查询结果合并在一起的查询操作。
包括两种常见的组合查询操作:UNION 和 UNION ALL。
1. UNION 操作:它用于将两个或多个查询的结果集合并, **并去除重复的行** 。即如果两个查询的结果有相同的行,则只保留一行。
2. UNION ALL 操作:它也用于将两个或多个查询的结果集合并, **但不去除重复的行** 。即如果两个查询的结果有相同的行,则全部保留。展开评论点赞 - #挑战每日一条沸点#
day 16
##### 关联查询
###### cross join
在之前的教程中,我们所有的查询操作都是在单个数据表中进行的。但有时,我们可能希望在单张表的基础上,获取更多额外数据,比如获取学生表中学生所属的班级信息等。这时,就需要使用关联查询。
在 SQL 中,关联查询是一种用于联合多个数据表中的数据的查询方式。
其中,`CROSS JOIN` 是一种简单的关联查询,不需要任何条件来匹配行,它直接将左表的 **每一行** 与右表的 **每一行** 进行组合,返回的结果是两个表的笛卡尔积。
使用 CROSS JOIN 进行关联查询,将员工表和部门表的所有行组合在一起,获取员工姓名、工资、部门名称和部门经理,示例 SQL 代码如下:
注意,在多表关联查询的 SQL 中,我们最好在选择字段时指定字段所属表的名称(比如 e.emp_name),还可以通过给表起别名(比如 employees e)来简化 SQL 语句。
###### inner join
在 SQL 中,INNER JOIN 是一种常见的关联查询方式,它根据两个表之间的关联条件,将满足条件的行组合在一起。
注意,INNER JOIN 只返回两个表中满足关联条件的交集部分,即在两个表中都存在的匹配行。
## outer join
在 SQL 中,OUTER JOIN 是一种关联查询方式,它根据指定的关联条件,将两个表中满足条件的行组合在一起,并 **包含没有匹配的行** 。
在 OUTER JOIN 中,包括 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 两种类型,它们分别表示查询左表和右表的所有行(即使没有被匹配),再加上满足条件的交集部分。
LEFT JOIN:
- LEFT JOIN以左边的表为主表,右边的表为关联表。
- 结果集包括左表中所有的记录,以及与左表匹配的右表记录。
- 如果左表中的记录在右表中找不到匹配的记录,那么结果集中将会用NULL值填充右表的字段。
RIGHT JOIN:
- RIGHT JOIN以右边的表为主表,左边的表为关联表。
- 结果集包括右表中所有的记录,以及与右表匹配的左表记录。
- 如果右表中的记录在左表中找不到匹配的记录,那么结果集中将会用NULL值填充左表的字段。展开评论点赞 - #挑战每日一条沸点#
day 15
sql语法的继续学习
##### 分组聚合
###### 单字段分组
在 SQL 中,分组聚合是一种对数据进行分类并对每个分类进行聚合计算的操作。它允许我们按照指定的列或字段对数据进行分组,然后对每个分组应用聚合函数,如 COUNT、SUM、AVG 等,以获得分组后的汇总结果。
在 SQL 中,通常使用 `GROUP BY` 关键字对数据进行分组。
1)使用分组聚合查询中每个客户的编号:
SELECT customer_id
FROM orders
GROUP BY customer_id;
###### 多字段分组
有时,单字段分组并不能满足我们的需求,比如想统计学校里每个班级每次考试的学生情况,这时就可以使用多字段分组。
多字段分组和单字段分组的实现方式几乎一致,使用 `GROUP BY` 语法即可
-- 查询每个班级每次考试的学生人数
SELECT customer_id, product_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id, product_id;
###### HAVING语句
在 SQL 中,HAVING 子句用于在分组聚合后对分组进行过滤。它允许我们对分组后的结果进行条件筛选,只保留满足特定条件的分组。
HAVING 子句与条件查询 WHERE 子句的区别在于,WHERE 子句用于在 **分组之前** 进行过滤,而 HAVING 子句用于在 **分组之后** 进行过滤。
##### 关联查询
###### cross join
在之前的教程中,我们所有的查询操作都是在单个数据表中进行的。但有时,我们可能希望在单张表的基础上,获取更多额外数据,比如获取学生表中学生所属的班级信息等。这时,就需要使用关联查询。
在 SQL 中,关联查询是一种用于联合多个数据表中的数据的查询方式。
其中,`CROSS JOIN` 是一种简单的关联查询,不需要任何条件来匹配行,它直接将左表的 **每一行** 与右表的 **每一行** 进行组合,返回的结果是两个表的笛卡尔积。展开评论点赞 - #挑战每日一条沸点#
day 14
##### 条件分支
条件分支 `case when` 是 SQL 中用于根据条件进行分支处理的语法。它类似于其他编程语言中的 if else 条件判断语句,允许我们根据不同的条件选择不同的结果返回。
`case when` 支持同时指定多个分支,示例语法如下:
```sql
CASE WHEN (条件1) THEN 结果1
WHEN (条件2) THEN 结果2
...
ELSE 其他结果 END
```
##### 时间函数
在 SQL 中,时间函数是用于处理日期和时间的特殊函数。它们允许我们在查询中操作和处理日期、时间、日期时间数据,从而使得在数据库中进行时间相关的操作变得更加方便和灵活。
常用的时间函数有:
- DATE:获取当前日期
- DATETIME:获取当前日期时间
- TIME:获取当前时间
-- 获取当前日期
SELECT DATE() AS current_date;
##### 字符串处理
在 SQL 中,字符串处理是一类用于处理文本数据的函数。它们允许我们对字符串进行各种操作,如转换大小写、计算字符串长度以及搜索和替换子字符串等。字符串处理函数可以帮助我们在数据库中对字符串进行加工和转换,从而满足不同的需求。
1)使用字符串处理函数 `UPPER` 将姓名转换为大写:
2)使用字符串处理函数 `LENGTH` 计算姓名长度:
3)使用字符串处理函数 `LOWER` 将姓名转换为小写:
##### 聚合函数
在 SQL 中,聚合函数是一类用于对数据集进行 **汇总计算** 的特殊函数。它们可以对一组数据执行诸如计数、求和、平均值、最大值和最小值等操作。聚合函数通常在 SELECT 语句中配合 GROUP BY 子句使用,用于对分组后的数据进行汇总分析。
常见的聚合函数包括:
- COUNT:计算指定列的行数或非空值的数量。
- SUM:计算指定列的数值之和。
- AVG:计算指定列的数值平均值。
- MAX:找出指定列的最大值。
- MIN:找出指定列的最小值。
select的多个变量之间要用,隔开展开评论点赞 - #挑战每日一条沸点#
day14
sql语法的继续学习
##### 去重
可能存在重复的数据记录,但如果我们想要过滤掉重复的记录,只保留不同的记录,就要使用 SQL 的去重功能。
在 SQL 中,我们可以使用 `DISTINCT` 关键字来实现去重操作。
举个应用场景:假设你是班长,要统计班级中有哪些不同的学生,而不关心他们重复出现的次数,就可以使用去重。
现在,我们使用`DISTINCT`关键字来找出不同的班级 ID:
```sql
-- SQL 查询语句
select distinct class_id from students;
```
除了按照单字段去重外,`DISTINCT` 关键字还支持根据多个字段的组合来进行去重操作,确保多个字段的组合是唯一的。
##### 排序
在查询数据时,我们有时希望对结果按照某个字段的值进行排序,以便更好地查看数据。
在 SQL 中,我们可以使用 `ORDER BY` 关键字来实现排序操作。`ORDER BY` 后面跟上需要排序的字段,可以选择升序(ASC)或降序(DESC)排列。
```sql
-- SQL 查询语句 1
select name, age from students order by age asc;
(Ascending order 升序)
```
在排序的基础上,我们还可以根据多个字段的值进行排序。当第一个字段的值相同时,再按照第二个字段的值进行排序,以此类推。
##### 截断和偏移
假设你有一张待办事项清单,上面有很多任务。当你每次只想查看其中的几个任务时,会怎么办呢?
1)你可以使用手指挡住不需要看的部分(即截断)
2)根据任务的编号,直接翻到需要查看的位置(即偏移)
在 SQL 中,我们使用 `LIMIT` 关键字来实现数据的截断和偏移。
```sql
-- LIMIT 后只跟一个整数,表示要截断的数据条数(一次获取几条)
select task_name, due_date from tasks limit 2;
-- LIMIT 后跟 2 个整数,依次表示从第几条数据开始、一次获取几条
select task_name, due_date from tasks limit 2, 2;
```展开评论点赞 - #挑战每日一条沸点#
day 13
sql学习笔记
##### 条件查询
+ where语句
+ 从数据库中筛选出 **满足特定条件** 的数据行,而不是返回表中的所有数据
+ 使用 where 子句在查询中设置过滤条件,只有满足这些条件的数据行才会被返回
+ ```sql
SELECT 列1, 列2, ...
FROM 表名
WHERE 条件;
```
+ 可以使用比较运算符(如`=`、`<`、`>`等)、逻辑运算符(如`AND`、`OR`等)、IN 操作符、LIKE 操作符等来设置条件
+ 标准的SQL语法中,字符串应该使用单引号
+ 标准的SQL语法中,应该使用单个等号(=)来表示等于比较操作
###### 运算符
+ SQL 中用于在条件查询中进行条件判断的特殊符号,比如 `=`、 `!=`、`<`、`>` 等。通过使用不同的运算符,我们可以在查询语句中设定多样化的条件,从而根据数据的不同属性进行灵活的筛选和过滤
+ "BETWEEN" 运算符 筛选某个范围内
###### 空值
+ 数据库中,有时候数据表的某些字段可能没有值,即为空值(NULL)
+ 使用 "IS NULL" 和 "IS NOT NULL" 来判断字段是否为空值或非空值
###### 模糊查询
模糊查询是一种特殊的条件查询,它允许我们根据模式匹配来查找符合特定条件的数据,可以使用 LIKE 关键字实现模糊查询。
在 LIKE 模糊查询中,我们使用通配符来代表零个或多个字符,从而能够快速地找到匹配的数据。
有如下 2 种通配符:
- 百分号(%):表示任意长度的任意字符序列。
- 下划线(_):表示任意单个字符。
- ```sql
-- SQL查询语句
select name, age, position from employees where name like '%张%';
###### 逻辑运算
在逻辑运算中,常用的运算符有:
- AND:表示逻辑与,要求同时满足多个条件,才返回 true。
- OR:表示逻辑或,要求满足其中任意一个条件,就返回 true。
- NOT:表示逻辑非,用于否定一个条件(本来是 true,用了 not 后转为 false)展开评论点赞 - #挑战每日一条沸点#
day 12
SQL语言学习
#### 介绍
+ SQL(Structured Query Language 结构化查询语言)
+ 是一种用于管理、操作和查询数据库的标准化语言,被广泛应用于各种类型的数据库,如 MySQL、PostgreSQL、Oracle、Microsoft SQL Server 等
#### select 查询
##### **全表查询**
+ `select * from 表名` 这样的 SQL 语句时,就是在进行全表查询,它会返回数据表中的所有行,让我们可以全面了解表中的数据 *号有全称的含义
##### 选择查询
+ 它用于从数据表中选择 **特定的列或字段** ,并只返回这些列的数据值
+ 选择查询的 SQL 语法是 `select {列名...}`,它告诉数据库我们想要查看哪些列的数据
+ ` select 字段1,字段2.... from 数据表`
##### 查询别名
+ 更改查询表头的信息,利用别名来代替
+ 别名是为数据表的列或查询结果中的字段取一个临时的、可读性更高的名字,使得查询结果更加直观和易读
+ 别名语法 `{原始字段名} as {别名}` 来为查询结果的列名取一个便于理解的名称
+ ```sql
- SQL查询语句
select name as 员工姓名, position as 职位名称 from employees;
所改变的只是查询的结果显示,数据库中数据没有被改变
```
> 上述代码中的 as 也可以省略,比如 `name 员工姓名` 也是 ok 的。
##### 常量和运算
+ SQL 中用于对数据进行计算和处理的重要概念。在 SQL 查询中,常量指的是固定的数值或文本(比如 "1"),而运算则是对这些常量进行数学运算或字符串操作
+ 通过常量和运算,我们可以在查询语句中对数据进行加减乘除、取平均值、连接文本等操作,从而得到我们想要的查询结果
+ SQL 可以直接把常量作为列名
##### 条件查询
+ where语句
+ 从数据库中筛选出 **满足特定条件** 的数据行,而不是返回表中的所有数据
+ 使用 where 子句在查询中设置过滤条件,只有满足这些条件的数据行才会被返回展开评论点赞 - #挑战每日一条沸点#
day 11
+ 请求方法:GET 请求数据 POST 提交数据 (最常见) 当然还有其余请求(DELETE PUT....)
+ URL(“统一资源定位符”(Uniform Resource Locator)的缩写。URL 是用于指定资源在互联网上位置的一种标准格式。它包含了访问资源所需的协议类型(如 HTTP、HTTPS、FTP 等)、主机名、端口号、路径和查询参数等信息。)一个典型的 URL 格式如下:
+ protocol://hostname:port/path?query_params
+ `protocol` 指定了访问资源所使用的协议类型,例如 HTTP、HTTPS、FTP 等。
+ `hostname` 是指远程主机的域名或 IP 地址,用于标识资源所在的网络地址。
+ `port` 是可选的,用于指定访问该资源时使用的端口号,默认根据协议类型进行设置。
+ `path` 是指资源在主机上的路径,用于定位具体的资源。
+ 通过提供有效的 URL,可以在 Web 浏览器中访问网页、下载文件、进行网络请求等。在编程中,也经常使用 URL 来进行网络通信、爬取网页数据、访问网络 API 等操作。
+ 请求行在请求和响应的格式略有差别
+ 请求状态行:请求方法 URL HTTP/浏览器协议版本
+ 如: "GET /index.php HTTP/1.1"
+ 响应状态行:HTTP/服务器协议版本 响应码 响应码描述
+ 如:"HTTP/1.1 200 OK "
+ 常见的响应码及其描述
+ 1xx表示一个临时响应
+ 如 100 Continue
+ 2xx表示服务器成功处理了用户的请求
+ 如 200 ok
+ 201 Created 指示成功地创建了新的资源
+ 3xx表示用户请求的资源应当从别处获取
+ 如 302 Found 指示所请求的资源已被临时移动到另一个位置
+ 304 Not Motified 指示服务器资源未被修改过,客户端可以使用缓存的版本而无需重新下载展开评论点赞 - #挑战每日一条沸点#
day 10
接口类型的方法
接口定义为一个方法的集合。方法包含实际的代码。换句话说,一个接口就是定义,
而方法就是实现。因此,接收者不能定义为接口类型,这样做的话会引起 invalid
receiver type ... 的编译器错误。来自语言说明书 [10] 的权威内容:
接收者类型必须是 T 或 *T,这里的 T 是类型名。T 叫做接收者基础类型或
简称基础类型。基础类型一定不能使指针或接口类型,并且定义在与方法
相同的包中。
Pointers to interfaces
在 Go 中创建指向接口的指针是无意义的。 实际上创建接口值的指针也是非
法的。在 2010-10-13 的发布日志中进行的描述,使得没有任何余地怀疑这一事实:
语言的改变是使用指针指向接口值不再自动反引用指针。指向接口值的
指针通常是低级的错误,而不是正确的代码。
这来自 [9]。如果不是这个限制,这个代码:
var buf bytes.Buffer
io.Copy(buf, os.Stdin)
就会复制标准输入到 buf 的副本,而不是 buf 本身。这看起来永远不会是一个期望
的结果。
接口名字
根据规则,单方法接口命名为方法名加上 -er 后缀:Reader,Writer,Formatter 等。
有一堆这样的命名,高效的反映了它们职责和包含的函数名。Read,Write,Close,
Flush,String 等等有着规范的声明和含义。为了避免混淆,除非有类似的声明和含
义,否则不要让方法与这些重名。相反的,如果类型实现了与众所周知的类型相同的方
法,那么就用相同的名字和声明;将字符串转换方法命名为 String 而不是 ToString。
实际上,无须明确一个类型是否实现了一个接口意味着 Go 实现了叫做 duck typing[26]
的模式。这不是纯粹的 duck typing,因为如果可能的话 Go 编译器将对类型是否实现
了接口进行实现静态检查。然而,Go 确实有纯粹动态的方面,如可将一个接口类型转
换到另一个。通常情况下,转换的检查是在运行时进行的。如果是非法转换——当在
已有接口值中存储的类型值不匹配将要转换到的接口——程序会抛出运行时错误。展开评论点赞