0


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

查询数据

专栏内容

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

开源贡献

  • toadb开源库

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

系列文章

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

文章目录

前言

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

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

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

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

概要介绍

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

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

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

SELECT 语句基本语法

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

语法

SELECT[ALL|DISTINCT[ON( expression [,...])]][*| expression [[AS] output_name ][,...]][FROM from_item [,...]][WHERE condition ][ORDERBY expression [ASC|DESC]][LIMIT { count |ALL } ][OFFSETstart[ROW|ROWS]]

准备数据

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

CREATETABLE tbl_company (  
    ID INTPRIMARYKEYNOTNULL,  
    NAME TEXTNOTNULL,  
    ADDRESS CHAR(50),  
    SALARY REAL,
    founded DATE);
db_factory2=>INSERTINTO 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)::REALAS salary,CURRENT_DATE-(random()*10*INTERVAL'1 year')AS founded
ORDERBY id;INSERT010000

在这个语句中,我们使用了

generate_series

函数生成了一个从1到10000的序列,用于生成唯一的id。

然后,我们使用字符串连接操作符(

||

)和

generate_series

函数生成随机的姓名和地址。

接下来,我们使用

random()

函数生成一个范围在0到1之间的随机数,乘以100000后将其转换为REAL类型作为薪资。

最后,我们使用

CURRENT_DATE

减去一个范围在0到10之间的随机年份,以生成成立日期。

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

基本用法

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

SELECT name, founded
FROM tbl_company;

也可以用

*

代替所有的列名

WHERE子句过滤数据

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

SELECT column1, column2,...FROM table_name
WHERE condition;

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

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

当然可以带多个条件,条件之间可以用

AND

表示与的关系,

OR

表示或的关系 进行串联;

ORDER BY子句排序

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

SELECT column1, column2,...FROM table_name
ORDERBY column1 [ASC|DESC], column2 [ASC|DESC],...;

其中

ASC

表示按升序进行排列,也就是从小到大;

DESC

表示按降序进行排列,也就是从大到小进行显示;

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

select id, name, salary, founded from tbl_company orderby salary desc;

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

LIMIT和OFFSET按页返回

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

LIMIT

子句用于限制

SELECT

语句返回的数据行数。基本语法如下:

SELECT column1, column2,...FROM table_name
LIMIT number_of_rows;

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

select id, name, salary, founded from tbl_company orderby salary desclimit5;
OFFSET

子句与

LIMIT

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

SELECT column1, column2,...FROM table_name
LIMIT number_of_rows OFFSEToffset;

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

select id, name, salary, founded from tbl_company orderby salary desclimit5offset5;
OFFSET

子句与

LIMIT

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

-- page1select id, name, salary, founded from tbl_company orderby salary desclimit100offset0;-- page2select id, name, salary, founded from tbl_company orderby salary desclimit100offset100;-- page3select id, name, salary, founded from tbl_company orderby salary desclimit100offset200;

DISTINCT 去重数据

DISTINCT

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

请注意,

DISTINCT

关键字适用于整个结果集,而不仅仅是选择的列; 这意味着在查询中使用

DISTINCT

时,所有选择的列的组合必须是唯一的。

为了演示,我们在

tbl_company

表中插入几行重复数据;

db_factory2=>insertinto tbl_company values(10001,'Name 1','Address 10001',8888,'2023-9-19');INSERT01
db_factory2=>insertinto tbl_company values(10002,'Name 10002','Address 1',8888,'2023-9-19');INSERT01
db_factory2=>insertinto tbl_company values(10003,'Name 10003','Address 10003',8888,'2023-9-19');INSERT01

结果集只有一列时

db_factory2=>selectdistinct name from tbl_company where id >10000or 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(11rows)

可以看到结果中没有重复项,我们插入的id=10001与id=1的

name

列值是一样的,在结果集中进行了过滤;

结果集有多列时

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

查询

name

salary

两列数据,发现

salary

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

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

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

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

可以看到加

DISTINCT

与不加的效果,对于整行重复的都进行了过滤;

DISTINCT

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

结尾

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

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

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


本文转载自: https://blog.csdn.net/senllang/article/details/133063097
版权归原作者 韩楚风 所有, 如有侵权,请联系我们删除。

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

还没有评论