select c.cno,c.cname,t.tname from course c ,teacher t where t.tno=c.tno
首先创建表course,sc,teacher表。
course表:
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`cno` varchar(10) NOT NULL,
`cname` varchar(20) DEFAULT NULL,
`tno` varchar(20) NOT NULL,
PRIMARY KEY (`cno`,`tno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('c001', 'J2SE', 't002');
INSERT INTO `course` VALUES ('c002', 'Java Web', 't002');
INSERT INTO `course` VALUES ('c003', 'SSH', 't001');
INSERT INTO `course` VALUES ('c004', 'Oracle', 't001');
INSERT INTO `course` VALUES ('c005', 'SQL SERVER 2005', 't003');
INSERT INTO `course` VALUES ('c006', 'C#', 't003');
INSERT INTO `course` VALUES ('c007', 'Javascript', 't002');
INSERT INTO `course` VALUES ('c008', 'DIV+CSS', 't001');
INSERT INTO `course` VALUES ('c009', 'PHP', 't003');
INSERT INTO `course` VALUES ('c010', 'EJB3.0', 't002');
sc表:
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
`sno` varchar(10) NOT NULL,
`cno` varchar(10) NOT NULL,
`score` int(11) DEFAULT NULL,
PRIMARY KEY (`sno`,`cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES ('s001', 'c001', '79');
INSERT INTO `sc` VALUES ('s001', 'c002', '83');
INSERT INTO `sc` VALUES ('s001', 'c003', '59');
INSERT INTO `sc` VALUES ('s002', 'c001', '81');
INSERT INTO `sc` VALUES ('s002', 'c002', '73');
INSERT INTO `sc` VALUES ('s003', 'c001', '82');
INSERT INTO `sc` VALUES ('s003', 'c002', '82');
INSERT INTO `sc` VALUES ('s004', 'c001', '61');
teacher表:
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`tno` varchar(10) NOT NULL,
`tname` varchar(20) DEFAULT NULL,
PRIMARY KEY (`tno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES ('t001', '刘阳');
INSERT INTO `teacher` VALUES ('t002', '谌燕');
INSERT INTO `teacher` VALUES ('t003', '胡明星');
1.inner join(内连接或等值连接) : 获取两个表中字段匹配关系的记录。
现在我们打算筛选出课程对应的教师名字,可以使用以下语句:
select c.cno,c.cname,t.tname from course c INNER JOIN teacher t on t.tno=c.tno
可以得到以下结果:
不过目前使用内连接的次数比较少,一般直接使用相同项相等即可。如上条SQL可以写为:
select c.cno,c.cname,t.tname from course c ,teacher t where t.tno=c.tno
2.left join(左连接) : 获取左表的所有记录,即使右表没有记录。
现在我们打算选出每科考试学生的平均成绩,可以使用以下语句:
SELECT c.cname,sc.avgs from course c LEFT JOIN (select cno,AVG(score) as avgs from sc GROUP BY cno) sc ON sc.cno=c.cno
运行后得出结果:
3.right join(右连接) : 与左连接相反。
现在,我们打算看看每个平均分对应的科目名字,可以使用以下语句:
SELECT c.cname,sc.avgs from course c RIGHT JOIN (select cno,AVG(score) as avgs from sc GROUP BY cno) sc ON sc.cno=c.cno
运行后得出结果:
4.inner Join后不添加任何条件(全连接):
我们运行以下SQL:
select c.cno,c.cname,t.tname from course c INNER JOIN teacher t
可以得到以下结果: