查询数据
专栏内容:
开源贡献:
系列文章
- 入门准备
- postgrersql基础架构
- 快速使用
- 初始化集群
- 数据库服务管理
- psql客户端使用
- pgAdmin图形化客户端
- 数据库的使用
- 创建数据库
- 数据库操作
- 表的使用
- 表的创建
- 表的操作
- 数据查询
- 数据查询
文章目录
- 查询数据
- 系列文章
- 前言
- 概要介绍
- [SELECT 语句基本语法](#SELECT 语句基本语法)
- 基本用法
- WHERE子句过滤数据
- [ORDER BY子句排序](#ORDER BY子句排序)
- LIMIT和OFFSET按页返回
- [DISTINCT 去重数据](#DISTINCT 去重数据)
- 结尾
前言
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)
查询name
和salary
两列数据,发现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
如有错误或者疏漏欢迎指出,互相学习。
注:未经同意,不得转载!