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

查询数据

专栏内容

开源贡献

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

系列文章

文章目录

前言

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

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

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

本专栏主要介绍postgresql 入门使用,数据库维护管理,通过这些使用来了解数据库原理,慢慢了解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

如有错误或者疏漏欢迎指出,互相学习。

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

相关推荐
Karoku06619 分钟前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch
莫叫石榴姐33 分钟前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
小技与小术2 小时前
数据库表设计范式
数据库·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器
数据库·sql·mysql·oracle·实验报告
Loganer2 小时前
MongoDB分片集群搭建
数据库·mongodb
LKID体2 小时前
Python操作neo4j库py2neo使用之创建和查询(二)
数据库·python·neo4j
魔珐科技2 小时前
以3D数字人AI产品赋能教育培训人才发展,魔珐科技亮相AI+教育创新与人才发展大会
大数据·人工智能
刘大浪2 小时前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis
一只爱撸猫的程序猿2 小时前
简单实现一个系统升级过程中的数据平滑迁移的场景实例
数据库·spring boot·程序员