查詢數(shù)據(jù)
?專欄內(nèi)容:
- postgresql內(nèi)核源碼分析
- 手寫(xiě)數(shù)據(jù)庫(kù)toadb
- 并發(fā)編程
?開(kāi)源貢獻(xiàn):
- toadb開(kāi)源庫(kù)
個(gè)人主頁(yè):我的主頁(yè)
管理社區(qū):開(kāi)源數(shù)據(jù)庫(kù)
座右銘:天行健,君子以自強(qiáng)不息;地勢(shì)坤,君子以厚德載物.
系列文章
- 入門(mén)準(zhǔn)備
- postgrersql基礎(chǔ)架構(gòu)
- 快速使用
- 初始化集群
- 數(shù)據(jù)庫(kù)服務(wù)管理
- psql客戶端使用
- pgAdmin圖形化客戶端
- 數(shù)據(jù)庫(kù)的使用
- 創(chuàng)建數(shù)據(jù)庫(kù)
- 數(shù)據(jù)庫(kù)操作
- 表的使用
- 表的創(chuàng)建
- 表的操作
- 數(shù)據(jù)查詢
- 數(shù)據(jù)查詢
前言
postgresql 數(shù)據(jù)庫(kù)是一款通用的關(guān)系型數(shù)據(jù),在開(kāi)源數(shù)據(jù)庫(kù)中能與商業(yè)數(shù)據(jù)媲美,在業(yè)界也越來(lái)越流行。
因?yàn)槭情_(kāi)源數(shù)據(jù)庫(kù),不僅公開(kāi)源碼,還有很多使用案例,好用的插件,所以它的慢慢變成了數(shù)據(jù)庫(kù)的先驅(qū)和標(biāo)準(zhǔn),通過(guò)postgresql可以很好從使用到原理,徹底搞懂;
如果是學(xué)習(xí)編程,也可以學(xué)到豐富的編程知識(shí),數(shù)據(jù)結(jié)構(gòu),編程技巧,它里面還有很多精妙的架構(gòu)設(shè)計(jì),分層思想,可以靈活定制的思想。
本專欄主要介紹postgresql 入門(mén)使用,數(shù)據(jù)庫(kù)維護(hù)管理,通過(guò)這些使用來(lái)了解數(shù)據(jù)庫(kù)原理,慢慢了解postgresql是什么樣的數(shù)據(jù)庫(kù),能做那些事情,以及如何做好服務(wù),最關(guān)鍵的是這些知識(shí)都是面試的必備項(xiàng)。
概要介紹
PostgreSQL是一種強(qiáng)大的開(kāi)源關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)。在這個(gè)系統(tǒng)中,你可以使用SQL(Structured Query Language)來(lái)查詢和操作數(shù)據(jù)。
本文將從以下幾個(gè)方面來(lái)分享,如何使用SQL來(lái)查詢數(shù)據(jù),通過(guò)過(guò)濾,排序得到想要的數(shù)據(jù),并且可以按需要的行數(shù)進(jìn)行分批返回;
- SELECT 語(yǔ)句的基本語(yǔ)法
- WHERE 子句用于過(guò)濾數(shù)據(jù)
- ORDER BY 子句用于排序數(shù)據(jù)
- LIMIT 和 OFFSET 子句用于限制返回的數(shù)據(jù)量
- DISTINCT 去重?cái)?shù)據(jù)
SELECT 語(yǔ)句基本語(yǔ)法
在數(shù)據(jù)庫(kù)中最復(fù)雜的SQL語(yǔ)句就是SELECT,語(yǔ)法解析的大部分代碼都是處理它的各種子句及組合;
這里介紹它的最基本常用的語(yǔ)法格式;
語(yǔ)法
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 ] ]
準(zhǔn)備數(shù)據(jù)
你可以使用以下的SQL語(yǔ)句在PostgreSQL中插入10000條隨機(jī)數(shù)據(jù):
CREATE TABLE tbl_company (
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL,
founded DATE
);
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
在這個(gè)語(yǔ)句中,我們使用了generate_series
函數(shù)生成了一個(gè)從1到10000的序列,用于生成唯一的id。
然后,我們使用字符串連接操作符(||
)和generate_series
函數(shù)生成隨機(jī)的姓名和地址。
接下來(lái),我們使用random()
函數(shù)生成一個(gè)范圍在0到1之間的隨機(jī)數(shù),乘以100000后將其轉(zhuǎn)換為REAL類型作為薪資。
最后,我們使用CURRENT_DATE
減去一個(gè)范圍在0到10之間的隨機(jī)年份,以生成成立日期。
這樣我們就有了10000條原始數(shù)據(jù),下面我們來(lái)進(jìn)行SQL查詢分析吧;
基本用法
指定要查詢的列名,從那張表里獲取數(shù)據(jù),SQL如下:
SELECT name, founded
FROM tbl_company;
也可以用*
代替所有的列名
WHERE子句過(guò)濾數(shù)據(jù)
WHERE子句用于過(guò)濾SELECT語(yǔ)句返回的數(shù)據(jù)?;菊Z(yǔ)法如下:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
示例:假設(shè)我們只想獲取創(chuàng)立時(shí)間在2019年前的企業(yè)名稱和ID:
SELECT id, name, founded FROM tbl_company WHERE founded < '2019-01-01';
當(dāng)然可以帶多個(gè)條件,條件之間可以用 AND
表示與的關(guān)系,OR
表示或的關(guān)系 進(jìn)行串聯(lián);
ORDER BY子句排序
ORDER BY子句用于根據(jù)指定的列對(duì)SELECT語(yǔ)句返回的數(shù)據(jù)進(jìn)行排序?;菊Z(yǔ)法如下:
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
其中ASC
表示按升序進(jìn)行排列,也就是從小到大; DESC
表示按降序進(jìn)行排列,也就是從大到小進(jìn)行顯示;
示例:假設(shè)按納稅額從降序排列:
select id, name, salary, founded from tbl_company order by salary desc;
當(dāng)然也可以帶有多個(gè)列的排序,數(shù)據(jù)庫(kù)處理時(shí)會(huì)按order by 子句中的順序,優(yōu)先第一個(gè),如果有相同的再按第二列進(jìn)行排序,依次進(jìn)行;
LIMIT和OFFSET按頁(yè)返回
當(dāng)按條件查詢的結(jié)果非常多時(shí),我們希望分批查看,這里就可以用limit 和 offset子句,達(dá)到分頁(yè)顯示的效果;
LIMIT
子句用于限制SELECT
語(yǔ)句返回的數(shù)據(jù)行數(shù)。基本語(yǔ)法如下:
SELECT column1, column2, ...
FROM table_name
LIMIT number_of_rows;
示例:我們獲取納稅前五的企業(yè)信息
select id, name, salary, founded from tbl_company order by salary desc limit 5;
OFFSET
子句與LIMIT
子句一起使用,可以跳過(guò)指定數(shù)量的行?;菊Z(yǔ)法如下:
SELECT column1, column2, ...
FROM table_name
LIMIT number_of_rows OFFSET offset;
示例:我們獲取納稅的第6到10名的企業(yè)信息
select id, name, salary, founded from tbl_company order by salary desc limit 5 offset 5;
OFFSET
子句與LIMIT
子句的聯(lián)合使用,可以達(dá)到翻頁(yè)的效果,如果每頁(yè)限制為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;
DISTINCT 去重?cái)?shù)據(jù)
DISTINCT
關(guān)鍵字用于從結(jié)果集中返回唯一的行。它可以用于單個(gè)列或多個(gè)列。
請(qǐng)注意,DISTINCT
關(guān)鍵字適用于整個(gè)結(jié)果集,而不僅僅是選擇的列; 這意味著在查詢中使用DISTINCT
時(shí),所有選擇的列的組合必須是唯一的。
為了演示,我們?cè)?code>tbl_company表中插入幾行重復(fù)數(shù)據(jù);
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
結(jié)果集只有一列時(shí)
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)
可以看到結(jié)果中沒(méi)有重復(fù)項(xiàng),我們插入的id=10001與id=1的name
列值是一樣的,在結(jié)果集中進(jìn)行了過(guò)濾;
結(jié)果集有多列時(shí)
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
兩列數(shù)據(jù),發(fā)現(xiàn)salary
列還是有重復(fù)數(shù)據(jù),但是對(duì)于兩列的組合結(jié)果集來(lái)說(shuō),是沒(méi)有重復(fù)行的;
下面是對(duì)于兩列都有重復(fù)行的情況進(jìn)行演示;
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
與不加的效果,對(duì)于整行重復(fù)的都進(jìn)行了過(guò)濾;
DISTINCT
關(guān)鍵字 只能寫(xiě)在所有列的開(kāi)始位置,因?yàn)樗轻槍?duì)所有列的結(jié)果集;
結(jié)尾
非常感謝大家的支持,在瀏覽的同時(shí)別忘了留下您寶貴的評(píng)論,如果覺(jué)得值得鼓勵(lì),請(qǐng)點(diǎn)贊,收藏,我會(huì)更加努力!
作者郵箱:study@senllang.onaliyun.com
如有錯(cuò)誤或者疏漏歡迎指出,互相學(xué)習(xí)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-727708.html
注:未經(jīng)同意,不得轉(zhuǎn)載!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-727708.html
到了這里,關(guān)于【postgresql 基礎(chǔ)入門(mén)】數(shù)據(jù)表的查詢基本知識(shí),條件過(guò)濾、單列多列排序、按頁(yè)瀏覽數(shù)據(jù)、數(shù)據(jù)去重,得到你想要的數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!