当前位置: 首页 > 科技观察

10分钟,带你彻底掌握SQL多表查询

时间:2023-03-12 02:15:20 科技观察

1.前言表查询,又称多表连接查询;作为关系型数据库的主要查询方式,在日常工作中得到了广泛的应用。常见的多表查询操作包括:子查询、内连接、左外连接、右外连接、全连接、交叉连接本文将通过一个例子来一一介绍这些操作。2、准备以Mysql数据库为例,创建两个数据表:student-学生表记录-选课记录表。其中student表id字段对应选课记录表中的student_id字段Sql如下:table:recordcreatetablerecord(idintnotnullprimarykey,namevarchar(255)notnull,student_idintnotnull,timedatetimenull)comment'选课记录';然后,往两张表中插入一些数据#学生表数据1,张三,182,李四,233,王五,304,马六,355,孙琦,406,朱巴,197,黄九,53#记录表数据2021001,中文,1,2021-01-1815:32:472021002,数学,2,2021-01-1815:33:412021003,英文,3,2021-01-1815:34:012021004,物理,4,2021-01-1815:34:332021005,体育,5,2021-01-1815:34:472021006,化学,8,2021-01-1815:35:122021007,生物学,9,2021-01-1815:35:392021008,music,10,2021-01-1815:36:003.1子查询子查询又称内查询,是嵌套在其他Sql查询的Where子句中的查询,一般用于进一步限定查询结果,返回所需资料;SELECT、INSERT、UPDATE、DELETE语句中都可以使用子查询这里以SELECT语句为例,在两个表中使用子查询过滤出满足条件的记录#subqueryselect*fromstudentwhereidin(selectstudent_idfromrecordwherestudent_id<=3)查询结果如下:#子查询的结果1,张三,182,李四,233,王五,30)需要注意的是,子查询一定要包含在括号中,并且ORDER不能使用BY排序3.2内连接内连接是通过关键字innerjoin连接两个表,只返回满足on条件的两个表的交集数据#Innerjoinselect*fromstudentsinnerjoinrecordrons.id=r.student_id;查询结果如下:#innerConnection查询结果1,张三,18,2021001,Chinese,1,2021-01-1815:32:472,李四,23,2021002,mathematics,2,2021-01-1815:33:413,王武,30,2021003,英语,3,2021-01-1815:34:014,马六,35,2021004,物理,4,2021-01-1815:34:335,孙琦,40,2021005,Sports,5,2021-01-1815:34:47需要注意的是,如果innerjoin不通过on关键字指定条件,则查询结果与crossjoin查询结果相同,但执行效率高于交叉连接3.3外连接外连接包括:左外连接右外连接其中,左外连接:使用关键字左连接,以左表为标准,返回所有左表的数据,右表所有满足on条件的数据都会显示,否则用空值填充右外连接:与左外连接相反。使用keyrightjoin,根据右表返回右表的所有数据,满足on条件的左表数据会显示出来,否则用空值填充先来看例子左连接#leftouterjoinselect*fromstudentsleftjoinrecordrons.id=r.student_id;返回结果如下:#Leftouterjoinresult1,张三,18,2021001,Chinese,1,2021-01-1815:32:472,李四,23,2021002,mathematics,2,2021-01-1815:33:413,王武,30,2021003,英语,3,2021-01-1815:34:014,马六,35,2021004,物理,4,2021-01-1815:34:335,孙琦,40,2021005,运动,5,2021-01-1815:34:476,猪八,19,NULL,NULL,NULL,NULL7,黄久,53,NULL,NULL,NULL,NULL然后我们看右边的连接#rightouterconnectionselect*fromstudentsrightjoinrecordrons.id=r.student_id;返回结果如下:#rightouterConnectionresult1,张三,18,2021001,Chinese,1,2021-01-1815:32:472,LiSi,23,2021002,mathematics,2,2021-01-1815:33:413,王武,30,2021003,English,3,2021-01-1815:34:014,MaLiu,35,2021004,Physics,4,2021-01-1815:34:335,SunQi,40,2021005,体育,5,2021-01-1815:34:47NULL,NULL,NULL,2021006,化学,8,2021-01-1815:35:12NULL,NULL,NULL,2021007,生物学,9,2021-01-1815:35:39NULL,NULL,NULL,2021008,Music,10,2021-01-1815:36:003.4完全连接完全连接是通过关键字fulljoin连接两张表,返回左边的所有数据表和右表,用空值填充缺失数据Data#fulljoinselect*fromstudentsfulljoinrecordrons.id=r.student_id;需要注意的是,Mysql不支持fulljoin,我们可以使用leftjoin+union+rightjoin来模拟fulljoin查询结果如下:#全连接结果1,张三,18,2021001,Chinese,1,2021-01-1815:32:472,李四,23,2021002,mathematics,2,2021-01-1815:33:413,WangWu,30,2021003,English,3,2021-01-1815:34:014,MaLiu,35,2021004,Physics,4,2021-01-1815:34:335,SunQi,40,2021005,体育,5,2021-01-1815:34:476,猪八,19,NULL,NULL,NULL,NULL7,黄九,53,NULL,NULL,NULL,NULLNULL,NULL,NULL,2021006,化学,8,2021-01-1815:35:12NULL,NULL,NULL,2021007,生物学,9,2021-01-1815:35:39NULL,NULL,NULL,2021008,音乐,10,2021-01-1815:36:003.5交叉连接交叉连接也称为笛卡尔积,使用关键字crossjoin将两个表连接起来进行查询。如果不使用where加限制,会返回两个表行数的乘积;如果添加限制条件,则返回将满足条件表达式的数据合并为一行。以限制条件的交叉连接查询为例#cross-connectselect*fromxag.studentasscrossjoinxag.recordasrwheres.id=r.student_id;查询结果如下:#cross-joinresult1,张三,18,2021001,Chinese,1,2021-01-1815:32:472,LiSi,23,2021002,Mathematics,2,2021-01-1815:33:413,王武,30,2021003,English,3,2021-01-1815:34:014,马六,35,2021004,物理,4,2021-01-1815:34:335,孙琦,40,2021005,Sports,5,2021-01-1815:34:47需要注意的是,如果交叉连接查询有限制条件,会先生成两个表行号生成查询结果集,再过滤通过限制性条件;因此,当数据量大的时候,查询速度会很快慢4.最后,多表查询相比单表查询,可以覆盖更多的业务场景,大大提高我们的工作效率!在实际工作中,大家可以根据自己的需要选择性地使用!