关于 JOIN 耐心总结,学不会你打我系列

现在随着各种数据库框架的盛行,在提高效率的同时也让我们忽略了很多底层的连接过程,这篇文章是对 SQL 连接过程梳理,并涉及到了现在常用的 SQL 标准 。

其实标准就是在不同的时间,制定的一些写法或规范 。
从 SQL 标准说起在编写 SQL 语句前,需要先了解在不同版本的规范,因为随着版本的变化,在具体编写 SQL 时会有所不同 。对于 SQL 来说,SQL92 和 SQL99 是最常见的两个 SQL 标准,92 和 99 对应其提出的年份 。除此之外,还存在 SQL86、SQL89、SQL2003、SQL2008、SQL2011,SQL2016等等 。
但对我们来说,SQL92 和 SQL99 是最常用的两个标准,主要学习这两个就可以了 。
为了演示方便,现在数据库中加入如下三张表:
每个学生属于一个班级,通过班级的人数来对应班级的类型 。
-- ----------------------------DROP TABLE IF EXISTS `Student`;CREATE TABLE `Student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL DEFAULT '',`birth` varchar(20) NOT NULL DEFAULT '',`sex` varchar(10) NOT NULL DEFAULT '',`class_id` int(11) NOT NULL COMMENT '班级ID',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;-- ------------------------------ Records of Student-- ----------------------------INSERT INTO `Student` VALUES ('1', '胡一', '1994.1.1', '男', '1');INSERT INTO `Student` VALUES ('3', '王阿', '1992.1.1', '女', '1');INSERT INTO `Student` VALUES ('5', '王琦', '1993.1.2', '男', '1');INSERT INTO `Student` VALUES ('7', '刘伟', '1998.2.2', '女', '1');INSERT INTO `Student` VALUES ('11', '张使', '1994.1.1', '男', '3');INSERT INTO `Student` VALUES ('13', '王阿', '1992.1.1', '女', '3');INSERT INTO `Student` VALUES ('15', '夏琪', '1993.1.2', '男', '3');INSERT INTO `Student` VALUES ('17', '刘表', '1998.2.2', '女', '3');INSERT INTO `Student` VALUES ('19', '诸葛', '1994.1.1', '男', '3');INSERT INTO `Student` VALUES ('21', '王前', '1992.1.1', '女', '3');INSERT INTO `Student` VALUES ('23', '王意识', '1993.1.2', '男', '3');INSERT INTO `Student` VALUES ('25', '刘等待', '1998.2.2', '女', '3');INSERT INTO `Student` VALUES ('27', '胡是一', '1994.1.1', '男', '5');INSERT INTO `Student` VALUES ('29', '王阿请', '1992.1.1', '女', '5');INSERT INTO `Student` VALUES ('31', '王消息', '1993.1.2', '男', '5');INSERT INTO `Student` VALUES ('33', '刘全', '1998.2.2', '女', '5');INSERT INTO `Student` VALUES ('35', '胡爱', '1994.1.1', '男', '5');INSERT INTO `Student` VALUES ('37', '王表', '1992.1.1', '女', '5');INSERT INTO `Student` VALUES ('39', '王华', '1993.1.2', '男', '5');INSERT INTO `Student` VALUES ('41', '刘伟以', '1998.2.2', '女', '5');INSERT INTO `Student` VALUES ('43', '胡一彪', '1994.1.1', '男', '5');INSERT INTO `Student` VALUES ('45', '王阿符', '1992.1.1', '女', '5');INSERT INTO `Student` VALUES ('47', '王琦删', '1993.1.2', '男', '5');INSERT INTO `Student` VALUES ('49', '刘达达', '1998.2.2', '女', '5');-- ------------------------------ Table structure for `Class`-- ----------------------------DROP TABLE IF EXISTS `Class`;CREATE TABLE `Class` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL DEFAULT '',`number` int(11) NOT NULL DEFAULT '',`class_type_id` int(11) NOT NULL COMMENT '班级类型ID',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- ------------------------------ Records of Class-- ----------------------------INSERT INTO `Class` VALUES ('1', '1年1班', 4, '1');INSERT INTO `Class` VALUES ('3', '1年2班', 8, '3');INSERT INTO `Class` VALUES ('5', '1年3班', 12, '5');CREATE TABLE `ClassType`(`id` int(11) NOT NULL AUTO_INCREMENT,`name` VARCHAR(20) NOT NULL DEFAULT '',`minimum_number` int(11) NOT NULL DEFAULT '' COMMENT '最少的班级人数',`maximum_number` int(11) NOT NULL DEFAULT '' COMMENT '最多的班级人数',PRIMARY KEY(`id`));INSERT INTO `ClassType` VALUES ('1', '小班', '1', '4');INSERT INTO `ClassType` VALUES ('3', '中班', '5', '8');INSERT INTO `ClassType` VALUES ('5', '大班', '9', '12');


推荐阅读