-1、SQL脚本
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `clazz`
-- ----------------------------
DROP TABLE IF EXISTS `clazz`;
CREATE TABLE `clazz` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`cname` varchar(30) NOT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of clazz
-- ----------------------------
-- ----------------------------
-- Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sid` int(11) NOT NULL AUTO_INCREMENT,
`sname` varchar(30) NOT NULL,
`sage` varchar(3) NOT NULL,
`cid` int(11) NOT NULL,
PRIMARY KEY (`sid`),
KEY `student_clazz` (`cid`),
CONSTRAINT `student_clazz` FOREIGN KEY (`cid`) REFERENCES `clazz` (`cid`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
0、表数据
1、左外连接
左外连接,就是无论on中的条件满不满足,都保留左表所有数据
应用
要查询出所有班级的班级名称以及班级内的学生数。
查询语句如下:
select cname 班级,count(sname) 总人数 from clazz left join student on (clazz.cid = student.cid) group by clazz.cid
结果:
2、右外连接
右外连接,即无论on中的条件满不满足,都保留右表所有数据
应用
查询出所有学生信息,如果学生信息中没有班级编号,则显示“无设置班级”。
查询语句如下:
select sname, if(isnull(cname),'无班级设置',cname) 班级 from clazz right join student on (clazz.cid = student.cid)
结果
3、全外连接
全外连接,即无论on中的条件满不满足,都保留所有表所有数据
测试SQL
由于mysql不支持全外连接,所以此条语句只能在其他数据库中执行。
select * from clazz full outer join student on (clazz.cid = student.cid)
4、内连接
内连接,即只保留满足on条件的数据项,无匹配的数据项被剔除
测试SQL
select * from clazz inner join student on (clazz.cid = student.cid)