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


    查询数据

    专栏内容

    开源贡献

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

    系列文章

    前言

    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 ]
        [ ORDER BY expression [ ASC | DESC ] ]
        [ LIMIT { count | ALL } ]
        [ OFFSET start [ ROW | ROWS ] ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    准备数据

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

    CREATE TABLE tbl_company (  
        ID INT PRIMARY KEY NOT NULL,  
        NAME TEXT NOT NULL,  
        ADDRESS CHAR(50),  
        SALARY REAL,
        founded DATE
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这个语句中,我们使用了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;
    
    • 1
    • 2

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

    WHERE子句过滤数据

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

    SELECT column1, column2, ...
    FROM table_name
    WHERE condition;
    
    • 1
    • 2
    • 3

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

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

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

    ORDER BY子句排序

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

    SELECT column1, column2, ...
    FROM table_name
    ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
    
    • 1
    • 2
    • 3

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

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

    select id, name, salary, founded from tbl_company order by salary desc;
    
    • 1

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

    LIMIT和OFFSET按页返回

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

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

    SELECT column1, column2, ...
    FROM table_name
    LIMIT number_of_rows;
    
    • 1
    • 2
    • 3

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

    select id, name, salary, founded from tbl_company order by salary desc limit 5;
    
    • 1

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

    SELECT column1, column2, ...
    FROM table_name
    LIMIT number_of_rows OFFSET offset;
    
    • 1
    • 2
    • 3

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

    select id, name, salary, founded from tbl_company order by salary desc limit 5 offset 5; 
    
    • 1

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

    -- 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; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    DISTINCT 去重数据

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

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

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果集只有一列时

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    结果集有多列时

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

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

    结尾

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

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

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

  • 相关阅读:
    封装,继承,java,220813,,
    SpringBatch(1): SpringBatch入门
    公司内部网络架设悟空CRM客户管理系统 cpolar无需公网IP实现内网,映射端口外网访问
    在麒麟V10操作系统上安装MySQL数据库
    flutter 加.then方法
    bean的生命周期
    Git管理的初步使用
    浅析云南某大学门户网密码加密算法
    【区块链】usdt充值 离线签名 离线生成地址
    QSS样式表的使用
  • 原文地址:https://blog.csdn.net/senllang/article/details/133063097