1、什么是子查询?
列出订购物品TNT2的所有客户:
select cust_id from orders where order_num IN (SELECT order_num from orderitems where prod_id = 'TNT2' )
格式化SQL
包含子查询的SELECT
语句难以阅读和调试,特别是它们较为复杂时更是如此。如上所示把子查询分解为多行并且适当地进行缩进,能极大地简化子查询的使用。
对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。
注:
列必须匹配 在
WHERE
子句中使用子查询(如这里所示),应该保证SELECT
语句具有与WHERE
子句中相同数目的列。通常,
子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。
除了子查询可以放在where
中,还可以放到select
中去。
假如需要显示customers
表中每个客户的订单总数。
select cust_name, cust_state, (SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) as orders from customers ORDER BY cust_name
mysql
的运行过程是先执行了customers
中查出来了cust_name
,cust_sta本文来源gaodai#ma#com搞@@代~&码网te
,cust_id
,然后执行5次子查询,查出来了结果。
逐渐增加子查询来建立查询 用子查询测试和调试查询很有技巧性,特别是在这些语句的复杂性不断增加的情况下更是如此。用子查询建立(和测试)查询的最可靠的方法是逐渐进行,这与MySQL处理它们的方法非常相同。首先,建立和测试最内层的查询。然后,用硬编码数据建立和测试外层查询,并且仅在确认它正常后才嵌入子查询。这时,再次测试它。对于要增加的每个查询,重复这些步骤。这样做仅给构造查询增加了一点点时间,但节省了以后(找出查询为什么不正常)的大量时间,并且极大地提高了查询一开始就正常工作的可能性
下面介绍一下联结:
SELECT vend_name,prod_name,prod_price FROM vendors,products WHERE vendors.vend_id=products.vend_id ORDER BY vend_name, prod_name
注:
完全限定列名 在引用的列可能出现二义性时,必须使用完全限定列名(用一个点分隔的表名和列名)。如果引用一个没有用表名限制的具有二义性的列名,MySQL将返回错误。
这里使用where 语句进行联接的作用:
利用WHERE子句建立联结关系似乎有点奇怪,但实际上,有一个很充分的理由。请记住,在一条SELECT语句中联结几个表时,相应的关系是在运行中构造的。在数据库表的定义中不存在能指示MySQL如何对表进行联结的东西。你必须自己做这件事情。在联结两个表时,你实际上做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。没有WHERE子句,第一个表中的每个行将与第二个表中的每个行配对,而不管它们逻辑上是否可以配在一起。