MySQL -- 连接查询

news2024/11/26 4:25:54

MySQL使用连接查询(JOIN)是为了从多个相关表中获取数据。连接查询是一种强大且常用的操作,可以根据某些条件将两张或多张表中的数据组合在一起,返回一个联合结果集。

1.为什么使用连接查询

  1. 数据规范化

    • 数据库设计时通常会将数据拆分到不同的表中,以减少数据冗余和提高数据一致性。这种方法称为规范化。
    • 例如,将用户信息存储在一个表中,将订单信息存储在另一个表中。这时,如果你需要获取某用户的订单信息,就需要使用连接查询将这两个表的数据组合在一起。
  2. 提高查询效率

    • 通过使用连接查询,可以减少重复的数据存储,优化数据的管理和查询效率。
    • 比如,一个表中存储用户ID,另一个表中存储用户详细信息,查询时只需要连接用户ID和详细信息表即可获取完整信息,而不需要在单个表中存储冗余数据。
  3. 复杂查询需求

    • 在实际应用中,很多查询需求都涉及多个表的数据。例如,报表生成、数据分析、统计等都需要从多个表中提取相关数据。
    • 连接查询可以实现这些复杂的查询需求,通过合并相关表的数据来满足业务逻辑。

2.主要类型的连接查询

INNER JOIN

  • 仅返回两个表中满足连接条件的记录。
SELECT users.username, orders.order_id
FROM users
INNER JOIN orders ON users.user_id = orders.user_id;
  • 说明:这将返回所有用户和他们的订单,前提是用户和订单在两个表中都有匹配。

LEFT JOIN (或 LEFT OUTER JOIN)

  • 返回左表中的所有记录,即使右表中没有匹配的记录。如果右表没有匹配,则结果为NULL。
SELECT users.username, orders.order_id
FROM users
LEFT JOIN orders ON users.user_id = orders.user_id;
  • 说明:这将返回所有用户以及他们的订单。如果某个用户没有订单,则相应的订单ID将为NULL。

RIGHT JOIN (或 RIGHT OUTER JOIN)

  • 返回右表中的所有记录,即使左表中没有匹配的记录。如果左表没有匹配,则结果为NULL。
SELECT users.username, orders.order_id
FROM users
RIGHT JOIN orders ON users.user_id = orders.user_id;
users. Username
  • 说明:这将返回所有订单以及对应的用户。如果某个订单没有匹配的用户,则相应的用户名将为NULL。

FULL JOIN (或 FULL OUTER JOIN)

  • 返回左表和右表中的所有记录,如果没有匹配则返回NULL。MySQL不直接支持FULL JOIN,可以通过UNION实现。
SELECT users.username, orders.order_id
FROM users
LEFT JOIN orders ON users.user_id = orders.user_id
UNION
SELECT users.username, orders.order_id
FROM users
RIGHT JOIN orders ON users.user_id = orders.user_id;
users. Username

3.测试连接查询

  1. student 表

  • 存储学生的基本信息。
  • uid:学生的唯一标识(主键),自动递增。
  • name:学生姓名。
  • age:学生年龄。
  • sex:学生性别,使用枚举类型,值可以是'M'或'W'。
  1. course 表

  • 存储课程的基本信息。
  • cid:课程的唯一标识(主键),自动递增。
  • cname:课程名称。
  • credit:课程学分。
  1. exame 表

  • 存储考试信息,包括学生、课程和考试成绩。
  • uid:学生ID,对应student表中的uid
  • cid:课程ID,对应course表中的cid
  • time:考试时间。
  • score:考试成绩。
  • PRIMARY KEY(uid,cid):联合主键,确保每个学生在每门课程中只有一个成绩记录。
CREATE TABLE student(
uid INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age TINYINT UNSIGNED NOT NULL,
sex ENUM('M','W') NOT NULL);

CREATE TABLE course(
cid INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
cname VARCHAR(50) NOT NULL,
credit TINYINT UNSIGNED NOT NULL);

CREATE TABLE exame(
uid INT UNSIGNED NOT NULL,
cid INT UNSIGNED NOT NULL,
time DATE NOT NULL,
score FLOAT NOT NULL,
PRIMARY KEY(uid,cid));

插入一些数据

-- 插入数据到 student 表
INSERT INTO student (name, age, sex) VALUES 
('Alice', 20, 'W'),
('Bob', 21, 'M'),
('Charlie', 22, 'M'),
('David', 20, 'M'),
('Eve', 21, 'W');

-- 插入数据到 course 表
INSERT INTO course (cname, credit) VALUES 
('Mathematics', 3),
('Physics', 4),
('Chemistry', 3),
('Biology', 2),
('Computer Science', 3);

-- 插入数据到 exame 表
INSERT INTO exame (uid, cid, time, score) VALUES 
(1, 1, '2024-01-10', 85.5),
(1, 2, '2024-01-11', 90.0),
(2, 1, '2024-01-9', 88.0),
(2, 3, '2024-01-10', 92.5),
(3, 4, '2024-01-12', 75.0),
(3, 5, '2024-01-9', 80.0),
(4, 2, '2024-01-12', 85.0),
(4, 3, '2024-01-12', 87.5),
(5, 1, '2024-01-11', 89.0),
(5, 5, '2024-01-11', 95.0);

 

 

 

 内连接

SELECT a.属性名1,a.属性名2,...,b,属性名1,b.属性名2... FROM table_name1 a inner join table_name2 b on a.id = b.id where a.属性名 满足某些条件;

预置条件:uid:1 cid:2
select score from exame where uid=1 and cid=2;
select a.uid,a.name,a.age,a.sex from student a where a.uid=1;
select c.score from exame c where c.uid=1 and c.cid=2;

连接两张表查询

// on a.uid=c.uid 区分大表 和 小表,按照数据量来区分,小表永远是整表扫描,然后去大表搜索 // 从student小表中取出所有的a.uid,然后拿着这些uid去exame大表中搜索 // 对于inner join内连接,过滤条件写在where的后面和on连接条件里面,效果是一样的

select a.uid,a.name,a.age,a.sex,c.score from student a
inner join exame c on a.uid=c.uid where c.uid=1 and c.cid=2;

select b.cid,b.cname,b.credit from course b where b.cid=2;

 

select a.uid,a.name,a.age,a.sex,b.cid,b.cname,b.credit,c.score
from exame c
inner join student a on c.uid=a.uid
inner join course b on c.cid=b.cid
where c.uid=1 and c.cid=2;

select a.uid,a.name,a.age,a.sex,b.cid,b.cname,b.credit,c.score
from exame c
inner join student a on c.uid=a.uid
inner join course b on c.cid=b.cid
where c.cid=2 and c.score>=90.0;

select b.cid,b.cname,b.credit,count(*)
from exame c
inner join course b on c.cid=b.cid
where c.score>=90.0
group by c.cid
having c.cid=2;//分组以后的过滤

select b.cid,b.cname,b.credit,count(*) cnt
from exame c
inner join course b on c.cid=b.cid
where c.score>=90.0
group by c.cid
order by cnt;

外连接查询

左连接查询

SELECT a.属性名列表, b.属性名列表 FROM table_name1 a LEFT [OUTER] JOIN table_name2 b on a.id = b.id;

// 把left这边的表所有的数据显示出来,在右表中不存在相应数据,则显示NULL
select a.* from User a left outer join Orderlist b on a.uid=b.uid where
a.orderid is null;

 例子:

select a.*,b.* from student a left join exame b on a.uid=b.uid;

找出没有考过试的

select a.*,b.* from student a left join exame b on a.uid=b.uid where b.cid is null;

内连接结果如下

左连接结果如下

 问题,为啥左连接没有把左表全部信息显示,左连接和内连接结果一样

若把where条件放到连接条件on后面

原因分析:

先用b.cid把b表过滤下

 这个内连接和外连接毫无区别,是一样的。所以外连接要把过滤条件写到on中

外连接查不存在的场景,还带有一定的限制条件,限制条件加到on的连接条件后面,where的过滤条件后面写null判空。

右连接查询

SELECT a.属性名列表, b.属性名列表 FROM table_name1 a LEFT [OUTER] JOIN table_name2 b on a.id = b.id;

// 把right这边的表所有的数据显示出来,在左表中不存在相应数据,则显示NULL
select a.* from User a right outer join Orderlist b on a.uid=b.uid where
b.orderid is null;
select * from student where uid not in (select distinct uid from exame);

 select distinct uid from exame-》会产生一张中间表存储结果供外面的sql来查询

not in 对于索引的命中并不高

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

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

相关文章

针对多智能体协作框架的元编程——METAGPT

M ETA GPT: M ETA P ROGRAMMING FOR M ULTI -A GENT COLLABORATIVE F RAMEWORK 1.概述 现有的多智能体系统主要面临以下问题: 复杂性处理不足:传统的多智能体系统主要关注简单任务,对于复杂任务的处理能力有限,缺乏深入探索和…

WeTrade亮相Traders Fair展会菲律宾站

2024年5月25日,菲律宾交易博览会在马尼拉的Edsa香格里拉酒店圆满落幕。 WeTrade作为本次交易博览会的重要战略合作伙伴、参展商和赞助商,吸引了全球各界人士的广泛关注。 现场,我们的菲律宾团队与客户进行了亲密的面对面交流,并…

如何理解与学习数学分析——第二部分——数学分析中的基本概念——第5章——序列

第2 部分:数学分析中的基本概念 (Concepts in Analysis) 5. 序列(Sequences) 本章介绍了序列属性,例如单调性、有界性和收敛性,使用图表和示例来解释这些属性,并演示如何在各种证明中使用它们的定义。讨论了趋于无穷大的序列出…

计算机网络学习实践:DHCP跨网段动态分配IP

计算机网络学习实践:DHCP跨网段动态分配IP 1.实验准备 实验环境:思科的模拟器 实验设备: 1个服务器,2个二层交换机(不是三层的),4个PC机,1个路由器 三个网段 192.168.1.0 255.…

大语言模型 (LLM) 窥探未来

随着2023年的岁月渐渐走向尾声,我们站在人工智能的前沿,回望大语言模型(Large Language Models, LLM)所走过的道路,同时也不禁展望未来。从初步尝试到成为人工智能领域的万千宠爱,一种又一种的技术突破&…

STM32(九):USART串口通信 (标准库函数)

前言 上一篇文章已经介绍了如何用STM32单片机中独立看门狗来实现检测按键点灯的程序。这篇文章我们来介绍一下如何用STM32单片机中USART通信协议来串口通信,并向XCOM发送信息。 一、实验原理 1.通信的介绍 首先,我们先介绍一下通信,何为通…

WordPress--批量关闭 Pingback 和 Trackback

原文网址:WordPress--批量关闭 Pingback 和 Trackback_IT利刃出鞘的博客-CSDN博客 简介 本文介绍WordPress如何批量关闭 Pingback 和 Trackback。 新发布文章默认关闭 在设置> 讨论中关闭如下两项: 关闭已经发布的文章 UPDATE wp_posts SET ping…

分析示例 | Simufact焊接工艺仿真变形精确预测汽车结构

导语 焊接是汽车制造过程中一个关键环节,白车身、发动机、底盘和变速箱等都离不开焊接工艺的应用,主要涉及气保焊、电阻点焊、激光焊、电子束焊等多种焊接工艺。由于汽车车型众多、成形结构复杂、汽车制造质量、效率、成本等方面的综合要求。如何高效、…

OpenGL系列(五)纹理贴图

概述 OpenGL纹理是一种在三维图形中应用纹理映射的技术。纹理是一张图像,可以应用到三维模型的表面上,从而使得模型看起来更加真实和具有细节。通过纹理映射,可以将图像的像素值与三维模型的顶点进行匹配,从而为模型的表面增加细节…

6ull--系统移植(U-Boot、内核kernel、根文件系统rootfs)

1、摘要 版本型号:ubuntu18.04 ARM板型号:imx6ull-emmc-8g核心板 要在Linux内核中进行驱动的编写,因此要找到kernel源码,适配内核kernel到板子上。 本文主要记录对imx6ull进行系统移植 U-Boot是官方自带的,没…

X86+FPGA方案:铁路货车装载视频智能监视系统应用

如果说高铁技术的问世开启了铁路运输的“速度革命”,那么人工智能技术的应用则将造就铁路出行的“智能革命”。铁路是国民经济的大动脉,铁路运输安全不仅影响铁路本身的效率和效益,更直接影响了整个社会的生产生活和稳定和谐。铁路货物运输是…

【笔记】1/4被动悬架垂向动力学仿真+频域特性分析

1/4被动悬架 代码: %书第156页、159页 clc clear close all %% 一.悬架参数 ms320; mw50; Ks22000; Cs1500; Kw195000; f00.07; %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 二.垂向振动动力学仿真 %% 二.1.状态方程 A [0 1 0 -1;.…

LlamaIndex三 配置

前言 在上篇LlamIndex二 RAG应用开发 - 掘金 (juejin.cn)中,我们学习到LlamaIndex对RAG的全面支持。这篇文章,我们就来细化这个过程,尝试各种配置选项,满足不同场景需求。学习过后,大家再开发RAG应用,会更…

数据库优化sql的方案

一: 插入数据的优化 1.insert 如果我们需要一次性往数据库表中插入多条记录,可以从以下三个方面进行优化 优化方案一 批量插入数据 Insert into tb_test values(1,Tom),(2,Cat),(3,Jerry); 优化方案二 start transaction; insert into tb_test values(…

qwen2 vllm推理部署;openai接口调用

参考: https://qwenlm.github.io/zh/blog/qwen2/ 下载 https://huggingface.co/Qwen 下载的Qwen2-7B-Instruct使用: export HF_ENDPOINT=https://hf-mirror.comhuggingface-cli download --resume-download --local-dir-use-symlinks False Qwen/Qwen2-7B-Instruct

webpack 优化构建速度的插件

1.HardSourceWebpackPlugin本地缓存 HardSourceWebpackPlugin这个插件比DLL动态链接库更优秀 HardSourceWebpackPlugin是webpack的插件,为模块提供中间缓存步骤。为了查看结果,您需要使用此插件运行webpack两次:第一次构建将花费正常的时间…

mysql中事务的简介

大家好。我们在日常开发过程中肯定都或多或少的用到过事务,而且在面试时,数据库的事务也是必问内容之一。今天我们就来说说mysql的事务。 为了方便我们下面内容的讲解,我们也先建立一个讲事务必用的表–account表,并在表中插入两…

zoomeye api报错 request invalid, validate usage and try again

项目场景: 调用zoomeye的api接口进行数据拿取 问题描述 之前接口一直通着今天突然报错,以下为源代码 pip install zoomeye from zoomeye.sdk import ZoomEye zm ZoomEye(api_key"34A8B452-D874-C63E0-8471-F3D4f89766f") zm.dork_search(a…

Python 将CSV文件转为PDF文件

CSV文件通常用于存储大量的数据,而PDF文件则是一种通用的文档格式,便于与他人共享和打印。将CSV文件转换成PDF文件可以帮助我们更好地管理和展示数据。本文将介绍如何通过Python编程将CSV文件导出为PDF文件。 Python Excel库安装及介绍 在 Python 中&am…

《手把手教你》系列练习篇之12-python+ selenium自动化测试(详细教程)

1. 简介 前面文章我们了解了如何获取元素的text属性值,和判断元素是否显示在页面(is_displayed()方法),本文我们来学习下,判断一个控件是否被选中状态、获取页面元素的大小、组合键-全选文字、组合键-退格键删除文本和…