查询数据
专栏内容:
- 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
如有错误或者疏漏欢迎指出,互相学习。
注:未经同意,不得转载!
版权归原作者 韩楚风 所有, 如有侵权,请联系我们删除。