多表查询还有前面的两块内容——内连接查询,外连接查询,希望看到这篇博客的朋友先去看看我的"Mysql数据库"专栏中Mysql数据库基本操作(六)多表查询-内连接,外连接这一章博客,看完再来看这一章的内容,相信即使你已经理解内连接,外连接查询,看博客的时候也会有新的收获。除此之外,接下类要讲的子查询,表自身关联查询所用到的数据也在上一篇博客中。
Mysql数据库基本操作(六)多表查询-内连接,外连接
子查询
前一篇博客中有两张表,部门表dept和员工表emp,如果让我们第一感觉随便想出一个sql语句,我相信大多数人想出的都是select* from emp where dept_id='1001';
这样一个简单的sql,其实仔细观察这个sql,我们应该这样理解这句话:select是选择的意思,*代表全部字段的意思,from后面的emp代表从哪张表中查询,emp可以替换成其他的表;where后面的是条件子句。dept_id=‘1001’,其中’1001‘也可以替换成其他值。
而我们又知道,其实我们所有的sql语句的查询结果返回也是一张表,或者具体来说可能是一个列,一个行,甚至是一个值。我们可不可以将这些返回的查询结果放在普通的sql语句中可以替换的地方做一个嵌套查询?答案的确如此。因此接下来我们分别介绍子查询如果分别是一整张表,一个列,一个行,一个值的时候分别怎么做嵌套循环。
1,子查询结果为一整张表或者一个行。
查询研发部23岁以下的员工信息
select *from (select * from dept3 where name = '研发部') t1, (select *from emp3 where age <23) t2 where t1.deptno=t2.dept_id;
解释这条SQL语句,这里先从部门表里查询到了研发部得到了一行记录select * from dept3 where name = '研发部';
又从员工表emp3中查询到了年龄小于23岁的员工,得到了一张表。
然后将这两个表利用他们之间天然的联系t1.deptno=t2.dept_id内连接起来,就得到了我们想要的结果。
而且仔细思考其实就能发现,t1,t2的笛卡尔集其实就是我们想要的结果,因为第一个子查询只返回了一行记录,不需要通过t1,t2表的内在联系t1.deptno=t2.dept_id过滤。所以sql语句其实可以不加后面的过滤条件:
select *from (select * from dept3 where name = '研发部') t1, (select *from emp3 where age <23) t2 ;
总结:子查询的结果为一个表或者一个行时,