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.展示每种进货的商品名称及其对应的收货员工姓名,如果商品尚未被指派收货员工,则显示"待指派"。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么做好企业短信服务呢?(文字短信XML接口示例)

企业短信服务已经成为各行各业都信赖的行业推广方式之一,并且短信行业也与时俱进的发展着,随之而来的就是市场上短信平台的数量也随之增多。那么怎么在鱼龙混杂的短信行业中选择适合自己的企业短信服务平台呢?企业短信服务平台又适用于哪些应…

合并两个有序链表和合并 K 个升序链表

21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2 […

【C语言】字符串左旋(三种方法)

(方法3只给出思路参考) 问题 描述: 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 分析 我们先来理解一下,什么叫“左旋”?其实是这…

html+CSS+js部分基础运用12

一、显示列表项的内容 编写javaScript代码实现用户登录时数据合法性校验功能,界面如图教材P338 第2题,效果如下图所示: 图1 显示列表项内容 二、日期的处理 实时显示当前时间及累计登录时间,如下图2所示。[提示window.setInt…

两款 IntelliJ IDEA 的 AI 编程插件

介绍两款 IntelliJ IDEA 的 AI 编程插件:通义灵码和 CodeGeeX。 通义灵码 这是由阿里推出的一个基于通义大模型的 AI 编码助手。 它提供了代码智能生成、研发智能问答等功能。通义灵码经过海量优秀开源代码数据训练,可以根据当前代码文件及跨文件的上下…

【Moveit】step或stl文件转urdf,并添加到机械臂上

【Moveit】step或stl文件转urdf,并添加到机械臂上 文章目录 【Moveit】step或stl文件转urdf,并添加到机械臂上1. 安装sw_urdf_exporter插件2. 导出urdf3. 将夹爪连接到机械臂上4. 使用moveit_setup_assistant配置功能包Reference ROS专门提供了一种机器人…

clion配置ssh隧道转发 实现远程主机功能

clion配置ssh隧道转发 clion自带的ssh配置只能配置主机和用户名的格式来实现ssh,因此如果需要通过中间设备来访问调试主机的话就无法使用了。 配置ssh隧道的方式有两种,一种是直接配置 ~/.ssh/config 配置文件,一种是使用跳板机工具。clion…

Java邮件客户端设计实现:使用JavaMail向QQ邮箱发邮件

目录 JavaMail 用JavaMail向qq邮箱发消息 ▐ 授权码的获取 JavaMail JavaMail 是一个用于发送和接收电子邮件的 Java API。它提供了一个平台无关和协议无关的框架,允许开发人员通过标准电子邮件协议(如 SMTP、POP3 和 IMAP)来创建、发送…

【TB作品】MSP430 G2553 单片机口袋板,电风扇模拟控制系统设计

功能 电风扇模拟控制系统设计 基本要求: 用LED/LCD 显示电风扇的工作状态 (1,2,3,4 四档风力), 显示风类:“自然风”、“常风”和“睡眠风”。 设计 “自然风”“常风”和“睡眠风” 三个风类键用于设置风类 设计一个“摇头”键用于控制电机摇头。 设计一个“定时”键&#x…

如何快速理解并掌握Java泛型的概念和使用方法

Java泛型(Generics)是Java SE 5引入的一种语言特性,旨在增强类型安全性和代码的重用性。泛型允许类、接口和方法操作对象的特定类型,同时在编译时进行类型检查。通过使用泛型,我们可以编写更通用、更灵活的代码&#x…

Linux用docker安装ElasticsearchSpringBoot整合ES

一. 部署Elasticsearch 1. docker查询docker容器中的es docker search elasticsearch 2. 安装(PS:查看自己的springBoot的版本号 对应的es版本安装) docker pull elasticsearch:7.6.23. 查看已安装的docker镜像 docker images4. 创建挂…

再论Web应用在医学研究中构建数据收集问卷(stremlit_survey包体验)

再论Web应用在医学研究中构建数据收集问卷(Streamlit_survey包体验) 概述 医学队列研究是临床研究的重要形式,这种研究通过收集临床诊疗过程中产生的数据而阐述疾病相关的因素。在临床数据收集过程中,Web APP体现出了一定的优势…

SpringBoot项目本地运行正常,jar包运行时前端报错403:No mapping for......

SpringBoot项目本地运行正常,jar包运行时前端报错403:No mapping for… 提示:在部署jar包到云服务器上之前,一定要在本地运行jar包,查看前端代码是否运行正常,若报错的话可以节省很多时间 方式:…

Linux命令篇(六):vi/vim专项

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝您生活愉快! 文章目录 一、什么是vim二…

弘君资本:如何看待股价波动?

在股票商场上股价的动摇无疑是投资者最为关怀的话题之一,面临股价的起伏不定投资者往往会感到迷茫和焦虑。对于怎么看待股价动摇,弘君资本下面就为我们具体介绍一下。 股价动摇是股市运转的常态,股市是国民经济的晴雨表,股票价格…

关于大模型是否开源的分析

引言 随着科技的迅速发展,大模型技术成为推动人工智能前沿的引擎,而开源与闭源之争成为这场技术风暴中的一道独特风景。特斯拉CEO马斯克的言论将开源的旗帜高高举起,宣示着技术的共享和合作的时代已经来临。然而,在数字化时代&am…

机器视觉检测--光源

一,环形光源 较为常见的LED光源之一,提供基本的照明作用。 随着光源距离产品的工作距离LWD变化而产生的亮度分布,如下图暖色表示亮;冷色表示暗。 同时该图示是针对特定一款大小的环形光源的数据(下同)。 二…

【二进制部署k8s-1.29.4】八、worker端安装kubelet和cotainerd

文章目录 简介 一.安装containerd1.1.安装containerd1.2.生成containerd配置文件并启动 二.安装kubelet并配置启动文件2.1.准备kubelet配置文件及证书2.2.安装kubelet2.3.配置启动脚步 三.将node节点加入集群注意事项 简介 本章节主要讲解安装containerd和kubelet,containerd主…

【Android】使用EventBus进行线程间通讯

EventBus 简介 EventBus:github EventBus是Android和Java的发布/订阅事件总线。 简化组件之间的通信 解耦事件发送者和接收者 在 Activities, Fragments, background threads中表现良好 避免复杂且容易出错的依赖关系和生命周期问题 Publisher使用post发出…

什么是公有云?与私有云的区别

公有云是指第三方提供商通过公共Internet为用户提供的云服务,用户可以通过Internet访问云并享受各类服务,包括并不限于计算、存储、网络等。公有云服务的模式可以是免费或按量付费。 微 思 | 好 课 推 荐 (全国直播) 【公有云】华…