Postgresql基础实践教程(七)

【入门教程】PostgreSQL+SequoiaDB HA 实践 【入门教程】PostgreSQL+SequoiaDB HA 实践 前言 SequoiaDB作为分布式数据库,从设计之初就已经支持SQL访问。目前,SequoiaDB自研的SQL访问组件SequoiaSQL作为企业版的功能之一已经提供给上百家企业用户使用,并且已经实现分布式架构下的SQL 2003支持。 对于SequoiaDB社区版用户,我们可以通过SequoiaDB对接Postgre 阅读详情

原始表
⭐️⭐️⭐️⭐️⭐️
完整数据详见 练习数据·免费
⭐️⭐️⭐️⭐️⭐️

六十二、格式化会员姓名

问题

输出所有会员的姓名,格式为"姓, 名"

预期结果

name
GUEST, GUEST
Smith, Darren
Smith, Tracy
Rownam, Tim
Joplette, Janice
Butters, Gerald
Tracy, Burton
Dare, Nancy
Boothe, Tim
Stibbons, Ponder
Owen, Charles
Jones, David
Baker, Anne
Farrell, Jemima
Smith, Jack
Bader, Florence
Baker, Timothy
Pinker, David
Genting, Matthew
Mackenzie, Anna
Coplin, Joan
Sarwin, Ramnaresh
Jones, Douglas
Rumney, Henrietta
Farrell, David
Worthington-Smyth, Henry
Purview, Millicent
Tupperware, Hyacinth
Hunt, John
Crumpet, Erica
Smith, Darren

[答案与讨论]

select surname || ', ' || firstname as name from cd.members

在 SQL 中构建字符串与其他语言类似,只是连接运算符有所不同:||。有些系统(如 SQL Server)使用 +,但 || 才是 SQL 标准。


六十三、按名称前缀查找设施

问题

查找所有名称以"Tennis"开头的设施。检索所有列。

预期结果

facidnamemembercostguestcostinitialoutlaymonthlymaintenance
0Tennis Court 152510000200
1Tennis Court 25258000200

[答案与讨论]

select * from cd.facilities where name like 'Tennis%';

SQL 的 LIKE 运算符是一种使用基本匹配来搜索字符串的标准方法。% 字符匹配任意字符串,而 _ 匹配任意单个字符。

使用 LIKE 时需要注意的一点是它如何使用索引。如果你使用的是"C"区域设置,任何具有固定开头的 LIKE 字符串(如本例所示)都可以使用索引。如果使用其他区域设置,LIKE 默认不会使用任何索引。详见此处了解如何更改这一行为。


六十四、执行不区分大小写的搜索

问题

执行不区分大小写的搜索,查找所有名称以"tennis"开头的设施。检索所有列。

预期结果

facidnamemembercostguestcostinitialoutlaymonthlymaintenance
0Tennis Court 152510000200
1Tennis Court 25258000200

[答案与讨论]

select * from cd.facilities where upper(name) like 'TENNIS%';

标准 SQL 中没有直接用于不区分大小写比较的运算符。幸运的是,我们可以借鉴许多其他语言的做法,在比较时将所有值强制转换为大写。这样大小写就不再重要,从而得到我们想要的结果。

另外,Postgres 还提供了 ILIKE 运算符,用于执行不区分大小写的搜索。虽然这不是标准 SQL,但可以说更加清晰明了。

需要注意的是,对列值运行 UPPER 这样的函数会阻止 Postgres 使用该列上的任何索引(ILIKE 也是如此)。幸运的是,Postgres 有解决办法:除了简单地在列上创建索引外,你还可以在表达式上创建索引。如果你在 UPPER(name) 上创建了索引,这个查询就可以很好地利用它。


六十五、查找包含括号的电话号码

问题

你注意到俱乐部的会员表中的电话号码格式非常不统一。你想找出所有包含括号的电话号码,返回会员 ID 和电话号码,并按会员 ID 排序。

预期结果

memidtelephone
0(000) 000-0000
3(844) 693-0723
4(833) 942-4710
5(844) 078-4130
6(822) 354-9973
7(833) 776-4001
8(811) 433-2547
9(833) 160-3900
10(855) 542-5251
11(844) 536-8036
13(855) 016-0163
14(822) 163-3254
15(833) 499-3527
20(811) 972-1377
21(822) 661-2898
22(822) 499-2232
24(822) 413-1470
27(822) 989-8876
28(855) 755-9876
29(855) 894-3758
30(855) 941-9786
33(822) 665-5327
35(899) 720-6978
36(811) 732-4816
37(822) 577-3541

[答案与讨论]

select memid, telephone from cd.members where telephone ~ '[()]';

我们选择使用正则表达式来解答这个问题,虽然 Postgres 也提供了其他字符串函数(如 POSITION),它们同样能胜任这项工作。Postgres 通过 ~ 运算符实现 POSIX 正则表达式匹配。如果你之前用过正则表达式,对这个运算符的功能会很熟悉。

作为替代方案,你可以使用 SQL 标准的 SIMILAR TO 运算符。它的正则表达式与 POSIX 标准有相似之处,但也存在很多差异。一些最显著的差异包括:

  • 与 LIKE 运算符一样,SIMILAR TO 使用 ‘_’ 字符表示"任意字符",使用 ‘%’ 字符表示"任意字符串"。
  • SIMILAR TO 表达式必须匹配整个字符串,而不像 POSIX 正则表达式那样只匹配子串。这意味着你通常需要在表达式两端加上 ‘%’ 字符。
  • 在 SIMILAR TO 正则表达式中,‘.’ 字符并不表示"任意字符",它只是一个普通字符。

下面给出的是使用 SIMILAR TO 的等效写法:

select memid, telephone from cd.members where telephone similar to '%[()]%';

最后需要注意的是,正则表达式通常不会使用索引。一般来说,你不希望让正则表达式承担查询中的繁重工作,因为它会比较慢。如果你需要快速的模糊匹配,可以考虑评估一下全文搜索是否能满足你的需求。


六十六、用前导零填充邮政编码

问题

我们的示例数据集中的邮政编码由于存储为数值类型,前导零被移除了。从会员表中检索所有邮政编码,将任何少于 5 个字符的邮政编码用前导零填充到 5 位。按新的邮政编码排序。

预期结果

zip
00000
00234
00234
04321
04321
10383
11986
23423
28563
33862
34232
43532
43533
45678
52365
54333
56754
57392
58393
64577
65332
65464
66796
68666
69302
75655
78533
80743
84923
87630
97676

[答案与讨论]

select lpad(cast(zipcode as char(5)),5,'0') zip from cd.members order by zip

Postgres 的 LPAD 函数是本次的主角。它的功能正如你所料:让我们生成一个填充后的字符串。我们需要记得将邮政编码转换为字符串类型,以便 LPAD 函数能够接受它。

在接手旧数据库时,发现数据类型方面做出了一些奇怪的决定并不罕见。你可能想修复这类错误,但如果更改数据类型会导致大量代码出错。在这种情况下,一种可行的方案(取决于性能要求)是在表上创建一个视图,以修正后的方式呈现数据,然后逐步迁移。


六十七、统计姓氏以字母表中每个字母开头的会员数量

问题

你想统计姓氏以字母表中每个字母开头的会员数量。按字母排序,如果某个字母对应的数量为 0,无需显示该字母。

预期结果

lettercount
B5
C2
D1
F2
G2
H1
J3
M1
O1
P2
R2
S6
T2
W1

[答案与讨论]

select substr (mems.surname,1,1) as letter, count(*) as count 
    from cd.members mems
    group by letter
    order by letter

这个练习相当直接。你只需要提取会员姓氏的第一个字母,然后进行基本的聚合统计即可。这里我们使用了 SUBSTR 函数,但其实还有很多其他方法可以实现同样的效果。例如,LEFT 函数可以返回字符串左侧的前 n 个字符。另外,你也可以使用 SUBSTRING 函数,它允许你使用正则表达式来提取字符串的一部分。

值得注意的是:正如你所见,SQL 中的字符串函数是基于 1 的索引,而不是你可能习惯的基于 0 的索引。在适应之前,这可能会让你犯一两次错误 😃


六十八、清理电话号码

问题

数据库中的电话号码格式非常不统一。你想打印一份会员 ID 和电话号码的列表,其中已移除 ‘-’、‘(’、‘)’ 和 ’ ’ 字符。按会员 ID 排序。

预期结果

memidtelephone
00000000000
15555555555
25555555555
38446930723
48339424710
58440784130
68223549973
78337764001
88114332547
98331603900
108555425251
118445368036
128440765141
138550160163
148221633254
158334993527
168339410824
178114096734
208119721377
218226612898
228224992232
248224131470
268445368036
278229898876
288557559876
298558943758
308559419786
338226655327
358997206978
368117324816
378225773541

[答案与讨论]

select memid, translate(telephone, '-() ', '') as telephone
    from cd.members
    order by memid;

最直接的解决方案可能是使用 TRANSLATE 函数,它可以用来替换字符串中的字符。你需要传递三个参数:要修改的值、要替换的字符,以及用于替换的字符。在我们的例子中,我们希望删除所有指定的字符,因此第三个参数是空字符串。

与处理字符串时常见的做法一样,我们也可以使用正则表达式来解决这个问题。REGEXP_REPLACE 函数提供了我们所需的功能:我们只需传入一个匹配所有非数字字符的正则表达式,并将它们替换为空,如下所示。‘g’ 标志告诉函数尽可能多地替换所有匹配的模式。这种解决方案可能更加健壮,因为它能清除更多不良格式。

select memid, regexp_replace(telephone, '[^0-9]', '', 'g') as telephone
    from cd.members
    order by memid;

自动化使用自由格式的文本数据可能会很麻烦。理想情况下,你希望避免不断编写代码来清理数据,因此应该考虑让数据库为你强制执行正确的格式。你可以在列上使用 CHECK 约束来实现这一点,它可以拒绝任何格式不佳的条目。在应用层执行此类验证很有诱惑力,这当然也是一种有效的方法。一般来说,如果你的数据库被多个应用程序使用,建议将更多的检查下推到数据库中,以确保各应用之间的行为一致。

偶尔,添加约束并不可行。例如,你可能有两个不同的遗留应用程序,它们以不同的格式提交信息。如果你无法修改这些应用程序,有几个方案可以考虑。首先,你可以在表上定义一个触发器。这允许你在数据插入表之前(或之后)拦截它,并将其规范化为单一格式。另外,你也可以在表上构建一个视图,在读取数据时即时清理信息。较新的应用程序可以从视图中读取,从而受益于更可靠格式的信息。

MySQL(七)MySQL和Oracle、PostgreSQL的区别 MySQL、Oracle、PostgreSQL 阅读详情

相关推荐

PostgreSql零基础入门

PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。PostgreSQL 开发者把它念作 post-gress-Q-L。PostgreSQL 的 Slogan 是 “世界上最先进的开源关系型数据库”。PostgreSQL官网PostgreSQL中文社区全球数据库排行国产数据库排行‘’PostgreSQL学习目录Postgres遵守BSD许可证发行,使开发者们得以获取源代码并进一步开发系统。

m0_57697768的博客 1403

PostgreSQL教程(十四):SQL语言(七)之索引

在没有事前准备的情况下,系统不得不扫描整个test1表,一行一行地去找到所有匹配的项。如果test1中有很多行但是只有一小部分行(可能是0或者1)需要被该查询返回,这显然是一种低效的方式。但是如果系统被指示维护一个在id列上的索引,它就能使用一种更有效的方式来定位匹配行。例如,它可能仅仅需要遍历一棵搜索树的几层而已。类似的方法也被用于大部分非小说书籍中:经常被读者查找的术语和概念被收集在一个字母序索引中放在书籍的末尾。感兴趣的读者可以相对快地扫描索引并跳到合适的页而不需要阅读整本书来寻找感兴趣的材料。

mr~li的博客 1467

PSO算法介绍

结合网上的文章对PSO进行一些介绍,并附上自己复现的算法。

Witty_Hou的博客 1万+

PostgreSQL教程(七):SQL语法(三)之调用函数

许带有命名参数的函数被使用位置或命名记号法调用。命名记号法对于有大量参数的函数特别有用,因为它让参数和实际参数之间的关联更明显和可靠。在位置记号法中,书写一个函数调用时,其参数值要按照它们在函数声明中被定义的顺序书写。在命名记号法中,参数根据名称匹配函数参数,并且可以以任何顺序书写。对于每一种记法,还要考虑函数参数类型的效果。在任意一种记号法中,在函数声明中给出了默认值的参数根本不需要在调用中写出。但是这在命名记号法中特别有用,因为任何参数的组合都可以被忽略。而在位置记号法中参数只能从右往左忽略。

mr~li的博客 741

非线性动力学_用MatCont分析非线性动力学方程组(一)

写在前面:笔者打算写两到三篇系列文章介绍MatCont,此为第一篇《用MatCont分析非线性动力学方程组(一)》。MatCont是一个基于Matlab而开发的免费工具包,专门用来做非线性动力学模型分叉、向量场、周期性等分析,符号(连续性)运算和数值(离散性)运算均适用。该工具的开发及研究项目由比利时Ghent大学的Willy Govaerts教授、荷兰Utrecht大学的Yuri Kuznets...

weixin_39700215的博客 2767

10分钟快速搭建OpenClaw(基于Windows+飞书)

OpenClaw 是一款功能强大的 AI 智能体工具,能够帮助用户管理邮件、日历等日常事务。本文详细介绍了在 Windows11 系统上安装和配置 OpenClaw 的完整步骤,包括 Node.js 环境搭建、Git 安装、OpenClaw 部署以及飞书机器人创建与对接。通过简单的命令行操作和可视化界面配置,用户可以快速完成 AI 助手部署,实现智能办公自动化。文中还提供了飞书机器人权限设置等关键环节的图文指引,帮助用户轻松完成系统集成。

Hello, New World! 2925

postgresql入门(postgresql教程)

检查服务登录身份是否为“本地系统账户”(Windows)或依赖项是否安装(Linux/macOS)。PostgreSQL 是开源关系型数据库,采用 BSD 协议,支持商业化使用。,重启服务后登录并重置密码。

Dontla的博客 2647

深入解析MTK DRM初始化流程:从KMS模块到组件框架

本文深入解析了联发科(MTK)平台上DRM显示框架的初始化流程。从内核模块加载、Component框架管理依赖,到核心的mtk_drm_bind函数构建KMS对象(CRTC、Plane、Encoder、Connector),最终完成DRM设备注册并创建用户空间接口。文章结合调试经验,为开发者梳理了从驱动启动到屏幕点亮的完整路径与关键排查点。

onion的博客 765

PostgreSQL教程

PostgreSQL,通常简称为“Postgres”,是一个功能强大的开源对象-关系数据库系统。它支持大部分SQL标准,并提供了大量的扩展功能,如复杂查询、外键、触发器、事务完整性、多版本并发控制等。由于其稳定性和强大的扩展性,PostgreSQL被广泛应用于各种规模的系统中,包括数据仓库、电子商务网站和复杂的应用程序。PostgreSQL的强大之处在于其丰富的扩展功能。你可以使用PostgreSQL的扩展机制来添加新的数据类型、函数、操作符等。此外,你还可以编写自定义的函数和触发器来扩展数据库的功能。

Python老吕的博客 3894

Qt应用软件【协议篇】自定义协议处理串口半包贴包

Qt串口数据,半包,贴包,丢包数据处理

小鱼酱的博客 1211

ximalaya 新xm-sign逆向思路

本文主要介绍目标网站新xm-sign值的逆向思路。仅代表个人理解,如有其他建议可在评论区沟通。声明仅仅记录一下自己的学习方法,不作为其他参考、更不作为商业用途。如有侵犯请联系本人删除。

weixin_66580433的博客 2017

Learn PostgreSQL 项目教程

Learn PostgreSQL 项目教程 1. 项目介绍 Learn PostgreSQL 是由 Packt Publishing 出版的一本关于 PostgreSQL 数据库的书籍,旨在帮助读者从零开始学习 PostgreSQL,并掌握如何构建和管理高性能的数据库解决方案。该项目在 GitHub 上开源,提供了书籍中的代码示例和相关资源。 PostgreSQL 是一个快速增长的开源对象关系数据...

gitblog_00114的博客 787

【Unity实战篇 】| 游戏中实现镂空遮罩效果【矩形、圆形镂空遮罩】

本文来写一下怎样在Unity中完成一个 镂空遮罩 的效果。 镂空遮罩 比较常用的有两种:矩形镂空遮罩、圆形镂空遮罩。 镂空遮罩 在游戏中常被当做新手引导必备的内容,可以给玩家更多不一样的体验。 下面就一起来看一下怎样做出这种效果吧!

努力前行,总会成为自己心中的那道光 1万+

Postgresql基础实践教程(四)

本文介绍了SQL聚合函数的基础用法,包括COUNT、SUM等函数的使用场景和注意事项。主要内容涵盖: 基本统计:使用COUNT(*)统计设施总数 条件统计:结合WHERE子句筛选高价设施进行计数 分组统计:通过GROUP BY按会员ID统计推荐人数 时段统计:计算每个设施的总预订时段数 时间范围统计:按月统计设施预订时段数 去重统计:使用DISTINCT统计有预订的会员数 筛选统计结果:用HAVING筛选时段超过1000的设施 文章通过7个典型示例。

专注GIS软件开发。 722

基于四旋翼模型的火箭型无人机视线角保持控制仿真设计

本文针对火箭型无人机的视线角保持控制问题展开研究。基于四旋翼动力学模型,通过改造设计了一种摄像头朝上安装的特殊无人机系统,用于追踪空中目标。文章详细推导了坐标系定义、运动学和动力学方程,重点分析了摄像头安装与视线几何关系,建立了目标运动模型和视线向量计算方法。通过解算期望姿态角,实现了使机体Z轴始终对准目标的控制目标。仿真结果表明,该系统能有效完成视线角保持任务,为空对空监视等应用场景提供了可行方案。~~~~~

huanghm88的专栏 140

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

零基础小白如何自学PostgreSQL

自学 PostgreSQL 从基础的 SQL 语法开始,逐渐深入到高级功能和性能优化,最重要的是多实践。通过学习数据库设计、优化以及应用开发,你会逐步掌握 PostgreSQL,为后续的开发打下坚实的基础。自学 PostgreSQL 需要循序渐进,从基础的 SQL 操作入手,逐步深入到数据库设计、优化、云部署等高级内容。实践是最好的学习方式,随着你不断练习和探索,你会越来越熟悉 PostgreSQL,并能够在实际项目中灵活运用它。

小宝哥Code的专栏 1675

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

GORM PostgreSQL 驱动使用教程

GORM PostgreSQL 驱动使用教程 1. 项目介绍 GORM PostgreSQL 驱动是 GORM(Go 语言的 ORM 库)的一个官方 PostgreSQL 数据库驱动。GORM 是一个功能强大且灵活的 ORM 库,支持多种数据库,而 PostgreSQL 驱动则是专门为 PostgreSQL 数据库设计的。该驱动提供了对 PostgreSQL 数据库的高效访问和操作,支持事务、连接...

gitblog_01103的博客 1761

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

PostgreSQL 权限管理PRIVILEGES:从基础到企业级实践

PostgreSQL权限管理从基础到企业级实践摘要:本文全面讲解PostgreSQL基于角色的权限管理体系,涵盖系统权限和对象权限矩阵。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 7819

postgreSQL 操作 教程

— 得到所有用户自定义表的名字(这里"tablename"字段是表的名字,"schemaname"是schema的名字。在PostgreSQL中,一个表可以从0个或多个表继承,一次查询可以查询到某个表中的所有行,或者这个表和这个表所有子表的所有行,默认为后者。postgres=# \encoding // 显示客户端的字元集。// 显示客户端的字元集。// 显示服务器的字元集。// 精细显示SQL命令中的select命令的使用方法。

dujidan的博客 1万+

Practical SQL完全指南:从零基础到PostgreSQL数据分析师的终极教程

**Practical SQL** 是一本由Anthony DeBarros撰写的经典教程,专为零基础学习者设计,通过PostgreSQL数据库系统掌握实用SQL技能。无论你是数据爱好者、职场新人还是希望转型的专业人士,这本书都能帮助你从零开始,逐步成长为能够处理真实世界数据的PostgreSQL数据分析师。 ## 📚 为什么选择PostgreSQL? PostgreSQL作为一款免费开源的

gitblog_00677的博客 597

PostgreSQL 基本使用教程

PostgreSQL 基本使用教程原文地址:PostgreSQL 基本使用教程

wwwcomcn123的专栏 2717

PostgreSQL扩展开发:从零实现uuid47类型的完整教程

PostgreSQL作为功能强大的开源数据库,支持通过扩展机制增强其原生功能。本教程将带你从零开始开发一个实用的PostgreSQL扩展——uuid47,它结合了UUID v4的隐私保护特性和v7的性能优势,为数据库提供更高效的唯一标识符解决方案。 ## 一、PostgreSQL扩展开发基础 PostgreSQL扩展(Extension)是一种打包的功能模块,包含SQL脚本、C代码或其他语言实

gitblog_00439的博客 700

PostgreSQL在Linux和Windows安装和入门基础教程

StackOverflow 2022 开发者报告:总体而言,MySQL 依然是最受欢迎的的数据库。但在专业开发者群体中,PostgreSQL(46.48%)已经超越 MySQL(45.68%)夺得了第一名。看来必须得学一波了啊。 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中。PostgreSQL支

write less , do more 6483

PostgreSQL编译安装教程

注意,如果pgdata目录没有指定,则会默认使用环境变量中的PGDATA指定的目录作为数据库存放的目录,由于之前我们刚刚设置了"PGDATA=/usr/local/pgsql/data"环境变量,所以此处我们也就无需再额外指定,直接执行初始化命令即可。目录里"linux"文件就是我们要找的文件。完成以后,在"--prefix=/usr/local/pgsql"参数对应的"/usr/local/pgsql"的目录就是我们所有PostgreSQL存放的文件,这里的这个data和log文件现在是没有的。

Eucalyptus's blog 2166

CartoDB PostgreSQL 扩展使用教程

CartoDB PostgreSQL 扩展使用教程 1. 项目介绍 CartoDB PostgreSQL 扩展是一个开源项目,旨在为 PostgreSQL 数据库添加 CartoDB 特定的功能和工具。该扩展是 CartoDB 平台的核心组件之一,主要用于处理地理空间数据和元数据。通过该扩展,用户可以将普通的 PostgreSQL 表转换为 CartoDB 可识别的表,并利用 CartoDB 的构...

gitblog_00046的博客 1322
上一篇: Postgresql基础实践教程(六)
下一篇: Postgresql基础实践教程(八)
丷丩
丷丩 优质创作者: 数据科学与机器学习技术领域 优质创作者: 数据科学与机器学习技术领域
博客等级 码龄18年 1万+粉丝 317原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丷丩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值