天天看點

PostgreSQL修煉之道:從小工到專家. 3.4 查詢語句

<b>3.4 查詢語句</b>

<b>3.4.1 單表查詢語句</b>

查詢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

如果想查詢表中所有列的資料,則可以使用“*”代表所有列,如下:

select * from student;

<b>3.4.2 過濾條件的查詢</b>

select語句後面可以通過指定where子句來指定要查詢哪條記錄或哪些記錄。比如,要查詢學号為3的記錄,其sql語句為:

osdba=# select * from student where no=3;

 no |

student_name | age

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

  3 |

王明充        |  13

在where條件中也可以使用大于、小于的表達式。比如,想查詢年齡大于等于15歲的學生,其語句如下:

osdba=# select * from student where age

&gt;= 15;

  1 |

張三         |  15

  2 |

李四         |  15

(2 rows)

<b>3.4.3 排序</b>

使用排序子句可以對查詢出的資料進行排序,排序子句是在select語句後面再加上“order by”子句。比如,希望查詢出來的結果按年齡排序,則查詢語句如下:

osdba=# select * from student order by age;

張三          |  15

李四          |  15

(3 rows)

排序子句“order by”應該在“where”子句之前,如果順序錯了,會報錯:

osdba=# select * from student order by age

where age &gt;= 15;

error: 

syntax error at or near "where"

line 1: select * from student order by age

把“order by”子句放到“where”子句後面就不報錯了:

&gt;= 15 order by age;

張三                |  15

還可以按多個列進行排序。比如,根據“age”和“student_name”兩個列來排序:

osdba=# select * from student order by

age,student_name;

也可以在排序子句的列名後加“desc”進行倒序排序:

desc;

desc,student_name;

<b>3.4.4 分組查詢</b>

如果需要統計不同年齡的學生人數,可以使用分組查詢,分組查詢子句的關鍵字為“group by”,用法如下:

osdba=# select age, count(*) from student

group by age;

 age

| count

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

  15

|     2

  13

|     1

從上面可以看出,使用“group by”語句時,需要使用聚合函數,常用的聚合函數為“count”、“sum”等。

<b>3.4.5 表join</b>

表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)班');

osdba=# insert into class values(3,'初二(3)班');

osdba=# insert into class values(4,'初二(4)班');

osdba=# select * from class;

class_name

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

初二(1)班

初二(2)班

初二(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);

osdba=# insert into student values(2, '吳二', 15, 1);

osdba=# insert into student values(3, '李四', 13, 2);

osdba=# insert into student values(4, '吳三', 15, 2);

osdba=# insert into student values(5, '王二', 15, 3);

osdba=# insert into student values(6, '李三', 14, 3);

osdba=# insert into student values(7, '吳二', 15, 4);

osdba=# insert into student values(8, '張四', 14, 4);

osdba=# select * from student;

student_name | age | class_no

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

張三          |  14 |       

1

吳二          |  15 |       

李四          |  13 |       

2

吳三          |  15 |       

  5 |

王二          |  15 |       

3

  6 |

李三          |  14 |       

  7 |

4

  8 |

張四          |  14 |       

若現在想查詢出每個學生與班級的關系,那麼此時就需要關聯查詢兩張表:

select student_name, class_name from

student, class

 where student.class_no = class.no;

查詢出來的結果如下:

osdba=# select student_name, class_name

from student, class

 student_name | class_name

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

 張三          | 初二(1)班

 吳二          | 初二(1)班

 李四          | 初二(2)班

 吳三          | 初二(2)班

 王二          | 初二(3)班

 李三          | 初二(3)班

 吳二          | 初二(4)班

 張四          | 初二(4)班

(8 rows)

表關聯查詢就是在where條件上加上需要關聯的條件(兩張表關聯):

where student.class_no = class.no;

由于在兩張表中,有一些列的名稱是重複的,如在表student中no表示學生号,而在表class中表示班級号,是以在關鍵條件中要明确使用“表名”加“列名”來唯一定位這個列。如果輸入的表名比較長,不是很友善,這時可以給表起個别名,如下所示:

student a, class b

 where a.class_no = b.no;

上面的語句中,給表“student”起的别名為“a”,表“class”的别名為“b”,這時條件表達式中“b.no”就代表了表“class”中的“no”列。

在關聯查詢的where子句中可以再加上其他的過濾條件,如下:

from student a, class b

 where a.class_no = b.no and a.age &gt; 14;

student_name | class_name

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

  吳二          | 初二(1)班

  吳三          | 初二(2)班

  王二          | 初二(3)班

  吳二          | 初二(4)班

繼續閱讀