mysql基础之多表查询(MySQL学习系列之九子查询)
mysql基础之多表查询(MySQL学习系列之九子查询)dept_discript char(50) NULL dept_name char(50) NOT NULL CREATE TABLE dept( dept_id int NOT NULL AUTO_INCREMENT
在之前的所有文章中,我们介绍了Oracle查询中所有的语句,所有的案例都是简单的查询,都是从单个数据库中查询数据的单条语句。
除了这些查询之外,SQL还允许创建子查询,即嵌套在其它查询中的查询,我们通过几个例子来理解子查询的优势。
在这之前,我们需要执行下面的语句创建dept表,并在其中插入数据。
emp表建表语句在文末链接中:MySQL学习系列之七——用聚集函数汇总数据
CREATE TABLE dept
(
dept_id int NOT NULL AUTO_INCREMENT
dept_name char(50) NOT NULL
dept_discript char(50) NULL
PRIMARY KEY (dept_id)
)
insert into dept values(01 '蜀国' '兴复汉室');
insert into dept values(02 '曹魏' '挟天子以令诸侯');
insert into dept values(03 '吴国' '雄踞江东');
insert into dept values(04 '东汉' '没落的王朝');
1.利用子查询进行过滤
每个dept都对应一些人物,比如,我们现在需要知道哪个dept在emp表中没有对应的人物。
哪个dept在emp表中没有对应的人物
在这个案例中,我们把子查询的作为where子句的条件。
需要注意的是,在where子句中使用子查询,一般与in结合使用,但也可以和 =、<>结合使用。
使用子查询并不总是执行这种类型的数据检索最有效的方式。
2.把子查询作为计算字段
我们可以使用子查询创建计算字段
比如:我们需要计算每个dept在emp表中对应的总数。
select dept_name as 部门 (select count(*) from emp where emp.dept_id = dept.dept_id) as 总人数 from dept
每个dept在emp表中对应的总数
在这个子查询中使用了列的完全限定名:表名.列名。emp.dept_id = dept.dept_id。子查询共查询了四次,因为检索出了4个部门编码。
如果不使用完全限定名会如何?
select dept_name as 部门 (select count(*) from emp where dept_id = dept_id) as 总人数 from dept
不使用完全限定名
如上图,查询结果会出现错误,因为emp表中每一个dept_id都可以在dept表中找到对应的dept_id。
关于子查询的介绍就这么多了,喜欢的小伙伴们麻烦关注、收藏、点赞啊。
MySQL学习系列之七——用聚集函数汇总数据
MySQL学习系列之六——创建计算字段
MySQL学习系列之五——通配符
MySQL学习系列之四——数据过滤和过滤数据