Postgresql是现在比较流行的数据库之一,这个起源于伯克利(BSD)的数据库研究计划目前已经衍生成一项国际开发项目,并且有非常广泛的用户。据我了解国内四大国产数据库,其中三个都是基于Postgresql开发的。并且,因为许可证的灵活,任何人都可以以任何目的免费使用,修改,和分发 Postgresql, 不管是私用,商用,还是学术研究使用。本文只是简单介绍一下postgresql的安装和简单的使用,语法方面涉及的比较少,以方便新手上路为目的。
1.系统环境和安装方法 ;
1.1 系统环境:Ubuntu Linux 7.04 ;Fedora;slackware;
1.2 安装;
Ubuntu下安装
xiaop@localhost$ sudo apt-get install postgresql-8.2
slackware下安装:
请到 linuxpackages.net 上查找您所用系统的对应版本,用pkginstall 来安装,或您安装slap-get 工具,在线自动安装;要用到root权限,可以通用sudo。关于su和sudo的参考;
《Linux 系统中的超级权限的控制》
安装postgresql的软件包,可用下面的办法 ;
注:这个命令为主机172.28.18.51的5000端口创建用户testuser, 此用户不可以创建数据库和其他用户。
注:此命令删除主机172.28.18.51(-h)的5000端口(-p)的用户testuser,并且需要确认(-i);
xiaop@localhost# pkginstall post*.tgz
或
xiaop@localhost# slapt-get --install postgresql-8.2.4
在Fedora中,您可以用软件包在线安装工具来安装
2.1 在流行Linux发行版的启动方法;
在Ubuntu系统中,服务器启动脚本放在 /etc/init.d目录中,您可以用下面的方法来启动,对于Fedora和Gentoo 也是类似的;
xiaop@localhost~# /etc/init.d/postgresql-8.2 start 注:启动;
xiaop@localhost~# /etc/init.d/postgresql-8.2 restart 注:重启;
xiaop@localhost~# /etc/init.d/postgresql-8.2 stop 注:停止;
xiaop@localhost~# /etc/init.d/postgresql-8.2 status 注:查看状态;
xiaop@localhost~# /etc/rc.d/rc.postgres start
2.2 关于 Postgresql启动和存储目录;
启动Postgresql服务器时,一般是以postgres 用户来启动的,自编译安装的除外;对于数据库的存储一般是放在/var/lib中的相关目录,比如 /var/lib/pgsql或 /var/lib/postgresql/8.2/main/ 目录等;不同的发行版可能不太一样,不过还是大同小异,您可以通过修改数据存储位置把数据库存在其它地方;
3.创建用户
createuser 是 sql 命令 CREATE USER的封装。
命令:createuser [-a] [-A] [-d] [-D] [-e] [-P] [-h 主机名] [-p port] 用户名
命令:createuser [-a] [-A] [-d] [-D] [-e] [-P] [-h 主机名] [-p port] 用户名
参数说明:
[-a]:允许创建其他用户,相当于创建一个超级用户;
[-A]:不允许此用户创建其他用户;
[-d]:允许此用户创建数据库;
[-D]:不允许此用户创建数据库;
[-e]:将执行过程显示到Shell上;
[-P]:创建用户时,同时设置密码;
[-h 主机名]:为某个主机上的Postgres创建用户;
[-p port]:与-h参数一同使用,指定主机的端口。
[-A]:不允许此用户创建其他用户;
[-d]:允许此用户创建数据库;
[-D]:不允许此用户创建数据库;
[-e]:将执行过程显示到Shell上;
[-P]:创建用户时,同时设置密码;
[-h 主机名]:为某个主机上的Postgres创建用户;
[-p port]:与-h参数一同使用,指定主机的端口。
3.1.1不带参数的创建用户;
xiaop@localhost~$ createuser testuser
Shall the new user be allowed to create databases? (y/n) n --------是否可以创建数据库:否
Shall the new user be allowed to create more new users? (y/n) n ---------是否可以创建新用户:否
CREATE USER
3.1.2 为指定的主机和端口上创建用户 ;
xiaop@localhost~$ createuser -h 172.28.18.51 -p 5000 -D -A -e testuser
CREATE USER joe NOCREATEDB NOcreateuser;
CREATE USER
3.1.3创建超级用户;
xiaop@localhost~$ createuser -P -d -a -e testuser
Enter password for new user: testuser
Enter it again: testuser
CREATE USER joe PASSWORD 'testuser' CREATEDB createuser;
CREATE USER
命令:dropuser [-i] [-h] [-p] [-e] 用户名
参数说明:
[ -i]:删除用户前,要求确认;
[-h 主机名]:删除某个主机上的Postgres用户;
[-p port]:与-h参数一同使用,指定主机的端口;
[-e]:将执行过程显示到Shell上。
[ -i]:删除用户前,要求确认;
[-h 主机名]:删除某个主机上的Postgres用户;
[-p port]:与-h参数一同使用,指定主机的端口;
[-e]:将执行过程显示到Shell上。
xiaop@localhost~$ dropuser testuser
DROP USER
xiaop@localhost~$ dropuser -p 5000 -h 172.28.18.51 -i -e testuser
User "testuser" and any owned databases will be permanently deleted.
Are you sure? (y/n) y
DROP USER "testuser"
DROP USER
4.1创建数据库
xiaop@localhost~$ createdb mydb
它应该生成下面这样的响应:
CREATE DATABASE
如果这样,那么这一步就成功了,如果您看到类似下面这样的信息
createdb: command not found
那么就是Postgresql没有安装好,要么是就根本没装上;
您还可以用其它名字创建数据库。 Postgresql 允许您在一个节点上创建任意数量的数据库。 数据库名必须是以字母开头并且小于 63 个字符长。 一个方便的做法是创建和您当前用户名同名的数据库。 许多工具假设该数据库名为缺省数据库名,所以这样可以节省您的敲键。 要创建这样的数据库,只需要键入 :
您还可以用其它名字创建数据库。 Postgresql 允许您在一个节点上创建任意数量的数据库。 数据库名必须是以字母开头并且小于 63 个字符长。 一个方便的做法是创建和您当前用户名同名的数据库。 许多工具假设该数据库名为缺省数据库名,所以这样可以节省您的敲键。 要创建这样的数据库,只需要键入 :
xiaop@localhost~$ createdb
如果您再也不想使用您的数据库了,那么您可以删除它。 比如,如果您是数据库 mydb 的所有人(创建人), 那么您就可以用下面的命令删除它:
xiaop@localhost~$ dropdb mydb
5.访问数据库
一旦您创建了数据库,您就可以访问它,您可以运行Postgresql交互的终端程序,叫psql,它允许您交互地输入,编辑,和执行 sql 命令。(图形化登录请参见6. Postgresql图形化管理工具pgAdmin3)
5.1 激活数据库
xiaop@localhost~$ psql mydb
psql 程序有一些不属于 sql 命令的内部命令。 它们以反斜杠开头,"\"。 有些这种命令在欢迎信息中列出。比如,您可以用下面的命令获取各种Postgresql sql 命令的帮助语法:
mydb=> \h
要退出 psql,键入
然后 psql 就会退出并且给您返回到命令行 shell; (要获取更多有关内部命令的信息,您可以在 psql 提示符上键入 \?。)
mydb=> \q
6. Postgresql图形化管理工具pgAdmin3 ;
版本:Version1.4.3
6.1 安装;
6.1.1 Ubuntu安装 ;
有两种方法:
1.在新立得软件包管理器中搜索pgadmin3,找到pgadmin3--应用
2.终端下输入命令:
xiaop@xiaop-laptop:~$ sudo apt-get install pgadmin3
6.1.2 其它系统的安装;
您可以参考其它系统正常的软件的安装方法,起本类似,这里就不多做介绍了;
6.2 pgAdmin3的简单使用;
图形化管理系统相对比较直观,您可以在命令行下操作,然后在pgAdmin3下查看效果;
6.2.1 pgAdmin3的启动
您可以在应用程序---系统工具中找到pgAdmin3的启动项;
也可以在命令行下输入:
也可以在命令行下输入:
xiaop@xiaop-laptop:~$ /usr/bin/pgadmin3 start
6.2.2 连接已创建的数据库mydb ;
点击档案-----新增服务器,然后在跳出的窗口下输入:
点击确定后大家便可以查看postsql已有的数据库了;
注:pgAdmin3的数据库和终端下创建的数据库是完全同步的(可以用刷新查看效果), pgAdmin3是比较方便的图形化管理工具,它可以创建图表,管理数据库等,有关pgAdmin3的详细介绍我们在以后讨论,本文主要介绍命令行下的操作。图形化管理工具能做到的命令行都可以做到,您可以在命令行下创建表,在pgAdmin3上查看是否同步:
点击确定后大家便可以查看postsql已有的数据库了;
注:pgAdmin3的数据库和终端下创建的数据库是完全同步的(可以用刷新查看效果), pgAdmin3是比较方便的图形化管理工具,它可以创建图表,管理数据库等,有关pgAdmin3的详细介绍我们在以后讨论,本文主要介绍命令行下的操作。图形化管理工具能做到的命令行都可以做到,您可以在命令行下创建表,在pgAdmin3上查看是否同步:
7. 创建和删除表;
7.1 创建新表;
创建完数据库之后,您就可以创建新表了,可以通过声明表的名字和所有字段的名字及其类型来创建表,例如:
注:您可以在 psql 里连换行符一起键入这些东西。 psql 可以识别该命令直到分号才结束,不要忘记“;”
您可以在 sql 命令中自由使用空白(也就是空格,tab,和换行符)。 这就意味着您可以用和上面不同的对齐方式键入命令。 两个划线("--") 引入注释。 任何跟在它后面的东西直到该行的结尾都被忽略。 sql 是对关键字和标识符大小写不敏感的语言,只有在标识符用双引号包围时才能保留它们的大小写属性。
mydb#CREATE TABLE weather (
city varchar(80),
temp_lo int,-- 最低气温
temp_hi int,-- 最高气温
prcp real,-- 降水量
date date
);
您可以在 sql 命令中自由使用空白(也就是空格,tab,和换行符)。 这就意味着您可以用和上面不同的对齐方式键入命令。 两个划线("--") 引入注释。 任何跟在它后面的东西直到该行的结尾都被忽略。 sql 是对关键字和标识符大小写不敏感的语言,只有在标识符用双引号包围时才能保留它们的大小写属性。
7.2 数据类型;
上面例子中的varchar(80) 声明一个可以存储最长 80 个字符的任意字符串的数据类型。 int 是普通的整数类型。 real 是一种用于存储单精度浮点数的类型。 date 类型应该可以自解释。
Postgressql 支持标准的 sql 类型 int,smallint, real,double precision, char(N), varchar(N),date, time,timestamp 和 interval,还支持其他的通用类型和丰富的几何类型。 Postgresql 可以客户化为定制任意的用户定义的数据类型,您可以参考Postgresql的中文文档来查询;
Postgressql 支持标准的 sql 类型 int,smallint, real,double precision, char(N), varchar(N),date, time,timestamp 和 interval,还支持其他的通用类型和丰富的几何类型。 Postgresql 可以客户化为定制任意的用户定义的数据类型,您可以参考Postgresql的中文文档来查询;
7.3 删除表;
如果您不再需要某个表,或者您想创建一个不同的表,那么您可以用下面的命令删除它:
mydb#DROP TABLE tablename
8. 向表中添加行;
8.1 INSERT;
INSERT 用于向表中添加行,您可以输入(在数据库中操作):
注:所有数据类型都使用了相当明了的输入格式。 那些不是简单数字值的常量必需用单引号(')包围, 就象在例子里一样。
mydb#INSERT INTO weather VALUES ('San Francisco',46,50,0.25,'1994-11-27');
8.2 point类型输入;
point 类型要求一个座标对作为输入,如下:
mydb#INSERT INTO cities VALUES ('San Francisco','(-194.0,53.0)');
8.3 copY;
您还可以使用 copY 从文本文件中装载大量数据。 这么干通常更快,因为 copY 命令就是为这类应用优化的, 只是比 INSERT 少一些灵活性.比如:
注:weather.txt是您提前写好的符合格式标准的表格内容文档;
mydb#copY weather FROM '/home/user/weather.txt';
9.1 SELECT;
要从一个表中检索数据就是查询这个表。 sql 的 SELECT 就是做这个用途的。 该语句分为选择列表(列出要返回的字段部分),表列表(列出从中检索数据的表的部分), 以及可选的条件(声明任意限制的部分)。比如,要检索表 weather 的所有行,键入:
SELECT * FROM weather;
<code>
输出结果:
<code>
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)
您可以在选择列表中写任意表达式,而不仅仅是字段列表。比如,您可以:
这样应该得出:
请注意这里的 AS 子句是如何给输出字段重新命名的。(AS 子句是可选的。)
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)
9.2 WHERE;
一个查询可以使用 WHERE 子句"修饰",声明需要哪些行。 WHERE 子句包含一个布尔(真值)表达式,只有那些布尔表达式为真的行才会被返回。 允许您在条件中使用常用的布尔操作符(AND,OR, 和 NOT)。 比如,下面的查询检索旧金山的下雨天的天气:
结果:
mydb#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)
9.3 排序;
您可以要求返回的查询是排好序的:
得出结果:
在这个例子里,排序的顺序并非绝对清晰的,因此您可能看到 San Francisco 行随机的排序。 但是如果您使用下面的语句,那么就总是会得到上面的结果
您可以要求查询的结果按照某种顺序排序, 并且消除重复的行输出:
得出结果:
再次声明,结果行的顺序可能是随机的。
mydb#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
SELECT * FROM weather
ORDER BY city,temp_lo;
mydb#SELECT disTINCT city
FROM weather;
city
---------------
Hayward
San Francisco
(2 rows)
10. 视图;
进入数据库后输入:
建立视图;
mydb#CREATE VIEW myview AS
SELECT city,temp_lo,temp_hi,prcp,date,location
FROM weather,cities
WHERE city = name;
然后选择建好的视图:
SELECT * FROM myview;
结果如下:
city | temp_lo | temp_hi | prcp | date | location
---------------+---------+---------+------+------------+-----------
San Francisco | 46 | 50 | 0.25 | 1994-11-27 | (-194,53)
San Francisco | 43 | 57 | 0 | 1994-11-29 | (-194,53)
(2 rows)
11. 更新行;
您可以用 UPDATE 命令更新现有的行。 假设您发现所有 11 月 28 日的温度计数都低了两度,那么您就可以用下面的方式更新数据:
看看数据的新状态:
结果为:
mydb#UPDATE weather
SET temp_hi = temp_hi - 2,temp_lo = temp_lo - 2
WHERE date > '1994-11-28';
SELECT * FROM weather;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 41 | 55 | 0 | 1994-11-29
Hayward | 35 | 52 | | 1994-11-29
(3 rows)
12. 删除行;