MySql——各类join的区别

select c.cno,c.cname,t.tname from course c ,teacher t where t.tno=c.tno

首先建立表course,sc,teacher表。sql

course表:3d

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表:code

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表:blog

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(内链接或等值链接) : 获取两个表中字段匹配关系的记录。ip

        如今咱们打算筛选出课程对应的教师名字,能够使用如下语句:class

select c.cno,c.cname,t.tname from course c INNER JOIN teacher t on t.tno=c.tno

        能够获得如下结果:select

        不过目前使用内链接的次数比较少,通常直接使用相同项相等便可。如上条SQL能够写为:im

select c.cno,c.cname,t.tname from course c ,teacher t where t.tno=c.tno

        2.left join(左链接) : 获取左表的全部记录,即便右表没有记录。d3

        如今咱们打算选出每科考试学生的平均成绩,能够使用如下语句:img

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

                能够获得如下结果:

 

相关文章
相关标签/搜索