目录

一、自连接

1.概述 :

2.语法 :

3.演示 :

二、外连接

1.为什么需要外连接?

2.外连接的定义 :

3.外连接的演示 :

1° 左外连接

2° 右外连接

3° 对部门表问题的解决


一、自连接

1.概述 :

自连接是指在同一张表上的连接查询(将同一张看做两张表);自连接本质上就是特殊的多表查询。

2.语法 :

        SELECT column_1 [AS alias_1], column_2 [AS alias_2]...

                FROM table_1 表别名, table_2 表别名...

                WHERE connect_expression...;

        注意事项——

        可以根据需要对查询的字段起别名;

        对表进行自连接时,必须对该表起两个别名,否则报错;对表起别名时不需要用到AS。

3.演示 :

先来建一张职员表,如下——

CREATE TABLE IF NOT EXISTS `staff`(`sno` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,`sname` VARCHAR(40) NOT NULL DEFAULT '',`ssex` CHAR(10),`ssalary` DECIMAL(8,2),`mgr` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;INSERT INTO `staff`(`sno`,`sname`,`ssex`,`ssalary`,`mgr`)VALUES(1000,'Cyan','male',15000,500),(1001,'Ice','male',17000,501),(1002,'Rain','female',20000,502),(1003,'Five','female',9900,503),(1004,'Rose','female',13500,504),(1005,'Wood','male',12700,505),(500,'爷1号','male',99999,0),(501,'爷2号','male',99999,0),(502,'爷3号','male',99999,0),(503,'爷4号','male',99999,0),(504,'爷5号','male',99999,0),(505,'爷6号','male',99999,0);SELECT * FROM `staff`;

现要求——
                查询职员编号,职员姓名,以及职员对应的的上级编号和上级姓名。如下:

# 相当于把第一张表当作了下属表,第二张表当作了上级表(本质是同一张表)。
SELECT`demo_1`.`sno` AS 'sub_no',`demo_1`.`sname` AS 'sub_name',`demo_1`.`mgr` AS 'sup_no',`demo_2`.`sname` AS 'sup_name'
FROM`staff` `demo_1`,`staff` `demo_2`
WHERE`demo_1`.mgr = `demo_2`.sno;


二、外连接

1.为什么需要外连接?

多表查询中,通过WHILE子句的条件来对笛卡尔积的结果进行过滤;但是查询结果只会显示WHERE关联条件匹配成功的记录,而不显示匹配失败的记录

举个栗子,当前有两张表分别是雇员表emp部门表dep,如下图所示 :

现要求——
                查询员工姓名,员工职位,员工部门号以及对应的部门名称,并且如果某个部门下没有员工,也要求显示出部门号和部门名称。

SELECT ename,ecareer,emp.deptno,dnameFROM emp,depWHERE emp.deptno = dep.dno;

显然,普通的多表查询无法满足我们的需求。这是因为雇员表中没有出现40部门的员工,因此不满足WHERE子句的关联条件,而多表查询只会显示匹配WHERE子句条件的记录,因而也就无法显示40部门的部门号和部门名称,但40部门又确实是真实存在的,这便是多表查询的一个弊端。

2.外连接的定义 :

外连接最常用的有两种,左外连接和右外连接。其中,左外连接表示连接后左侧的表会完全显示右外连接则表示连接后右侧的表会完全显示

        左外连接使用格式如下——

                SELECT column_1, column_2...column_n

                        FROM table_1 LEFT JOIN table_2

                        ON connect_expression;

右外连接使用格式如下——

SELECT column_1, column_2...column_n

                        FROM table_1 RIGHT JOIN table_2

                        ON connect_expression;

注意事项——
        左外连接后,左表中无法匹配查询条件的记录也会显示,但左表中不存在的字段数据自动为NULL;右外连接后,右表中无法匹配查询条件的记录也会显示,但右表中不存在的字段数据自动为NULL。

3.外连接的演示 :

1° 左外连接

先来建两张表——学生表stus和成绩表scores。
                创建学生表stus的代码如下 : 

CREATE TABLE IF NOT EXISTS `stus`(`id` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,`name` VARCHAR(32) NOT NULL DEFAULT '',`sex` CHAR(16) NOT NULL DEFAULT ''
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;INSERT INTO `stus`(`id`, `name`, `sex`)VALUES(1, 'Cyan', 'male'),(2, 'Five', 'female'),(3, 'Ice', 'male'),(4, 'Rain', 'female'),(5, 'Kaiyu', 'male');SELECT * FROM `stus`;

学生表stus效果如下 : 

创建成绩表scores的代码如下 : 

CREATE TABLE IF NOT EXISTS `scores`(`id` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,`score` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;INSERT INTO `scores`VALUES(1, 141),(2, 135),(5, 142),(7, 138),(10, 150);SELECT * FROM `scores`;

成绩表scores效果如下 :         

现要求——
                查询学生的编号,姓名和成绩;并要求显示所有的学生,若该学生无成绩,则成绩一栏显示为空。

SELECT stus.id, `name`, scoreFROM stus LEFT JOIN scoresON stus.id = scores.id;

2° 右外连接

仍然操作学生表stus和成绩表scores,
                现要求——
                要求查询学生的编号,姓名,性别及成绩;并要求显示所有的成绩,若学生表中无对应的学生,则学生的相关信息显示为空。

SELECT stus.id, `name`, sex, scoreFROM stus RIGHT JOIN scoresON stus.id = scores.id;

3° 对部门表问题的解决

针对于“为什么需要外连接”中引出的关于显示所有部门的问题,现在可以通过左外连接和右外连接进行解决。
                需求如下——
                查询员工姓名,员工职位,员工部门号以及对应的部门名称,并且如果某个部门下没有员工,也要求显示出部门号和部门名称
                代码如下 : 

# 方式一 : 左外连接
SELECT ename,ecareer,dep.dno,dnameFROM dep LEFT JOIN empON dep.dno = emp.deptno;# 方式二 : 右外连接
SELECT ename,ecareer,dep.dno,dnameFROM emp RIGHT JOIN depON emp.deptno = dep.dno;

  System.out.println("END------------------------------------------------------------------------------"); 

MySQL_6 自连接和外连接相关推荐

  1. 自连接、外连接和自连接查询

    表1:teacher +----+--------+ | id | name   | +----+--------+ |  1 | 刘德华 | |  2 | 张学友 | |  4 | 黎明   | + ...

  2. Hibernate进阶之如何使用Hql内连接,外连接以及自连接

    一.sql语句中的 内连接.自连接和外连接: 1.使用等值连接/内连接查询,查询客户姓名,订单编号,订单价格 等值连接/内连接:只能查询出符合条件的记录: select c.name,o.ordern ...

  3. Oracle 表连接方式(内连接/外连接/自连接) 详解

    Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制)        (2)右外连接(右边的表不加限制)         (3)全外连接(左 ...

  4. 笛卡尔集基本原理,等值连接,不等值连接,外连接,自连接

     1笛卡尔集基本原理 两个表如果笛卡尔集运算 (1)行数是两个表行数相乘的结果 (2)列是两个表合集 案例: 错误查询方式: select count(e.EMPNO) from emp e,de ...

  5. 数据库编程1 Oracle 过滤 函数 分组 外连接 自连接

    [本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲>数据库编程1 Oracle 过滤 函数 分组 外连接 自连接本文实验基于的数据表:winso ...

  6. mysql内连接的自连接_mysql 内连接、外连接、自连接

    一)内连接(等值连接):查询客户姓名,订单编号,订单价格 --------------------------------------------------- select c.name,o.isb ...

  7. 连接(交叉连接、内连接、外连接、自连接)

    本文非原创 可分为:交叉连接.内连接.外连接.自连接 1.使用交叉连接: 它是非限制连接,就是将两个表格不加任何条件的组合在一起, 即第一个表格的所有记录分别和第二个表格的每一条记录相连接 组合成新的 ...

  8. 非等值连接,外连接,自连接,子查询

    非等值连接,外连接,自连接,子查询 非等值连接: select empno,ename,sal,grade from emp,salgrade where sal between salgrade.l ...

  9. SQL内连接、外连接、全连接、交叉连接、自连接、自然连接

    SQL内连接.外连接.交叉连接 内连接(inner join) 外连接(outer join) 左外连接 右外连接 全连接(full join) 交叉连接(cross join) 隐式交叉连接与显式交 ...

最新文章

  1. 多机多卡训练基本原理
  2. linux查询锁定时间,Linux限制远程登陆尝试密码次数及锁定时间
  3. mysql数据库搜索字符_在MySQL数据库中快速搜索字符串?
  4. matlab 坐标修改gca及Matlab中输入上标、下标、希腊字母,特殊符号或字体
  5. Excel批量转csv格式
  6. Head First Python-Python中与文件相关的操作-读、处理、写
  7. linux下jdk源码安装,Linux JDK 源码安装
  8. html导出excel 内存不足,web导出excel那些坑
  9. Greenplum segment级问题的排查 - gp_session_role=utility (含csvlog日志格式解读)
  10. 多线程编程、线程同步|安全和线程通信
  11. P2420 让我们异或吧 (树链剖分,异或前缀和)
  12. The host '192.168.174.130' is unreachable. the host may be down..............
  13. Tomcat优化技巧
  14. Python函数练习题
  15. Ubuntulinux离线安装ClamTk杀毒软件步骤和使用方法
  16. 【Day3.3】美攻铁道市场零距离接触行驶中的火车
  17. libed2k源码导读:(二)Session接口以及实现分析
  18. layui表格使用及分页实现
  19. 如何选择适合自己业务的服务器配置
  20. 程序创业会有哪些坑?

热门文章

  1. Linux权限(重点)
  2. static中兴考试题
  3. pythonocc 保存为图片
  4. Flash卡的技术入门
  5. 华科大考研计算机系834大纲之计算机网络(三)
  6. 真正解决出现pip安装软件时出现Command “python setup.py egg_info“ failed with error code 1 in /tmp/的办法
  7. 在公共场所提供给用户使用的多媒体计算机,计算机一级填空-重点
  8. 资深老司机带你玩转-测试用例
  9. 哪些名人在学python_大佬分析:哪些人适合学习Python
  10. 数据结构——图的存储结构