当前位置: 首页 > news >正文

【postgresql 基础入门】带过滤条件的查询,where子句中的操作符介绍,案例展示,索引失效的大坑就在这里

查询数据-过滤数据

专栏内容

  • postgresql内核源码分析
  • 手写数据库toadb
  • 并发编程

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

系列文章

  • 入门准备
  • postgrersql基础架构
  • 快速使用
  • 初始化集群
  • 数据库服务管理
  • psql客户端使用
  • pgAdmin图形化客户端
  • 数据库的使用
  • 创建数据库
  • 数据库操作
  • 表的使用
  • 表的创建
  • 表的操作
  • 数据查询
  • 数据查询
  • 多表联合查询
  • 数据操作
  • 插入数据的方式

文章目录

  • 查询数据-过滤数据
  • 系列文章
  • 前言
  • 概述
  • where 子句介绍
  • 操作符
  • 案例实践
    • 字符串匹配
    • 范围比较
  • 总结
  • 结尾

前言


postgresql 数据库是一款通用的关系型数据,在开源数据库中能与商业数据媲美,在业界也越来越流行。

因为是开源数据库,不仅公开源码,还有很多使用案例,好用的插件,所以它的慢慢变成了数据库的先驱和标准,通过postgresql可以很好从使用到原理,彻底搞懂;

如果是学习编程,也可以学到丰富的编程知识,数据结构,编程技巧,它里面还有很多精妙的架构设计,分层思想,可以灵活定制的思想。

本专栏主要介绍postgresql 入门使用,数据库维护管理,通过这些使用来了解数据库原理,慢慢了解postgresql是什么样的数据库,能做那些事情,以及如何做好服务,最关键的是这些知识都是面试的必备项。

概述


在使用SQL查询数据时,一般不会查询全部数据,而是使用条件或者很多条件的组合来缩小结果集的范围,甚至精准查询到想要的数据。本文将介绍postgresql数据库中如何筛选过滤数据,如何设置条件,以及有那些操作符可以使用。

where 子句介绍


一般的查询SQL结构如下

SELECT ... FROM ... WHERE ... ORDER BY... ; 

一般把每个关键字,如SELECT,叫做一个子句,如select子句,from 子句,where子句,orderby子句等等,如果要对数据行进行过滤和筛选,就要用到where子句。

在postgresql 中,子句的执行顺序是
from子句->where子句->select子句-> orderby子句

按照实际执行动作,就是先扫描表,然后按条件进行过滤,再进行投影运算,最后对结果集进行排序。

这就会存在select子句中的列的别名,在where子句中是不能使用的,相反from子句和where子句中表的别名,在select子句中是可以使用的。

where子句,它的内容是一个个条件表达式,最终计算结果是一个布尔值,也就是’true’,'false’或者不确定;

也就是说当条件值为’true’时,数据表中的行才会被选入结果集当中,当不会真时就会被过滤掉。

操作符


在条件表达式中,要使用一些操作符,比如比较运算符,逻辑运算符等,才能组成表达式,我们常用的操作符有以下:

  • 比较运算符
运算符描述
=相等
<>或者!=不相等
>大于
>=大于等于
<小于
<=小于等于

比较运算符有些类似于其它编程语言中的比较运算符,用于两个列、列与常量或者常量与常量的比较。

  • 逻辑运算符
运算符描述
AND逻辑与
OR逻辑或
NOT逻辑非,取反
  • 集合操作
运算符描述
BETWEEN ... AND ...在 AND前后指定的范围内则返回true
IN在指定的集合中时返回true
  • 其它运算符
运算符描述
LIKE模式配匹,通配符有%,_
IS NULL值为空时返回true

案例实践


下面我们一起来实践一下吧,先准备数据。

-- create table 
create table student(sid int primary key,sname varchar,sage int,ssex char,ctime timestamp);-- insert data
insert into student values(1,'lilei',18,'m','2023/9/20'),(2,'liming',19,'m','2022/8/20'),(3,'zhanghua',20,'f','2021/8/29'),(4,'guodong',21,'f','2020/10/1');

再创建索引,用于后面案例分析

create index idx_sname ON student (sname);
create index idx_ssex on student (ssex );

查询一下所有数据

postgres=# select * from student;sid |  sname   | sage | ssex |        ctime
-----+----------+------+------+---------------------1 | lilei    |   18 | m    | 2023-09-20 00:00:002 | liming   |   19 | m    | 2022-08-20 00:00:003 | zhanghua |   20 | f    | 2021-08-29 00:00:004 | guodong  |   21 | f    | 2020-10-01 00:00:00
(4 rows)

字符串匹配


先来看一下字符串的条件,因为它常常会用到,但是也常常会出现问题。

在我们对字符串进行模糊查找时,会用到like 和通配符的方式,通配符在postgresql中有两个:

  • 百分号 %, 匹配任意字符和长度
  • 下划线 _, 匹配任意的一个字符

如果字符串中包括以上通配符,需要使用转义字符’'进行转义;

查找li开头的字符串,如下:

postgres=# select * from student where sname like 'li%';sid | sname  | sage | ssex |        ctime
-----+--------+------+------+---------------------1 | lilei  |   18 | m    | 2023-09-20 00:00:002 | liming |   19 | m    | 2022-08-20 00:00:00
(2 rows)

查找li开头的字符串,并且字符长度确定时,如下:

postgres=# select * from student where sname like 'li_';sid | sname | sage | ssex | ctime
-----+-------+------+------+-------
(0 rows)postgres=# select * from student where sname like 'li___';sid | sname | sage | ssex |        ctime
-----+-------+------+------+---------------------1 | lilei |   18 | m    | 2023-09-20 00:00:00
(1 row)

注意:虽然模糊匹配非常好用,但是我们还是要尽量减少使用,因为它会让该列上的索引失效,如下所示:

postgres=# explain select * from student where sname like 'li___';QUERY PLAN
----------------------------------------------------------Seq Scan on student  (cost=0.00..121.05 rows=1 width=56)Filter: ((sname)::text ~~ 'li___'::text)
(2 rows)postgres=# explain select * from student where sname like 'lilei';QUERY PLAN
--------------------------------------------------------------------------Index Scan using idx_sname on student  (cost=0.13..8.15 rows=1 width=56)Index Cond: ((sname)::text = 'lilei'::text)Filter: ((sname)::text ~~ 'lilei'::text)
(3 rows)

当我们使用了通配符之后,查询计划变成了Seq scan,也就是顺序扫描,而不使用通配符时采用的是index scan也就是索引扫描。

在一些字符串作为键值的业务逻辑当中,如果发现业务性能下降时,可以按此方法进行排查,是否存在索引失效的问题。

范围比较


查找sage在17到20之间的数据,这个范围可以有两种写法:
一种使用比较运算符和逻辑运算符;

postgres=# select * from student where sage >= 17 and sage <=20;sid |  sname   | sage | ssex |        ctime
-----+----------+------+------+---------------------1 | lilei    |   18 | m    | 2023-09-20 00:00:002 | liming   |   19 | m    | 2022-08-20 00:00:003 | zhanghua |   20 | f    | 2021-08-29 00:00:00
(3 rows)

另一种使用between and运算符;

postgres=# select * from student where sage between 17 and 20;sid |  sname   | sage | ssex |        ctime
-----+----------+------+------+---------------------1 | lilei    |   18 | m    | 2023-09-20 00:00:002 | liming   |   19 | m    | 2022-08-20 00:00:003 | zhanghua |   20 | f    | 2021-08-29 00:00:00
(3 rows)

可以将多个条件使用 逻辑运算符连接起来,形成多条件过滤。

总结


通过where子句中的条件可以达到过滤查询的效果,其中使用不同的运算符组合可以形成多个条件表达式,同时在使用过程中避免索引失效的情况,尤其在大数据量下时,索引失效可能是灾难级的。

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

相关文章:

【postgresql 基础入门】带过滤条件的查询,where子句中的操作符介绍,案例展示,索引失效的大坑就在这里

查询数据-过滤数据 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#…...

vue项目打包获取git commit信息并输出到打包后的指定文件夹中

需求背景&#xff1a; 前端项目经常打包&#xff0c;发包部署&#xff0c;为了方便测试及运维发现问题时与正确commit信息对比 实现方式&#xff1a; 使用Node.js的child_process模块来执行git命令 实现步骤&#xff1a; 1.在package.json的同级目录下新建一个version.js文件。…...

vue 移动端app预览和保存pdf踩坑

需求 使用Vue开发h5&#xff0c;嵌套到Android和IOS的Webview里&#xff0c;需要实现pdf预览和保存功能&#xff0c;预览pdf的功能&#xff0c;我这边使用了三个库&#xff0c;pdf5&#xff0c;pdf.js&#xff0c;vue.pdf&#xff0c;现在把这三个库在app端的坑分享一下。先说…...

Vueuse:打造高效的 Vue.js 开发利器

Vueuse&#xff1a;打造高效的 Vue.js 开发利器 Vueuse 是一个功能强大的 Vue.js 生态系统工具库&#xff0c;它提供了一系列的可重用的 Vue 组件和函数&#xff0c;帮助开发者更轻松地构建复杂的应用程序。本文将介绍 Vueuse 的主要特点和用法&#xff0c;以及它在 Vue.js 开发…...

mysql锁的创建方式

在 MySQL 中,锁是用来控制多个用户对同一数据的访问。主要有两种类型的锁:表级锁和行级锁。MySQL 的锁定机制主要是通过 SQL 语句来实现的,而不是通过特定的锁定命令。下面是一些常见的锁相关的 SQL 操作方式:表级锁 MySQL 中,表级锁是最基本的锁策略,它会锁定整个表。一…...

5.WEB渗透测试-前置基础知识-常用的dos命令

内容参考于&#xff1a; 易锦网校会员专享课 上一篇内容&#xff1a;4.WEB渗透测试-前置基础知识-快速搭建渗透环境&#xff08;下&#xff09;-CSDN博客 常用的100个CMD指令 1.gpedit.msc—–组策略 2. sndrec32——-录音机 3. Nslookup——-IP地址侦测器 &#xff0c;是一个…...

解决:code ERESOLVE:ERESOLVE could not resolve 的报错问题

报错实例 报错原因 是我执行npm i xxx-xx的时候会出现这个错误 查了资料表示是node.js的问题 或者的依赖本身的问题 解决 1.在后面加上 --legacy-peer-deps 示例&#xff1a;npm i sass-loader7.3.1 --legacy-peer-deps 2&#xff0c;检查node版本&#xff0c;更改node版本 …...

Dockerfile(3) - WORKDIR 指令详解

WORKDIR 切换到镜像中的指定路径&#xff0c;设置工作目录在 WORKDIR 中需要使用绝对路径&#xff0c;如果镜像中对应的路径不存在&#xff0c;会自动创建此目录一般用 WORKDIR 来替代 切换目录进行操作的指令 RUN cd <path> && <do something> WORKDIR…...

2024万元投影仪怎么选?极米RS10 Ultra和当贝X5 Ultra实测横评

随着过去一年投影仪的不断进步&#xff0c;高端型号在2024年初的选择变得更加多样。除了激光外混光已然成为“金字塔顶端”的一种全新光源选择。目前主流的就是作为Dual Light 2.0新升级的极米RS10 Ultra&#xff0c;以及ALPD5.0超级全色激光代表当贝X5 Ultra。很多人也肯定想知…...

java环境搭建

要搭建 Java 环境&#xff0c;你需要进行以下步骤&#xff1a; 1. 下载和安装 JDK&#xff08;Java Development Kit&#xff09;&#xff1a;访问 Oracle 官方网站&#xff08;https://www.oracle.com/java/technologies/javase-jdk14-downloads.html&#xff09;&#xff0c;…...

【GB28181】wvp-GB28181-pro快速修改登录页面名称(前端)

引言 作为一个非前端开发人员,自己摸索起来比较费劲,也浪费了很多时间 本文快速帮助开发者修改为自己名称的一个国标平台 文章目录 一、 预期效果展示二、 源码修改-前端三、 验证修改效果一、 预期效果展示 二、 源码修改-前端 需要修改的文件位置: 项目工程下web_src目录…...

【lv15 day1 设备号申请和注销】

一、Linux内核对设备的分类 linux的文件种类&#xff1a; -&#xff1a;普通文件 d&#xff1a;目录文件 p&#xff1a;管道文件 s&#xff1a;本地socket文件 l&#xff1a;链接文件 c&#xff1a;字符设备 b&#xff1a;块设备Linux内核按驱动程序实现模型框架的不同&#…...

JVM对象创建与内存分配机制

JVM对象创建与内存分配机制 JVM对象创建与内存分配机制 JVM对象创建与内存分配机制对象的创建过程内存分配对象栈上分配对象逃逸分析标量替换 对象在Eden区分配大对象直接进入老年代长期存活的对象将进入老年代对象年龄动态判断老年代空间分配担保机制 对象头与指针压缩对象头利…...

《TCP/IP详解 卷一》第10章 UDP和IP分片

目录 10.1 引言 10.2 UDP 头部 10.3 UDP校验和 10.4 例子 10.5 UDP 和 IPv6 10.6 UDP-Lite 10.7 IP分片 10.7.1 例子&#xff1a;IPV4 UDP分片 10.7.2 重组超时 10.8 采用UDP的路径MTU发现 10.9 IP分片和ARP/ND之间的交互 10.10 最大UDP数据报长度 10.11 UDP服务器…...

Android进阶之路 - RecyclerView停止滑动后Item自动居中(SnapHelper辅助类)

之前一直没注意 SnapHelper 辅助类的功能&#xff0c;去年的时候看到项目中仅通过俩行代码设置 RecyclerView 后就提升了用户体验&#xff0c;觉得还是很有必要了解一下&#xff0c;尝试过后才发现其 PagerSnapHelper、LinearSnapHelper 子类可以作用于不同场景&#xff0c;且听…...

高性能图表组件LightningChart .NET v11.0发布——增强DPI感知能力

LightningChart完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科学&am…...

神经网络系列---计算图基本原理

文章目录 计算图符号微分符号微分的步骤示例符号微分在计算图中的使用总结 数值微分前向差分法中心差分法数值微分的使用注意事项总结 自动微分1. 基本原理2. 主要类型3. 计算图4. 应用5. 工具和库6. 优点和缺点 计算图1. **计算图的建立**2. **前向传播**3. **反向传播**4. **…...

3D数字孪生

数字孪生&#xff08;Digital Twin&#xff09;是物理对象、流程或系统的虚拟复制品&#xff0c;用于监控、分析和优化现实世界的对应物。 这些数字孪生在制造、工程和城市规划等领域变得越来越重要&#xff0c;因为它们使我们能够在现实世界中实施改变之前模拟和测试不同的场景…...

C++惯用法之空基类优化

相关系列文章 C惯用法之Pimpl C惯用法之CRTP(奇异递归模板模式) C之std::tuple(二) : 揭秘底层实现原理 目录 1.空类 2.空基类优化 3.内存布局原则 4.实例分析 5.总结 1.空类 C 中每个对象的实例都可以通过取地址运算符获取其在内存布局中的开始位置&#xff0c;因此每个类…...

【生成式AI】ChatGPT 原理解析(2/3)- 预训练 Pre-train

Hung-yi Lee 课件整理 预训练得到的模型我们叫自监督学习模型&#xff08;Self-supervised Learning&#xff09;&#xff0c;也叫基石模型&#xff08;foundation modle&#xff09;。 文章目录 机器是怎么学习的ChatGPT里面的监督学习GPT-2GPT-3和GPT-3.5GPTChatGPT支持多语言…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...