MySQL操作实战(三):表联结
1. 简单联结
①内部联结
内部联结
又称为等值联结
。ANSI SQL规范首选INNER JOIN语法
。
内部联结
分为隐式内联结
和显式内联结
,二者查询效果相同,仅仅是语法不一样而已。
隐式内联结:
WHERE子句
FROM tb1_name, tb2_name, tb3_name
WHERE condition_1 AND condition_2
显式内联结:INNER JOIN语法
FROM tb1_name
INNER JOIN tb2_name ON condition_1
INNER JOIN tb3_name ON condition_2
- 应用场景:统计参加了考试的学生及其各科成绩
# 隐式内联结
mysql> SELECT a.stu_id, stu_name, a.lesson_id, lesson_name, score-> FROM t_score a, t_stu_profile b, t_lesson c-> WHERE a.stu_id = b.stu_id AND a.lesson_id = c.lesson_id-> ORDER BY stu_id, lesson_id-> ;
+--------+----------+-----------+-------------+-------+
| stu_id | stu_name | lesson_id | lesson_name | score |
+--------+----------+-----------+-------------+-------+
| 1 | 郭东 | L001 | 语文 | 90 |
| 1 | 郭东 | L002 | 数据 | 86 |
| 2 | 李西 | L001 | 语文 | 84 |
| 2 | 李西 | L002 | 数据 | 90 |
| 2 | 李西 | L003 | 英语 | 86 |
| 2 | 李西 | L004 | 物理 | 75 |
| 2 | 李西 | L005 | 化学 | 77 |
| 3 | 张北 | L001 | 语文 | 100 |
| 3 | 张北 | L002 | 数据 | 91 |
| 3 | 张北 | L003 | 英语 | 85 |
| 4 | 钱南 | L001 | 语文 | 99 |
| 4 | 钱南 | L002 | 数据 | 88 |
| 4 | 钱南 | L003 | 英语 | 66 |
| 4 | 钱南 | L005 | 化学 | 98 |
+--------+----------+-----------+-------------+-------+# 显式内联结
mysql> SELECT a.stu_id, stu_name, a.lesson_id, lesson_name, score-> FROM t_score a-> INNER JOIN t_stu_profile b-> ON a.stu_id = b.stu_id-> INNER JOIN t_lesson c-> ON a.lesson_id = c.lesson_id-> ORDER BY stu_id, lesson_id-> ;
2. 高级联结
①自联结
自联结
通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。虽然最终的结果是相同的,但有时候处理联结远比处理子查询快得多。
- 应用场景:发现成绩表上有个100分的成绩存在问题,需查询100分的这门课程的其它同学的成绩是否存在问题
子查询:先找到100分的这门课程的名称(
lesson_id
),然后找出这门课程的其他同学的成绩。
mysql> SELECT stu_id, score-> FROM t_score-> WHERE lesson_id = (-> SELECT lesson_id-> FROM t_score-> WHERE score = 100)-> ;
+--------+-------+
| stu_id | score |
+--------+-------+
| 1 | 98 |
| 2 | 84 |
| 3 | 100 |
| 4 | 99 |
+--------+-------+
自联结:此查询中需要的两个表实际上是相同的表,因此
t_score表
在FROM 子句
中出现了两次。虽然这是合法的,但对t_score表
的引用具有二义性,因为MySQL不知道引用的是t_score表
的哪个实例。
mysql> SELECT a.stu_id, a.score-> FROM t_score a, t_score b-> WHERE a.lesson_id = b.lesson_id AND b.score = 100-> ;
+--------+-------+
| stu_id | score |
+--------+-------+
| 1 | 98 |
| 2 | 84 |
| 3 | 100 |
| 4 | 99 |
+--------+-------+
②自然联结
无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列)。标准的联结返回所有数据,甚至相同的列多次出现。
自然联结
排除多次出现,使每个列只返回一次。
通配符*
只对表t_stu_profile
使用,所有其它列明确列出,所以没有重复的列被检索出来。
mysql> SELECT b.*, a.lesson_id, c.lesson_name, a.score-> FROM t_score a, t_stu_profile b, t_lesson c-> WHERE a.stu_id = b.stu_id AND a.lesson_id = c.lesson_id-> ;
事实上,迄今为止建立的每个内部联结都是自然联结,很可能永远都不会用到不是自然联结的内部联结。
③外部联结
许多联结将一个表中的行与另一个表中的行相关联,但有时候会需要包含没有关联行的那些行。例如,需要对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户。
那么,联结包含了那些在相关表中没有关联行的行,这种类型的联结称为外部联结
。
- 应用场景:统计每位同学的成绩,包括没参加考试的同学
外部联结:外部联结分为左外部联结(
LEFT OUTER JOIN
)和右外部联结(RIGHT OUTER JOIN
)
mysql> SELECT a.stu_id, stu_name, lesson_id, score-> FROM t_score a-> RIGHT OUTER JOIN t_stu_profile b-> ON a.stu_id = b.stu_id-> ;
+--------+----------+-----------+-------+
| stu_id | stu_name | lesson_id | score |
+--------+----------+-----------+-------+
| 1 | 郭东 | L001 | 98 |
| 1 | 郭东 | L002 | 86 |
| 1 | 郭东 | L003 | 79 |
| 1 | 郭东 | L004 | 88 |
| 1 | 郭东 | L005 | 98 |
| 2 | 李西 | L001 | 84 |
| 2 | 李西 | L002 | 90 |
| 2 | 李西 | L003 | 86 |
| 2 | 李西 | L004 | 75 |
| 2 | 李西 | L005 | 77 |
| 3 | 张北 | L001 | 100 |
| 3 | 张北 | L002 | 91 |
| 3 | 张北 | L003 | 85 |
| 3 | 张北 | L004 | 79 |
| 3 | 张北 | L005 | 85 |
| 4 | 钱南 | L001 | 99 |
| 4 | 钱南 | L002 | 88 |
| 4 | 钱南 | L003 | 66 |
| 4 | 钱南 | L004 | 66 |
| 4 | 钱南 | L005 | 98 |
| NULL | 王五 | NULL | NULL |
| NULL | 赵七 | NULL | NULL |
+--------+----------+-----------+-------+
MySQL操作实战(三):表联结相关推荐
- MySQL编程实战三之求任务执行批次号
MySQL编程实战三之求任务执行批次号 需求: 想产生一个与时间有关的process_id:需要考虑到批次号的不冲突性.例如有很多任务同时执行,这个同时很有可能是在同一毫秒上,所以我们最好使用一个随机 ...
- Mysql 编程实战三之计算两个日期的工作日数
Mysql 编程实战三之计算两个日期的工作日数 1.需求 求出两个日期中的工作日数. 2.实现 代码如下: delimiter // drop procedure if exists getworkd ...
- mysql修改工资字段_基于Linux的MySQL操作实例(修改表结构,MySQL索引,MySQL数据引擎)...
基于Linux的MySQL操作实例(修改表结构,MySQL索引,MySQL数据引擎) 前言 本篇是基于Linux下针对MySQL表结构的修改,MySQL索引的操作以及MySQL数据引擎的配置和说明. ...
- MYSQL基础笔记(三)-表操作基础
数据表的操作 表与字段是密不可分的. 新增数据表 1 Create table [if not exists] 表名( 2 字段名 数据类型, 3 字段名 数据类型, 4 字段n 数据类型 --最后一 ...
- MySQL操作实战(一):关键字 函数
以下为数据库sqltest中的三张表,其结构和内容(部分)如下: 1. 关键字 ①EXISTS.NOT EXISTS EXISTS关键字:当EXISTS里的条件语句能够返回记录行时,条件为真,返回当前 ...
- Mysql常用基础命令操作实战
目录 一 启动与关闭MySQL 3 1.1 单实例MySQL启动与关闭方法 3 ※1※ 常规启动关闭数据库方式(推荐) 3 1.2 多实例MySQL启动与关闭 ...
- mysql三锁,mysql锁机制之表锁(三)
顾名思义,表锁就是一锁锁一整张表,在表被锁定期间,其他事务不能对该表进行操作,必须等当前表的锁被释放后才能进行操作.表锁响应的是非索引字段,即全表扫描,全表扫描时锁定整张表,sql语句可以通过执行计划 ...
- Mysql表并联_SQL多表查询 表联结
一.表的加法 union 将表按照行加起来,如无特殊要求会自动删除重复数据 union all 保留全部的行 二.表的联结 表之间通过列产生关系,并联结在一起 jion联结 1.交叉联结 又称笛卡尔积 ...
- mysql第四篇:数据操作之多表查询
mysql第四篇:数据操作之多表查询 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept (did int not null auto_increment P ...
最新文章
- 重启nagios有异常提示Starting nagios:This account is currently not available
- JVM之GCRoots概述
- POJ 3020 Antenna Placement
- 九大经典算法之选择排序、堆排序
- 算法:动态规划算法的最佳实践-背包问题
- ubuntu16.04安装python.h_ubuntu16.04 下基于 Python 的 OpenCV 的安装
- IE浏览器不能上网的处理办法
- 理财经理们都想用AI,但客户们不想用 | 福布斯报告
- python代码命令行tab补齐_超简python命令行tab一键补全方法
- yum install安装时 提示“Another app is currently holding the yum lock; waiting for it to exit...”原因和解决
- bzoj2101[Usaco2010 Dec]Treasure Chest 藏宝箱 DP
- 狭义相对论从入门到入土(建议初一及以上)
- 百度OCR java-SDK做图文识别
- 金山办公上市,600亿!WPS求伯君:永远去做你余生中最重要的那件事
- 新起点,何去?何从?
- 法雷奥ScaLa核心人物加入:如何带领速腾聚创踏上车规激光雷达量产之路?...
- 找不到动态库解决方案
- 用Python下载一个网页保存为本地的 HTML文件
- flutter 报错之 No MediaQuery widget found.
- Android 音频设备管理