数据库的连接查询

连接查询:若一次查询涉及两个或两个以上的表,称之为连接查询。

连接查询可以分为:

  • 等值连接
  • 非等值连接
  • 自然连接
  • 自身连接
  • 外连接
  • 复合条件连接

以下的例程,都以下面的三个表为例:

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 = "数据库";

这里写图片描述

发布了129 篇原创文章 · 获赞 203 · 访问量 45万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章