如何使用Select命令在PostgreSQL中创建数据查询

来自菜鸟教程
跳转至:导航、​搜索

什么是 PostgreSQL?

PostgreSQL 是一个使用 SQL 查询语言的开源数据库管理系统。 PostgreSQL,或简称为“Postgres”,是 VPS 服务器上非常有用的工具,因为它可以处理网站和其他应用程序的数据存储需求。

在本指南中,我们将研究如何查询 PostgreSQL 数据库。 这将允许我们指示 Postgres 返回它管理的与我们正在寻找的标准匹配的所有数据。

本教程假设您已经在您的机器上安装了 Postgres。 我们将使用 Ubuntu 12.04,但任何现代 Linux 发行版都应该可以工作。

登录 PostgreSQL

我们将从 Internet 下载一个示例数据库以供使用。

首先,使用以下命令登录默认 Postgres 用户:

sudo su - postgres

我们将通过键入以下内容获取数据库文件:

wget http://pgfoundry.org/frs/download.php/527/world-1.0.tar.gz

提取 gzipped 存档并切换到内容目录:

tar xzvf world-1.0.tar.gz
cd dbsamples-0.1/world

创建一个数据库以将文件结构导入:

createdb -T template0 worlddb

最后,我们将使用 .sql 文件作为新创建数据库的输入:

psql worlddb < world.sql

我们现在准备登录到我们新创建的环境:

psql worlddb

如何在 PostgreSQL 中显示数据

在开始之前,让我们先了解一下我们刚刚导入了什么样的数据。 要查看表列表,我们可以使用以下命令:

\d+
                         List of relations
 Schema |      Name       | Type  |  Owner   |  Size  | Description 
--------+-----------------+-------+----------+--------+-------------
 public | city            | table | postgres | 264 kB | 
 public | country         | table | postgres | 48 kB  | 
 public | countrylanguage | table | postgres | 56 kB  | 
(3 rows)

我们这里有三张桌子。 如果我们想查看构成“city”表的列,可以发出以下命令:

\d city
          Table "public.city"
   Column    |     Type     | Modifiers 
-------------+--------------+-----------
 id          | integer      | not null
 name        | text         | not null
 countrycode | character(3) | not null
 district    | text         | not null
 population  | integer      | not null
Indexes:
    "city_pkey" PRIMARY KEY, btree (id)
Referenced by:
    TABLE "country" CONSTRAINT "country_capital_fkey" FOREIGN KEY (capital) REFERENCES city(id)

我们可以看到有关每一列的信息,以及该表与其他数据集的关系。

如何在 PostgreSQL 中使用 Select 查询数据

我们使用“select”语句从 Postgres 查询(询问)信息。 这些语句使用以下通用语法:

SELECT columns_to_return FROM table_name;

例如,如果我们发出“\d country”,我们可以看到“country”表有很多列。 我们可以创建一个查询,列出国家名称和它所在的大陆,如下所示:

SELECT name,continent FROM country;
                     name                     |   continent   
----------------------------------------------+---------------
 Afghanistan                                  | Asia
 Netherlands                                  | Europe
 Netherlands Antilles                         | North America
 Albania                                      | Europe
 Algeria                                      | Africa
 American Samoa                               | Oceania
 Andorra                                      | Europe
 . . .

要查看特定表中的所有列,我们可以使用星号 (*) 通配符。 这意味着“匹配所有可能性”,因此将返回每一列。

SELECT * FROM city;
  id  |               name                | countrycode |           district            | population 
------+-----------------------------------+-------------+-------------------------------+------------
    1 | Kabul                             | AFG         | Kabol                         |    1780000
    2 | Qandahar                          | AFG         | Qandahar                      |     237500
    3 | Herat                             | AFG         | Herat                         |     186800
    4 | Mazar-e-Sharif                    | AFG         | Balkh                         |     127800
    5 | Amsterdam                         | NLD         | Noord-Holland                 |     731200
    6 | Rotterdam                         | NLD         | Zuid-Holland                  |     593321
    7 | Haag                              | NLD         | Zuid-Holland                  |     440900
. . .
Here, we see the "city" table in its entirety.

在 PostgreSQL 中排序查询结果

您可以使用“order by”子句来组织查询结果。 这允许您指定返回数据的排序顺序。

“order by”子句出现在正常的 select 语句之后。 这是一般语法:

SELECT columns FROM table ORDER BY column_names [ ASC | DESC ];

如果我们想从国家表中选择国家和大洲,然后按大洲排序,我们可以给出以下内容:

SELECT name,continent FROM country ORDER BY continent;
                     name                     |   continent   
----------------------------------------------+---------------
 Algeria                                      | Africa
 Western Sahara                               | Africa
 Madagascar                                   | Africa
 Uganda                                       | Africa
 Malawi                                       | Africa
 Mali                                         | Africa
 Morocco                                      | Africa
 Côte d\u0092Ivoire                           | Africa
 . . .

如您所见,默认情况下 order 语句按升序组织数据。 这意味着它从字母组织的开头和数字搜索的最低数字开始。

如果我们想反转排序顺序,我们可以在“order by”列声明之后输入“desc”:

SELECT name,continent FROM country ORDER BY continent DESC;
                     name                     |   continent   
----------------------------------------------+---------------
 Paraguay                                     | South America
 Bolivia                                      | South America
 Brazil                                       | South America
 Falkland Islands                             | South America
 Argentina                                    | South America
 Venezuela                                    | South America
 Guyana                                       | South America
 Chile                                        | South America
. . .

我们也可以选择按多列排序。 我们可以有一个主排序字段,然后如果多个记录在主排序字段中具有相同的值,则使用其他排序字段。

例如,我们可以按大洲排序,然后按国家排序,得到每个大洲按字母顺序排列的国家记录列表:

SELECT name,continent FROM country ORDER BY continent,name;
                     name                     |   continent   
----------------------------------------------+---------------
 Angola                                       | Africa
 Burundi                                      | Africa
 Benin                                        | Africa
 Burkina Faso                                 | Africa
 Botswana                                     | Africa
 Central African Republic                     | Africa
 Côte d\u0092Ivoire                           | Africa
 Cameroon                                     | Africa
 Congo, The Democratic Republic of the        | Africa
. . .

我们现在在两列中按字母排序。

在 PostgreSQL 中过滤查询结果

我们已经学会了如何通过指定我们想要的列来从表中只选择某些信息,但是 Postgres 提供了更细粒度的过滤机制。

我们可以通过包含“where”子句来过滤结果。 where 子句后面是我们希望收到的结果的描述。

例如,如果我们想选择美国的所有城市,我们可以告诉 Postgres 返回三位国家代码为“USA”的城市名称:

SELECT name FROM city WHERE countrycode = 'USA';
          name           
-------------------------
 New York
 Los Angeles
 Chicago
 Houston
 Philadelphia
 Phoenix
 San Diego
 Dallas
 San Antonio
. . .

字符串值,如上面的 USA,必须放在单引号中才能被 Postgres 正确解释。

上一个查询使用“=”来比较列值是否与表达式右侧给出的值完全匹配。 虽然使用“like”比较运算符,但我们可以更灵活地搜索。

like 运算符可以使用“_”作为通配符来匹配单个字符,使用“%”作为通配符来匹配零个或多个字符。

我们还可以将过滤术语与“and”或“or”结合使用。 让我们结合一些过滤来查找名称以“N”开头的美国城市:

SELECT name FROM city WHERE countrycode = 'USA' AND name LIKE 'N%';
        name        
--------------------
 New York
 Nashville-Davidson
 New Orleans
 Newark
 Norfolk
 Newport News
 Naperville
 New Haven
 North Las Vegas
 Norwalk
 New Bedford
 Norman
(12 rows)
We can, of course, sort these results just like with regular, unfiltered select data.
SELECT name FROM city WHERE countrycode = 'USA' AND name LIKE 'N%' ORDER BY name;
        name        
--------------------
 Naperville
 Nashville-Davidson
 Newark
 New Bedford
 New Haven
 New Orleans
 Newport News
 New York
 Norfolk
 Norman
 North Las Vegas
 Norwalk
(12 rows)

PostgreSQL 中的高级选择操作

我们将检查一些更复杂的查询。 考虑以下:

SELECT country.name AS country,city.name AS capital,continent FROM country JOIN city ON country.capital = city.id ORDER BY continent,country;
                country                |              capital              |   continent   
---------------------------------------+-----------------------------------+---------------
 Algeria                               | Alger                             | Africa
 Angola                                | Luanda                            | Africa
 Benin                                 | Porto-Novo                        | Africa
 Botswana                              | Gaborone                          | Africa
 Burkina Faso                          | Ouagadougou                       | Africa
 Burundi                               | Bujumbura                         | Africa
 Cameroon                              | Yaoundé                           | Africa
 Cape Verde                            | Praia                             | Africa
 Central African Republic              | Bangui                            | Africa
 Chad                                  | N´Djaména                         | Africa
. . .

这个查询有几个不同的部分。 让我们从头开始,然后向后工作。

语句的“order by”部分(ORDER BY 大陆,国家)应该很熟悉。

这部分语句告诉 Postgres 首先根据大洲进行排序,然后按国家列对具有匹配大洲值的条目进行排序。

为了解释下一部分,表规范,我们将了解表连接。

使用连接从 PostgreSQL 中的多个表中选择数据

Postgres 允许您使用“join”子句从不同的相关表中选择数据。 如果每个表都有一个可以引用相同数据的列,则表是相关的。

在我们的示例数据库中,我们的“国家”和“城市”表共享一些数据。 我们可以通过键入以下内容看到“country”表引用了“city”表:

\d country
. . .
. . .
Foreign-key constraints:
    "country_capital_fkey" FOREIGN KEY (capital) REFERENCES city(id)
. . .
. . .

该语句告诉我们,“country”表中的“capital”列是对“city”表中的“id”列的引用。 这意味着我们几乎可以通过匹配这些列中的值来将这两个表视为一个巨大的表。

在我们的查询中,表选择显示为“FROM country JOIN city ON country.capital = city.id”。

在这个语句中,我们告诉 Postgres 从两个表中返回信息。 “join”语句指定默认连接,也称为“内连接”。

内连接将返回两个表中都存在的信息。 例如,如果我们匹配没有明确关联为外键的列,我们可能会遇到一个表的值在另一个表中不匹配的情况。 这些不会使用常规连接返回。

“on”关键字后面的部分指定表共享的列,以便 Postgres 知道数据是如何相关的。 通过指定以下信息给出此信息:

table_name.column_name

在我们的例子中,我们选择在两个表中具有匹配值的记录,其中 country 表的 capital 列应与 city 表的 id 列进行比较。

PostgreSQL 中表连接的命名选择标准

我们现在是查询语句的开始。 选择列的部分。 根据上一节,这部分应该很容易理解。

如果我们试图选择两个表中都存在的列名,我们现在必须命名列所在的表。

例如,我们从 country 表和 city 表中都选择了“name”列。 如果我们不使用“table_name”。 选择的一部分,匹配将是模棱两可的,Postgres 将不知道要返回哪些数据。

我们通过明确在发生命名冲突时从哪个表中选择来解决这个问题。 为了保持可读性,有时为表命名而不考虑名称是否唯一会很有帮助。/p>

结论

您现在应该对如何制定查询有了基本的了解。 这使您能够从各种来源返回特定数据。 这有助于围绕该技术构建或使用应用程序和交互式网页。

作者: