尚硅谷之MySQL基础

第11章 关联查询

作用:从2张或多张表中,取出有关联的数据.

关联查询一共有几种情况:

  • 内连接:INNER JOIN 、CROSS JOIN
  • 外连接:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)、全外连接(FULL OUTER JOIN)
  • 自连接:当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义

说明:

  • 连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
  • 当两个关联查询的表如果有字段名字相同,并且要查询中涉及该关联字段,那么需要使用表名前缀加以区分
  • 当如果表名比较长时,可以给表取别名,简化SQL语句

关联条件

表名前缀

否则报Column 'eid' in field list is ambiguous

表别名

笛卡尔积

定义:将两(或多)个表的所有行进行组合,连接后的行数为两(或多)个表的乘积数.

在MySQL中如下情况会出现笛卡尔积,主要是因为缺少关联条件或者关联条件不准确

注:外连接必须写关联条件,否则报语法错误

#笛卡尔积

#查询员工姓名和所在部门名称

SELECT ename,dname FROM t_employee,t_department;

SELECT ename,dname FROM t_employee INNER JOIN t_department;

SELECT ename,dname FROM t_employee CROSS JOIN t_department;

SELECT ename,dname FROM t_employee JOIN t_department;

关联条件

表连接的约束条件可以有三种方式:WHERE, ON, USING

  • WHERE:适用于所有关联查询
  • ON:只能和JOIN一起使用,只能写关联条件。虽然关联条件可以并到WHERE中和其他条件一起写,但分开写可读性更好。
  • USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中名称一致,而且只能表示关联字段值相等

#关联条件

#把关联条件写在where后面

SELECT ename,dname FROM t_employee,t_department WHERE t_employee.dept_id=t_department.did;

#把关联条件写在on后面,只能和JOIN一起使用

SELECT ename,dname FROM t_employee INNER JOIN t_department ON t_employee.dept_id=t_department.did;

SELECT ename,dname FROM t_employee CROSS JOIN t_department ON t_employee.dept_id=t_department.did;

SELECT ename,dname FROM t_employee JOIN t_department ON t_employee.dept_id=t_department.did;

#把关联字段写在using()中,只能和JOIN一起使用

#而且两个表中的关联字段必须名称相同,而且只能表示=

#查询员工姓名与基本工资

SELECT ename,basic_salary FROM t_employee INNER JOIN t_salary USING(eid);

#n张表关联,需要n-1个关联条件

#查询员工姓名,基本工资,部门名称

SELECT ename,basic_salary,dname FROM t_employee,t_department,t_salary

WHERE t_employee.dept_id=t_department.did AND t_employee.eid=t_salary.eid;

SELECT ename,basic_salary,dname FROM t_employee INNER JOIN t_department INNER JOIN t_salary

ON t_employee.dept_id=t_department.did AND t_employee.eid=t_salary.eid;