MySQl基础入门⑬.5

创建多表连接查询

表准备

CREATE TABLE 员工信息 (员工号 INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,姓名 VARCHAR(50) NOT NULL,性别 ENUM('男', '女') NOT NULL,出生日期 DATE NOT NULL,部门 VARCHAR(50) NOT NULL,手机号码 VARCHAR(20) NOT NULL,-- 根据数据库不同,可能需要为手机号码字段添加UNIQUE约束以确保唯一性UNIQUE KEY `unique_phone` (`手机号码`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

插入数据

INSERT INTO 员工信息 (姓名, 性别, 出生日期, 部门, 手机号码) VALUES
('张三', '男', '1985-06-12', '技术部', '13800138001'),
('李四', '女', '1990-11-7', '市场部', '13912345678'),
('王五', '男', '1988-09-22', '人力资源部', '13711112222'),
('赵六', '女', '1992-04-15', '财务部', '13600001111'),
('陈七', '男', '1995-12-25', '技术部', '13522223333'),
('周八', '女', '1987-07-18', '市场部', '13433334444'),
('吴九', '男', '1991-08-28', '销售部', '13344445555'),
('郑十', '女', '1986-03-10', '研发部', '13255556666'),
('钱十一', '男', '1993-05-20', '人力资源部', '13166667777'),
('孙十二', '女', '1989-12-2', '客服部', '13077778888'),
('朱十三', '男', '1994-07-13', '财务部', '12988889999'),
('马十四', '女', '1990-09-25', '技术部', '12899990000'),
('唐十五', '男', '1987-02-19', '市场部', '12700001112'),
('曹十六', '女', '1992-11-11', '销售部', '12611112223');

CREATE TABLE 销售表 (销售员ID INT(11) NOT NULL,-- 假设销售员ID为外键,引用员工信息表的员工号FOREIGN KEY (销售员ID) REFERENCES 员工信息(员工号),销售业绩金额 DECIMAL(10, 2) NOT NULL,部门 VARCHAR(50) NOT NULL,-- 可以根据需要添加其他字段,如销售日期、产品信息等销售日期 DATE,产品名称 VARCHAR(100)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

插入数据

INSERT INTO 销售表 (销售员ID, 销售业绩金额, 部门, 销售日期, 产品名称) VALUES
(1, 8500.50, '技术部', '2023-04-01', '全麦面包'),
(2, 1200.75, '市场部', '2023-04-02', '低脂牛奶'),
(3, 4500.00, '人力资源部', '2023-04-03', '红富士苹果'),
(4, 9800.25, '财务部', '2023-04-04', '新鲜鸡蛋'),
(5, 7200.10, '技术部', '2023-04-05', '即食燕麦片'),
(6, 5500.60, '市场部', '2023-04-06', '巧克力棒'),
(7, 15000.00, '销售部', '2023-04-07', '混合坚果'),
(8, 6800.30, '研发部', '2023-04-08', '绿茶饮料'),
(9, 3200.90, '人力资源部', '2023-04-09', '冷冻海鲜拼盘'),
(10, 8000.45, '客服部', '2023-04-10', '意大利面'),
(11, 7000.80, '财务部', '2023-04-11', '橄榄油'),
(12, 5000.20, '技术部', '2023-04-12', '黑咖啡豆'),
(13, 9500.15, '市场部', '2023-04-13', '酸奶'),
(14, 4000.55, '销售部', '2023-04-14', '薯片');

CREATE TABLE 进货表 (进货记录ID INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,-- 假设收货人为公司员工,因此收货人ID为外键,引用员工信息表的员工号收货人ID INT(11) NOT NULL,FOREIGN KEY (收货人ID) REFERENCES 员工信息(员工号),产品名称 VARCHAR(20) NOT NULL,货号 VARCHAR(50) NOT NULL,总数量 INT(11) NOT NULL,总金额 DECIMAL(10, 2) NOT NULL,-- 可以根据需要添加其他字段,如进货日期、供应商信息等进货日期 DATE,供应商名称 VARCHAR(100)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

插入数据

INSERT INTO 进货表 (收货人ID, 货号, 总数量, 总金额, 进货日期, 供应商名称) VALUES
(1, 'GR001', 200, 8500.00, '2023-04-01', '绿叶食品有限公司'),
(2, 'DR002', 150, 4500.00, '2023-04-02', '大洋乳制品厂'),
(3, 'FR003', 300, 9800.00, '2023-04-03', '田园鲜果农场'),
(4, 'EG004', 500, 7200.00, '2023-04-04', '金鸡饲养场'),
(5, 'MT005', 250, 5500.00, '2023-04-05', '美味甜品工坊'),
(6, 'CH006', 180, 6800.30, '2023-04-06', '可可巧克力工厂'),
(7, 'NM007', 120, 15000.00, '2023-04-07', '坚果世界'),
(8, 'TE008', 220, 9500.15, '2023-04-08', '茶源饮品集团'),
(9, 'FS009', 350, 4000.55, '2023-04-09', '海之鲜冷冻食品'),
(10, 'SP010', 280, 8000.45, '2023-04-10', '意面之家'),
(11, 'OL011', 160, 7000.80, '2023-04-11', '橄榄庄园'),
(12, 'CF012', 200, 5000.20, '2023-04-12', '咖啡原产地'),
(13, 'YD013', 190, 9800.25, '2023-04-13', '酸奶乐园'),
(14, 'CP014', 230, 4500.90, '2023-04-14', '脆皮薯片厂');

1.交叉连接查询

在MySQL中,交叉连接(Cross Join)又称为笛卡尔积,它返回两个表中所有行的组合。如果一个表有m行,另一个表有n行,那么交叉连接会产生m*n行的结果集。这种类型的查询并不常用,除非你确实需要所有可能的组合。

格式一
select 字段名 from1 cross join2;案例:select * from 员工信息 cross join 销售表;
省略写法:select 字段名 from1,2;

2.内连接查询

内连接(INNER JOIN)是关系型数据库中常用的查询方式之一,它用来返回两个或多个表中满足连接条件的所有记录。内连接基于一个共同列(或多个共同列),只显示那些在所有参与连接的表中都匹配的行。

格式一
select 字段名 from 表名1 join 表名2 ON 表名1.关系字段=表名2.关系字段;案例:select 姓名,销售业绩金额 from 员工信息 join 销售表 on 员工信息.员工号=销售表.销售员ID;JOIN关键字指定了内连接操作。
FROM  员工信息指定了查询的第一个表(左表)。
INNER JOIN 销售表指定了查询的第二个表(右表)。
ON 员工信息.员工号=销售表.销售员ID;是连接条件,表示只有当员工信息表的员工号与销售表的销售员ID相等时,才会从这两个表中选择相应的行进行匹配。
执行这个查询后,结果将只包含那些在员工信息表和销售表中都有对应销售业绩金额的记录,显示员工姓名和他们的销售额。

外连接(Outer Join)在数据库查询中用于返回两个或更多表中匹配的行,以及左表或右表中没有匹配项的行。外连接有三种主要类型:左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN)。在MySQL中,不直接支持FULL OUTER JOIN,但可以通过UNION或其他方法模拟。

左外连接(LEFT JOIN)

左外连接会返回左表(LEFT JOIN关键字左边的表)的所有记录,即使右表中没有匹配。如果右表中没有匹配,则结果集中右表的部分将为NULL。

示例:假设我们想列出所有员工及其销售业绩,包括那些没有销售记录的员工。

SELECT 员工信息.员工号, 员工信息.姓名, 销售表.销售业绩金额
FROM 员工信息
LEFT JOIN 销售表 ON 员工信息.员工号 = 销售表.销售员ID;

右外连接(RIGHT JOIN)

右外连接与左外连接相反,它会返回右表(RIGHT JOIN关键字右边的表)的所有记录,即使左表中没有匹配。如果左表中没有匹配,则结果集中左表的部分将为NULL。

示例:假设我们想列出所有销售记录及其对应的员工信息,包括那些员工信息可能不存在的销售记录(这种情况较少见,但理论上可以这样查询)。

SELECT 员工信息.员工号, 员工信息.姓名, 销售表.销售业绩金额
FROM 员工信息
RIGHT JOIN 销售表 ON 员工信息.员工号 = 销售表.销售员ID;

全外连接(模拟)

MySQL不直接支持FULL OUTER JOIN,但可以通过UNION来模拟,以合并左外连接和右外连接的结果,从而获取两边都不缺失的记录。

示例:展示所有员工和销售记录的组合,无论是否有匹配。

(SELECT 员工信息.员工号, 员工信息.姓名, 销售表.销售业绩金额FROM 员工信息LEFT JOIN 销售表 ON 员工信息.员工号 = 销售表.销售员ID
) UNION (SELECT 员工信息.员工号, 员工信息.姓名, 销售表.销售业绩金额FROM 员工信息RIGHT JOIN 销售表 ON 员工信息.员工号 = 销售表.销售员ID
) ORDER BY 员工号;

注意:最后一个示例中的ORDER BY语句是为了排序结果,以便查看更清晰。在实际应用中,根据需求决定是否需要排序。


做前须知:

IFNULL()的用法

select 收货人ID,ifnull(总数量,0) from 进货表;

在这里插入图片描述

在MySQL中,正确的函数是IFNULL(),但实际上正确的函数名是IFNULL()应为IFNULL()。IFNULL(expression, value_if_null)函数用于判断第一个表达式expression是否为NULL,如果是NULL,则返回第二个参数value_if_null,否则返回第一个表达式的值。这是一个条件函数,用于处理NULL值的简单替换场景。

作用:
IFNULL()函数在SQL中的作用主要是处理NULL值。当我们在查询数据库时,有时会遇到某些字段的值为NULL,这可能会影响到后续的数据处理或展示。IFNULL()函数允许我们为这些NULL值提供一个默认的替换值。


练习题

1.列出所有员工的姓名以及他们销售的商品名称,对于没有销售记录的员工,商品名称显示为"未销售"。

2.编写一个SQL查询,使用右外连接(RIGHT JOIN)来整合“进货表”和“员工信息表”,确保所有员工都被列出,无论他们是否有关联的进货记录。查询应展示员工的姓名以及他们负责的商品货号(如果有的话)。对于没有进货记录的员工,货号显示为NULL。

3.列出每个员工的姓名以及他们销售的任意一款产品名称,如果员工没有销售记录,则显示"无销售记录"。

4.展示每种进货的商品名称及其对应的收货员工姓名,如果商品尚未被指派收货员工,则显示"待指派"。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NVIDIA NIM推理微服务集成6款新模型

NIM(NVIDIA Inference Microservice)最新模型实例 得益于不断涌现的突破性基础模型,生成式 AI 正在彻底改变各行各业的几乎所有用例。这些模型能够理解背景和原因,从而生成高质量的内容和高精度答案。 NVIDIA 不断优化和发布新的模型。本文将为您介绍最…

ctfshow-web入门-爆破(web25)及php_mt_seed工具的安装与使用

爆个🔨,不爆了 hexdec() 函数用于将十六进制字符串转换为十进制数; 注意: 我最开始做这道题时看错了,误以为随机数的种子直接来自于 flag 的前八位,以为就是 ctfshow{ 这八个字符然后 md5 加密再截取&a…

【DSP】【第六篇】开发支持包

1. SYS/BIOS发展历史 2. 下载链接 全目录链接。 2.1 SYS/BIOS DSP/BIOS和SYS/BIOS链接 2.1.1 DSP/BIOS 2.1.2 SYS/BIOS SYS/BIOS下载链接下图红框标记的是CCSv5可以使用的最新的版本。 2.1.2.1 网络驱动与协议栈 SYS/BIOS组件之网络驱动与协议栈 (1&#xf…

2024年Google算法更新打击低质量(如AI生成)内容后,英文SEO优化人员该如何调整谷歌SEO优化策略?

3月5日,谷歌发布了2024年的首次算法更新。与以往更新不同,本次更新更加复杂,这次更新旨在提高搜索结果的质量和相关性,可能对外贸网站排名和流量产生显著影响。也将产生更大的网站数据波动。但在担心自己的网站数据受到影响之前&a…

MYSQL三、MYSQL的函数与约束

一、函数 函数:是指一段可以直接被另一段程序调用的程序或代码。MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。 1、字符串函数 -- concat : 字符串拼接 select concat(Hello , MySQL); -- 输出: Hello M…

通用代码生成器应用场景六,为完善的应用系统收集需求

通用代码生成器应用场景六,为完善的应用系统收集需求 使用急就章功能可以开发一个简单的应用先凑和着使用。此应用系统也可以成为完善的应用系统的原型和祖先。如果您新规划一个完善的应用系统,您可以先使用通用代码生成器生成一个临时使用的系统&#x…

人脸识别系统之动态人脸识别

二.动态人脸识别 1.摄像头人脸识别 1.1.导入资源包 import dlib import cv2 import face_recognition from PIL import Image, ImageTk import tkinter as tk import os注:这些导入语句允许您在代码中使用这些库和模块提供的功能,例如创建…

Cacti EZ中文版 12.2.27 ISO 下载安装

简介 修改了yum源为中国高校联合镜像源 github改为gitee。 系统增加中文语言包。 修改时区为东八区。 增加了常用的软件包。 PS:CactiEZ是一个自动化安装cacti和插件的ISO镜像,本教程的ISO是基于官方的IOS针对国内网络做了修改。 可按照目前最新的Ca…

Java1.8 vue版家政服务系统成品源码 家政管家系统源码 家政月嫂系统源码 家政保洁系统源码 在线派单,师傅入驻全套商业源码

Java1.8 vue版家政服务系统成品源码 家政管家系统源码 家政月嫂系统源码 家政保洁系统源码 在线派单,师傅入驻全套商业源码 一、系统定义 家政上门服务系统是一种利用互联网技术,将家政服务需求与专业的家政服务人员进行高效匹配的平台。它允许用户通过…

【OceanBase诊断调优】—— obdiag 工具助力OceanBase数据库诊断调优(DBA 从入门到实践第八期)

1. 前言 昨天给大家分享了【DBA从入门到实践】第八期:OceanBase数据库诊断调优、认证体系和用户实践 中obdiag的部分,今天将其中的内容以博客的形式给大家展开一下,方便大家阅读。 2. 正文 在介绍敏捷诊断工具之前,先说说OceanBa…

springboot配置

springboot配置 配置文件分类 springboot提供了多种属性配置方式 application.xml(只有老的spring项目使用)application.propertiesapplication.yml(或yaml) 优先级:properties>yml>yaml 配置文件 pom.xml★ 在Spring Boot项目中,pom.xml文件是Maven项目…

PLM系统与PDM系统、ERP系统、CRM系统有哪些关系?

在当今快速发展的信息技术时代,企业信息化已成为提升管理水平和增强竞争力的关键。其中,产品生命周期管理(PLM)作为企业信息化的基石,与其他信息系统如产品数据管理(PDM)、企业资源规划&#xf…

基于SpringBoot+Vue的公园管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

如何自建yum源仓库

文章目录 1,创建可用的yum源文件夹,把你自己的软件包,并放在这个目录文件夹中2,将yum源文件夹目录复制到/var/www/html/中3,客户端修改配置文件4,创建一个 RPM 软件包存储库5,查验是否成功6&…

Dify快速接入微信

一、Dify简介 项目官网:Dify.AI 生成式 AI 应用创新引擎 Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非…

ESP32-C3模组上跑通OTA升级(11)

接前一篇文章:ESP32-C3模组上跑通OTA升级(10) 本文内容参考: 《ESP3-C3 物联网工程开发实战》 乐鑫科技 特此致谢! 上一回说到解决了证书验证的问题,但紧接着又出现了一个新的问题:版本相同无…

QT等比例缩放图片

1、这里使用QLabe控件显示图片,如下: label->setPixmap(QPixmap::fromImage(image_2)); 以上是直接原始大小来显示QImage image_2图片。 label->setAlignment(Qt::AlignCenter); 以上代码,是将显示的图片居中展示,默认…

Vue3-Pinia(大菠萝)附源码

文章目录 Pinia 开源地址Pinia 定义与起源优点与特性Pinia使用准备一个小模块(可参考以下程序)搭建 pinia 环境存储读取数据修改数据(三种方式)storeToRefsgetters$subscribestore组合式写法 更多相关内容可查看 Pinia 开源地址 git地址:https://gitee.com/its-a-l…

干货分享 | 详解TSMaster CAN 与 CANFD 的 CRCE2E 校验方法

面对切换工具链的用户来说,在 TSMaster 上完成总线通讯中的 CRC/E2E 校验处理不是特别熟悉,该文章可以协助客户快速使用 TSMaster 完成 CAN/CAN FD 总线通讯的 CRC/E2E 校验。 本文关键字:TSMaster,CAN/CANFD,CRC 校验…

RK3588平台编译zlog 日志模块

下载zlog之后 解压 进入zlog目录 新建一个build_rk3588.sh脚本 内容如下 make CCaarch64-linux-gcc PREFIX./install_rk3588 将工具链导入环境变量 export PATH/home/QMCY/RK3588/arm64tools/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/:$PATH 编译无问题 产生的…