【postgresql 基础入门】数据表的查询基本知识,条件过滤、单列多列排序、按页浏览数据、数据去重,得到你想要的数据

news/2024/7/9 23:12:04 标签: postgresql, 数据库, 大数据, sql

查询数据

专栏内容

开源贡献

  • toadb开源库

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

系列文章

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

文章目录

  • 查询数据
  • 系列文章
  • 前言
  • 概要介绍
  • SELECT 语句基本语法
    • 语法
    • 准备数据
  • 基本用法
  • WHERE子句过滤数据
  • ORDER BY子句排序
  • LIMIT和OFFSET按页返回
  • DISTINCT 去重数据
    • 结果集只有一列时
    • 结果集有多列时
  • 结尾

前言

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

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

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

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

概要介绍

PostgreSQL是一种强大的开源关系数据库管理系统。在这个系统中,你可以使用SQL(Structured Query Language)来查询和操作数据。

本文将从以下几个方面来分享,如何使用SQL来查询数据,通过过滤,排序得到想要的数据,并且可以按需要的行数进行分批返回;

  • SELECT 语句的基本语法
  • WHERE 子句用于过滤数据
  • ORDER BY 子句用于排序数据
  • LIMIT 和 OFFSET 子句用于限制返回的数据量
  • DISTINCT 去重数据

SELECT 语句基本语法

数据库中最复杂的SQL语句就是SELECT,语法解析的大部分代码都是处理它的各种子句及组合;
这里介绍它的最基本常用的语法格式;

语法

sql">SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
    [ * | expression [ [ AS ] output_name ] [, ...] ]
    [ FROM from_item [, ...] ]
    [ WHERE condition ]
    [ ORDER BY expression [ ASC | DESC ] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start [ ROW | ROWS ] ]

准备数据

你可以使用以下的SQL语句在PostgreSQL中插入10000条随机数据:

sql">CREATE TABLE tbl_company (  
    ID INT PRIMARY KEY NOT NULL,  
    NAME TEXT NOT NULL,  
    ADDRESS CHAR(50),  
    SALARY REAL,
    founded DATE
);
sql">db_factory2=> INSERT INTO tbl_company (id, name, address, salary, founded)
SELECT
    generate_series(1, 10000) AS id,
    'Name ' || generate_series(1, 10000) AS name,
    'Address ' || generate_series(1, 10000) AS address,
    (random() * 100000)::REAL AS salary,
    CURRENT_DATE - (random() * 10 * INTERVAL '1 year') AS founded
ORDER BY id;
INSERT 0 10000

在这个语句中,我们使用了generate_series函数生成了一个从1到10000的序列,用于生成唯一的id。

然后,我们使用字符串连接操作符(||)和generate_series函数生成随机的姓名和地址。

接下来,我们使用random()函数生成一个范围在0到1之间的随机数,乘以100000后将其转换为REAL类型作为薪资。

最后,我们使用CURRENT_DATE减去一个范围在0到10之间的随机年份,以生成成立日期。

这样我们就有了10000条原始数据,下面我们来进行SQL查询分析吧;

基本用法

指定要查询的列名,从那张表里获取数据,SQL如下:

sql">SELECT name, founded
FROM tbl_company;

也可以用*代替所有的列名

WHERE子句过滤数据

WHERE子句用于过滤SELECT语句返回的数据。基本语法如下:

sql">SELECT column1, column2, ...
FROM table_name
WHERE condition;

示例:假设我们只想获取创立时间在2019年前的企业名称和ID:

sql">SELECT id, name, founded FROM tbl_company WHERE founded < '2019-01-01';

当然可以带多个条件,条件之间可以用 AND 表示与的关系,OR 表示或的关系 进行串联;

ORDER BY子句排序

ORDER BY子句用于根据指定的列对SELECT语句返回的数据进行排序。基本语法如下:

sql">SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;

其中ASC表示按升序进行排列,也就是从小到大; DESC 表示按降序进行排列,也就是从大到小进行显示;

示例:假设按纳税额从降序排列:

sql">select id, name, salary, founded from tbl_company order by salary desc;

当然也可以带有多个列的排序,数据库处理时会按order by 子句中的顺序,优先第一个,如果有相同的再按第二列进行排序,依次进行;

LIMIT和OFFSET按页返回

当按条件查询的结果非常多时,我们希望分批查看,这里就可以用limit 和 offset子句,达到分页显示的效果;

LIMIT子句用于限制SELECT语句返回的数据行数。基本语法如下:

sql">SELECT column1, column2, ...
FROM table_name
LIMIT number_of_rows;

示例:我们获取纳税前五的企业信息

sql">select id, name, salary, founded from tbl_company order by salary desc limit 5;

OFFSET子句与LIMIT子句一起使用,可以跳过指定数量的行。基本语法如下:

sql">SELECT column1, column2, ...
FROM table_name
LIMIT number_of_rows OFFSET offset;

示例:我们获取纳税的第6到10名的企业信息

sql">select id, name, salary, founded from tbl_company order by salary desc limit 5 offset 5; 

OFFSET子句与LIMIT子句的联合使用,可以达到翻页的效果,如果每页限制为100条;

sql">-- page1
select id, name, salary, founded from tbl_company order by salary desc limit 100 offset 0; 

-- page2
select id, name, salary, founded from tbl_company order by salary desc limit 100 offset 100; 

-- page3
select id, name, salary, founded from tbl_company order by salary desc limit 100 offset 200; 

DISTINCT 去重数据

DISTINCT关键字用于从结果集中返回唯一的行。它可以用于单个列或多个列。

请注意,DISTINCT关键字适用于整个结果集,而不仅仅是选择的列; 这意味着在查询中使用DISTINCT时,所有选择的列的组合必须是唯一的。

为了演示,我们在tbl_company表中插入几行重复数据;

sql">db_factory2=> insert into tbl_company values(10001, 'Name 1','Address 10001',8888,'2023-9-19');
INSERT 0 1
db_factory2=> insert into tbl_company values(10002, 'Name 10002','Address 1',8888,'2023-9-19');
INSERT 0 1
db_factory2=> insert into tbl_company values(10003, 'Name 10003','Address 10003',8888,'2023-9-19');
INSERT 0 1

结果集只有一列时

sql">db_factory2=> select distinct name from tbl_company where id > 10000 or id < 10;
    name
------------
 Name 1
 Name 10002
 Name 10003
 Name 2
 Name 3
 Name 4
 Name 5
 Name 6
 Name 7
 Name 8
 Name 9
(11 rows)

可以看到结果中没有重复项,我们插入的id=10001与id=1的name列值是一样的,在结果集中进行了过滤;

结果集有多列时

sql">db_factory2=> select distinct name, salary from tbl_company where id > 10000;
    name    | salary
------------+--------
 Name 1     |   8888
 Name 10002 |   8888
 Name 10003 |   8888
(3 rows)

查询namesalary两列数据,发现salary列还是有重复数据,但是对于两列的组合结果集来说,是没有重复行的;

下面是对于两列都有重复行的情况进行演示;

sql">db_factory2=> select distinct  salary, founded from tbl_company where id > 10000;
 salary |  founded
--------+------------
   8888 | 2023-09-19
(1 row)

db_factory2=> select  salary, founded from tbl_company where id > 10000;
 salary |  founded
--------+------------
   8888 | 2023-09-19
   8888 | 2023-09-19
   8888 | 2023-09-19
(3 rows)

可以看到加DISTINCT与不加的效果,对于整行重复的都进行了过滤;

DISTINCT关键字 只能写在所有列的开始位置,因为它是针对所有列的结果集;

结尾

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

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

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


http://www.niftyadmin.cn/n/5044272.html

相关文章

【Java】泛型 之 使用泛型

使用ArrayList时&#xff0c;如果不定义泛型类型时&#xff0c;泛型类型实际上就是 Object&#xff1a; // 编译器警告: List list new ArrayList(); list.add("Hello"); list.add("World"); String first (String) list.get(0); String second (Strin…

Redis性能压测、监控工具及优化方案

Redis是一款高性能的开源缓存数据库&#xff0c;但是在实际应用中&#xff0c;我们需要对Redis进行性能压测、监控以及优化&#xff0c;以确保其稳定性和高可用性。本文将介绍Redis性能压测、监控工具及优化方案。 01 Redis性能压测 常用的Redis性能压测工具有&#xff1a; …

jenkins容器内配置python项目运行环境(Python3.7.3)

目录 1.查看启动的容器2.进入jenkins容器内部3.使用wget&#xff1a;提示没有wget命令4.查看jenkins容器系统版本5.换成国内源&#xff08;阿里&#xff09;5.更新apt-get6.安装wget7.创建python存放目录8.下载python9.解压10.安装依赖11.运行脚本configure12.make编译make ins…

NLP 的 Task 和 Metric (Perplexity,BLEU,METOR,ROUGH,CIDEr)

Task 1. 信息检索IR&#xff08;Information Retrieval&#xff09; 信息检索&#xff08;NLU&#xff09;是指通过在大规模的文本库或数据库中搜索相关信息&#xff0c;将与用户查询匹配的文档或记录返回给用户。信息检索主要涉及到索引构建、查询处理和结果排序等技术&#…

服从正态分布的正弦函数、余弦函数期望

服从正态分布的正弦函数期望 服从正态分布的正弦函数、余弦函数期望。 服从正态分布的正弦函数、余弦函数期望。 如果X服从均值为 μ \mu μ&#xff0c;方差为 σ 2 \sigma^2 σ2的正态分布&#xff0c;计算sin(X)与cos(X)的数学期望。 利用特征函数(Characteristic Functio…

Leetcode.2560 打家劫舍 IV

题目链接 Leetcode.2560 打家劫舍 IV rating : 2081 题目描述 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统&#xff0c;所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为他在…

OpenGLES:使用纹理绘制一张图片

一.概述 最近疏于写博客&#xff0c;接下来会陆续更新这段时间OpenGLES的一些开发过程。 前两篇OpenGLES的博客讲解了怎样使用OpenGLES实现相机普通预览和多宫格滤镜 在相机实现过程中&#xff0c;虽然使用到了纹理&#xff0c;但只是在生成一个纹理之后&#xff0c;使用纹理…

Java多线程之以7种方式让主线程等待子线程结束

https://www.cnblogs.com/aliveneko/p/10998058.html#synchronized%E7%9A%84%E7%AD%89%E5%BE%85%E5%94%A4%E9%86%92%E6%9C%BA%E5%88%B6