从 MySQL 学习 PostgreSQL
本文假设您已掌握了 MySQL 的基本使用,现在快速学习 PostgreSQL。主要介绍两者差异化语法。
为什么学习 PostgreSQL最初我了解 PostgreSQL 是数据库课上,我们老师非常的特别,因为多数老师数据库教学都会选择 MySQL。
作为全英文授课,这位老师的英文教学格外清晰易懂,我英语不好但听她上课非常舒服,她讲到:由于 MySQL 被 Oracle 收购,MySQL 虽然之前一直因为开源而备受青睐,近年却颇有商业化趋势。PostgreSQL 被越来越多的当作 MySQL 的替代品被应用。
另外,PostgreSQL 由于诞生晚于 MySQL 不仅性能上更加优越,支持上更广泛,语法也更现代化。不过在学习 PostgreSQL 的过程中也会发现其一些值得诟病的地方,这里不展开描述。
个人在学习数据库课程中的感受是,PostgreSQL 在社区支持方面不如 MySQL,因此感觉在中文社区学习 MySQL 然后转向 PostgreSQL 是一个不错的选择。
下载与安装
这里我们直接选择使用图形化工具,你可以选择 PgAdmin ,它是官方开源的。
PostgreSQL ...
使用触发器与视图
触发器
什么是触发器
触发器(Trigger)顾名思义可以在一个事件发生时,自动地执行一段逻辑。当我们需要维护一系列表的信息时,可以使用一些触发器自动维护,虽然这些维护的逻辑放在业务代码中更好一些,但 MySQL 以及其他许多 SQL 提供的触发器也提供了一个解决方案。
相关语法
创建触发器:
12345CREATE TRIGGER {触发器名} {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON {检测表名} FOR EACH ROWBEGIN {执行逻辑}END;
删除触发器:
1DROP TRIGGER {触发器名};
显示触发器:
1SHOW TRIGGERS;
触发器使用示例
例如在更新外键时,使用触发器更新主表使两者保持连接。
例如插入或更新元素时,使用触发器进行复制逻辑检测,如果非法,禁止更新。
注意事项
使用触发器应防止循环递归调用,否则会发生错误。
视图
什么是视图
视图(VIEW)提供 ...
python 面向对象编程备忘
基本结构
123456789101112131415161718192021222324252627282930class Animal: count = 0 # 函数外使用静态变量 # 构造函数, __xxx__ 为特殊成员函数, 具有官方指定的特殊用途, 非私有 def __init__(self, name: str): self.name = name # 公有成员变量 self._name = name # 受保护成员变量, 使用 _ 开头, python 不强制受保护只是用户约定 self.__name = name # 私有成员变量, 使用 __ 开头 Animal.count += 1 # 函数内使用静态变量 # 公有成员函数 def get_name(self) -> str: return self.__name # 受保护成员函数, 使用 _ 开头, python 不强制受保护只是用户约定 def _get_nam ...
使用键与索引
在 SQL 中存在多种键,通常用于约束和查询。本文将介绍主键、唯一键、非空值、默认值、外键与索引。
开始前的一个小芝士本文将介绍键和索引的使用,这首先需要学会查看已有键和索引,但是初学者往往不知道如何查看表的结构。不同 SQL 语言查看的方法各不相同,对于 MySQL 可以使用下面的命令。
1SHOW CREATE TABLE {表名};
示例输出1SHOW CREATE TABLE MOvies;1234567891011121314+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ...
移动硬盘中的 Ubuntu 安装
参考资料 移动硬盘中的 Ubuntu 安装笔记 - smallC233 的博客 - 洛谷博客 作修改
安装 Ubuntu 花絮这个移动硬盘中的 Ubuntu 系统是我和 smallC233 一起捣鼓了两天半才装好的,中间找了很多教程,试用了许多方法,也寻求了帮助,自己也思考和尝试了许多奇奇怪怪的解决方案。
为什么要安装 Ubuntu 系统?smallC233 是我的 ACM 队友,得知 ICPC 比赛是在 Ubuntu 上进行的,于是想到了安装 Ubuntu 系统用来熟悉环境。我们想要在 smallC233 的移动硬盘上安装 Ubuntu 系统,即插即用,并且移动硬盘的多余空间依然可以用于常规存储。
刻录 Ubuntu 镜像文件
首先需要从官网 下载Ubuntu桌面系统 镜像文件,或者从 清华大学开源软件镜像站 等国内源下载,建议下载 22.04.3 版本。
准备一个系统安装 U 盘(不是你的移动硬盘),将下载得到的 .iso 文件刻录到 U 盘中,注意刻录会格式化你的 U 盘。刻录用的软件有很多,如 Ubuntu 官方推荐的 balenaEtcher-Portable-1.18 ...
数据库中的范式
范式是一套严格的概念,本文从个人的理解解释范式,描述不一定严谨。
在关系型数据库中,关于数据表设计的基本原则和规范,被称为范式(Normal Form)。在 SQL 中对范式不作强制要求,但范式却是减少数据冗余、便利数据维护非常有效的设计原则。范式分为五级,其中常用的为前三级,每级范式满足的条件需首先满足上一级。
需要注意的是,虽然范式可以有效减少数据冗余,但随范式等级的提高,可继续减少的冗余减少,随表的变多询问效率却在下降。因此常用的范式仅为前三级和 BC 范式,另外还提出了反范式牺牲一些规范来提高效率。
键
在介绍范式前,需要再次明确键的概念,在后面范式的描述中,需要使用。
超键:可唯一确定一条记录的字段组成的元组,可以只有一个字段。
候选键:没有子集是超键的超键。通俗地讲,候选键是没有冗余字段的用于唯一确定字段的元组。
主键:用户从候选键中选择一个(或不选)作为主键,包含多个字段的主键称为联合主键。用户应选择合适的候选键作主键。
外键:用于与外表联结的键,对应外表中的主键。
主属性:包含于任意候选键的字段。
非主属性:不包含于任何候选键的字段。
第一范式(1NF)
第一 ...
SELECT 中的合并、交集与差集
合并 UNION
UNION 是将介绍的三种集合运算中最常用的运算,用于求两个 SELECT 语句结果的交集。
1{主 SELECT 语句} UNION {副 SELECT 语句};
需要注意的是,UNION 的使用中 (INTERSECT 和 EXCEPT 也一样) 要求且只要求两个 SELECT 语句输出的字段数相同,也就是说,如果两个 SELECT 语句返回的类型不同,依然可以使用 UNION。即使两个数据表毫无关系,只要字段数相同,都可以使用 UNION。
基本使用
示例输出12345678910SELECT starName AS name FROM StarsIn UNION SELECT name FROM MovieExec;-- 合并 StarsIn 和 MovieExec 中的人名1234567891011121314151617+-------------------+| name |+-------------------+| Harrison Ford | ...
SELECT 中的子查询与联结
子查询
SELECT 是查询语句,但 SQL 还支持 SELECT 的嵌套使用,这种使用称之为子查询。后面我将介绍子查询的三种应用:子查询作为筛选条件、子查询作为计算字段、使用子查询插入。需要注意的是,这些仅是子查询的常见应用,子查询不止可以用于这些场景。另外子查询尽管提供了很好的自由度,但很多时候效率低下,在可以使用下一章介绍的联结时尽量使用联结。
子查询作为筛选条件
可以将子查询作为筛选条件,这通常使用 IN 多值查找,但这要求子查询的返回必须只有一列。
1{SELECT 语句} WHERE {字段} IN ({SELECT 子查询})
HAVING 分组筛选同理。
示例输出123456789SELECT * FROM movies WHERE title IN ( SELECT movieTitle FROM StarsIn );-- 查找所有有明星出演的电影信息(所有明星出演作品都会在 StarsIn 中)12345678+---------------------+---- ...
SELECT 中的子句与运算
本文将详细介绍 SQL 中的四种子句 WHERE / ORDER BY / GROUP BY / HAVING,以及基本运算 / 特殊条件表达式 / 函数 / 聚集函数。
数据过滤 WHERE
基本格式
SELECT 语句可以使用 WHERE 进行数据过滤。格式为:
1{SELECT 语句} WHERE {条件表达式};
示例输出1SELECT * FROM MovieStar WHERE birthDATE >= "19700101";12345678+--------------+-------------+--------+------------+| name | address | gender | birthDate |+--------------+-------------+--------+------------+| Alec Baldwin | Baldwin Av. | M | 1977-06-07 || Kim Basinger | Baldwin Av. ...
对于后缀表达式的思考 - 栈
前往 算竞题解 分类 || 前往 算竞模板 分类
花絮 - 为什么写这篇题解今天是 23 年 10 月 7 日,数据结构课上讲栈,其中讲到了后缀表达式,但我惊奇的发现我竟然不会处理这个问题。
想起来这个问题我其实在去年 10 月遇到,那是刚刚大一开学,然后当时学了很久都没有学会,最后使用 python 的 eval 函数水过去了。之后 … 就把这件事忘了,现在回想起来,这个问题确实有很高深的东西。
听完老师讲完这节课,课后找了这道题,然后写了这篇题解。
后面我会讲到,后缀表达式实质上就是对树的后序遍历,而这棵树则是一棵笛卡尔树(一种索引满足二叉搜索树性质、值满足堆性质、唯一确定的树),但在代码实现中我们之所以看不到任何树的影子,是因为笛卡尔树的建树过程通常使用单调栈维护,而这棵笛卡尔树的后序遍历可以同时完成。这一个小小的栈,不仅是单调栈,还是笛卡尔树。
原题链接
洛谷 P1449 后缀表达式
洛谷 P1175 表达式的转换
简明题意
我们平常使用的算数表达式都是中缀表达式,而在计算机中对表达式求值都是先将其转换为后缀表达式,然后对后缀表达式只需从左往右求值即可。现在你需要编写程序模 ...