打印

PostgreSQL 8.1 中文文档

PostgreSQL 8.1 中文文档

Chapter 1. 从头开始
Table of Contents
1.1. 安装
1.2. 体系基本概念
1.3. 创建一个数据
1.4. 访问数据库
1.1. 安装
自然,在你想开始使用 PostgreSQL 之前, 你必须安装它。PostgreSQL 很有可能已经安装到你的节点上了, 因为它包含在你的操作系统的发布里, 或者是系统管理员已经安装了它。如果是这样的话, 那么你应该从操作系统的文档或者你的系统管理员那里获取如何访问 PostgreSQL 的信息。

如果你不清楚 PostgreSQL 是否已经安装, 或者不知道你能否用它(已经安装的)做自己的实验,那么你就可以自己安装。 这么做并不难,并且是一次很好的练习。 PostgreSQL 可以由任何非特权用户安装, 并不需要超级用户 (root) 的权限

如果你准备自己安装 PostgreSQL, 那么请参考 Chapter 14 获取安装的有关信息, 安装之后再回到这个指导手册来。一定要记住要尽可能遵循有关设置合适的环境变量章节里的信息。

如果你的节点管理员没有按照缺省的方式设置各项相关参数, 那你还有点额外的活儿要干。比如,如果数据库服务机器是一个远程的机器, 那你就需要把 PGHOST 环境变量设置为数据库服务那台机器的名字。 环境变量 PGPORT 也可能需要设置。最后一招: 如果当你试着启动一个应用而该应用报告说不能与数据库建立联接时, 你应该马上与你的数据库管理员联系,如果你就是管理员, 那么你就要参考文档以确保你的环境变量得到正确的设置。 如果你不理解随后的几段,那么先阅读下一章。

TOP

1.2. 体系基本概念
在我们开始讲解之前,我们应该先了解 PostgreSQL 系统的基本体系。 理解 PostgreSQL 的部件之间的相互关系将会使本节显得更清晰一些。

在数据库术语里,PostgreSQL 使用一种客户端/服务器的模式。一次 PostgreSQL 会话由下列相关的进程(程序)组成:



一个服务器进程,它管理数据库文件,接受来自客户端应用与数据库的联接,并且代表客户端在数据库上执行操作。 数据库服务器程序叫做 postmaster。

那些需要执行数据库操作的用户的客户端(前端)应用。 客户端应用可能本身就是多种多样的:它们可以是一个字符界面的工具, 也可以是一个图形界面的应用,或者是一个通过访问数据库来显示网页的 web 服务器,或者是一个特殊的数据库管理工具。 一些客户端应用是和 PostgreSQL 发布一起提供的,但绝大部分是用户开发的。


和典型的客户端/服务器应用(C/S应用)一样,这些客户端和服务器可以在不同的主机上。 这时它们通过 TCP/IP 网络联接通讯。 你应该记住的是,在客户机上可以访问的文件未必能够在数据库服务器机器上访问(或者只能用不同的文件名进行访问)。

PostgreSQL 服务器可以处理来自客户端的多个并发请求。 因此,它为每个请求启动("fork")一个新的进程。 从这个时候开始,客户端和新服务器进程就不再经过最初的 postmaster 进程的干涉进行通讯。 因此, postmaster 总是在运行,等待着联接, 而客户端和相关联的服务器进程则是起起停停。(当然,用户是肯定看不到这些事情的。我们在这儿谈这些主要是为了完整。)

TOP

1.3. 创建一个数据库
看看你能否访问数据库服务器的第一个例子就是试着创建一个数据库。 一台运行着的 PostgreSQL 服务器可以管理许多数据库。 通常我们会为每个项目和每个用户单独使用一个数据库。

你的节点管理员可能已经为你创建了可以使用的数据库。 他应该已经告诉你这个数据库的名字。如果这样你就可以省略这一步, 并且跳到下一节。

要创建一个新的数据库,在我们这个例子里叫 mydb,你可以使用下面的命令:

$ createdb mydb它应该生成下面这样的响应:

CREATE DATABASE如果这样,那么这一步就成功了,你就可以忽略本节余下的部分了。

如果你看到类似下面这样的信息

createdb: command not found那么就是PostgreSQL没有安装好。要么是就根本没装上, 要么是你的搜索路径没有设置正确。尝试用绝对路径调用该命令试试:

$ /usr/local/pgsql/bin/createdb mydb在你的节点上这个路径可能不一样。和你的管理员联系或者看看安装指导获取正确的位置。

另外一种响应可能是这样:

createdb: could not connect to database postgres: could not connect to server:
No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?这意味着该服务器没有启动,或者没有在 createdb 预期的地方启动。同样, 你也要检查安装指导或者找管理员。

另外一个响应可能是这样:

createdb: could not connect to database postgres: FATAL:  user "joe" does not
exist在这里提到了你自己的登陆名。如果管理员没有为你创建 PostgreSQL 用户帐号, 就会发生这些现象。(PostgreSQL 用户帐号和操作系统用户帐号是不同的。) 如果你是管理员,参阅 Chapter 18 获取创建用户帐号的帮助。 你需要变成安装 PostgreSQL 的操作系统用户的身份(通常是 postgres)才能创建第一个用户帐号。 也有可能是赋予你的 PostgreSQL 用户名和你的操作系统用户名不同; 这种情况下,你需要使用 -U 开关或者使用 PGUSER 环境变量声明你的 PostgreSQL 用户名。

如果你有个数据库用户帐号,但是没有创建数据库所需要的权限,那么你会看到下面的东西:

createdb: database creation failed: ERROR:  permission denied to create database并非所有用户都经过了创建新数据库的授权。 如果 PostgreSQL 拒绝为你创建数据库, 那么你需要让节点管理员赋予你创建数据库的权限。出现这种情况时请咨询你的节点管理员。 如果你自己安装了 PostgreSQL, 那么你应该以你启动数据库服务器的用户身份登陆然后参考手册完成权限的赋予工作。 [1]

你还可以用其它名字创建数据库。 PostgreSQL 允许你在一个节点上创建任意数量的数据库。 数据库名必须是以字母开头并且小于 63 个字符长。 一个方便的做法是创建和你当前用户名同名的数据库。 许多工具假设该数据库名为缺省数据库名,所以这样可以节省你的敲键。 要创建这样的数据库,只需要键入

$ createdb
如果你再也不想使用你的数据库了,那么你可以删除它。 比如,如果你是数据库 mydb 的所有人(创建人), 那么你就可以用下面的命令删除它:

$ dropdb mydb(对于这条命令而言,数据库名不是缺省的用户名。这样你就必须声明它。) 这个动作物理上将所有与该数据库相关的文件都删除并且不可取消, 因此做这件事之前一定要想清楚。

Notes
[1] 为什么这么干就行了? 解释:PostgreSQL 用户名是和操作系统用户账号分开的。 如果你与一个数据库联接,你可以选择以何种 PostgreSQL 用户名进行联接; 如果你不选择,那么缺省就是你的当前操作系统账号。 如果这样,那么总有一个与操作系统用户同名的 PostgreSQL 用户账号用于启动服务器, 并且通常这个用户都有创建数据库的权限。如果你不想以该用户身份登陆, 那么你也可以在任何地方声明一个 -U 选项以选择一个联接的 PostgreSQL 用户名。

TOP

1.4. 访问数据库
一旦你创建了数据库,你就可以访问它:



运行 PostgreSQL 交互的终端程序, 叫 psql, 它允许你交互地输入,编辑,和执行 SQL 命令。

使用我们现有的图形前端工具,比如 PgAccess 或者带 ODBC 支持的办公套件来创建和管理数据库。 这种方法在这份教程中没有介绍。

写一个客户应用,使用多种语言绑定中的一种。 这些可能性在 Part IV 中有更深入的讨论。

你可能需要启动 psql,试验本教程中的例子。 你可以用下面的命令为 mydb 数据库激活它:

$ psql mydb如果你省略了数据库名字,那么它缺省就是你的用户账号名字。 你已经在前面的小节里知道这个大纲了。

在 psql 里,你会看到下面的欢迎信息:

Welcome to psql 8.1, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

mydb=>最后一行也可能是

mydb=#这个提示符意味着你是数据库超级用户,最可能出现在你自己安装了 PostgreSQL 的情况下。作为超级用户意味着你不受访问控制的限制。 对于本教程的目的而言,是否超级用户并不重要。

如果你启动 psql 时碰到了问题,那么回到前面的小节。 诊断 createdb 的方法和诊断 psql 的方法很类似, 如果前者能运行那么后者也应该能运行。

psql 打印出的最后一行是提示符,它表示 psql 正听着你说话,这个时候你就可以敲入 SQL 查询到一个 psql 维护的工作区中。试验一下下面的命令:

mydb=> SELECT version();
                            version
----------------------------------------------------------------
PostgreSQL 8.1 on i586-pc-linux-gnu, compiled by GCC 2.96
(1 row)
mydb=> SELECT current_date;
    date
------------
2002-08-31
(1 row)

mydb=> SELECT 2 + 2;
?column?
----------
        4
(1 row)
psql 程序有一些不属于 SQL 命令的内部命令。 它们以反斜杠开头,"\"。 有些这种命令在欢迎信息中列出。比如,你可以用下面的命令获取各种PostgreSQL SQL 命令的帮助语法:

mydb=> \h
要退出 psql,键入

mydb=> \q然后 psql 就会退出并且给你返回到命令行 shell。 (要获取更多有关内部命令的信息,你可以在 psql 提示符上键入 \?。) psql 的完整功能在 Part VI 中有文档。如果 PostgreSQL 安装正确,那么你还可以在操作系统的 shell 提示符上键入 man psql 来阅读该文档。在这份文档里,我们将不会明确使用这些特性,但是你自己可以在合适的时候使用它们。

TOP

Chapter 2. SQL 语言
Table of Contents
2.1. 介绍
2.2. 概念
2.3. 创建新表
2.4. 向表中添加行
2.5. 查询一个表
2.6. 在表之间连接
2.7. 聚集函数
2.8. 更新
2.9. 删除
2.1. 介绍
本章提供一个如何使用 SQL 执行简单操作的概述。 本教程的目的只是给你一个介绍,并非完整的 SQL 教程。有许多关于 SQL 的书,包括 Understanding the New SQL 和 A Guide to the SQL Standard。而且你还要知道有些 PostgreSQL语言特性是对标准的扩展。

在随后的例子里,我们假设你已经创建了名为 mydb 的数据库,就象在前面的章里面介绍的一样,并且已经启动了 psql。

本手册的例子也可以在PostgreSQL 源代码发布里的目录 src/tutorial/ 中找到。 要使用这些文件,首先进入该目录然后运行 make:

$ cd ..../src/tutorial
$ make这样就创建了那些脚本以及编译了包含用户定义函数和类型的 C 文件。 (你必须使用 GNU make 来做这件事情 — 它在你的系统上可能名字是其它什么东西,经常是 gmake。) 要开始这个教程,按照下面说的进行:

$ cd ..../src/tutorial
$ psql -s mydb
...

mydb=> \i basics.sql\i 命令从指定的文件中读取命令。 -s 选项把你置于单步模式,它在向服务器发送每个语句之前暂停。 在本节使用的命令都在文件 basics.sql 中。

TOP

2.2. 概念
PostgreSQL 是一种关系型数据库管理系统 (RDBMS)。 这意味着它是一种用于管理那些以关系形式存储数据的系统。 关系实际上是表的数学称呼。 今天,把数据存储在表里的概念已经快成了固有的常识了, 但是还有其它的一些方法用于组织数据库。 在类 Unix 操作系统上的文件和目录就形成了一种层次数据库的例子。 更现代的发展是面向对象的数据库。

每个表都是一个命名的行的集合。 每一行由一组相同的命名字段组成。 而且每一字段都有一特定的类型。虽然每字段在每行里的位置是固定的, 但一定要记住 SQL 并未对行在表中的顺序做任何保证(但你可以对它们进行明确的排序进行显示)。

表组成数据库,一个由某个 PostgreSQL 服务器管理的数据库集合组成一个数据库集群。

TOP

2.3. 创建新表
你可以通过声明表的名字和所有字段的名字及其类型来创建表∶

CREATE TABLE weather (
    city            varchar(80),
    temp_lo         int,           -- 最低气温
    temp_hi         int,           -- 最高气温
    prcp            real,          -- 降水量
    date            date
);你可以在 psql 里连换行符一起键入这些东西。 psql 可以识别该命令直到分号才结束。

你可以在 SQL 命令中自由使用空白(也就是空格,tab,和换行符)。 这就意味着你可以用和上面不同的对齐方式键入命令。 两个划线("--" 引入注释。 任何跟在它后面的东西直到该行的结尾都被忽略。 SQL 是对关键字和标识符大小写不敏感的语言,只有在标识符用双引号包围时才能保留它们的大小写属性(上面没有这么干)。

varchar(80) 声明一个可以存储最长 80 个字符的任意字符串的数据类型。 int 是普通的整数类型。 real 是一种用于存储单精度浮点数的类型。 date 类型应该可以自解释。(没错,类型为 date 的字段名字也是 date。 这么做可能比较方便,也可能容易让人混淆 — 你自己看啦。)

PostgresSQL 支持标准的 SQL 类型 int,smallint, real,double precision, char(N), varchar(N),date, time,timestamp 和 interval,还支持其他的通用类型和丰富的几何类型。 PostgreSQL 可以客户化为定制任意的用户定义的数据类型。 因而类型名并不是语法关键字,除了 SQL92 标准要求支持的特例外。

第二个例子将保存城市和它们相关的地理位置:

CREATE TABLE cities (
    name            varchar(80),
    location        point
);类型 point 就是一种 PostgreSQL 特有数据类型的例子。

最后,我们还要提到如果你不再需要某个表,或者你想创建一个不同的表,那么你可以用下面的命令删除它:

DROP TABLE tablename;

TOP

2.4. 向表中添加行
INSERT 用于向表中添加行:

INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');请注意所有数据类型都使用了相当明了的输入格式。 那些不是简单数字值的常量必需用单引号(')包围, 就象在例子里一样。 date 类型实际上对可接收的格式相当灵活, 不过在本教程里,我们应该坚持使用这里显示的格式。

point 类型要求一个座标对作为输入,如下:

INSERT INTO cities VALUES ('San Francisco', '(-194.0, 53.0)');
到目前为止使用的语法要求你记住字段的顺序。一个可选的语法允许你明确地列出字段:

INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)
    VALUES ('San Francisco', 43, 57, 0.0, '1994-11-29');如果你需要,你可以用另外一个顺序列出字段或者是忽略某些字段, 比如说,我们不知道降水量:

INSERT INTO weather (date, city, temp_hi, temp_lo)
    VALUES ('1994-11-29', 'Hayward', 54, 37);许多开发人员认为明确列出字段要比依赖隐含的顺序是更好的风格。

请输入上面显示的所有命令,这样你在随后的各节中才有可用的数据。

你还可以使用 COPY 从文本文件中装载大量数据。 这么干通常更快,因为 COPY 命令就是为这类应用优化的, 只是比 INSERT 少一些灵活性.比如:

COPY weather FROM '/home/user/weather.txt';这里源文件的文件名必须是后端服务器可访问的, 而不是客户端可访问的,因为后端服务器直接读取文件。 你可以在 COPY 中读到更多有关 COPY 命令的信息。

TOP

2.5. 查询一个表
要从一个表中检索数据就是查询这个表。 SQL 的 SELECT 就是做这个用途的。 该语句分为选择列表(列出要返回的字段部分),表列表(列出从中检索数据的表的部分), 以及可选的条件(声明任意限制的部分)。比如,要检索表 weather 的所有行,键入:

SELECT * FROM weather;这里 * 是"所有字段" 的缩写。 [1] 因此同样的结果可以用下面语句获得:

SELECT city, temp_lo, temp_hi, prcp, date FROM weather;而输出应该是:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
San Francisco |      46 |      50 | 0.25 | 1994-11-27
San Francisco |      43 |      57 |    0 | 1994-11-29
Hayward       |      37 |      54 |      | 1994-11-29
(3 rows)
你可以在选择列表中写任意表达式,而不仅仅是字段列表。比如,你可以:

SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;这样应该得出:

     city      | temp_avg |    date
---------------+----------+------------
San Francisco |       48 | 1994-11-27
San Francisco |       50 | 1994-11-29
Hayward       |       45 | 1994-11-29
(3 rows)请注意这里的 AS 子句是如何给输出字段重新命名的。(AS 子句是可选的。)

TOP

一个查询可以使用 WHERE 子句"修饰",声明需要哪些行。 WHERE 子句包含一个布尔(真值)表达式,只有那些布尔表达式为真的行才会被返回。 允许你在条件中使用常用的布尔操作符(AND,OR, 和 NOT)。 比如,下面的查询检索旧金山的下雨天的天气:

SELECT * FROM weather
    WHERE city = 'San Francisco' AND prcp > 0.0;结果:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)
你可以要求返回的查询是排好序的:

SELECT * FROM weather
    ORDER BY city;
     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
Hayward       |      37 |      54 |      | 1994-11-29
San Francisco |      43 |      57 |    0 | 1994-11-29
San Francisco |      46 |      50 | 0.25 | 1994-11-27

TOP


感谢一直以来您对我们的支持!
当前时区 GMT+8, 现在时间是 2008-12-3 04:04 京ICP证060528 号

Designed By 17DST