MySQL多表查询总结
MySQL术语:
- Redundacncy(冗余):存储两次或多次数据,以便实现快速查询。
- Primary Key(主键):主键是唯一的。表中每条记录的唯一标识。
- Foreign Key(外键):用于连接两张表。
表的连接方式
- 内连接
- 外连接
- 自连接
数据准备
创建两张表:student表,college表。
student表结构;
CREATE TABLE `student` (
`studentId` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`phone` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`collegeId` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`studentId`),
KEY `collegeId` (`collegeId`)
) ENGINE = MyISAM CHARSET = utf8 COLLATE utf8_unicode_ci;
创建的表:

college表结构:
CREATE TABLE `college` (
`collegeId` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`collegeName` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`collegeId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
创建的表:

内连接
内连接就是表间的主键与外键连接,只取键值一致的,可以获取双方表中的数据。语法:
SELECT 列明1,列明2......FROM 表1 INNER JOIN 表2 ON 表1.外键 = 表2.主键 WHERE 条件语句;
具体MySQL代码:SELECT student.name,college.collegeName FROM student INNER JOIN college ON student.collegeId = college.collegeId;
查询结果:

说明:通过表的内连接,实现了对两张表的数据的查询。将student表中的name字段与college表中的collegeName字段查询出来。
外连接
与取得两张表中的数据相比,外连接只能取得其中一方存在的数据,外连接又分为左连接和右连接两种情况。
左外连接
左外连接是以左表为标准,值查询在左边表中存在的数据,当然需要两个表中的键值一致。语法为:
SELECT 列明1 FROM 表1 LEFT OUTER JOIN 表2 ON 表1.外键 = 表2.主键 WHERE条件语句;
MySQL代码:SELECT student.name,collegeName FROM student LEFT OUTER JOIN college ON student.collegeId = college.collegeId;
运行结果;

可以看到,与内连接不同的是:【钱七】这个学生虽然没有学校ID,但是也被查询出来了,这就是我们所说的,左外连接会以左表中的全部数据作为基础进行查询。
右外连接
同理,右连接将会以右边的数据作为基础,进行检索。语法为:
SELECT 列名1 FROM 表2 RIGHT OUTER JOIN 表2 ON 表1.外键 = 表2.主键 WHERE 条件语句;
代码:
SELECT student.name,college.collegeName FROM student RIGHT OUTER JOIN college ON student.collegeId = college.collegeId;
运行结果:

从运行结果中可以看到,结果是根据右边的数据表college为基础进行检索的。因为表student中并没有“厦大”对应的学生,所以检索出来的结果为NULL。
总结:
- 内连接是抽取两张表中键值一致的数据,而外连接(左连接、右连接)时,是以其中的一个表中的全部记录作为基础进行检索的。
- 左连接与右连接只有数据基准的区别,本质上市一样的,具体使用哪种连接,根据实际情况决定。
- 无论是内连接还是外连接,在查询时候,最好使用【表明.列明】的方式指定需要查询的列明,否则一旦两个表中出现了列明一致的数据,将会报错。
- 表的别名。其实在我们的实际工程中,如果遇到表明复杂的情况,往往通使用表的别名来简化代码。例:SELECT a.name,b.collegeName FROM student a RIGHT OUTER JOIN college b ON a.collegeId = b.collegeId;/SELECT a.name,b.collegeName FROM student AS a RIGHT OUTER JOIN college AS b ON a.collegeId = b.collegeId;(遇上面代码运行结果一致)。这样会使得代码更加简洁。
自连接
自连接顾名思义,就是根据自己连接自己。
现在我们修改【student】表的数据如下,进行效果验证。

代码:SELECT * FROM student s,student a WHERE a.collegeId = s.collegeId AND a.name <> s.name ORDER BY a.collegeId;

可以看出我们就将【student】表,在同一个学生的学生查出来了。
语句解释:
- 【student s】和【student a】的含义是分别给两张表起了一个别名,为了代码简洁。
- 【a.collegeId = s.collegeId AND a.name <> a.name】的含义是找出【collegeId】相同,但是【name】不同的人。
- 【order BY a.collegeId】将结果按顺序输出。
子查询
通常我们在查询的SQL中嵌套查询,成为子查询。子查询通常会使得复杂的查询变得简单,但是相关的子查询要对基础表中的的每一条数据都进行子查询的动作,座椅当表彰的数据量过大的时候,一定要慎重选择。基本语法如下:
SELECT 列明1 ...FROM
代码:
SELECT * FROM (SELEC
T student.name,college.collegeName FROM student INNER JOIN college ON student.collegeId = college.collegeId)b WHERE b.collegeName = '清华';
结果:

MySQL多表查询总结的更多相关文章
- MySQL多表查询之外键、表连接、子查询、索引
MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...
- Mysql 单表查询 子查询 关联查询
数据准备: ## 学院表create table department( d_id int primary key auto_increment, d_name varchar(20) not nul ...
- (转)Mysql 多表查询详解
MySQL 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...
- MySQL多表查询回顾
----------------------siwuxie095 MySQL 多表查询回顾 以客户和联系人为例(一对多) 1.内连接 /*内连接写法一*/ select * from t_custom ...
- python 3 mysql 单表查询
python 3 mysql 单表查询 1.准备表 company.employee 员工id id int 姓名 emp_name varchar 性别 sex enum 年龄 age int 入职 ...
- python3 mysql 多表查询
python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id ...
- Mysql 单表查询-排序-分页-group by初识
Mysql 单表查询-排序-分页-group by初识 对于select 来说, 分组聚合(((group by; aggregation), 排序 (order by** ), 分页查询 (limi ...
- Mysql 单表查询where初识
Mysql 单表查询where初识 准备数据 -- 创建测试库 -- drop database if exists student_db; create database student_db ch ...
- MySQL多表查询合并结果union all,内连接查询
MySQL多表查询合并结果和内连接查询 1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tab ...
- MySQL多表查询、事务、DCL:内含mysql如果忘记密码解决方案
MySQL多表查询.事务.DCL 多表查询 * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id ...
随机推荐
- CF1032B Personalized Cup
一个多月前写的题,既然没人写题解,那蒟蒻就写一篇吧 基本思路 既然是输出任意一个解,那么号的位置在那里是没有关系的.我的思路是默认*号在最后面,然后对输入的字符串输出的行数进行分类. 代码 #incl ...
- 笔记-2:python基本数据类型
1.数字类型 1.1 整数类型 整数类型有4种进制表示:十进制,二进制,八进制,十六进制,默认情况下,整数采用十进制. 整数类型有4种进制:十进制. 二进制. 八进制和十六进制. 默认情况, 整数采用 ...
- 网络编程[第三篇]基于tcp协议实现远程连接
需要用到subprogress模块来远程控制cmd控制台程序来得到控制台的输出信息 一.服务端 —— 控制输出信息 import socket import subprocess #socket实例化 ...
- python — 生成器、推导式、递归
目录 1 生成器(函数的变异) 2 推导式 3 递归 1 生成器(函数的变异) 判断一个函数是否是生成器函数:只需看函数内部是否有yield # 生成器函数(内部是否包含yield) def func ...
- golang数据基本数据类型和string类型的转换
基本类型之间的转换 golang在不同类型的变量之间赋值时需要显式转换,也就是说golang中数据类型不能自动转换. 表达式T(v)将值v转换为类型T 1.数据类型的转换可以是从范围小——>范围 ...
- 用shell脚本安装MySQL-5.7.22-官方版本
Install_CentOS7_MySQL57_binary.sh #!/bin/bash MySQL_Package=mysql-5.7.22-linux-glibc2.12-x86_64.tar. ...
- 二、python数据类型、字符编码、文件处理
一. 前言 1. 什么是数据: x = 10,10就是我们要存储的数据 2. 为何数据要分不同的类型 数据是用来表示状态的, 不同的状态就应该用不同类型的数据去表示 3. 数据类型 数字(整型.长整型 ...
- validform 自定义校验
validform虽然很强大,但是依然不能满足我们各种奇葩的校验,这是时候就需要我们自己去手写. vaildform 也是基于jq的,正常我们需要引入5个文件 supply 是我们自定义方法的js文件 ...
- 【Log4J】
学习mybatis中用到了Log4J 在此记录下 引入 引入Maven配置 <!-- https://mvnrepository.com/artifact/log4j/log4j --> ...
- Kubernetes的初始化容器initContainers
initContainers是一种专用的容器,在应用程序容器启动之前运行,可以包括一些应用程序镜像中不存在的实用工具和安装脚本,可以完成应用的必要数据初始化等工作.总的来说就是在正式的容器启动之前做一 ...