MySQL48--表连接
2021/10/25 2:13:38
本文主要是介绍MySQL48--表连接,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
连接
连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的重要标志。当检索数据时,通过连接操作可以管理存放在多张数据表中的记录信息;
MySQL支持多表查询、多表删除及多表更新;
MySQL连接可以分为:
内连接;
外连接;
自连接;
使用连接
连接的语法结构是:
TABLE_reference { [ INNER | CROSS ] JOIN | { LEFT | RIGHT } [ OUTER ] JOIN } TABLE_reference ON cONditiONal_expr
TABLE_reference语法结构是:
tbl_name [ [ AS ] aliAS ] | TABLE_subquery [ AS ] aliAS
cONditiONal_expr语法结构是:
使用ON关键字来设定连接条件,也可以使用WHERE来代替;
通常使用ON关键字来设定连接条件;使用WHERE关键字进行结果集记录的过滤;
连接类型
INNER JOIN
INNER JOIN称为内连接,返回数据表中符合连接条件的记录;
-- 查询emp表中,员工编号(empno),姓名(ename),职位(job)以及dept表中,部门名称(dname),部门地址(loc) SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno; -- 说明:多表连接查询的关联条件就是查看2张表中是否有相同的列
-- 查询emp表中,员工姓名不包含字母M的,员工编号(empno),姓名(ename),职位(job)以及dept表中,部门名称(dname),部门地址(loc),根据员工编号降序排列 SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno AND NOT e.ename LIKE '%M%' ORDER BY e.empno DESC;
-- 查询部门地址(loc)是CHENGDU的,员工的编号(empno),姓名(ename),职位(job),工资(sal) SELECT e.empno,e.ename,e.job,e.sal FROM emp e,dept d WHERE e.deptno=d.deptno AND d.loc='CHENGDU';
-- 查询emp表中,员工姓名不包含字母K并且部门编号是10号或者20号部门的,员工的编号(empno),姓名(ename),职位(job),部门编号(deptno),以及dept表中部门名称(dname),部门地址(loc),根据员工姓名升序排列 SELECT e.empno,e.ename,e.job,e.deptno,d.dname,d.loc FROM dept d,emp e WHERE e.deptno=d.deptno AND NOT e.ename LIKE '%K%' AND e.deptno in(10,20) ORDER BY e.ename ASC;
-- 查询emp表中,员工编号(empno),姓名(ename),工资(sal),以及salgrade表中工资等级(grade),该等级下的最低工资(losal),该等级下的最高工资(hISal) ----特殊 SELECT e.empno,e.ename,e.sal,s.grade,s.losal,s.hISal FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hISal;
-- 查询emp表中,员工编号(empno),员工姓名(ename),职位(job),工资(sal),上级领导编号(mgr),上级领导姓名(ename) ----特殊 SELECT e.empno,e.ename,e.job,e.sal,e.mgr,m.ename FROM emp e,emp m WHERE e.mgr=m.empno;
LEFT [OUTER] JOIN
LEFT [OUTER] JOIN称为左外连接;
左外连接的结果集包括 LEFT OUTER 子句中指定的左表中所有记录(而不仅仅是符合连接的记录)和右表中符合连接条件的记录;
如果左表的某条记录在右表中没有与之相匹配的记录,则右表的相关字段显示空值(NULL);
-- 查询emp表中全部员工的编号,姓名,职位,工资以及该员工的部门名称(dname),部门地址(loc) SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;
-- 查询dept表中所有部门的全部信息,以及该部门下,员工的编号(empno),姓名(ename),职位(job),根据员工编号降序排列 SELECT d.*,e.empno,e.ename,e.job FROM dept d LEFT JOIN emp e ON e.deptno=d.deptno ORDER BY e.empno DESC;
-- 查询emp表中,员工姓名不包含字母K的,所有员工的编号,姓名,职位,以及该员工的部门名称(dname),部门地址(loc),根据员工编号升序排列 SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno WHERE NOT e.ename LIKE '%K%' ORDER BY e.empno ASC;
RIGHT [OUTER] JOIN
RIGHT [OUTER] JOIN称为右外连接,右外连接是左外连接的反向联接;
右外连接的结果集包括 RIGHT OUTER 子句中指定的右表中所有记录(而不仅仅是符合连接的记录)和左表中符合连接条件的记录;
如果右表的某条记录在左表中没有与之相匹配的记录,则左表的相关字段显示空值(NULL);
-- 查询emp表中全部员工的编号,姓名,职位,工资以及该员工的部门名称(dname),部门地址(loc) SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc FROM dept d RIGHT JOIN emp e ON e.deptno=d.deptno;
连接时可能产生的错误
ERROR 1052 (23000): Column 'type_id' in ON clause IS ambiguous 错误原因:连接时因多张数据表存在相同名称的字段而导致的错误;
这篇关于MySQL48--表连接的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程
- 2024-11-01部署MySQL集群学习:新手入门教程
- 2024-11-01部署MySQL集群入门:新手必读指南
- 2024-10-23BinLog入门:新手必读的MySQL二进制日志指南
- 2024-10-23Binlog入门:MySQL数据库的日志管理指南