1 使用表别名
SELECT vend_name,prod_name,prod_price FROM vendors AS v,products AS p
WHERE v.vend_id=p.vend_id AND v.name=p.name
表别名只在查询执行中使用,与列别名不一样,表别名不返回到客户机
2 使用不同类型的联结:之前是内部联结或等值联结
2.1自联结 :可以在单条SELECT语句中不止一次的引用相同的表
找出id=dtntr存在问题,想知道生成该物品的供应商生成的其他物品是否也存在这些问题
子查询
SELECT id,name FROM products WHERE id =(SELECT id FROM products WHERE id='dtntr');
自联结
SELECT p1.id,p1.name FROM products AS p1,products AS p2 WHERE
p1.id =p2.id AND p2.id='dtntr';
2.2自然联结:排除列的多次出现,使每个列值返回一次
通配符 ( SELECT *)
SELECT P1.*,p1.id,p1.name FROM products AS p1,products AS p2 WHERE
p1.id =p2.id AND p2.id='dtntr';
这个列子中通配符只对第一个表使用
我们所有使用的内部联结都是自然联结
2.3外部联结:需要包含不同表中没有关联行的那些行
简单内部联结
SELECT c.id,o.num FROM c INNER JOIN o ON c.id=0.id;
外部联结类似,需要检索所有的客户,包括那些没有订单的客户
SELECT c.id,o.num FROM c LEFT OUTER JOIN o ON c.id=0.id;
从左边的表选所有行
SELECT c.id,o.num FROM c RIGHT OUTER JOIN o ON c.id=0.id;
从you边的表选所有行
3 使用带聚集函数的联结
SELECT c.name,c.id,COUNT(o.num) AS num FROM c INNER JOIN o GROUP BY c.id;
SELECT c.name,c.id,COUNT(o.num) AS num FROM c LEFT OUTER JOIN o ON c.id=0.id GROUP BY c.id;