(MySQL笔记)SELECT语句的FROM⼦句详解
FROM⼦句是SELECT语句中最先开始处理的⼦句,FROM⼦句指定了要查询的表,表的后⾯可能还跟着⼀个别名。表可以直接是表名,也可以在前⾯加上数据库的名字。如:
SELECT studentNO FROM school.student AS S
笛卡尔积
FROM⼦句可以有⼀个表指定,也可以跟多个表指定,如从两张表⾥读取数据:
SELECT studentNO,laterNum FROM student,later
later是存放迟到信息的表,有学⽣学号(studentNO)和迟到次数(laterNum)两列。上⾯的查询语句中从student和later两张表中查询数据。
当FROM⼦句中指定两张表时,FROM⼦句返回⼀个中间结果集,这个中间结果集的列数等于两张表的列相加,⾏数等于两张表的⾏数相乘,这通常叫做相关两张表的笛卡尔积。如:
student表
studentNO name
--------- ----
1 张三
2 李四
3 王五
4 赵六
later表
studentNO laterNum
--------- --------
2 3
4 2
有student表和later表两张表,student表中存放了张三,李四,王五,赵六四个学⽣的信息,later表中存放的是学⽣迟到的次数,其中2号李四迟到3次,4号赵六迟到2次。那么
SELECT studentNO,laterNum FROM student,later
执⾏FROM⼦句后,FROM⼦句返回的中间结果集(笛卡尔积)如下:button重置按钮
studentNO name studentNO laterNum
--------- ---- --------- --------
1 张三
2 3
1 张三 4 2
2 李四 2 3
2 李四 4 2
3 王五 2 3
3 王五
4 2
4 赵六 2 3
4 赵六 4 2
FROM⼦句中表指定的顺序冰不影响FROM⼦句执⾏的结果,执⾏后的中间结果集是⼀样的。
表的联接
SELECT studentNO,laterNum FROM student,later WHERE student.studentNO=later.studentNO
当FROM⼦句指定两张或两张以上的表时,叫做表的联接(join),进⾏⽐较的两列叫做联接条件。
上⾯的FROM先将student表和later表联接,⽣成⼀个笛卡尔积中间结果集,然后执⾏WHERE⼦句,出表student和表later的studentNO相等的⾏。
studentNO name studentNO laterNum
--------- ---- --------- --------
1 张三mysql语句顺序
2 3
1 张三 4 2
2 李四 2 3
主流编译器有哪些2 李四 4 2
3 王五 2 3
3 王五
4 2
4 赵六 2 3
4 赵六 4 2
WHERE⼦句执⾏完后,结果集中剩下了上⾯标蓝的两⾏数据,然后执⾏SELECT⼦句,得到如下最终结果集:
js全栈工程师
name laterNum
---- --------
axis image李四 3
赵六 2
显式联接
上⾯的联接是⼀个隐式联接,因为SELECT语句中并没有join关键字。join是联接的关键字,可以通过join显式的指定⼀个联接。SELECT name,laterNum FROM student INNER JOIN later ON (student.studentNO = later.studentNO)
显式联接与上⾯的隐式联接返回的最终结果集是⼀样的,只不过将联接条件放到了FROM⼦句中,⽽隐式联接中联接条件是放在WHERE ⼦句中的。
左外联接,右外联接
上⾯的SELECT语句中,我们指定了INNER JOIN关键字,表明这是⼀个显式联接,并且是⼀个内联接。显式联接中的内连接跟隐式联接的返回结果是⼀样的,显式联接还有另外⼀种:外联接。
上⾯的例⼦中,出了有过迟到的李四和赵六的迟到次数。但是张三和王五没有出现在最终结果集中,因为他们没有迟到过。但是有时候需要练没有迟到过的⼈也查出来,这就需要外联接。
外联接通过OUTER JOIN关键字来指定,必须指定是左连接(LEFT)还是右联接,表⽰是哪个表要联接哪个表。⽐如要出所有⼈的迟到信息,没有迟到的⼈也需要显⽰出来,则⽤下⾯的语句:
SELECT name,laterNum FROM student LEFT OUTER JOIN later ON (student.studentNO = later.studentNO)
将得到下⾯的结果集:
name laterNum
---- --------
张三 ?
李四 3
王五 ?
自动化测试平台搭建
赵六 2
指定student表左连接到later表,所以student表中的所有⾏必须出现在FROM⼦句的结果集中,也就是later表中没有对应值的以空值填充。
左联接经常⽤在以下情况中,就是联接条件中,被联接的表中的联接列式联接表中联接列的⼦集。也就是在上⾯的例⼦中,student表中的studentNO是4⾏,⽽later表中的studentNO是两⾏(只有迟到过的学⽣才会在later表有记录),所以later表的studentNO是student 表的studentNO列的⼦集。如果要查出所有学⽣的迟到信息(包括没迟到过的),就需要⽤外联接。
右外联接与左外联接正好相反,被联接的表的所有⾏必须出现在FROM⼦句的结果集中。所以将两个表对调⼀下,然后⽤右外联接与左外连接的结果是⼀样的:
SELECT name,laterNum FROM later RIGHT OUTER JOIN student ON (student.studentNO = later.studentNO)
使⽤USING
在显式联接中,如果联接条件的两个列名字相同,并且联接条件是⼆者相等,则可以⽤USING。
SELECT name,laterNum FROM student LEFT OUTER JOIN later USING(studentNO)
这与上⾯的结果集是⼀样的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论