MySQL创建高级联结的方法

  

1。,使用表别名

别名除了用于列名和计算字段外,SQL还允许给表名起别名。这样做有两个主要理由:

    <李>

    缩短SQL语句;

    <李>

    允许在单条选择语句中多次使用相同的表。

mysql>从客户选择cust_name cust_contact c,订单为o, orderitems oi c.cust_id=o。cust_id oi.order_num=o。order_num prod_id=& # 39; TNT2& # 39;;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | cust_name | cust_contact |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   李| | |狼Inc . Y   Y山姆| | |优胜美地地方   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
    <李>

    分析:可以看的到,<代码> 的子句中3个表全都具有别名。<代码>客户c> 的客户别名,等等。这使得能使用省写的<代码> c> 客户> ,子句,它还可以用于<代码> 选择的列表,<代码>,子句以及语句的其他部分。

2。,使用不同类型的联结

2.1自联结

mysql>选择p1。prod_id, p1。prod_name从产品p1, p2, p1.vend_id=p2。vend_id p2.prod_id=& # 39; DTNTR& # 39;   →;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | prod_id | prod_name |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | DTNTR |雷管|   | | FB |鸟种子   胡萝卜FC | | |   | | |安全安全   吊吊| | |   | | TNT1 | TNT(1把)   | | TNT2 | TNT(5根)   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
    <李>

    分析:此查询中需要的两个表实际上是相同的表,因此产品<代码> 表在<代码>与子句中出现了两次。虽然这是完全合法的,但对产品<代码> 的引用具有二义性,因为<代码> MySQL> 产品表中的哪个实例。

用自联结而不用子查询:自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。虽然最终的结果是相同的,但有时候处理联结远比处理子查询快得多

2.2自然联结

mysql>选择c。*,o。order_num, o。order_date oi。prod_id oi。数量,oi。item_price c从客户,订单啊,orderitems oi, c。cust_id=o。cust_id oi。order_num=o。order_num prod_id=& # 39; fb # 39;;   + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   | cust_id | cust_name | cust_address | cust_city | cust_state | cust_zip | cust_country | cust_contact cust_email | | order_num | order_date | prod_id | |数量item_price |   + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   | 10001 |狼股份有限公司| 200年枫巷底特律| | | 44444 | |美国Y小姐李| ylee@coyote.com | 20005 | 2005-09-01就是| FB | 1 | 10.00 |   | 10001 |狼股份有限公司| 200年枫巷底特律| | | 44444 | |美国Y小姐李| ylee@coyote.com | 20009 | 2005-10-08就是| FB | 1 | 10.00 |   + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - -


    <李>

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

2.3外部联结

许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。
为了检索所有客户,包括那些没有订单的客户,可如下进行:

mysql>选择客户。cust_id,订单。从客户左外连接订单> mysql> order_num;选择客户。cust_name,客户。cust_id, COUNT (orders.order_num)从客户内连接订单num_ord> mysql>选择客户。cust_name,客户。cust_id,计数(orders.order_num) num_ord从客户左外连接订单客户。cust_id=订单。由customers.cust_id cust_id组;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   | cust_name | cust_id | num_ord |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   |狼股份有限公司| 10001 | 2 |   10002 | | 0 | |老鼠的房子   | Wascals | 10003 | 1 |   约塞米蒂| 10004 | | 1 |   | E艾玛| 10005 | 1 |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - +

MySQL创建高级联结的方法