IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MYSQL中的连接查询 -> 正文阅读

[大数据]MYSQL中的连接查询

通过对DQL的学习,我们可以很轻松的从?张数据表中查询出需要的数据;在企业的应
?开发中,我们经常需要从多张表中查询数据(例如:我们查询学?信息的时候需要同
时查询学?的班级信息),可以通过连接查询从多张数据表提取数据:
在MySQL中可以使?join实现多表的联合查询——连接查询, join按照其功能不同分为
三个操作:
inner join 内连接
left join 左连接
right join 右连接

1.数据准备

1.1 创建数据表

创建班级信息表 和 学?信息表

create table classes(
class_id int primary key auto_increment,
class_name varchar(40) not null unique,
class_remark varchar(200)
);
create table students(
stu_num char(8) primary key,
stu_name varchar(20) not null,
stu_gender char(2) not null,
stu_age int not null,
cid int,
constraint FK_STUDENTS_CLASSES foreign key(cid) references
classes(class_id) ON UPDATE CASCADE ON DELETE CASCADE
);

1.2 添加数据

添加班级信息

# Java2104 包含三个学?信息
insert into classes(class_name,class_remark) values('Java2104','...');
# Java2105 包含两个学?信息
insert into classes(class_name,class_remark) values('Java2105','...');
# 以下两个班级在学?表中没有对应的学?信息
insert into classes(class_name,class_remark) values('Java2106','...');
insert into classes(class_name,class_remark) values('Python2105','...');

添加学生信息

# 以下三个学?信息 属于 class_id=1 的班级 (Java2104)
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210101','张三','男',20,1);
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210102','李四','?',20,1);
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210103','王五','男',20,1);
# 以下三个学?信息 属于 class_id=2 的班级 (Java2105)
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210104','赵柳','?',20,2);
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210105','孙七','男',20,2);
# ?红和?明没有设置班级信息
insert into students(stu_num,stu_name,stu_gender,stu_age)
values('20210106','?红','?',20);
insert into students(stu_num,stu_name,stu_gender,stu_age)
values('20210107','?明','男',20);

2.内连接 INNER JOIN

语法

select ... from tableName1 inner join tableName2 ON 匹配条件 [where 条件];

2.1 笛卡尔积

1.笛卡尔积(A集合&B集合):使?A中的每个记录?次关联B中每个记录,笛卡尔积的总数=A总数*B总数
2.如果直接执? select … from tableName1 inner join tableName2; 会获取两种数
据表中的数据集合的笛卡尔积(依次使?tableName1 表中的每?条记录 去 匹配
tableName2的每条数据)

2.2 内连接条件

两张表时用inner join 连接查询之后生成的笛卡尔积数据中很多数据都是无意义的,我们如何消除无意义的数据呢? --添加进行连接查询是的条件
1.使用 on 设置两张表连接查询的匹配条件

-- 使?where设置过滤条件:先?成笛卡尔积再从笛卡尔积中过滤数据(效率很低)
select * from students INNER JOIN classes where students.cid =
classes.class_id;
-- 使?ON设置连接查询条件:先判断连接条件是否成?,如果成?两张表的数据进?组合?成?
条结果记录
select * from students INNER JOIN classes ON students.cid =
classes.class_id;

结果:只获取两种表中匹配条件成?的数据,任何?张表在另?种表如果没有找到对应
匹配则不会出现在查询结果中(例如:?红和?明没有对应的班级信息, Java2106和
Python2106没有对应的学?

3.左连接 LIFT JOIN

需求:请查询出所有的学?信息,如果学?有对应的班级信息,则将对应的班级信息也
查询出来
左连接:显示左表中的所有数据,如果在有右表中存在与左表记录满?匹配条件的数据,则进?匹配;如果右表中不存在匹配数据,则显示为Null

# 语法
select * from leftTabel LEFT JOIN rightTable ON 匹配条件 [where 条件];
-- 左连接 : 显示左表中的所有记录
select * from students LEFT JOIN classes ON students.cid =
classes.class_id;

在这里插入图片描述

4.右连接 RIGHT JOIN

-- 右连接 :显示右表中的所有记录
select * from students RIGHT JOIN classes ON students.cid =
classes.class_id;

在这里插入图片描述

5.数据表别名

如果在连接查询的多张表中存在相同名字的字段,我们可以使? 表名.字段名 来进?区
分,如果表名太?则不便于SQL语句的编写,我们可以使?数据表别名
示例:

select s.*,c.class_name
from students s
INNER JOIN classes c
ON s.cid = c.class_id;

6.子查询/嵌套查询

?查询 — 先进??次查询,第?次查询的结果作为第?次查询的源/条件(第?次查询
是基于第?次的查询结果来进?的)

6.1 子查询返回单个值—单行单列

案例1: 查询班级名称为’Java2104’班级中的学?信息 (只知道班级名称,?不知道班级ID)
1.传统的方式

-- a.查询Java2104班的班级编号
select class_id from classes where class_name='Java2104';
-- b.查询此班级编号下的学?信息
select * from students where cid = 1;

2.子查询

-- 如果?查询返回的结果是?个值(单列单?),条件可以直接使?关系运算符(= !=
....)
select * from students where cid = (select class_id from classes where
class_name='Java2105');

6.2 子查询返回多个值—多行多列

案例2: 查询所有Java班级中的学?信息

  1. 传统的方式:
-- a.查询所有Java班的班级编号
select class_id from classes where class_name LIKE 'Java%';
+--------------+
| class_id |
+--------------+
| 1 |
| 2 |
| 3 |
+--------------+
-- b.查询这些班级编号中的学?信息(union 将多个查询语句的结果整合在?起)
select * from students where cid=1
UNION
select * from students where cid=2
UNION
select * from students where cid=3;

2.子查询

-- 如果?查询返回的结果是多个值(单列多?),条件使?IN / NOT IN
select * from students where cid IN (select class_id from classes where
class_name LIKE 'Java%');

案例3: 查询cid=1的班级中性别为男的学?信息

-- 多条件查询:
select * from students where cid=1 and stu_gender='男';
-- ?查询:先查询cid=1班级中的所有学?信息,将这些信息作为?个整体虚拟表(多?多列)
-- 再基于这个虚拟表查询性别为男的学?信息(‘虚拟表’需要别名)
select * from (select * from students where cid=1) t where
t.stu_gender='男';
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:39:43  更:2022-03-04 15:43:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:35:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码