MYSQL连接

本文详细介绍了SQL中的交叉连接(笛卡尔积),内连接(INNER JOIN),以及左、右外连接的区别与用法。通过实例演示了如何在MySql中操作,并强调了SQL标准与非标准的连接方式。涵盖了基本的表连接和复杂多表查询的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

交叉连接

左表中的所有行,左表中的每一行与右表中的所有行再一一组合,形成的结果集的数据行数相当于两个表数据行数“相乘”后的结果。这种情况在数据库连接查询中,被称为交叉连接(也称为笛卡尔乘积连接)。在数据库中创建连接查询非常简单,只需要指明连接的表以及他们之间的关系即可

格式

select 字段名  from 表1, 表2... where 条件;
# 查询员工的姓名和对应的部门名称
select emp.EMPNO, emp.ENAME, dept.DNAME from emp, dept where emp.DEPTNO = dept.DEPTNO;

【注意】查询的字段需要通过 表名. 的形式来指明是哪张具体的表,如果查询条件中的字段,如果不指明是哪张表会报错,因为对于相同的字段无法判断到底是哪张表下的

# 直接通过字段名进行查询员工的姓名和对应的部门名称,不指定具体某个表下的字段,因为字段是不重复的
select EMPNO, ENAME, DNAME from emp, dept where emp.DEPTNO = dept.DEPTNO;
# 错误演示:重复字段没有指明表
select EMPNO, ENAME, DNAME, DEPTNO from emp, dept where emp.DEPTNO = dept.DEPTNO;

# 正确演示,指明表中的字段
select EMPNO, ENAME, DNAME, emp.DEPTNO from emp, dept where emp.DEPTNO = dept.DEPTNO;
# 通过对表起别名进行查询员工的姓名和对应的部门名称以及部门编号
select e.EMPNO, e.ENAME, d.DNAME, e.DEPTNO from emp as e, dept as d where e.DEPTNO = d.DEPTNO;

【注意】as可以省略

# 通过对表起别名(省略as)进行查询员工的姓名和对应的部门名称以及部门编号
select e.EMPNO, e.ENAME, d.DNAME, e.DEPTNO from emp e, dept d where e.DEPTNO = d.DEPTNO;
# 对字段进行起别名查询
select e.EMPNO as `员工号`, e.ENAME as `员工姓名`, d.DNAME as `部门名称` from emp as e, dept as d where e.DEPTNO = d.DEPTNO;
# 省略as对字段进行起别名查询
select e.EMPNO `员工号`, e.ENAME `员工姓名`, d.DNAME `部门名称` from emp e, dept d where e.DEPTNO = d.DEPTNO;
# 对查询的结果根据薪资进行倒序排序
select e.EMPNO as `员工号`, e.ENAME `员工姓名`, d.DNAME `部门名称` from emp as e, dept as d where e.DEPTNO = d.DEPTNO order by e.EMPNO desc;

内连接查询(INNER JOIN ON)

和交叉连接的效果是一样的

select 字段名 from 表1 inner join 表2 on 条件;
# 使用内连接查询员工号,员工姓名及部门名称并对其起别名
select e.EMPNO `员工号`, e.ENAME `员工姓名`, d.DNAME `部门名称` from emp e
inner join dept d 
on e.DEPTNO = d.DEPTNO;

三表连接查询

#查询所有员工工号、名字、部门名称、部门所在国家ID
SELECT * FROM t_employees e 
INNER JOIN t_departments d 
on e.department_id = d.department_id
INNER JOIN t_locations l
ON d.location_id = l.location_id

左外连接(LEFT JOIN ON)

select 字段名 from 表1 left outer join 表2 on 条件;
# 使用左外连接查询员工号、员工姓名和部门名称
select e.EMPNO `员工号`, e.ENAME `员工姓名`, d.DNAME `部门名称` from emp e 
left outer join dept d 
on e.DEPTNO = d.DEPTNO;

右外连接(RIGHT JOIN ON)

# 使用右外连接查询员工号、员工姓名和部门名称
select e.EMPNO `员工号`, e.ENAME `员工姓名`, d.DNAME `部门名称` from emp e 
right outer join dept d 
on e.DEPTNO = d.DEPTNO;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值