MySQL连接查询,内连接,自连接、外连接,多表连接查询、左外连接、右外连接查询等等,sql查询练习
MySQL连接查询
主要分为内连接和外连接两种查询方式。外连接可分为左外连接和右外连接
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。
右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。
以实际操作介绍下文的各种连接,现准备三张表如下:
- 员工表(emp)
员工id(eId)、员工姓名、领导ID(eLeader)、所在部门ID(eDep)、工资价格
- 部门表(dep)
部门ID、部门名称
- 工资等级表(price)
工资等级,该等级最低工资、该等级最高工资
内连接
内连接主要包含四种连接,由于自然连接和Using子句连接不常用,此处不做记录,下面记录交叉连接和On子句连接查询。
- 交叉连接(笛卡尔乘积连接)
语法:select * from 表1 join 表2
该连接进行笛卡尔乘积计算,即一个表的每一条记录都与另一个表内的所有记录进行连接,示例如下,共查询出28条记录,即员工表7条乘以(x)部门表4条记录
SELECT * FROM emp JOIN dep;
- On子句连接
语法:select 待查询内容 from 表1 join 表2 On (连接条件)
该连接类似于在交叉连接的基础上进行了筛选操作,on()括号内容极为筛选条件。
示例:查询员工id、姓名、工资、所在部门名称,我们只需要在交叉连接查询基础上筛选出eDep=dId的记录即可,示例如下图,共6条记录,由于老总不属于任何一个部门,即结果没有老总。
SELECT eId,eName,ePrice,dName
FROM emp JOIN dep ON (eDep = dId);
-- 当然,我们可以给待查询字段指定数据库,让数据库知道在哪个表查找该字段,若观察时间,会发现该方法查询时间更短,查询更快。
SELECT emp.eId,emp.eName,emp.ePrice,dep.dName
FROM emp JOIN dep ON (emp.eDep = dep.dId);
--当然,当表名太长时,这个方法写起来费时间,我们可以给表起一个别名,如emp别名e,dep别名d
SELECT e.eId,e.eName,e.ePrice,d.dName
FROM emp e JOIN dep d ON (e.eDep = d.dId);
- 自连接
即自己和自己连接查询
示例:由表emp可知,记录了每个员工的领导ID,同时领导也在emp表中,那么此时进行查询员工ID、姓名、领导姓名,需要进行自连接,自连接查询如下图所示。
SELECT e.eId,e.eName,e.eLeader,m.eName
FROM emp e JOIN emp m ON (e.eLeader=m.eId);
外连接
- 左外连接
语法:SELECT 待查询内容 FROM 表1 LEFT JOIN 表2 ON (连接条件)
示例:查询员工id、姓名、工资、所在部门名称、部门ID,查询结果如下图,可以看到即使老总没有部门的情况下,仍然能够查询出来,这也是外连接与内连接的基本区别。
SELECT e.eId,e.eName,e.ePrice,d.dName,d.dId
FROM emp e LEFT JOIN dep d ON (e.eDep = d.dId);
- 右外连接
语法:SELECT 待查询内容 FROM 表1 RIGHT JOIN 表2 ON (连接条件)
示例:查询员工id、姓名、工资、所在部门名称、部门ID,查询结果如下图,可以看到即使财务部没有员工的情况下,仍然能够查询出来,
SELECT e.eId,e.eName,e.ePrice,d.dName,d.dId
FROM emp e RIGHT JOIN dep d ON (e.eDep = d.dId);
- 全连接
仔细观察左连接可知没有财务部,右连接没有老总这个人,如果我们既想要查询到老总又想要查询到财务部怎么办?采用全连接来解决。
在MySql中不支持全连接,但是支持取并集,我们可以对左外连接和右外连接取并集,注意,MySQL不支持取交集。
SELECT e.eId,e.eName,e.ePrice,d.dName,d.dId
FROM emp e LEFT JOIN dep d ON (e.eDep = d.dId)
UNION
SELECT e.eId,e.eName,e.ePrice,d.dName,d.dId
FROM emp e RIGHT JOIN dep d ON (e.eDep = d.dId);
]
- 左外连接、右外连接、全连接基本区别
由上面的左外连接和右外连接示例可知,仅仅是改变了left和right,查询结果已经发生了变化,在左外连接中,以左表为主,全部查询到了左表,而右表中的财务部由于左表没有员工对应,所以右表没有查询到财务部,同理,右连接展示了财务部,而没有老总。可知,通俗的讲,当左连接时以左表为主,右连接以右表为主。
额外示例
查询部门ID是100的员工id、姓名、工资、所在部门名称、部门ID。
SELECT e.eId,e.eName,e.ePrice,d.dName,d.dId
FROM emp e Left JOIN dep d ON (e.eDep = d.dId)
WHERE d.did=100;
三表连接查询
上述我们准备了三张表,工资等级表price一直没有使用,此处进行三表连接查询
示例:查询所有员工ID、员工姓名、员工部门名称、员工工资等级,结果如下图所示,我们在两表连接的基础上再进行一次Join连接。
因为我们要查询所有员工,那么在员工表和部门表连接时采用左连接,因为工资等级表没有与前两表相同的字段,所以采用交叉连接工资等级表,然后采用where1语句进行条件筛选。
SELECT e.eId,e.eName,d.dName,p.pGrade FROM emp e
LEFT JOIN dep d ON (e.eDep=d.dId)
JOIN price p WHERE e.ePrice>p.pMin AND e.ePrice<p.pMax;