PostgreSQL修炼之道:从小工到专家. 3.4 查询语句

3.4 查询语句

3.4.1 单表查询语句

查询student表中所有数据的语句为:

select no, student_name, age from student;

其中“SELECT”是关键字,表示要查询,后面跟多个列名,各列之间使用逗号分隔。其后的“FROM”是关键字,后面跟表的名称。各个列可以是表的列名,也可以是一个表达式,如下:

select age+5 from student;

表达式中可以包括表的列,也可以只是一个与表列无关的表达式,如下:

select no, 3+5 from student;

当表达式与表的列无关时,在PostgreSQL和MySQL中可以不使用“FROM 表名”,这样一来,就可以当作计算器使用了:

osdba=# select 55+88;

 ?column?

----------

     
143

(1 row)

 

osdba=# select 10*2,3*5+2;

 ?column? | ?column?

----------+----------

      
20 |       17

(1 row)

如果想查询表中所有列的数据,则可以使用“*”代表所有列,如下:

select * from student;

3.4.2 过滤条件的查询

SELECT语句后面可以通过指定WHERE子句来指定要查询哪条记录或哪些记录。比如,要查询学号为3的记录,其SQL语句为:

osdba=# SELECT * FROM student where no=3;

 no |
student_name | age

----+--------------+-----

  3 |
王明充        |  13

(1 row)

在WHERE条件中也可以使用大于、小于的表达式。比如,想查询年龄大于等于15岁的学生,其语句如下:

osdba=# SELECT * FROM student where age
>= 15;

 no |
student_name | age

----+--------------+-----

  1 |
张三         |  15

  2 |
李四         |  15

(2 rows)

3.4.3 排序

使用排序子句可以对查询出的数据进行排序,排序子句是在SELECT语句后面再加上“ORDER BY”子句。比如,希望查询出来的结果按年龄排序,则查询语句如下:

osdba=# SELECT * FROM student ORDER BY age;

 no |
student_name | age

----+--------------+-----

  3 |
王明充        |  13

  1 |
张三          |  15

  2 |
李四          |  15

(3 rows)

排序子句“ORDER BY”应该在“WHERE”子句之前,如果顺序错了,会报错:

osdba=# SELECT * FROM student ORDER BY age
WHERE age >= 15;

ERROR: 
syntax error at or near "WHERE"

LINE 1: SELECT * FROM student ORDER BY age
WHERE age >= 15;

把“ORDER BY”子句放到“WHERE”子句后面就不报错了:

osdba=# SELECT * FROM student WHERE age
>= 15 ORDER BY age;

 no |
student_name | age

----+--------------+-----

  1 |
张三                |  15

  2 |
李四          |  15

(2 rows)

还可以按多个列进行排序。比如,根据“age”和“student_name”两个列来排序:

osdba=# SELECT * FROM student ORDER BY
age,student_name;

 no |
student_name | age

----+--------------+-----

  3 |
王明充        |  13

  2 |
李四          |  15

  1 |
张三          |  15

(3 rows)

也可以在排序子句的列名后加“DESC”进行倒序排序:

osdba=# SELECT * FROM student ORDER BY age
DESC;

 no |
student_name | age

----+--------------+-----

  1 |
张三          |  15

  2 |
李四         |  15

  3 |
王明充        |  13

(3 rows)

 

osdba=# SELECT * FROM student ORDER BY age
DESC,student_name;

 no |
student_name | age

----+--------------+-----

  2 |
李四          |  15

  1 |
张三          |  15

  3 |
王明充        |  13

(3 rows)

3.4.4 分组查询

如果需要统计不同年龄的学生人数,可以使用分组查询,分组查询子句的关键字为“GROUP BY”,用法如下:

osdba=# SELECT age, count(*) FROM student
GROUP BY age;

 age
| count

-----+-------

  15
|     2

  13
|     1

(2 rows)

从上面可以看出,使用“GROUP BY”语句时,需要使用聚合函数,常用的聚合函数为“count”、“sum”等。

3.4.5 表join

表join也称为多表关联查询。假设有一张班级表class,建表语句为:

CREATE TABLE class(no int primary key,
class_name varchar(40));

表中的“no”表示班级编号,“class_name”表示班级名称。

插入一些测试数据:

osdba=# INSERT INTO class VALUES(1,'初二(1)班');

INSERT 0 1

osdba=# INSERT INTO class VALUES(2,'初二(2)班');

INSERT 0 1

osdba=# INSERT INTO class VALUES(3,'初二(3)班');

INSERT 0 1

osdba=# INSERT INTO class VALUES(4,'初二(4)班');

INSERT 0 1

osdba=# SELECT * FROM class;

 no |
class_name

----+------------

  1 |
初二(1)班

  2 |
初二(2)班

  3 |
初二(3)班

  4 |
初二(4)班

(4 rows)

还有另一张学生表student,建表语句为:

CREATE TABLE student(no int primary key,
student_name varchar(40), age int, class_no int);

也插入一些数据:

osdba=# INSERT INTO student VALUES(1, '张三', 14, 1);

INSERT 0 1

osdba=# INSERT INTO student VALUES(2, '吴二', 15, 1);

INSERT 0 1

osdba=# INSERT INTO student VALUES(3, '李四', 13, 2);

INSERT 0 1

osdba=# INSERT INTO student VALUES(4, '吴三', 15, 2);

INSERT 0 1

osdba=# INSERT INTO student VALUES(5, '王二', 15, 3);

INSERT 0 1

osdba=# INSERT INTO student VALUES(6, '李三', 14, 3);

INSERT 0 1

osdba=# INSERT INTO student VALUES(7, '吴二', 15, 4);

INSERT 0 1

osdba=# INSERT INTO student VALUES(8, '张四', 14, 4);

INSERT 0 1

osdba=# SELECT * FROM student;

 no |
student_name | age | class_no

----+--------------+-----+----------

  1 |
张三          |  14 |       
1

  2 |
吴二          |  15 |       
1

  3 |
李四          |  13 |       
2

  4 |
吴三          |  15 |       
2

  5 |
王二          |  15 |       
3

  6 |
李三          |  14 |       
3

  7 |
吴二          |  15 |       
4

  8 |
张四          |  14 |       
4

若现在想查询出每个学生与班级的关系,那么此时就需要关联查询两张表:

SELECT student_name, class_name FROM
student, class

 WHERE student.class_no = class.no;

查询出来的结果如下:

osdba=# SELECT student_name, class_name
FROM student, class

 WHERE student.class_no = class.no;

 student_name | class_name

--------------+------------

 张三          | 初二(1)班

 吴二          | 初二(1)班

 李四          | 初二(2)班

 吴三          | 初二(2)班

 王二          | 初二(3)班

 李三          | 初二(3)班

 吴二          | 初二(4)班

 张四          | 初二(4)班

(8 rows)

表关联查询就是在WHERE条件上加上需要关联的条件(两张表关联):

WHERE student.class_no = class.no;

由于在两张表中,有一些列的名称是重复的,如在表student中no表示学生号,而在表class中表示班级号,所以在关键条件中要明确使用“表名”加“列名”来唯一定位这个列。如果输入的表名比较长,不是很方便,这时可以给表起个别名,如下所示:

SELECT student_name, class_name FROM
student a, class b

 WHERE a.class_no = b.no;

上面的语句中,给表“student”起的别名为“a”,表“class”的别名为“b”,这时条件表达式中“b.no”就代表了表“class”中的“no”列。

在关联查询的WHERE子句中可以再加上其他的过滤条件,如下:

osdba=# SELECT student_name, class_name
FROM student a, class b

 WHERE a.class_no = b.no AND a.age > 14;

 
student_name | class_name

---------------+------------

  吴二          | 初二(1)班

  吴三          | 初二(2)班

  王二          | 初二(3)班

  吴二          | 初二(4)班

(4 rows)

时间: 2024-09-19 09:24:13

PostgreSQL修炼之道:从小工到专家. 3.4 查询语句的相关文章

PostgreSQL修炼之道:从小工到专家

数据库技术丛书 PostgreSQL修炼之道:从小工到专家 唐成著             图书在版编目(CIP)数据 PostgreSQL修炼之道:从小工到专家/唐成著. -北京:机械工业出版社,2015.4 (数据库技术丛书) ISBN 978-7-111-49872-8 I. P- II. 唐- III. 关系数据库系统 IV. TP311.132.3 中国版本图书馆CIP数据核字(2015)第063966号 PostgreSQL修炼之道:从小工到专家 出版发行:机械工业出版社(北京市西城

PostgreSQL修炼之道:从小工到专家. 导读

  数据库技术丛书 PostgreSQL修炼之道:从小工到专家   为什么要写这本书 PostgreSQL数据库是目前功能最强大的开源数据库,它基本包含了其他所有商业或开源的数据库中能找到的功能,甚至还包含了一些商业数据库中没有的功能.它是最接近工业标准SQL92的查询语言,并且正在实现新的功能以兼容最新的SQL标准:SQL2003.PostgreSQL也获得数个奖项,曾三次被评为Linux Journal杂志编辑评选的"最佳数据库奖"(2000年.2003年和2004年),并获200

PostgreSQL修炼之道:从小工到专家. 3.1 SQL语句语法简介

3.1 SQL语句语法简介 3.1.1 语句的分类 SQL命令一般分为DQL.DML.DDL几类. DQL:数据查询语句,基本就是SELECT查询命令,用于数据查询. DML:Data Manipulation Language的简称,即数据操纵语言,主要用于插入.更新.删除数据,所以也分为INSERT.UPDATE.DELETE三种语句. DDL:Data Definition Language的缩写,即数据定义语言,主要用于创建.删除,以及修改表.索引等数据库对象语言. 3.1.2 词法结构

PostgreSQL修炼之道:从小工到专家. 1.2 PostgreSQL数据库与其他数据库的对比

1.2 PostgreSQL数据库与其他数据库的对比 1.2.1PostgreSQL与MySQL数据库的对比 可能有人会问,既然已经有一个人气很高的开源数据库MySQL了,为什么还要使用PostgreSQL?这主要是因为在一些应用场景中,使用MySQL有以下几个缺点: 功能不够强大:MySQL的多表连接查询方式只支持"Nest Loop",不支持"hash join"和"sort merge join".不仅如此,还有很多SQL语法它也不支持,子

PostgreSQL修炼之道:从小工到专家. 2.2 从源码安装

2.2 从源码安装 2.2.1 编译安装过程介绍 这里先把大致的安装过程介绍一下. 第一步:下载源代码. 第二步:编译安装.过程与Linux下其他软件的编译安装过程相同,都是"三板斧": ./configure make make install 第三步:编译安装完成后执行如下步骤. 1)使用initdb命令初使用化数据库簇. 2)启动数据库实例. 3)创建一个应用使用的数据库. 数据库簇是指数据库实例管理的系统文件和各个数据库文件的一个集合. 2.2.2 下载源代码 打开Postgr

PostgreSQL修炼之道:从小工到专家. 2.1 从发行版本安装

2.1 从发行版本安装 2.1.1 在Debian或Ubuntu下的安装 在Debian和Ubuntu下一般使用apt-get命令或aptitude命令来安装软件,命令如下: sudo apt-get install postgresql 安装完毕后,PostgreSQL数据库就启动了,如果想进入数据库,需要切换到postgres用户下: su - postgres 然后使用psql连接到数据库中,从操作系统下的"postgres"用户(注意这里指的不是数据库中的postgres用户)

PostgreSQL修炼之道:从小工到专家. 1.3 小结

1.3 小结 本章主要给大家介绍了什么是PostgreSQL数据库,它有哪些强大的功能,以及目前的一些应用情况,以便大家对PostgreSQL有一个初步的认识.

PostgreSQL修炼之道:从小工到专家. 2.4 PostgreSQL的简单配置

2.4 PostgreSQL的简单配置 本节将简单介绍PostgreSQL的配置方法,更具体的配置操作会在后面的章节中介绍.PostgreSQL数据库的配置主要是通过修改数据目录下的postgresql.conf文件来实现的. 2.4.1 修改监听的IP和端口 在数据目录下编辑postgresql.conf文件,找到如下内容: #listen_addresses = 'localhost'         # what IP address(es) to listen on; #port = 5

PostgreSQL修炼之道:从小工到专家. 2.5 小结

2.5 小结 本章讲解了PostgreSQL在不同平台下的二进制安装方法,以及从源代码进行安装的方法.从前面的叙述中可以看出,在多数Linux发行版本中都自带了PostgreSQL的二进制安装包,可以直接使用Linux发行版本中的包管理器进行安装.不过这些自带的PostgreSQL版本都比较旧,如果想安装较新的PostgreSQL版本,可以从源代码进行编译安装.源代码编译安装也比较简单,要注意的是,需要先把一些依赖的开发包安装上.