子查询
在开始了解子查询之前,首先做下准备工作,建立3个表,
- 一个是customers表,其中包括:客户名字、客户ID、客户Tel等。
- 一个是orders表,其中包括:订单号、客户ID、订单时间等。
- 一个是ordersitems表,其中包括:订单物品、订单号、物品数量。
准备工作
1、建表
建customers表的命令如下,其它的表与之类似:
create table customers(cust_name varchar(10),cust_id int(10),cust_tel varchar(10));
2、插入内容
为customers表插入内容的命令如下,其它的与子类似:
insert into customers values(‘wu‘,2,‘1387234‘);
最后三个表的内容截图如下:
子查询
前面我们所学的东西都是简单的查询,即从单个数据库表中检索数据的单条语句。
到底什么是子查询呢?通过下面这个例子,相信我们就更好的理解了。
上面我们建了三个表,分别为customers/orders/ordersitems.
现在,假如,我们想看下订购了物品 apple的所有客户信息,应该怎样检索呢?
下面列出具体的步骤:
- 第一步:在ordersitems表中找出包含有apple的订单号order_id.
- 第二步:根据上一步查找的结果,找出订单号为order_id的客户ID(cust_id).
- 最后:根据上一步查找的结果,在customers表中根据客户ID(cust_id)找出客户信息。
现在我们按照步骤来查询下,观察下结果:
从上面可以看出,我们就是按照步骤,将第一步的结果当做第二步的条件来进行查询,将第二步的结果直接作为第三步的条件来进行查询,最后得到最终的结果。
现在,我们分别把第一个子查询(返回订单号的那一个)变为子查询组合到第二个查询中。
第一个查询的代码如下:
select order_id from ordersitems where content=‘apple‘;
作为子查询组合到第二个查询后的代码如下:
select cust_id from orders where order_id in (
select order_id from ordersitems where content=‘apple‘
);
结果如下,从结果可以看出,与我们单个查询的结果是一致的:
现在,我们就把上面的查询作为子查询组合到第三个查询中,代码如下:
select cust_name,cust_tel from customers where cust_id in(
select cust_id from orders where order_id in(
select order_id from ordersitems where content=‘apple‘)
)
);
注意:包含子查询的select语句难以阅读和调试,特别是他们较为复杂时。如上所示把子查询分解为多行并且适当地进行缩进,能极大地简化子查询的使用。
在where子句中使用子查询能够编写出功能很强并且很灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。
注意:在子查询中,列必须匹配
作为计算字段使用子查询
上面介绍的都是作为条件使用子查询,下面就介绍下作为计算字段使用子查询。
还是以一个例子来进行说明。
假如需要显示customers表中每个客户的订单总数。
为执行这个操作,步骤如下:
- 从customers表中检索客户列表
- 对于检索出的每个客户,统计其在orders表中的订单数目。
例如:查询客户id=1的订单数的命令如下:
select count(*) as order_total from orders where cust_id=1;
将上面的命令作为字段的子查询的代码如下:
select cust_name,cust_tel,(select count(*) from orders where orders.cust_id==customers.cust_id) from customers ;
小结
子查询可以理解为嵌套,这里方便理解一点。但是在我们使用子查询的过程中,要先分步骤来完成,然后将子查询一个一个的组合起来,直到这个子查询加入之后得到的结果是符合要求的,然后继续将下一个子查询组合进行直至完成所有的子查询都全部正确的加入。