今天讲解下mysql的left join的使用方法,除了left join链表查询还有right join,在这里我主要讲解left join,如果这个你掌握了那么right join你也会了。
LEFT JOIN连接两个表,并返回来自两个表的匹配记录和来自“左”表的不匹配记录。
因此,在“FROM”子句之后给出一个表,而在JOIN子句之后给出另一个表; FROM子句中指定的表是左表,LEFT JOIN子句后面的表是右表。LEFT JOIN返回“左”表中的所有行。
右表的值填充了“NULL”值,这些值是不匹配的。语法后的示例使MySQL LEFT JOIN的工作方式更加清晰。
使用MySQL LEFT JOIN的语法
这是MySQL LEFT JOIN的使用方式:
1 2 3 4 5 6 7 8 9 | SELECT tab1.col1, tab2.c1,.... FROM left_table t1 LEFT JOIN right_table t2 ON tab1.col1 = tab2.col1; |
MySQL LEFT JOIN的一个例子
在这个例子中,我使用两个表来解释LEFT JOIN的工作原理。我们有一个员工表,用于存储有关员工的基本信息,而第二个表是存储订单信息的订单表以及获取该特定订单的员工的ID。
这两个表中的公共密钥是员工ID,其用法如下:
1 2 3 4 5 | SELECT employee_name, employee_age, employee_join_date, order_date FROM tst_employees LEFT OUTER JOIN tst_orders_customers ON tst_employees.id = tst_orders_customers.emp_id |
使用表别名的示例
如LEFT JOIN的语法所示,您还可以使用表名别名而不是全名来指定公用键。下面的示例返回与上例中相同的结果,除了我使用表别名:
1 2 3 4 5 | SELECT employee_name, employee_age, employee_join_date, order_date FROM tst_employees TE LEFT JOIN tst_orders_customers TOr ON TE.id=TOr.emp_id; |
使用带有LEFT JOIN的GROUP BY子句的示例
下面的示例使用带有LEFT JOIN 的MySQL GROUP BY子句。同样,使用员工和订单表,查询返回其订单表中存在记录的员工的总工资:
查询:
1 2 3 4 5 6 7 | SELECT employee_name AS "Employee Name", SUM(employee_salary) As "Total Paid" FROM tst_employees TE LEFT JOIN tst_orders_customers TOr ON TE.id=TOr.emp_id GROUP BY TE.employee_name; |
结果:
添加HAVING子句示例
同样,您可以添加HAVING子句来过滤使用GROUP BY子句返回的行。请参阅LEFT JOIN,GROUP BY和HAVING子句的组合:
查询:
您可以在上图中看到,这些员工的记录将返回,其汇总工资大于4000。
使用多个LEFT JOIN示例
以下查询使用多个LEFT JOIN组合三个表的数据。除了上面两个表之外,products表也包含在查询中,如下所示:
1 2 3 4 5 6 7 8 9 10 11 | SELECT employee_name, employee_age, employee_join_date, order_date, product_name FROM tst_employees TE LEFT JOIN tst_orders_customers TOr ON TE.id=TOr.emp_id LEFT JOIN tst_products TP ON TP.product_id = TOr.prod_id; |
结果: