本文中的样例来自pg的帮助文档。
首先还是介绍下pg,这是一个开源的关系型数据库,支持很多SQL特性,像复杂查询,外键约束,触发器,可更新视图,事务完整性,并发控制。同时,它还支持用户对其进行扩展,如添加数据类型,自定义函数、操作符、集合函数,索引方法,程序化处理语言。
pg的wiki查询,可以查阅相应的FAQ | pg的官网,可以下载安装包和相应的文档以及源码
学习版本PostgreSQL 9.4.1,OS为Windows 10 preview。
pg使用的是客户/服务器模式(C/S),一次pg的会话是由两个相互协调的进程组成的:
服务器进程
服务器进程管理数据库文件,接受来自服务的连接请求并代替客户端执行数据库操作。pg中的服务器程序是postgres。客户端进程
客户端是指想要执行数据库操作的应用程序,也叫做前端。实际使用中,可以被叫做客户端的程序有很多,比如一个命令行操作工具,一个图像应用程序,一个需要访问数据库用于显示页面的web服务器,或者一个专用的数据库维护工具。
比较适合学习pg的方式是使用SQL Shell(psql)这个pg为我们提供命令行工具,可以通过SQL语句进行数据库操作的实现,而不用进入pgAdmin III。
1.创建数据库
SQL:create database mydb;
要记住psql中输入SQL语句之后要在末尾输入分号;
,否则会被作为一个不完整的SQL语句,psql会继续在新一行等待用户的输入,而不会执行该语句。执行效果如下,会给出CREATE DATABASE
的反馈。
2.删除数据库
SQL:drop database mydb;
tips:psql的进入:,打开psql后一直回车,[...]
中的内容为默认参数,即可进入服务器为[localhost]
,数据库为默认数据库[postgres]
,端口号为安装时设置的端口[5432]
,用户名为默认用户[postgres]
的数据库。若需要访问刚刚创建的mydb,可以重启psql,在Database参数处输入mydb,继续回车,如下图。
psql的帮助为\h
,退出为\q
(\q
也可以用于在帮助中退出,当帮助显示的太多以--More--
显示时,可以使用\q
退出帮助提示)。
3.创建表
SQL:create table weather(
city varchar(80),
temp_lo int, -- low temperature
temp_hi int, -- high temperature
prcp real, -- precipitation
date date
);
create table cities(
name varchar(80),
location_x real,
location_y real
);
SQL中使用--
作为行注释开头,表示接下来的部分为注释。
4.向表添加记录
全填充方式:
SQL:insert into weather values('San Francisco', 46, 50, 0.25, '1994-11-27');
insert into cities values('San Francisco', -194.0, 53.0);
选择填充:
SQL:insert into weather (date, city, temp_hi, temp_lo)
values('1994-11-29', 'Hayward', 54, 37);
5.查询1
选择weather表的全部数据
SQL:select * from weather;
select * from cities;
从weather表查询城市每一天的平均气温和日期
SQL:select city, (temp_lo + temp_hi)/2 as temp_avg, date from weather;
语句as
可以用于起别名,用于显示在查询结果之中。
查询weather中记录的所有城市名
SQL:select distinct city from weather;
连接查询
SQL:select * from weather, cities where city = name;
等同于上述语句的内连接
SQL:select * from weather inner join cities on (weather.city = cities.name);
6.表信息查看
表定义:\d weather;
将显示字段的定义,修饰词,约束信息。
查看当前数据库中用户已创建的表的名称
SQL:select tablename from pg_tables
where tablename not like 'pg_%' and tablename not like 'sql_%';
查看所有已创建的数据库名称
SQL:select datname from pg_database
where datname not like 'template%';