MySQL关联查询

本文详细介绍了数据库查询中的关联查询,包括内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT JOIN 和 FULL JOIN)以及自连接的概念和使用方法。通过实例展示了各种连接类型在SQL语句中的应用,强调了连接条件的重要性以及如何避免笛卡尔积。同时,还探讨了在多表查询中如何设置正确的关联条件和筛选条件,以获取所需的数据。

关联查询

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

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

内连接:INNER JOIN 、CROSS JOIN

外连接:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)、全外连接(FULL OUTER JOIN)

自连接:当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义

说明:

(1)连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。

(2)当两个关联查询的表如果有字段名字相同,并且要查询中涉及该关联字段,那么需要使用表名前缀加以区分

(3)当如果表名比较长时,可以给表取别名,简化SQL语句

笛卡尔积

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

在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;

内连接(INNER JOIN)

有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行

格式:

隐式:

SELECT [cols_list] from 表1,表2 where [condition]

显式:

SELECT [cols_list] from 表1 INNER JOIN 表2 ON [关联条件] where [其他筛选条件]

SELECT [cols_list] from 表1 CROSS JOIN 表2 ON [关联条件] where [其他筛选条件]

SELECT [cols_list] from 表1 JOIN 表2 ON [关联条件] where [其他筛选条件]

#内连接

#查询员工姓名和所在部门名称
SELECT ename,dname FROM t_employee,t_department WHERE t_employee.dept_id=t_department.did;
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;

#查询员工姓名,基本工资,部门名称
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;

外连接(OUTER JOIN)

外连接分为:

左外连接(LEFT OUTER JOIN),简称左连接(LEFT JOIN)

右外连接(RIGHT OUTER JOIN),简称右连接(RIGHT JOIN)

全外连接(FULL OUTER JOIN),简称全连接(FULL JOIN)。

左连接(LEFT JOIN)

右外连接(RIGHT JOIN)

外连接(FULL JOIN)

mysql不支持FULL JOIN,但是可以用 left join union right join代替

自连接

当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询

#自连接
#查询员工姓名以及领导姓名,仅显示有领导的员工
SELECT emp.ename,mgr.ename
FROM t_employee AS emp, t_employee AS mgr
WHERE emp.mid = mgr.eid;

#查询员工姓名以及领导姓名,仅显示有领导的员工
SELECT emp.ename,mgr.ename
FROM t_employee AS emp INNER JOIN t_employee AS mgr
ON emp.mid = mgr.eid;

#查询所有员工姓名及其领导姓名
SELECT emp.ename,mgr.ename
FROM t_employee AS emp LEFT JOIN t_employee AS mgr
ON emp.mid = mgr.eid;

MySQL关联查询是一种在之间建立关联并检索相关数据的查询方式。MySQL关联查询的语法通常使用JOIN关键字将两个或连接在一起,根据指定的连接条件来获取相关的数据。 在MySQL中,关联查询可以通过使用内连接、外连接或交叉连接来实现不同类型的连接操作。内连接通过匹配两个之间的共同值来返回符合条件的数据。外连接可以返回不满足连接条件的记录,并将NULL值填充到相应的列中。而交叉连接则返回两个的所有可能组合。 关联查询可以在SELECT语句的FROM子句中使用子查询来实现更复杂的查询需求。子查询可以作为主查询的一部分,并且可以在WHERE子句、FROM子句、HAVING子句或SELECT子句中使用。 总结起来,MySQL关联查询是通过连接并根据指定的连接条件来检索相关数据的查询方式。它可以使用内连接、外连接或交叉连接,并且可以在主查询的不同位置嵌入子查询来实现更复杂的查询需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [《MySQL数据库关联查询](https://blog.youkuaiyun.com/qianfeng_dashuju/article/details/107099405)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值