【MySQL】创建高级联结

目录

一、使用表别名

二、使用不同类型的联结

1.自联结

2.自然联结

3.外部联结

3.使用带聚集函数的联结

4.使用联结和联结条件


一、使用表别名

别名除了用于列名和计算字段外,SQL还允许给表名起别名

起别名有两个好处:

  • 一个是缩短SQL语句;
  • 一个是允许在单条select语句中多次使用相同的表。

示例:

输入:select prod_name,prod_desc

          from products as p,vendors as v

          where p.vend_id = v.vend_id

          and prod_price = 4.5;

输出:

 from子句中两个表都有别名,products AS p建立p作为products的别名,等等。这使得能使用省写的p而不是全名products。在此例子中,表别名只用于where子句。但是表别名不仅能用于where子句,它还可以用于select的列表、order by子句以及子句的其他部分。

注意:表别名只在查询执行中使用。与列别名不一样,表别名不反悔到客户机。

二、使用不同类型的联结

1.自联结

当在相同的一张表中查询且该表的表名要出现2次在select语句中时使用自联结。即自己和自己联结。

使用子查询:

输入:select prod_id,prod_name

           from products

           where vend_id =  

                                   (select vend_id

                                    from products

                                    where prod_id = 2);

使用自联结:

输入: select p1.prod_id,p2.prod_name

            from products as p1,products as p2

            where p1.vend_id = p2.vend_id

            and p2.prod_id = 2;

输出:

【MySQL】创建高级联结_第1张图片

 products第一次出现为别名p1,第二次出现为别名p2。select语句使用p1前缀明确的给出所需列的全名,如果不这样,MySQL将返回错误的数据。

自联结和子查询都可以进行在相同的表中进行查询,返回的结果是相同的,但是自联结更快一些。

2.自然联结

自然联结排除多次出现,使每个列只返回一次。

示例:

输入:

select c.*,o.order_num,o.order_date

           from customers as c,orders as o

           where c.cust_id = o.cust_id

           and prod_id = 3;

在这个例子中,通配符只对第一个表使用,所有其他列明确列出,所以没有重复的列被检索出来。

3.外部联结

许多联结将一个表的行与另一个表中的行进行联结,但有时候会需要包含没有关联行的那些行。

联结包含了那些在相关表中没有关联行的行。这种类型的联结被称为外部联结。

示例:

输入:select customers,cust_id,orders.order_num

           from customers inner join orders

          on customers.cust_id = orders.cust_id;

此处的inner join用来指定表,只不过要用on进行联结而不是where,传递出给on的实际条件与传递给where的相同。

输入:select customers.cust_id,orders.order_num

          from customers left outer join orders

          on customers.cust_id = orders_id;

以上两个查询语句返回的结果是相同的。

第二条select语句采用了outer join来指定联结的类型(代替where)。但是,与内部联结关联两个表中的行不同的是:外部联结还包括没有关联的行。在使用outer join语法时,必须使用right或left关键字指定包括其所有行的表(right指出的是outer join右边的表,left则相反)。left outer join则是选择from子句中左边的表(customers表)中选择所有行,right outer join 则是选择orders表中的所有行。

注意:在外部联结中可通过颠倒from或where子句中的表的顺序转换为右外部联结。因此,两种类型的外部联结都可以互换使用。

3.使用带聚集函数的联结

聚集函数用来汇总数据。这些函数也可以和联结一起使用。

4.使用联结和联结条件

  1. 注意所使用的联结类型。一般使用内部联结,但使用外部联结也是有效的
  2. 保证使用正确的联结条件,否则将返回不正确的数据
  3. 应该总是提供联结条件,否则会得出笛卡儿积
  4. 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。但应该在测试它们之前,分别测试每个联结。这将使故障排除更为方便。

你可能感兴趣的:(MySQL,mysql,数据库,sql)