同表子查询
SQL语句1:SELECT order_num FROM orderitms WHERE prod_id=’TNT2’
SQL语句2:SELECT cust_id FROM orderitems WHERE order_num IN(20005,20007)
SQL语句3:SELECT cust_id FROM orderitems WHERE order_num IN( SELECT order_num FROM orderitms WHERE prod_id=’TNT2’ )
可以看到SQL语句3其实是把SQL1和SQL2组合在了一起,IN关键字括号里面的SQL语句就是子句。在SELECT语句中,子查询总是从内向外处理,在处理SQL3的SELECT语句时,MySQL实际上执行了两个操作:
- 先执行SQL1, 此查询返回两个订单号:20005和20007
- 然后这两个值以IN操作符要 求的逗号分隔的格式传递给外部查询的WHERE子句。外部查询变成SQL2
在WHERE子句中使用子查询能够编写出功能很强并且很灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于(<>)等。
相关子查询
SQL语句:SELECT cust_name, cust_orders (SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders FROM customers ORDER BY cust_name
可以看到上面的orders列是使用子查询查出来的,但是这个子查询语句里面却使用了“orders.cust_id = customers.cust_id”,可以前者指的是orders表的cust_id字段,但是后者指的是customers表的cust_id字段,像这种涉及到两个及以上的表的查询就叫做相关子查询。在使用相关子查询的时候,最好使用完全限定名(即表名.列名),否则可能会因为不同表含有相同的字段导致歧义的产生
