本文主讲数据查询中的 连接查询 和 嵌套查询(部分),欢迎阅读~
📋目录
一、连接查询
连接查询: 同时涉及两个及以上的表的查询
- 连接条件: 用来连接两个表的条件
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
比如:Student.Sno = SC.Sno
- 连接字段: 连接条件中的列名称
如:Sno就是上面例子中的连接字段
(ps:连接字段类型必须是可比的,但名字不必相同)
1. 等值与非等值连接查询
当连接运算符为=
时,称为等值连接;使用其他运算符称为非等值连接。
等值连接: 连接运算符为 =
🌟来看例子: 查询每个学生及其选修课程的情况:
SELECT Student.*, SC.*
FROM Student, SC
WHERE Student.Sno = SC.Sno;
- 关系代数中的等值连接:Student ⋈ S t u d e n t . S n o = S C . S n o \underset{Student.Sno = SC.Sno}\Join Student.Sno=SC.Sno⋈SC
(这里为了省事儿,SELECT Student.*, SC.*
可简写为SELECT *
)
如图等值连接即直接把两个表拼在一起了,会有重复的列,如图中的Sno,一会儿要写的自然连接就是去掉了重复列。
- 这里如果不写条件即没有WHERE条件表达式,则打印出的是两个表的笛卡尔积(如下图,列数即两表的列数之和,行数即两表的行数之积,所以有10*9=90个元组,5+3=8个属性列)
自然连接
🌟来看例子: 用自然连接完成上面的那个例子:(即去掉重复列Sno)
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student, SC
WHERE Student.Sno = SC.Sno;
一条SQL语句可以同时完成选择和连接查询
🌟来看例子: 查询选修2号课程且成绩在80分以上的所有学生的学号和姓名:
SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno = SC.Sno AND
SC.Cno = '2' AND SC.Grade > 80;
SELECT *
FROM Student, SC
WHERE Student.Sno = SC.Sno; /*把总的打印出来对照*/