MySQL子查询,联结表

2019-07-03 17:23:47 浏览数 (2)

一,子查询

子查询:嵌套在其他查询中;执行顺序由里到外。子查询数目没有限制,如果要使用多层查询,注意写好缩进格式,不要出错。

SELECT cust_id,order_num FROM orders WHERE order_num IN(SELECT order_num FROM orderitems WHERE prod_id='TNT2');

对计算字段使用子查询:

SELECT cust_name,cust_state, (SELECT count(*) FROM orders WHERE orders.cust_id=customers.cust_id) AS orders FROM customers

order by cust_name;

二,联结表

SQL强大的功能之一就是能够在数据检索查询的执行中使用联结(join)。使用联结的的原理是一个表与另一个表有相关联的列。一个表的外键是另一个列主键,通过外键可以将两个表联结起来。

SELECT vend_name, prod_name, prod_price FROM vendors,products WHERE vendors.vend_id=products.vend_id ORDER BY vend_name, prod_name;

在使用联结表时,实际上做的是将第一个表的每一行与第二行表行进行匹配。因此,如果没有联结条件,检索出的行数目将是第一个表的行数乘以第二个表的行数,即所谓的笛卡儿积。

内部联结(inner join)=等值联结

SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id=products.vend_id;

对于联结表的数目没有限制,对于那些复杂的查询使用联结将变得简单。

外部链接,左联结(left outer join),右联结(right outer join);左联结左边表全部返回,右边表没有匹配的为空;右联结同理。

SELECT customers.cust_name,customers.cust_id, count(orders.order_num) AS num_ord FROM customers LEFT OUTER JOIN orders ON customers.cust_id=orders.cust_id group by customers.cust_id;

0 人点赞