【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

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

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

相关推荐
小菜yh23 分钟前
关于Redis
java·数据库·spring boot·redis·spring·缓存
Microsoft Word43 分钟前
数据库系统原理(第一章 数据库概述)
数据库·oracle
华为云开源1 小时前
openGemini 社区人才培养计划:助力成长,培养新一代云原生数据库人才
数据库·云原生·开源
小安运维日记3 小时前
Linux云计算 |【第四阶段】NOSQL-DAY1
linux·运维·redis·sql·云计算·nosql
kejijianwen4 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
编程零零七4 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
高兴就好(石7 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆7 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0668 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下8 小时前
Redis的配置与优化
数据库·redis·缓存