mysql 学习记录 联结表和高级联结

第十五章 联结表 第十六章 创建高级联结
表别名

 select concat(rtrim(vend_name),' (',rtrim(vend_country),')') as vend_title
 from vendors order by vend_name;
 
 select cust_name,cust_contact 
 from customers as c,orders as o,orderitems as oi
 where c.cust_id = o.cust_id
 and oi.order_num = o.order_num
 and prod_id = 'TNT2';

与列别名不一样,表列名不返回到客户机.。
在from中定义表别名,可在select中使用

等值联结(内部联结)
两个表之间存在相同值

select vend_name,prod_name,prod_price 
from vendors,products
where vendors.vend_id = products.vend_id
order by vend_name,prod_name;

where 子句是过滤匹配条件(联结条件)的行。没有where子句则是将表1的每一行与表2的每一行联结。没有联结条件的表关系返回的结果为笛卡尔积
内部联结也可以用以下方法联结

select vend_name,prod_name,prod_price
from vendors inner join products
on vendors.vend_id=products.vend_id

出现重复列的内部联结不算自然联结

如下
select *
from vendors inner join products 

自然联结
自然联结排出多次出现,使每个列只返回一次。你只能选择唯一的列。这一般是通过使用通配符,对所有其他表的列使用明确的子集来完成的。每个列只返回一次的内部联结称为自然联结。

select c.*,o.order_num,o.order_date,oi.prod_id,oi.quantity,oi.item_price
from customers as c,orders as o,orderitems as oi
where c.cust_id = o.cust_id
and oi.order_num = o.order_num
and prod_id = 'FB';

联结多个表

select vend_name,prod_name,prod_price,quantity
from vendors,products,orderitems
where products.vend_id = vendors.vend_id
and products.prod_id = orderitems.prod_id
and order_num = 20005;

与十四章子查询对比

select cust_name,cust_contact
from customers,orders,orderitems
where customers.cust_id = orders.cust_id
and orders.order_num =  orderitems.order_num
and prod_id = 'TNT2';

自联结
与十四章中的子查询有相同的作用

select prod_id,prod_name from products
where vend_id = (select vend_id from products where prod_id = 'DTNTR');

select p1.prod_id,p1.prod_name
from products as p1, products as p2
where p1.vend_id = p2.vend_id
and p2.prod_id = 'DTNTR';

相同方法试一试以确定性能

外部联结
外部联结包含没有关联行的那些行
检查所有客户及其订单

select customers.cust_id,orders.order_num
from customers inner join orders
on customers.cust_id = orders.cust_id;

mysql 学习记录 联结表和高级联结_第1张图片
检查所有客户及其订单,包括没有订单的客户

select customers.cust_id,orders.order_num
from customers left outer join orders
on customers.cust_id = orders.cust_id;

mysql 学习记录 联结表和高级联结_第2张图片
外部联结包括left outer join 和right outer join
如上所示,left outer join 将以customers表为主,若使用right outer join则会出现下面情况,与自然联结相同作用。

select customers.cust_id,orders.order_num
from customers right outer join orders
on customers.cust_id = orders.cust_id;

mysql 学习记录 联结表和高级联结_第3张图片
使用带聚集函数的联结

 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; 

mysql 学习记录 联结表和高级联结_第4张图片
要点

  1. 一般使用内部联结
  2. 保证使用正确的联结条件,且应该常提供联结条件,否则会得出笛卡尔积
  3. 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在一起测试他们前,分别测试每个联结。

你可能感兴趣的:(mysql)