用到的四个例子图表
Select 基本结构
语句格式:
SELECT [ALL | DISTINCT]<目标列表达式>[,<目标列表达式>]…#(select相当于投影运算)
FROM <表名或视图名>[,<表名或视图名>]
[WHERE <条件表达式>] #(where相当于选择运算)
[GROUP BY <列名1> #(进行分组)
[HAVING <条件表达式>]] #(选择符合条件的行)
[ORDER BY <列名2>[ASC | DESC]…] #(排序,ASC升序,DESC是降序,默认升序排列)
简单查询
最基本的查询语句:查询S表中性别为男的学生的学号和姓名
Select Sno,Sname
from S
where sex='男'; //等价于:π Sno,Sname (σ sex='男' (S))
更名操作:使用AS可以给列和表重命名。如下例
Select 学生表.sno as 学号,Sname as 姓名,Grade 成绩 //注:AS是可以省略的
from S 学生表,SC 课程表 //表也可以重命名
where 学生表.Sno=课程表.Sno and 学生表.SD='计算机';
//表重命名后,引用时一定要用新名称,这里不能再用S和SC
连接查询
如果涉及两个以上的表,则称为连接查询。
(1)检索选修了课程号为'C1'的学生号和学生姓名:
Select S.Sno,Sname
from S,SC
where S.Sno=SC.Sno and SC.Cno='C1';
//π S.Sno,Sname (σ S.Sno=SC.Sno∧SC.Cno='C1' (S×SC))
(2)检索选修课程名为“操作系统”的学生号和学生姓名:
Select S.Sno,Sname
from S,SC,C
where S.Sno=SC.Sno and SC.Cno=C.Cno and C.Cname='操作系统';
(3)检索至少选修了课程号为“C1”和“C3”的学生号:(同一张表的自连接)
Select Sno
from SC SC_X,SC SC_Y
where SC_X.Sno=SC_Y.Sno and SC_X.Cno='C1' and SC_Y.Cno='C3';
子查询
子查询也称嵌套查询。嵌套查询是指一个SELECT-FROM-WHERE查询块中可以嵌入另一个查询块之中。在SQL中允许多重嵌套。
• IN(在……集合中) | NOT IN(不在……集合中)
例:(1)检索选修了课程号为'C1'的学生号和学生姓名:
Select Sno,Sname
from S
where Sno IN (Select Sno
from SC
Where Cno='C1');
(2)检索选修课程名为“操作系统”的学生号和学生姓名:
Select Sno,Sname
from S
where Sno IN (Select Sno
from SC
Where Cno IN (Select Cno
From C
Where Cname='操作系统'));
EXISTS(存在) | NOT EXISTS(不存在)
• 例:查询没有被任何同学选修的课程号和课程名
• Select Cno,Cname from C
where NOT EXISTS (select * from SC where SC.Cno=C.Cno)
聚集函数
• 聚集函数是一个值的集合为输入,返回单个值的函数。SQL提供了5个预定义集函数:
平均值AVG()、最小值MIN()、最大值MAX()、求和SUM()、计数COUNT()。