范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

关于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"); SQL92笛卡尔积(交叉连接)
  笛卡尔积是一个数学上的概念,表示如果存在 X,Y 两个集合,则 X,Y 的笛卡尔积记为 X * Y. 表示由 X,Y 组成有序对的所有情况。
  对应在 SQL 中,就是将两张表中的每一行进行组合。而且在连接时,可以没有任何限制,可将没有关联关系的任意表进行连接。
  这里拿学生表和班级表举例,在学生表中我们插入了20名学生的数据,课程表中插入三个班级。则学生和班级的笛卡尔结果就是将两表的每行数据一一组合,最后就是有 24 * 3 = 72 行的结果,如下图所示。
  并且需要知道的是,下面学习的外连接,自连接,等值连接等都是在笛卡尔积的基础上筛选得到的。
  对应的 SQL92 写法为:select * from Student, Class;
  等值连接(内连接)
  等值连接就是将两张表中都存在的列进行连接,具体来说就是 where 后面通过 = 进行筛选。
  比如查询 Student 和其所属 Class 信息的关系:SELECT * FROM Student as s, Class as c where s.class_id = c.id;
  非等值连接
  非等值连接就是将等值连接中的等号换成其他的过滤条件。
  比如这里查询每个班级的信息以及所属的班级类别。SELECT * FROM Class as c, ClassType t where c.number between t.minimum_number and maximum_number;
  外连接
  对于 SQL92 的外连接来说,在连接时会将两张表分为主表和从表,主表显示所有的数据,从表显示匹配到的数据,没有匹配到的则显示 None. 用 + 表示从表的位置。
  左外连接:左表是主表,右表时从表。SELECT * FROM Student as s , Class as c where s.class_id = c.id(+);
  右外连接:左表是从表,右表时主表。SELECT * FROM Class as c, Student as s  where c.id = s.class_id(+);
  注意 SQL92 中并没有全外连接。自连接
  自连接一般用于连接本身这张表,由于常见的 DBMS 都会对自连接做一些优化,所以一般在子查询和自连接的情况下都使用自连接。
  比如想要查询比1年1班人数多的班级:
  子查询:SELECT * FROM Class WHERE number > (SELECT number FROM Class WHERE name="1年1班");
  自连接:SELECT c2.* FROM Class c1, Class c2 WHERE c1.number < c2.number and c1.name = "1年1班";
  SQL99交叉连接SELECT * FROM Student CROSS JOIN Class;
  还可以对多张表进行交叉连接,比如连接 Student,Class,ClassType 三张表,结果为 24 * 3 * 3 = 216 条。
  相当于嵌套了三层 for 循环。
  自然连接
  其实就是 SQL92 中的等值连接,只不过连接的对象是具有相同列名,并且值也相同的内容。SELECT * FROM Student NATURAL JOIN CLASS;SELECT * FROM Student as s, Class as c where s.id = c.id;
  如果想用 NATURAL JOIN 时,建议为两表设置相同的列名,比如 Student 表中的班级列为 class_id, 则在 Class 表中,id 也应改为 class_id. 这样连接更合理一些。
  如果大家尝试,自然连接的话,会发现查出来的结果集为空,不要奇怪,下面说一下原因:
  这是因为,NATURAL JOIN 会自动连接两张表中相同的列名,而对于 Student 和 Class 两张表来说,id 和 name 在这两张表都是相同的,所以既满足 id 又满足 name 的行是不存在的。
  相当于 SQL 变成了这样SELECT * FROM Student as s, Class as c where s.id = c.id and s.name = c.name;ON 连接
  ON 连接其实对了 SQL92 中的等值连接和非等值连接:
  等值连接:SELECT * FROM Student as s JOIN Class as c ON s.class_id = c.id;  or  SELECT * FROM Student as s INNER JOIN Class as c ON s.class_id = c.id;
  非等值连接:SELECT * FROM Class as c JOIN ClassType t ON c.number between t.minimum_number and maximum_number;USING 连接
  和 NATURAL JOIN 很像,可以手动指定具有相同列名的列进行连接:SELECT * FROM Student JOIN Class USING(id);
  这时就解决了之前列存在重名,无法连接的情况。外连接
  左外连接: 左表是主表,右表时从表。SELECT * FROM Student as s LEFT JOIN Class as c on s.class_id = c.id; OR SELECT * FROM Student as s LEFT OUTER JOIN Class as c on s.class_id = c.id;
  右外连接:左表是从表,右表时主表。SELECT * FROM Student as s RIGHT JOIN Class as c on s.class_id = c.id; OR SELECT * FROM Student as s RIGHT OUTER JOIN Class as c on s.class_id = c.id;
  全外连接: 左外连接 + 右外的连接的合集SELECT * FROM Student as s FULL JOIN Class as c ON s.class_id = c.id;
  MySQL 中没有全外连接的概念。
  自连接:SELECT c2.* FROM Class c1 JOIN Class c2 ON c1.number < c2.number and c1.name = "1年1班"; SQL92 和 SQL99 的对比SQL92 中的等值连接(内连接),非等值连接,自连接对应了 SQL99 的 ON 连接,用于筛选满足连接条件的数据行。SQL92 的笛卡尔积连接,对应了 SQL99 的交叉连接。SQL92 中的外连接并不包含全外连接,而 SQL99 支持,并且将 SQL92 中 WHERE 换为 SQL99 的 ON. 这样的好处可以更清晰的表达连接表的过程,更直观。SELECT ... FROM table1 JOIN table2 ON filter_condition JOIN table3 ON filter_conditionSQL99 多了自然连接和 USING 连接的过程,两者的区别是是否需要显式的指定列名。总结
  我们知道,在 SQL 中,按照年份划分了不同的标准,其中最为常用的是 SQL-92 和 SQL-99 两个标准。
  接着,对比了 92 和 99 两者的不同,发现 99 的标准在连接时,更加符合逻辑并且更加直观。
  最后,上一张各种连接的示意图, 方便梳理复习:

曝三年不卡顿红米Note12Pro,Note11让路在即,彻底价格边缘曝光小金刚再创新奇迹红米Note12Pro水桶旗舰这款机型将会搭载天玑8000处理器,曝光小金刚再创新奇迹红米Note12Pro水桶旗舰仅次于天玑8100处理器,曝光小金刚再创新奇总结了11种Numpy的高级操作01数组上的迭代NumPy包含一个迭代器对象numpy。nditer。它是一个有效的多维迭代器对象,可以用于在数组上进行迭代。数组的每个元素可使用Python的标准Iterator20002500左右手机第一款一加ace这款手机搭载120hz柔性OLED屏幕,720hz采样率。同时采用了定制超晶石墨材料,散热性能提升60性能方面这款手机采用了定制版的天机8100max处理器相比天机健康宝弹窗4,核酸检测0天,怎么办?主要健康宝技术太落后,信息为什么不及时同步?怕方便了大众?信息不实时同步,不讲科学,人为设障,强烈要求健康宝科学管理,实时高效,方便大众生活,不蛮干赞那是因为您在345第二轮连续核大家说,小区做核酸喇叭在楼下叫,但楼上有人就不下来怎么办?不做核酸,健康吗会变色或者弹窗,政府会有办法的得意规划不行,累死三军。5G时代,在电信营业厅部门配合下,政府完全可以做到精准通知,精准复核检测结果。比如规定两天一次核酸,没有结果上听无损音乐不再难,TEAC505X解码器,让网络音乐全HIFI早在2013年左右,我就开始接触无损音乐。使我着迷的是,无损音乐可以听到一首歌曲的另一面。细腻且丝丝入扣的扫弦,鼓锤在鼓面跳跃式的击打,还有犹如在你耳边曼妙动听的人声。这都是我从来我想知道头条上那些月薪上万,年薪百万是真实的吗?哈尔滨也是如此吗?哈尔滨,打工百万的没见过,月薪过万的周围很不少,接触的都是设计岗。上百万年薪的没接触过,但是月薪上万的,真的不少,不说别的,我所在的恒大某小区,保安经理月薪都八千多。他上面还有项目华为4年招募22名天才少年,其中6席华科,4席西交,清北仅3席快讯华为2019年宣布全球招募天才少年以来已有20名加入,近日,根据西交大的官方通告,西交大两位博士成功加入选华为天才少年计划,并在4月24日举行签约仪式。至此,我们可以看到华为已2022年五一假期全国邮政快递业揽投快递包裹28。1亿件来源国家邮政局网站国家邮政局监测数据显示,2022年五一假期(4月30日5月4日),全国邮政快递业运行平稳,揽收快递包裹13。4亿件,同比增长2。3投递快递包裹14。7亿件,同比增刘强东明州案全网最深度挖掘近日,强东的案件又被翻了出来,孰是孰非,让我们先来还原下三年前的案件是怎样的?案件回溯2018年8月30日晚,在美国的一家名叫OrigamiRestaurant的日本料理店里,京东你第一次意识到知识产权的重要性是怎么时候?2004年第一次办理专利诉讼案件,当时的办案法官办案律师,当然也包括我自己,对于专利知识的熟悉程度,还不如当事人负责专利事务经理,惭愧啊!但那时才知道知识产权对企业的重要性。第一次
AirPods系统大更新推出丨苹果宣布彻底淘汰这几件产品苹果过时产品更新苹果会在一款产品发布了很长时间后,将其加入过时产品清单,此类产品苹果将不再有资格在天才吧或苹果授权服务提供商那里维修。而在近日,苹果将AA电池充电器和第三代AppliPhone13P50Mate40小米11Ultra硬件成本分析,谁最良心?近日,有机构拆解了iPhone13Pro256GB版,然后分析出了iPhone13Pro256GB的硬件成本约为570美元(约合人民币3674元左右)。考虑到iPhone13Pro找到了!掀起华为nova9Pro手机抢购潮的原因!前后双景录像拍摄YYDS终于迎来了十一小长假,这对于工作多时的我来说必须来一场说走就走的旅行,当然在旅行时最必不可少的一定是记录美景美食和美美自己的工具了。刚刚入手的华为nova9Pro手机正是我记录生活老外拆解iPhone13,供应商名单被确定,没有一款核心芯片来自中国此前,有日本媒体联合日本工程师对华为旗下的一款5G手机华为Mate40E进行了拆解,统计数据显示,国产零部件在华为Mate40E中占比达到了56。6,这算是目前国产化最高的一款旗舰南卡A2主动降噪真无线体验全面升级性价比依旧时隔一年半,当下的真无线耳机市场,已经进入全民降噪的时代,南卡终于也更新了旗下主动降噪系列真无线耳机A2,在配置加量的同时,售价变得更为亲民,整机拥有40dB降噪深度无线充电长续航藏于枕底,温馨助眠南卡枕中宝真骨传导蓝牙音箱不知道你们听没听过一句话人的一生中有将近13的时间在睡眠中度过。梦洁在几个月前发布了一份2020年中国人睡眠质量报告。在报告中写明近3亿中国人睡眠质量差,67。24的人出现失眠症状联想电脑Windows10升级Windows11全攻略一支持升级Windows11机型列表可以通过以下链接查看支持升级Windows11的消费机型httpstools。lenovo。com。cndocdetailid1946html,曝三星Flip3是否在报修范围由加速度计日志决定,Flip2沦为百元机据外媒报道,三星似乎对Flip3的虚假保修索赔采取了额外的预防措施,因为事实证明,新款旗舰翻盖手机正在记录所有基于加速度的自由落体事件。当客户希望提出保修索赔时,三星工程师可以参考2000元档最值得买的手机,钱要用在刀刃上今年的手机市场有点怪,尽管芯片有点缺,尽管使用骁龙888顶级旗舰的手机有点贵,但由于今年的次旗舰产品,如骁龙870,天玑1200的出现,还是让不少厂家推出不少价格在2K元档的高性能华为mate40Pro,估计是目前最保值的非ios手机,没有之一华为mate40Pro真保值,估计是目前为止最保值的安卓手机(或者说是鸿蒙系统手机)。我之前的这部mate40Pro用了8个月,是8256GB的版本,因为保护的很好,外观没有任何磕还有60天!小米12携5500mAh大电池上线,4nm处理器很受期待最近关于小米新机的消息不断,但是大家最关心的应该还是小米12,据悉,小米12将首发骁龙898,也就是高通最新的4nm,因为今年的骁龙888翻车事件,高通正处于风口浪尖,如果新的4n