对被联结的表使用别名和聚集函数
使用表别名
- 使用CONTACT联合搜索组合列并且起别名
SELECT
CONCAT( RTRIM( vend_name ), "(", RTRIM( vend_country ), ")" ) AS vend_title
FROM
vendors
ORDER BY
vend_name;
除此之外,MySQL允许给表起别名,其有2个理由:
1.缩短SQL语句
2.允许在单条SELECT语句中多次使用相同的表
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";
注意
表别名不仅能用于WHERE子句,还可以用于SELECT的列表、ORDER BY子句以及语句的其他部分。
表别名只能在查询执行中使用。
使用不同类型的联结
除了内联结还有自联结、自然联结和外部联结3种联结
自联结
自联结可以代替SELECT子查询
- 例
通过查询某个商品获得其制造商,再查询其制造商ID获得该制造商所制造的所有产品
1.通过SELECT子查询
SELECT
prod_id,
prod_name
FROM
products
WHERE
vend_id =(
SELECT
vend_id
FROM
products
WHERE
prod_id = "DTNTR"
);
2.使用自联结查询
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";
注意因为是查询vend_id所以,WHERE的条件有VEND_ID
用自联结而不用子查询
自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句,其处理速度往往比处理子查询快得多。
自然联结
自然联结排除多次出现,使每个列只返回一次,一般是通过SELECT *,对所有其他表的列使用明确的子集来完成的
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";
通配符支队第一个表使用,其他列明确给出,所以没有重复的列被检索出来
事实上,迄今为止我们建立的每个内部联结都是自然联结,也基本不会用到不是自然联结的内部联结
外部联结 LEFT (OUTER) JOIN
将表中的行与另一个表中的行相关联,包含哪些没有关联的行,称为外部联结
- 例
检索所有客户订单信息,包含没有订单的客户
SELECT
customers.cust_id,
orders.order_num
FROM
customers
LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;
其中outer可以不写,即简写为LEFT JOIN
LEFT RIGHT
在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表
LEFT表示左边表中所有的行,RIGHT表示有表的表中选择所有的行
左外部联结和右外部联结其唯一差别时所关联的表的顺序不同,左外部联结可通过颠倒FROM或WHERE子句中表的顺序转换为右外部联结。具体使用哪种联结纯粹是根据个人喜好和方便而定
注意
MySQL不支持简化字符*=和=*的使用,虽然这2种操作符在其他DBMS种很流行
使用带聚集函数的联结
聚集函数用来汇总数据,其也可以与联结一起使用。
- 例
SELECT
customers.cust_name,
customers.cust_id,
COUNT( orders.order_num ) AS num_ord
FROM
customers
INNER JOIN orders ON customers.cust_id = orders.cust_id
GROUP BY
customers.cust_id;
使用联结和联结条件
- 一般使用内部联结,但使用外部联结也是有效的
- 保证正确的联结条件,否则将返回不正确的数据
- 提供联结条件,否则会返回笛卡尔乘积
- 联结中可以包含多个表,对于每个联结也可以采用不同的联结类型。但应该在联结一起时注意分别测试每个联结,方便排出故障
Comments | 0 条评论