当前位置:早雪网网络学院编程文档数据库技术Postgresql → PostgreSQL7.0手册-教程 -72. 查询语言

PostgreSQL7.0手册-教程 -72. 查询语言

减小字体 增大字体 作者:不详  来源:supcode.com收集整理  发布时间:2005-7-23 12:22:38
 temp_avg, date FROM weather;
在任何查询条件中条件都可以使用任意布尔操作符(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 | 11-27-1994 |
+--------------+---------+---------+------+------------+
最后,你可以对 select 的结果排序输出或去除重复记录. 
SELECT DISTINCT city
    FROM weather
    ORDER BY city;

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

重新定向 SELECT 查询
任何 select 查询可以重定向到一个新表 
SELECT * INTO TABLE temp FROM weather;
这句话隐含一个 create 命令,创建一个有着与 select into 命令目标列表一样的字段的新表 temp.这样,我们可以象对其他表一样对生成的表做操作.

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

联接表
到此为止,我们一次只能对一个表进行查询.我们可以同时查询多个表,或者同时处理一个表的多个记录.一个同时访问一个或多个表的多个记录的查询叫连接查询.比如,我们想找出所有温度范围在其他记录的温度范围之内的记录.实际上,我们需要拿每个 EMP 记录的 temp_lo 和 temp_hi 字段和所有其他 EMP 记录的相应字段作比较. 
注意:这只是一个概念上的模型.实际的联合查询可以一种更有效的方式进行,但却是用户不可见的.
我们可以用下面的查询: 
SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,
    W2.city, W2.temp_lo AS low, W2.temp_hi AS high
    FROM weather W1, weather W2
    WHERE W1.temp_lo < W2.temp_lo
    AND W1.temp_hi > W2.temp_hi;

+--------------+-----+------+---------------+-----+------+
|city          | low | high | city          | low | high |
+--------------+-----+------+---------------+-----+------+
|San Francisco | 43  | 57   | San Francisco | 46  | 50   |
+--------------+-----+------+---------------+-----+------+
|San Francisco | 37  | 54   | San Francisco | 46  | 50   |
+--------------+-----+------+---------------+-----+------+
注意: 此连接查询的语意是要从查询里声明的表的笛卡儿乘积里面找出符合查询条件的所有记录。对笛卡儿乘积里面资格条件为真的记录, Postgres 计算并返回目标列表的所有值. PostgresSQL 并不对表达式中的重复值赋予任何特殊含义,这就意味着Postgres 有时候会若干次重复计算同一目标列表;这种情况在布尔表达式包含"or"时尤甚,为了避免重复,你应该使用 select distinct 语句.
在本例中,W1 和 W2 都是表 weather 的别名,都具有weather表的所有记录.在大多数数据库术语里 W1 和 W2 被看作是范围变量(range variables.) 一个查询可以包含任意数量的表名和别名.

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

更新
你可以使用 update 命令更新现有记录.例如你发现11月28日后所有温度记都偏高2度,你可以用下面命令更新数据库数据: 
UPDATE weather
    SET temp_hi = temp_hi - 2,  temp_lo = temp_lo - 2
    WHERE date > '11/28/1994';

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

删除
使用 DELETE 命令删除记录: 
DELETE FROM weather WHERE city = 'Hayward';
所有属于 Hayward 的天气记录都将被删除.我们进行下面查询操作时头脑应该很清醒: 
DELETE FROM classname;
在不带任何条件时,delete 将简单地把指定表中的所有记录都删除掉,而且做这些之前系统将不给出任何提示!

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

使用聚集函数
与其他大多数查询语言一样, PostgreSQL 支持聚集函数。一个聚集函数从多个输入行计算单一一个结果。例如,存在聚集函数对一个实例的集合进行 count(计数),sum(求和),avg(平均),max (最大),和 min (最小)的计算。 
理解聚集和 SQL 的 WHERE 和 HAVING 子句之间的相互作用是非常重要的。在 WHERE 和 HAVING 之间的基本差别是:WHERE 在分组和聚集计算之前选择输入行(因此,它控制哪一行进入聚集计算),而 HAVING 在分组和聚集计算之后选择分组行。因此 WHERE 子句可能不包含聚集函数;因为试图使用一个聚集来判断那些行需要输入到聚集函数中没有什么意义。另一方面,HAVING 子句总是包含聚集函数。(严格的说,你允许写一个不使用聚集的 HAVING 子句,不过是在浪费时间;相同的条件可以在 WHERE 阶段更有效地使用。) 

例如,我们可以用下面语句找出最高的最低温度 

SELECT max(temp_lo) FROM weather;
如我们想知道这个读数是在哪个城市发生的,我们可以 
SELECT city FROM weather WHERE temp_lo = max(temp_lo);
不过这样做是不行的,因为聚集 max() 不能在 WHERE 中使用。不过,正如经常见到的那样,我们可以重新排列查询以实现这样

上一页  [1] [2] [3]  下一页

[数据载入中...] [返回上一页] [打 印]