<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
>= 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 >= 15;
error:
syntax error at or near "where"
line 1: select * from student order by age
把“order by”子句放到“where”子句後面就不報錯了:
>= 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 > 14;
student_name | class_name
---------------+------------
吳二 | 初二(1)班
吳三 | 初二(2)班
王二 | 初二(3)班
吳二 | 初二(4)班