1、单关系查询
1)查询通式:
select 属性1,属性2,……
from 表
where P;(P是谓词)
尽管各子句必须以select、from、where的次序写出,但理解查询所代表的的最容易方式是运算的顺序来考察各子句:首先是from,然后是where,最后是select。
2)示例
# 查询表中所有属性
SELECT *FROM department;
# 查询表中的某些属性
SELECT dept_name FROM department;
SELECT dept_name,building FROM department;
SELECT budget FROM department;
# 想要去除重复时,可在select后加上distinct。
SELECT DISTINCT budget FROM department;
# where 子句允许我们选出那些在from子句的结果关系中满足特定谓词的元组
# (注:查询一个关系得到的结果是一个新的关系)
SELECT budget FROM department WHERE budget>=15;
3)结果截图
2、多关系查询
1)查询通式:
select 属性1,属性2,……
from 表1,表2,……
where P;(P是谓词)
2)示例:
SELECT department.dept_name,name,building
FROM department,instructor
WHERE department.dept_name = instructor.dept_name;
该示例的原理:
通过from子句定义了一个该子句中所列出关系上的笛卡尔积。它可以用集合理论来形式化地定义,但最好是通过迭代过程来理解,此过程可为from子句的结果产生关系元组。
for each 元组1 in 关系1(表1)
for each 元组2 in 关系2
……
for each 元组t in 关系t
把元组1,元组2,……元组t连接成单个元组m
把元组m加到结果关系中
然后从结果关系中查询满足谓词P的元组
笛卡尔积:
例如:关系1和关系2如下:
name | age | salary |
---|---|---|
smith | 34 | 7000 |
white | 25 | 8000 |
name | com | favorite |
---|---|---|
smith | unknow | football |
white | unknow | table ball |
那么这两个关系的笛卡尔积如下(结果是新的关系):
name | age | salary | name | com | favorite |
---|---|---|---|---|---|
smith | 34 | 7000 | smith | unknow | football |
smith | 34 | 7000 | white | unknow | table ball |
white | 25 | 8000 | smith | unknow | football |
white | 25 | 8000 | white | unknow | table ball |
3)结果:
3、自然连接运算(natural join)
1)定义:
它作用于两个关系,并产生一个关系作为结果。自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元组对。
例如:
name | age | salary |
---|---|---|
smith | 34 | 7000 |
white | 25 | 8000 |
name | com | favorite |
---|---|---|
smith | unknow | football |
black | unknow | table ball |
则结果为:
name | age | salary | name | com | favorite |
---|---|---|---|---|---|
smith | 34 | 7000 | smith | unknow | football |
2)通用形式:
select 属性1,……
from 关系1 natural join 关系2 …… natural join 关系t
where P
示例:
SELECT department.dept_name,name,building
FROM department NATURAL JOIN instructor;
结果是等价于(当且仅当department是instructor的参照):
SELECT department.dept_name,name,building
FROM department,instructor
WHERE department.dept_name = instructor.dept_name;
那么如何判断两个表之间的参照关系:
假设关系B中含有关系A的主码(属性),则B参照了A。这个属性在B上称作参照A的外码。关系B也称为外码依赖的参照关系,关系A称作外码的被参照关系。