快捷搜索:  汽车  科技

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

mysql基础之多表查询(MySQL学习系列之九子查询)(1)

每个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

mysql基础之多表查询(MySQL学习系列之九子查询)(2)

不使用完全限定名

如上图,查询结果会出现错误,因为emp表中每一个dept_id都可以在dept表中找到对应的dept_id。

关于子查询的介绍就这么多了,喜欢的小伙伴们麻烦关注、收藏、点赞啊。

MySQL学习系列之七——用聚集函数汇总数据

MySQL学习系列之六——创建计算字段

MySQL学习系列之五——通配符

MySQL学习系列之四——数据过滤和过滤数据

猜您喜欢: