(MySQL笔记)SELECT语句的FROM子句详解
来源:互联网 发布:apache mpm winnt 编辑:程序博客网 时间:2024/06/04 19:25
FROM子句是SELECT语句中最先开始处理的子句,FROM子句指定了要查询的表,表的后面可能还跟着一个别名。表可以直接是表名,也可以在前面加上数据库的名字。如:
SELECT studentNOFROM school.studentAS S
笛卡尔积
FROM子句可以有一个表指定,也可以跟多个表指定,如从两张表里读取数据:
SELECT studentNO,laterNumFROM 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,laterNumFROM student,later
执行FROM子句后,FROM子句返回的中间结果集(笛卡尔积)如下:
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,laterNumFROM student,later WHERE student.studentNO=later.studentNO
当FROM子句指定两张或两张以上的表时,叫做表的联接(join),进行比较的两列叫做联接条件。
上面的FROM先将student表和later表联接,生成一个笛卡尔积中间结果集,然后执行WHERE子句,找出表student和表later的studentNO相等的行。
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
WHERE子句执行完后,结果集中剩下了上面标蓝的两行数据,然后执行SELECT子句,得到如下最终结果集:
name laterNum
---- --------
李四 3
赵六 2
显式联接
上面的联接是一个隐式联接,因为SELECT语句中并没有join关键字。join是联接的关键字,可以通过join显式的指定一个联接。
SELECT name,laterNumFROM student INNER JOIN later ON (student.studentNO = later.studentNO)
显式联接与上面的隐式联接返回的最终结果集是一样的,只不过将联接条件放到了FROM子句中,而隐式联接中联接条件是放在WHERE子句中的。
左外联接,右外联接
上面的SELECT语句中,我们指定了INNER JOIN关键字,表明这是一个显式联接,并且是一个内联接。显式联接中的内连接跟隐式联接的返回结果是一样的,显式联接还有另外一种:外联接。
上面的例子中,找出了有过迟到的李四和赵六的迟到次数。但是张三和王五没有出现在最终结果集中,因为他们没有迟到过。但是有时候需要练没有迟到过的人也查出来,这就需要外联接。
外联接通过OUTER JOIN关键字来指定,必须指定是左连接(LEFT)还是右联接,表示是哪个表要联接哪个表。比如要找出所有人的迟到信息,没有迟到的人也需要显示出来,则用下面的语句:
SELECT name,laterNumFROM 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,laterNumFROM later RIGHT OUTER JOIN student ON(student.studentNO= later.studentNO)
使用USING
在显式联接中,如果联接条件的两个列名字相同,并且联接条件是二者相等,则可以用USING。
SELECT name,laterNum FROM student LEFT OUTER JOIN later USING(studentNO)
这与上面的结果集是一样的。
0 0
- (MySQL笔记)SELECT语句的FROM子句详解
- (MySQL笔记)SELECT语句的WHERE子句详解
- (MySQL笔记)SELECT语句的WHERE子句详解
- SELECT 语句与其子句的详解
- SELECT 语句与其子句的详解
- SELECT 语句与其子句的详解
- MYSQL语句之Select子句
- SQL select的from 子句
- MySQL不支持 SELECT INTO FROM 这种语句,MySQL SELECT INTO FROM 语句的替代方案
- SQL语言基础--select语句的各个子句(一)
- SQL-SELECT 语句,From子句,where条件查询
- MySQL学习笔记20151009select常见子句
- SELECT 语句中Having子句的使用
- MySQL-SELECT 语句详解
- Select查询语句详解(MySQL)
- (MySQL笔记)SELECT语句执行顺序
- mysql学习笔记(三)select语句
- 在AS2005的From子句中使用Select从句
- 图片被超链接包裹后,IE6下有边框
- 《Unix/Linux网络日志分析与流量监控》获2015年度最受读者喜爱的IT图书奖
- [Spring Reference] P Ⅰ.Spring框架综述/1.Spring框架介绍/1.1依赖注入(DI)和控制反转(IOC)
- javascript数组常用方法解析
- IOS,Iphone 拨号三种方法
- (MySQL笔记)SELECT语句的FROM子句详解
- html操作
- 最简单的事件设计模式
- 第三章:初体验druid.io引擎
- XDOJ B进制加法
- 有用的工具animate.css
- javascript数组特性
- AIDL介绍和实例讲解
- JAVA equals()方法重写