MySQL_6 自连接和外连接
目录
一、自连接
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...;
注意事项——
1° 可以根据需要对查询的字段起别名;
2° 对表进行自连接时,必须对该表起两个别名,否则报错;对表起别名时不需要用到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:teacher +----+--------+ | id | name | +----+--------+ | 1 | 刘德华 | | 2 | 张学友 | | 4 | 黎明 | + ...
- Hibernate进阶之如何使用Hql内连接,外连接以及自连接
一.sql语句中的 内连接.自连接和外连接: 1.使用等值连接/内连接查询,查询客户姓名,订单编号,订单价格 等值连接/内连接:只能查询出符合条件的记录: select c.name,o.ordern ...
- Oracle 表连接方式(内连接/外连接/自连接) 详解
Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左 ...
- 笛卡尔集基本原理,等值连接,不等值连接,外连接,自连接
1笛卡尔集基本原理 两个表如果笛卡尔集运算 (1)行数是两个表行数相乘的结果 (2)列是两个表合集 案例: 错误查询方式: select count(e.EMPNO) from emp e,de ...
- 数据库编程1 Oracle 过滤 函数 分组 外连接 自连接
[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲>数据库编程1 Oracle 过滤 函数 分组 外连接 自连接本文实验基于的数据表:winso ...
- mysql内连接的自连接_mysql 内连接、外连接、自连接
一)内连接(等值连接):查询客户姓名,订单编号,订单价格 --------------------------------------------------- select c.name,o.isb ...
- 连接(交叉连接、内连接、外连接、自连接)
本文非原创 可分为:交叉连接.内连接.外连接.自连接 1.使用交叉连接: 它是非限制连接,就是将两个表格不加任何条件的组合在一起, 即第一个表格的所有记录分别和第二个表格的每一条记录相连接 组合成新的 ...
- 非等值连接,外连接,自连接,子查询
非等值连接,外连接,自连接,子查询 非等值连接: select empno,ename,sal,grade from emp,salgrade where sal between salgrade.l ...
- SQL内连接、外连接、全连接、交叉连接、自连接、自然连接
SQL内连接.外连接.交叉连接 内连接(inner join) 外连接(outer join) 左外连接 右外连接 全连接(full join) 交叉连接(cross join) 隐式交叉连接与显式交 ...
最新文章
- 多机多卡训练基本原理
- linux查询锁定时间,Linux限制远程登陆尝试密码次数及锁定时间
- mysql数据库搜索字符_在MySQL数据库中快速搜索字符串?
- matlab 坐标修改gca及Matlab中输入上标、下标、希腊字母,特殊符号或字体
- Excel批量转csv格式
- Head First Python-Python中与文件相关的操作-读、处理、写
- linux下jdk源码安装,Linux JDK 源码安装
- html导出excel 内存不足,web导出excel那些坑
- Greenplum segment级问题的排查 - gp_session_role=utility (含csvlog日志格式解读)
- 多线程编程、线程同步|安全和线程通信
- P2420 让我们异或吧 (树链剖分,异或前缀和)
- The host '192.168.174.130' is unreachable. the host may be down..............
- Tomcat优化技巧
- Python函数练习题
- Ubuntulinux离线安装ClamTk杀毒软件步骤和使用方法
- 【Day3.3】美攻铁道市场零距离接触行驶中的火车
- libed2k源码导读:(二)Session接口以及实现分析
- layui表格使用及分页实现
- 如何选择适合自己业务的服务器配置
- 程序创业会有哪些坑?
热门文章
- Linux权限(重点)
- static中兴考试题
- pythonocc 保存为图片
- Flash卡的技术入门
- 华科大考研计算机系834大纲之计算机网络(三)
- 真正解决出现pip安装软件时出现Command “python setup.py egg_info“ failed with error code 1 in /tmp/的办法
- 在公共场所提供给用户使用的多媒体计算机,计算机一级填空-重点
- 资深老司机带你玩转-测试用例
- 哪些名人在学python_大佬分析:哪些人适合学习Python
- 数据结构——图的存储结构