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