连接查询:若一次查询涉及两个或两个以上的表,称之为连接查询。
连接查询可以分为:
- 等值连接
- 非等值连接
- 自然连接
- 自身连接
- 外连接
- 复合条件连接
以下的例程,都以下面的三个表为例:
CREATE TABLE Student (
Sno INT(6) PRIMARY KEY, # 学号
Sname VARCHAR(20) NOT NULL, # 姓名
Ssex CHAR(2) NOT NULL, # 性别
Sage INT NOT NULL, # 年龄
Sdept VARCHAR(10) NOT NULL # 所在系
);
CREATE TABLE Course (
Cno INT PRIMARY KEY, # 课程号
Cname VARCHAR(40) NOT NULL, # 课程名
Cpno INT, # 先修课
Ccredit INT NOT NULL # 学分
);
CREATE TABLE SC (
Sno INT(6), # 学号
Cno INT, # 课称号
Grade INT # 得分
);
INSERT INTO Student VALUES (950001, '李大勇', '男', 20, 'CS');
INSERT INTO Student VALUES (950002, '刘晓晨', '女', 19, 'CS');
INSERT INTO Student VALUES (950003, '王敏', '女', 18, 'MA');
INSERT INTO Student VALUES (950004, '张成功', '男', 19, 'IS');
INSERT INTO Course VALUES (1, '数据库', 5, 4);
INSERT INTO Course (Cno, Cname, Ccredit) VALUES (2, '数学', 2);
INSERT INTO Course VALUES (3, '信息系统', 1, 4);
INSERT INTO Course VALUES (4, '操作系统', 6, 3);
INSERT INTO Course VALUES (5, '数据结构', 7, 6);
INSERT INTO Course (Cno, Cname, Ccredit) VALUES (6, '数据处理', 4);
INSERT INTO Course VALUES (7, 'C语言', 6, 4);
INSERT INTO SC VALUES (950001, 1, 90);
INSERT INTO SC VALUES (950001, 2, 88);
INSERT INTO SC VALUES (950001, 3, 79);
INSERT INTO SC VALUES (950002, 2, 93);
INSERT INTO SC VALUES (950002, 3, 80);
Student表
Course表
SC表
等值连接与非等值连接
等值连接:当连接的比较运算符为=时,则为等值连接
非等值连接:与等值连接相反
问题:查询每个学生的姓名及其选修课情况
SELECT Student.Sname,SC.Cno FROM Student,SC WHERE Student.Sno = SC.Sno;
自身连接
自身连接:连接操作在同一个表中进行,即自己连接自己
问题:查询每门课的间接选修课,即先修课的先修课:
SELECT A.Cno ,B.Cpno FROM Course AS A,Course AS B WHERE A.Cpno = B.Con;
注:在自身连接时,必须给同一个表取上不同的别名,以区分,不然无法完成自身连接
外连接
外连接可以分为:左外连接,右外连接,全外连接
CREATE TABLE A(
id int PRIMARY KEY ,
name VARCHAR(20) ,
score INT
);
INSERT INTO A VALUES (1,'zp',80);
INSERT INTO A VALUES (2,'hh',75);
INSERT INTO A VALUES (3,'ee',89);
INSERT INTO A VALUES (4,'rr',86);
CREATE TABLE B(
id INT PRIMARY KEY ,
type VARCHAR(20),
s INT
);
INSERT INTO B VALUES (1,'ll',10);
INSERT INTO B VALUES (2,'cc',20);
INSERT INTO B VALUES (3,'xx',30);
A表
B表
内连接:
SELECT * FROM A INNER JOIN B ON A.id = B.id;
结论:内连接只连接匹配的行
左外连接:
SELECT * FROM A LEFT JOIN B ON A.id = B.id;
结论:左外连接包含左表(A)的全部内容,包含右表(B)匹配的内容
右外连接
SELECT * FROM A RIGHT JOIN B ON A.id = B.id;
结论:右外连接包含右表(B)的全部内容,包含左表(A)匹配的内容
SELECT * FROM A FULL JOIN B ;
结论:全连接指将俩表的全部内容都连接起来,关于为何有12行,这与DBMS的连接实现有关:
我们可以将其想成两层的for循环,A表的第一行分别与B表的3行匹连接,然后是第二行,依次类推
复合条件连接
WHERE子句有多个连接条件,称为复合条件连接
例:查询选修了数据库课程且成绩在90分及以上的学生的学号和姓名
SELECT SC.Sno,Student.Sname FROM Student,SC,Course WHERE SC.Sno = Student.Sno AND SC.Cno=Course.Cno AND SC.Grade >= 90 AND Course.Cname = "数据库";