多表查询(整理)

article/2025/9/24 7:44:35

一、多表关系

概述:项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间互相关联,所以各个表结构之间也存在着各种联系。

基本上有三种:一对多(多对一),多对多,一对一。

  • 一对多(多对一)

 

  • 多对多

 

  • 一对一

 辅助建表内容:

-- 多表查询 --
create table student(id int auto_increment primary key comment '主键id',name varchar(10) comment '姓名',no varchar(10) comment '学号'
)comment '学生表';
insert into student values (null,'黛绮丝','2000100101'),(null,'谢逊','2000100102'),(null,'殷天正','2000100103'),(null,'韦一笑','2000100104');create table course(id int auto_increment primary key comment '主键id',name varchar(10) comment '课程名称'
)comment '课程表';
insert into course values (null,'Java'),(null,'PHP'),(null,'MySQL'),(null,'Hadoop');create table student_course(id int auto_increment primary key comment '主键id',studentid int not null comment '学生id',courseid int not null comment '课程id',constraint fk_studentid foreign key (studentid) references student(id),constraint fk_courseid foreign key (courseid) references course(id)
)comment '学生课程中间表';
insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);create table tb_user(id int auto_increment primary key comment '主键id',name varchar(10) comment '姓名',age int comment '年龄',gender char(1) comment '1: 男 , 2: 女 ',phone char(11) comment '手机号'
)comment '用于多表查询的用户基本信息表';
insert into tb_user(id,name,age,gender,phone)values (null,'英语',45,'1','18800001111'),(null,'冰冰',35,'2','18800002222'),(null,'码云',55,'1','18800008888'),(null,'李彦宏',50,'1','18800009999');create table tb_user_edu(id int auto_increment primary key comment '主键id',degree varchar(20) comment '学历',major varchar(50) comment '专业',primaryschool varchar(50) comment '小学',middleschool varchar(50) comment '中学',university varchar(50) comment '大学',userid int unique comment '用户id',constraint fk_userid foreign key (userid) references tb_user(id)
)comment '用于多表查询的用户教育信息表';
insert into tb_user_edu(id,degree,major,primaryschool,middleschool,university,userid)values (null,'本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈院',1),(null,'硕士','表演','朝阳区第一小学','朝阳区第一中学','北京电影学院',2),(null,'本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学',3),(null,'本科','应用数学','阳泉第一小学','阳泉第一中学','清华大学',4);

二、多表查询概述

  • 概述:指从多张表中查询数据

笛卡尔积:笛卡尔乘积是指在数学中,两个集合A和集合B的所有组合情况

[注]:在多表查询时,需要消除无效的笛卡尔积

三、多表查询分类

概述:

        连接查询

                内连接:相当于查询A、B交集部分数据

                外连接:

                               左外连接:查询左表所有数据,以及两张表交集部分数据

                               右外连接:查询右表所有数据,以及两张表交集部分数据

                 自连接:当前表与自身的连接查询,自连接必须使用表别名

        子查询

                                        

辅助建表内容:

create table mtdept(id int auto_increment comment '编号' primary key ,name varchar(50) not null comment '部门名称'
)comment '用于练习多表查询的部门表';insert into mtdept(id, name) values (1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办'),(6,'人事部');create table mtemp(id int auto_increment primary key comment '编号',name varchar(50) not null comment '姓名',age int comment '年龄',job varchar(20) comment '职位',salary int comment '薪资',entrydate date comment '入职时间',managerid int comment '直属领导id',dept_id int comment '部门id'
)comment '用于练习多表查询的员工表';insert into mtemp (id,name,age,job,salary,entrydate,managerid,dept_id)values  (1,'金庸',66,'总裁',20000,'2000-01-01',null,5),(2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1),(3,'杨逍',33,'开发',8400,'2000-11-03',2,1),(4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),(5,'常遇春',43,'开发',10500,'2004-09-07',3,1),(6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1),(7,'灭绝',60,'财务总监',8500,'2002-09-12',1,3),(8,'周芷若',19,'会计',4800,'2006-06-02',7,3),(9,'丁敏君',23,'出纳',5250,'2009-05-13',7,3),(10,'赵敏',20,'市场部总监',12500,'2004-10-12',1,2),(11,'鹿杖客',56,'职员',3750,'2006-10-03',10,2),(12,'鹤笔翁',19,'职员',3750,'2007-05-09',10,2),(13,'方东白',19,'职员',5500,'2009-02-12',10,2),(14,'张三丰',88,'销售总监',14000,'2004-10-12',1,4),(15,'俞莲舟',38,'销售',4600,'2004-10-12',14,4),(16,'宋远桥',40,'销售',4600,'2004-10-12',14,4),(17,'陈友谅',42,null,2000,'2011-10-12',1,null);

①连接查询-内连接

隐式内连接

select 字段列表 from 表1,表2 where 条件....;

显式内连接

select 字段列表 from 表1 [inner] jion 表2 on 连接条件...;

[注]:内连接查询的是两张表交集的部分

②连接查询-外连接

左外连接

select 字段列表 from 表1 left [outer] join 表2 on 条件....;#相当于查询表1(左表)的所有数据,包含表1和表2交集部分的数据

右外连接

select 字段列表 from 表1 right [outer] join 表2 on 条件....;#相当于查询表2(右表)的所有数据,包含表1和表2交集部分的数据

[注]:我的理解是当进行多表查询的时候会有一些是没有数据的,我们给的条件会自动筛除掉,如果我们需要完完全全的展示出来就可以使用左(右)外连接。然后这两个其实就是谁先谁后,用的时候完全可以只用左外连接或者右外连接,就像我们大多数人习惯右手使用东西一样,一般我们会更习惯用左外连接。

 ③多表查询-自连接(可以是内连接查询,也可以是外连接查询)

select 字段列表 from 表A 别名a jion 表A 别名b on 条件...;

 ④联合查询-union,union all(就是把多次查询的结果合并起来,形成一个新的查询结果集)

select 字段列表 from 表A...
union [all]
select 字段列表 from 表B...;

[注]:加不加all只有一个区别,union all 会有重复的内容,union 会把重复的内容筛除。

⑤子查询

概念:SQL语句中嵌套select语句,称为嵌套查询,又称子查询

select *from t1 where column1 = (select column1 from t2);

[注]:子查询外部的语句可以是 insert / update / delete / select 的任意一个

根据子查询结果不同,分为:

        标量子查询(子查询结果为单个值)

        列子查询(子查询结果为一列)

        行子查询(子查询结果为一行)

        表子查询(子查询结果为多行多列)

根据子查询位置,分为:where之后、from之后、select之后。

-- 标量子查询 --

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式。

常用的操作符:= ,<>,>,>=,<,<=

-- 列子查询 --

子查询返回的结果是一列(可以是多行)。

常用的操作符:in , not in , any , some , all

操作符描述
in在指定的合集范围之内,多选一
not in不在指定的集合范围之内
any子查询返回列表中,有任意一个满足即可
some与any等同,使用some的地方都可以使用any
all子查询返回列表的所有值都必须满足

-- 行子查询 --

 子查询返回结果是一行(可以是多列)。

常用的操作符:= ,<> ,in  ,not in 

 

-- 表子查询 --

子查询返回的结果是多行多列。

常用的操作符:in

 案例练习:

-- 1.查询员工的姓名,年龄,职位,部门信息

-- 2.查询年龄小于30岁的员工姓名,年龄,职位,部门信息

-- 3.查询拥有员工的部门id,部门名称

-- 4.查询所有年龄大于40岁的员工,及其归属的部门名称,如果员工没有分配部门也需要展示出来

-- 5.查询所有员工的工资等级

-- 6.查询“研发部”所有员工的信息及工资等级

-- 7.查询“研发部”员工的平均工资

-- 8.查询工资比“灭绝”高的员工信息

-- 9.查询比平均薪资高的员工信息

-- 10.查询低于本部门平均工资的员工信息

-- 11.查询所有的部门信息,并统计部门的员工人数

-- 12.查询所有学生的选课情况,展示出学生名称,学号,课程名称

辅助建表内容:

create table salgrade(grade int,losal int,hisal int
)comment '用于多表查询的薪资登记表';
insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);

 


http://chatgpt.dhexx.cn/article/Lj31GVVV.shtml

相关文章

mybatis多表查询

目录 前言 一、Mybatis多表查询 2.一对一查询&#xff08;多对一&#xff09; 2.2 一对多查询 2.3 多对多查询 2.4 知识小结 前言 mybatis初学者记录每日学习日常 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Mybatis多表查询 内连接、左外连…

多表查询(连接查询)

在使用数据库查询语句时&#xff0c;单表的查询有时候不能满足项目的业务需求&#xff0c;在项目开发过程中&#xff0c;有很多需求都是要涉及到多表的连接查询最终需要查询的数据来源于不同的表中时&#xff0c;这个时候需要考虑使用连接查询 新建一张员工表 -- emp drop t…

数据库高级——多表查询

多表查询 多表查询有如下几种&#xff1a; 合并结果集&#xff1a;union、union all连接查询&#xff1a; 2.1. 内连接&#xff1a;inner join on 2.2. 外连接&#xff1a;outer join on – 左外连接&#xff1a;left outer join – 右外连接&#xff1a;right outer join 2.…

MySQL多表查询

文章目录 一、什么是多表查询1、概述2、笛卡尔积现象 二、多表查询的分类1、等值连接 vs非等值连接2、自连接 vs 非自连接3、内连接 vs 外连接4、满外连接&#xff08;FULL OUTER JOIN&#xff09; 三、UNION[ALL]的使用四、7种SQL JOINS的实现 一、什么是多表查询 1、概述 多…

【MySQL】多表查询策略(多表联查子查询)

目录 一、MySQL多表查询 二、准备工作 1.运行环境 2.创建公司表 3.创建员工表 三、多表查询 &#xff08;一&#xff09;多表联查—同时查询多张表 1.联结 2.左连接 3.右连接 4.内连接 &#xff08;二&#xff09;子查询 1.SELECT子查询 2.WHERE子查询 3.FROM子…

MySQL----多表查询

MySQL----多表查询 多表关系表与表之间的联系&#xff1a;一对多(多对一)多对多一对一 多表查询多表查询的分类数据准备内连接外连接自连接联合查询子查询标量子查询列子查询行子查询表子查询 多表查询案例 多表关系 在进行数据库表结构的设计时&#xff0c;会根据业务的需求和…

SQL语句多表查询

多表查询 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&a…

十、多表查询

十、多表查询 *多表查询的本质就是把多张表合并成一个临时表 1、多表数据合并方案 连接查询合并方案【最常见】 首先确保两张表之间存在【隶属关系】将两张表中的数据行【沿着水平方向进行拼接】最终得到一个拥有【完整隶属关系】的新数据行 联合查询合并方案 不需要两张表之…

图解数据库多表查询(多表联查)的几种方式

多表查询&#xff0c;也被称为多表连接查询。 为什么会有多表查询这个操作呢&#xff1f; 在实际项目开发过程中&#xff0c;会出现多张表&#xff0c;用于分类存储不同的信息&#xff0c;我们测试需要的数据也会来自不同的表&#xff0c;因此需要使用多表查询。 我们常用的…

史上最牛mysql-06 (多表连接)

多表连接 个人博客 &#xff1a;www.xiaobeigua.icu 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&…

sql多表查询

1.多表查询概念&#xff1a;从多张表查询数据 2.分类&#xff1a;连接查询和子查询。 有两张表A、B 连接查询&#xff1a; 内连接 相当于查询A、B交集数据 例1&#xff1a;select * from emp,dept where emp.dep_iddept.id; 外连接 左外连接&#xff1a;相当于查询…

sql语句之多表查询

文章目录 一、笛卡尔积(交叉连接) ---->cross join1、概念2. 语法3.示例 二、内连接---->inner join1、概念2. 语法3.示例 三、外链接---->outer join1、概念2. 语法3.示例 四、联合连接---->union1、概念2.示例 一、笛卡尔积(交叉连接) ---->cross join 1、概…

连接查询(多表查询)——MySQL

连接查询&#xff08;多表查询&#xff09; 又称多表查询&#xff0c;当查询的字段涉及多个表的时候&#xff0c;就要用到连接查询 分类&#xff1a; 为表起别名&#xff1a; 提高语句的简洁度区分多个重名字段注意&#xff1a;如果为表起了别名&#xff0c;则查询的字段就不…

MySQL-多表查询

一、表架构 student(sid,sname,sage,ssex) 学生表course(cid,cname,tid) 课程表sc(sid,cid,score) 成绩表teacher(tid,tname) 教师表 二 、建表sql语句 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for course -- --…

Java中的XML解析

前言 这几天在手写Spring IOC的时候遇上了xml文件的解析&#xff0c;通过解析Spring.xml配制文件的方式来创建对象。因为之前从来都没遇见过相关的需求&#xff0c;所以对此做一份记录 XML (eXtensible Markup Language) 意为可扩展标记语言&#xff0c;被多数技术人员用以选择…

Java - XML文件解析

Java对XML文件的解析 一、前言二、实例分析 - DOM方式解析XML文件2.1 XMLDomParseUtil - 抽象工具类2.2 待解析xml文件示例2.3 解析xml文件2.3.1 新建一个用于存储xml文件中各节点的属性和属性值的类2.3.2 解析实际节点 2.4 测试 一、前言 1、HTTP网络传输中的数据组织方式有三…

Java解析XML文件的方式

在项目里&#xff0c;我们往往会把一些配置信息放到xml文件里&#xff0c;或者各部门间会通过xml文件来交换业务数据&#xff0c;所以有时候我们会遇到“解析xml文件”的需求。一般来讲&#xff0c;有基于DOM树和SAX的两种解析xml文件的方式&#xff0c;在这部分里&#xff0c;…

java解析xml格式的节点属性值

xml示例&#xff1a; <ResponseContent><Parameter><Document><RecordSet id"1"><Master name"purchase"><Record><Field name"orderNumber" value"1P05-151200172"/><Field name"…

Java解析XML字符串

在网上找了很多Java语言解析XML字符串的资料&#xff0c;很多内容写得很繁复&#xff0c;没有普适性&#xff0c;遂自己动手写了一个用Java解析XML的工具类。话不多说&#xff0c;直接看下面代码&#xff1a; XML解析工具类&#xff1a; import org.dom4j.Document; import o…

JAVA解析xml报文

目录 问题需求 响应报文格式 1&#xff0c;开发导入的依赖 2&#xff0c;开发样例 3&#xff0c;测试结果 问题需求 在工作中此项目请求指定项目之后&#xff0c;项目会返回一个xml报文格式的响应&#xff0c;此时我需要判断返回的报文是否是成功的响应报文&#xff0c;如…