多表查询(连接查询)

article/2025/9/24 8:44:56
  • 在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询
  • 最终需要查询的数据来源于不同的表中时,这个时候需要考虑使用连接查询
    • 新建一张员工表
--  emp 
drop table if exists emp;
create table if not exists emp(
empno int primary key auto_increment,
ename varchar(10) not null,
job varchar(20),
salary double(8,2),
mgr int(10),
bonus double(6,2),
hiredate date,
deptno int(10)
);
    • 插入数据
insert into emp values(null,'mary','sales',7000,6,1000,'2014-1-1',10);
insert into emp values(null,'lily','sales',6000,1,800,'2014-5-1',10);
insert into emp values(null,'tom','sales',5000,1,4000,'2014-3-1',10);
insert into emp values(null,'james','account',8000,6,null,'2014-2-1',20);
insert into emp values(null,'scott','teaching',8000,6,3000,'2014-1-20',30);
insert into emp values(null,'tom','BOSS',38000,null,null,'2013-1-20',30);
insert into emp values(null,'kitty','teaching',7000,5,700,'2014-5-20',30);
insert into emp values(null,'kitty','teaching',6000,5,500,'2014-6-20',30);
insert into emp values(null,'green','analyst',15000,6,1000,'2014-2-20',40);
insert into emp values(null,'brown','analyst',12000,9,7000,'2014-4-20',40);
insert into emp values(null,'danis','department',3000,6,800,'2014-3-4',50);
insert into emp values(null,'brown','department',1800,11,600,'2014-4-20',50);
insert into emp values(null,'smith','department',1200,11,500,'2014-5-20',50);
    • 部门表
drop table if exists dept;
create table if not exists dept(
deptno int primary key,
dname varchar(30),
dlocation varchar(255)
);
insert into dept values(10,'teaching','北京');
insert into dept values(20,'analyst','武汉');
insert into dept values(30,'department','上海');
insert into dept values(40,'sales','郑州');
insert into dept values(50,'account','广州');	

笛卡尔积介绍 

  • 对于数据库中 针对于两张表的记录数的所有记录进行匹配。
  • 将A表中每条记录 与 B表中每条记录进行 匹配 获得笛卡尔积
select * from emp;
select * from dept;
select * from emp,dept; 显示结果就是笛卡尔积 
  • 笛卡尔积结果 就是 两个表记录乘积 例如A 表3条 B表4条
  • 注意: 笛卡尔积结果是无效的,必须从笛卡尔积中选取有效的数据结果 !!!找到他们的关联关系
  • 因为记录所有的显示出来 而我们需要的往往是有效的数据

 

连接查询

内连接查询

  • 关键字:inner join --- on
  • 内链接查询的数据和等值关联查询得到的数据是一样的,是2中表中共有的数据
  • 语句:select * from a_table a inner join b_table b on a.a_id = b.a_id;

外连接查询

  • 左外连接 - 以左表为基准表,左表的所有的数据全部会显示,不管右表是否有匹配项
  • 关键字:left [outer] join on
  • 语句:SELECT * FROM a_table a left join b_table b ON a.a_id = b.b_id;

右外连接

  • 关键字:right join on / right outer join on
  • 语句:SELECT * FROM a_table a right outer join b_table b on a.a_id = b.b_id;

连接查询比较

 

代码理解

-- 查看三门成绩都及格的人数有多少
SELECT COUNT(id)
FROM exam
WHERE chinese > 70 and math > 70 and english >70-- sum() 求和,财务报表的时候,求一列的和
-- avg() 求平均值,某一列的平均值
-- max(),min() 求最大值和最小值的,都是列名
-- 查询数学学科的最高分,最低分,平均分
SELECT MAX(math),MIN(math),AVG(math)
FROM exam-- 求三门学科的总的平均分
SELECT AVG(chinese),AVG(math),AVG(english) FROM exam
SELECT AVG(math) FROM exam
SELECT AVG(english) FROM examSELECT c,m,e,(c+m+e)/3
FROM (SELECT AVG(chinese) c,AVG(math) m,AVG(english) e FROM exam)tb_avg-- 模糊查询 like 
-- col like '规则'
-- 可以使用 _ 一个_代码一个字符  %若干个字符  如
-- name like '张_' 查询所有姓张的,姓名是2个字的
-- 
SELECT *
FROM exam
WHERE name like '%张%'     -- 包含张的都出来
-- WHERE name like '张%'   -- 查询所有的姓张的
-- WHERE name like '张_'   -- 姓名是2个字的姓张的-- in(集合)
-- 批处理的时候。可以和or进行转换使用的
-- 查询id为1,2,3,4的学生的考试信息
SELECT *
FROM exam
WHERE id=1 -- in(集合)
-- 批处理的时候。可以和or进行转换使用的
-- 查询id为1,2,3,4的学生的考试信息
SELECT *
FROM exam
WHERE id in(1,2,3,4)
-- WHERE id=1 or id=2 or id=3 or id=4--  删除id为3,5,6的考试信息
DELETE from exam WHERE id in(3,5,6)-- is NULL, 判断某一列是不是为null
--  is not null , 某一列不为空
-- 查询有哪些学生是没有参加考试的
SELECT *
FROM exam
WHERE chinese is null or math is null or english is NULL-- 查询那些人是没有奖金的
-- 查询哪些人是有奖金的,按照奖金由高到底的进行排序
SELECT ename,job
FROM emp
WHERE emp.bonus is not null
order by emp.bonus desc-- 查询所有员工的个人信息和他对应的部门信息
-- 等值关联查询,
-- 特点 : 2张表中共有的数据
-- 也叫内链接查询
-- tableA a INNER JOIN tableB b ON a.col=b.col
SELECT * 
from emp,dept
WHERE emp.deptno = dept.deptnoSELECT *
FROM emp INNER JOIN dept ON emp.deptno = dept.deptno-- 外连接查询
-- 左外链接,右外链接,其实是可以互相转换的
-- 左外链接,a left join b on a.col = b.col
-- 右外链接  a right join b on a.col = b.col-- 所有的老公的信息和他对应的老婆信息
-- 过滤笛卡尔积
SELECT *
FROM husband h ,wife w
WHERE h.wid = w.widSELECT *
FROM husband INNER JOIN wife ON husband.wid = wife.wid-- 左外链接
-- 将左表所有的数据全部展示出来,右表匹配的数据才会展示,不匹配的不展示
SELECT *
FROM husband LEFT JOIN wife on husband.wid = wife.widSELECT *
FROM husband RIGHT JOIN wife on husband.wid = wife.wid

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

相关文章

数据库高级——多表查询

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

MySQL多表查询

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

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

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

MySQL----多表查询

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

SQL语句多表查询

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

十、多表查询

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

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

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

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

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

sql多表查询

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

sql语句之多表查询

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

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

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

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文件的解析,通过解析Spring.xml配制文件的方式来创建对象。因为之前从来都没遇见过相关的需求,所以对此做一份记录 XML (eXtensible Markup Language) 意为可扩展标记语言,被多数技术人员用以选择…

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文件的方式

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

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;如…

Java解析xml

记录工作中遇到的一些问题和解决方式&#xff0c;自己摘抄整理了一下用来巩固&#xff0c;如有不足或有更好的方式 欢迎交流。 java解析xml的话有四种方式&#xff0c;分别为DOM,SAX,DOM4J,JDOM 转载&#xff1a;Java解析XML(4种方法)_蓝星花的博客-CSDN博客_java解析xml 这里的…

Java解析XML(4种方法)

xml文件 <?xml version"1.0" encoding"utf-8" ?> <class><student><firstname>cxx1</firstname><lastname>Bob1</lastname><nickname>stars1</nickname><marks>85</marks></stud…