当前位置: 首页 > article >正文

数据库自然连接详解

各类资料学习下载合集

​​https://pan.quark.cn/s/8c91ccb5a474​​

数据库自然连接详解

自然连接(Natural Join)是一种在关系型数据库中用于合并两个或多个表的数据的操作。它基于表之间的公共列,自动识别具有相同列名的列,并将匹配的行合并在一起。自然连接可以简化查询操作,避免手动指定连接条件。在本文中,我们将深入探讨自然连接的概念、用法,并通过Python和SQLite进行示例演示。

1. 自然连接的基本概念

1.1 定义

自然连接是一种特殊类型的连接,它根据表之间的同名列进行连接。在自然连接中,只有一列结果将显示在结果集中,而不是显示重复的列。

1.2 语法

自然连接的基本语法如下:

SELECT *
FROM table1
NATURAL JOIN table2;

1.3 特点

  • 自动识别:自然连接会自动识别两个表中相同名称的列。
  • 消除重复列:在结果集中,相同列只会出现一次。

2. 使用SQLite进行自然连接

我们将通过Python的​​sqlite3​​模块创建一个数据库,展示如何使用自然连接。

2.1 创建数据库和表

首先,我们创建一个SQLite数据库和两个表:​​students​​ 和 ​​courses​​,并插入一些示例数据。

import sqlite3def create_database():connection = sqlite3.connect('school.db')cursor = connection.cursor()# 创建学生表cursor.execute('''CREATE TABLE IF NOT EXISTS students (student_id INTEGER PRIMARY KEY,name TEXT NOT NULL,course_id INTEGER NOT NULL)''')# 创建课程表cursor.execute('''CREATE TABLE IF NOT EXISTS courses (course_id INTEGER PRIMARY KEY,course_name TEXT NOT NULL)''')connection.commit()cursor.close()connection.close()if __name__ == "__main__":create_database()

2.2 插入数据

接下来,我们向这两个表中插入一些数据。

def insert_student(student_id, name, course_id):connection = sqlite3.connect('school.db')cursor = connection.cursor()cursor.execute('INSERT INTO students (student_id, name, course_id) VALUES (?, ?, ?)', (student_id, name, course_id))connection.commit()cursor.close()connection.close()def insert_course(course_id, course_name):connection = sqlite3.connect('school.db')cursor = connection.cursor()cursor.execute('INSERT INTO courses (course_id, course_name) VALUES (?, ?)', (course_id, course_name))connection.commit()cursor.close()connection.close()if __name__ == "__main__":# 插入学生数据students_data = [(1, 'Alice', 101),(2, 'Bob', 102),(3, 'Charlie', 101),(4, 'David', 103)]for student in students_data:insert_student(*student)# 插入课程数据courses_data = [(101, 'Mathematics'),(102, 'Physics'),(103, 'Chemistry')]for course in courses_data:insert_course(*course)

2.3 自然连接查询

现在我们将展示如何使用自然连接来查询学生及其所选课程的信息。

def fetch_students_with_courses():connection = sqlite3.connect('school.db')cursor = connection.cursor()cursor.execute('''SELECT *FROM studentsNATURAL JOIN courses''')rows = cursor.fetchall()cursor.close()connection.close()return rowsif __name__ == "__main__":print("学生及其课程信息:", fetch_students_with_courses())

3. 代码整合

下面是将上面所有代码整合到一个完整的程序中。

import sqlite3def create_database():connection = sqlite3.connect('school.db')cursor = connection.cursor()# 创建学生表cursor.execute('''CREATE TABLE IF NOT EXISTS students (student_id INTEGER PRIMARY KEY,name TEXT NOT NULL,course_id INTEGER NOT NULL)''')# 创建课程表cursor.execute('''CREATE TABLE IF NOT EXISTS courses (course_id INTEGER PRIMARY KEY,course_name TEXT NOT NULL)''')connection.commit()cursor.close()connection.close()def insert_student(student_id, name, course_id):connection = sqlite3.connect('school.db')cursor = connection.cursor()cursor.execute('INSERT INTO students (student_id, name, course_id) VALUES (?, ?, ?)', (student_id, name, course_id))connection.commit()cursor.close()connection.close()def insert_course(course_id, course_name):connection = sqlite3.connect('school.db')cursor = connection.cursor()cursor.execute('INSERT INTO courses (course_id, course_name) VALUES (?, ?)', (course_id, course_name))connection.commit()cursor.close()connection.close()def fetch_students_with_courses():connection = sqlite3.connect('school.db')cursor = connection.cursor()cursor.execute('''SELECT *FROM studentsNATURAL JOIN courses''')rows = cursor.fetchall()cursor.close()connection.close()return rowsif __name__ == "__main__":# 创建数据库和表create_database()# 插入数据students_data = [(1, 'Alice', 101),(2, 'Bob', 102),(3, 'Charlie', 101),(4, 'David', 103)]for student in students_data:insert_student(*student)courses_data = [(101, 'Mathematics'),(102, 'Physics'),(103, 'Chemistry')]for course in courses_data:insert_course(*course)# 查询学生及其课程信息print("学生及其课程信息:", fetch_students_with_courses())

4. 运行结果

运行此完整的程序将产生类似以下的输出:

学生及其课程信息: [(1, 'Alice', 101, 'Mathematics'), (3, 'Charlie', 101, 'Mathematics'), (2, 'Bob', 102, 'Physics'), (4, 'David', 103, 'Chemistry')]

在输出结果中,每一行代表一个学生及其对应的课程信息,其中包含学生的 ​​student_id​​、​​name​​ 和选修课程的 ​​course_id​​ 和 ​​course_name​​。

相关文章:

数据库自然连接详解

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 数据库自然连接详解 自然连接(Natural Join)是一种在关系型数据库中用于合并两个或多个表的数据的操作。它基于表之间的公共列,自动识别具有相同列名的列,并…...

说说MyBatis一、二级缓存和Spring一二级缓存有什么关系?

大家好,我是锋哥。今天分享关于【说说MyBatis一、二级缓存和Spring一二级缓存有什么关系?】面试题。希望对大家有帮助; 说说MyBatis一、二级缓存和Spring一二级缓存有什么关系? 1000道 互联网大厂Java工程师 精选面试题-Java资源…...

蓝桥杯题型分布2

蓝桥杯 蓝桥杯题型分类2素数孪生素数素数个数朴素筛法求素数线性筛法求素数 因数分解试除法分解质因数 等差素数列梅森素数组素数素数环找素数(分段筛)连续素数和小明的素数对疑似素数质数拆分纯质数超级质数质数日期质数游戏2魔法阵的能量阿坤老师切割年糕阶乘分解…...

北京交通大学第三届C语言积分赛

作者有言在先: 题解的作用是交流思路,不是抄作业的。可以把重点放在思路分析上而不是代码上,毕竟每个人的代码风格是不一样的,看别人的代码就跟做程序填空题一样。先看明白思路再看代码。 还有就是,deepseek真的很好用…...

ESP32学习 -从STM32工程架构进阶到ESP32架构

ESP32与STM32项目文件结构对比解析 以下是对你提供的ESP32项目文件结构的详细解释,并与STM32(以STM32CubeIDE为例)的常见结构进行对比,帮助你理解两者的差异: 1. ESP32项目文件解析 文件/目录作用STM32对应或差异set…...

vue响应式原理剖析

一、什么是响应式? 我们先来看一下响应式意味着什么?我们来看一段代码: m有一个初始化的值,有一段代码使用了这个值; 那么在m有一个新的值时,这段代码可以自动重新执行; let m = 20 console.log(m) console.log(m * 2)m = 40上面的这样一种可以自动响应数据变量的代码机…...

【HTML 基础教程】HTML 元素

HTML 文档由 HTML 元素定义。 HTML 元素 开始标签 *元素内容结束标签 *<p>这是一个段落</p><a href"default.htm">这是一个链接</a><br>换行 *开始标签常被称为起始标签&#xff08;opening tag&#xff09;&#xff0c;结束标签常称…...

解锁智能制造新体验:兰亭妙微 UE/UI 设计赋能行业变革

在智能制造时代的滚滚浪潮中&#xff0c;企业的数字化转型不仅是技术的革新&#xff0c;更是用户体验与交互界面的全面升级。然而&#xff0c;许多制造企业在这一转型过程中&#xff0c;面临着一系列 UI/UE 设计难题&#xff0c;严重阻碍了企业的数字化发展进程。兰亭妙微凭借专…...

Element UI实现表格全选、半选

制作如图所示的表格全选、半选&#xff1a; 父组件 <template><div id"app"><SelectHost :hostArray"hostArray" /></div> </template><script> import SelectHost from ./components/SelectHost.vue export default…...

如何使用动作捕捉系统训练人形机器人

随着人形机器人变得越来越先进&#xff0c;使用动作捕捉系统教会它们如何像人类一样移动成为了人形机器人领域正在研究的全新方向。本文探讨了如何使用Xsens技术捕捉精确的人类运动数据&#xff0c;使机器人能够通过人工智能和机器学习安全高效地学习、适应和执行复杂任务。 近…...

Vue.js 和 Vue 3 全面详解指南

1. Vue.js 基础介绍 1.1 什么是 Vue.js Vue.js(简称 Vue)是一个用于构建用户界面的渐进式 JavaScript 框架。与其他框架不同,Vue 被设计为可以逐步采用。Vue 的核心库只关注视图层,易于上手,便于与其他库或既有项目整合。 Vue 由尤雨溪(Evan You)在 2014 年创建。尤雨…...

OpenRAND可重复的随机数生成库

OpenRAND 是一个 C++ 库,旨在通过提供强大且可复制的随机数生成解决方案来促进可重复的科学研究。它是一个简单的仅头文件库,性能可移植,统计稳健,并且易于集成到任何 HPC 计算项目中。 特征 跨平台支持:OpenRAND 旨在跨各种平台无缝工作,包括 CPU 和 GPU。其仅标题库设计…...

内网渗透技术 Docker逃逸技术(提权)研究 CSMSF

目录 如何通过上传的webshell判断当前环境是否是物理环境还是Docker环境 方法一&#xff1a;检查文件系统 方法二&#xff1a;查看进程 方法三&#xff1a;检查网络配置 方法四&#xff1a;检查环境变量 方法五&#xff1a;检查挂载点 总结 2. 如果是Docker环境&#x…...

生活电子常识——cmd不能使用anaconda的python环境,导致输入python打开应用商店

前言 电脑已经安装了anaconda,从自带的Anaconda Prompt (Anaconda3)中是可以识别python环境的&#xff0c;然而切换到cmd时&#xff0c;突然发现cmd中无法识别anaconda的python环境&#xff0c;竟然打开了应用商店让我安装Python&#xff0c;这当然是不对的。 解决 这是因为…...

如何在linux中部署dns服务 主备dns (详细全过程)

环境centos 7.9 主DNS&#xff1a;192.168.60.131 备DNS&#xff1a;192.168.60.134 我以 chenxingyu0.com 指向 192.168.60.200为例 首先是主dns #!/bin/bash# 检查是否为 root 用户 if [ "$(id -u)" ! "0" ]; thenecho "请使用…...

Oracle到达梦数据库迁移:技术要点与实践分享

一、达梦数据库简介 达梦数据库(DM,Dameng Database)是国内自主研发的具有自主知识产权的大型通用数据库管理系统,具备以下显著特点: 1.高性能:高效的存储与计算分离架构:达梦数据库采用先进的存储与计算分离架构,能够根据业务需求灵活分配存储和计算资源,大大提高了…...

word写latex-Mathtype安装成功-方法

MathType安装报错 想在word写latexMathtype, 网上搜教程安装&#xff0c; 结果一直报错一直删重来&#xff0c; 一直报错一直删了重来 一直报错一直删了重来来来&#xff0c; 就这么反反复复一直不好 网上的教程都是教你不是删mathtype, 就是删office 时代变了啊&#x…...

【踩坑日记】springboot 打包后实现类无法找到

试过了所有改什么目录 依赖 clean都以失败告终 最后将实现类的文件名从Impl改成impl宣布成功 记得使用idea自带的重构...

deepseek(2)——deepseek 关键技术

1 Multi-Head Latent Attention (MLA) MLA的核心在于通过低秩联合压缩来减少注意力键&#xff08;keys&#xff09;和值&#xff08;values&#xff09;在推理过程中的缓存&#xff0c;从而提高推理效率&#xff1a; c t K V W D K V h t c_t^{KV} W^{DKV}h_t ctKV​WDKVht​…...

Linux (Centos7)安装Mongodb4.0.28

一、官网下载安装包上传到服务器系统 官网&#xff1a;https://www.mongodb.com/try/download/community 放在/opt/software目录下&#xff1a; 二、解压至/usr/local目录下&#xff0c;并重新命名为mongodb [rootlocalhost software]# tar -zxvf mongodb-linux-x86_64-rhel7…...

数据库设计-笔记4

1.操作词汇简介 insert&#xff1a;用于向表中插入新记录。 delete&#xff1a;用于从表中删除记录。 update&#xff1a;用于修改表中已有的记录。 select&#xff1a;用于从表中检索数据。 2.代码基础(增删改&#xff09; -- 修改表中的信息 -- 修改表名 alter table s…...

基于python的图书管理系统设计与实现

摘要 21世纪的今天&#xff0c;随着计算机技术和网络技术的的不断推广发展和应用&#xff0c;图书馆管理方式也应该随之而更新&#xff0c;借由人力进行繁杂重复的图书管理工作已经不再可取&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0…...

10-- 网络攻击防御原理全景解析 | 从单包攻防到DDoS军团作战(包你看一遍全记住)

&#x1f6e1;️ 网络攻击防御原理全景解析 | 从单包攻防到DDoS军团作战 如果你也对网络工程师的内容感兴趣的话&#xff0c;欢迎看我的最新文章9–BGP路由黑洞&#xff08;超万字大解析&#xff09;&#xff1a;网络世界的“百慕大三角“逃生指南(BGP路由配置实验含路由黑洞,…...

RAG专栏:向量数据库

一、数据库分类 键值数据库&#xff08;Key-Value&#xff09;&#xff1a;通常用于简单的数据存储&#xff0c;通过键来快速访问数据。文档数据库&#xff08;Document&#xff09;&#xff1a;用于存储文档结构的数据&#xff0c;如 JSON 格式。图数据库&#xff08;Graph&a…...

【GPUStack】【dify】【RAGflow】:本地部署GPUStack并集成到dify和RAGflow

目录 Nvidia-Driver CUDA NVIDIA Container Toolkit&#xff08;新版本的docker不用安装&#xff0c;自带&#xff09; Docker 部署GPUStack Text Embeddings 部署模型库模型 测试 部署开源模型&#xff08;modelscope&#xff09; dify 集成 RAGflow集成 Nvidia-Dri…...

第12章:优化并发_《C++性能优化指南》notes

优化并发 一、并发基础与优化核心知识点二、关键代码示例与测试三、关键优化策略总结四、性能测试方法论多选题设计题答案与详解多选题答案&#xff1a; 设计题答案示例 一、并发基础与优化核心知识点 线程 vs 异步任务 核心区别&#xff1a;std::thread直接管理线程&#xf…...

逼用户升级Win11,微软开始给Win10限速

随着Windows10的支持时间越来越短&#xff0c;微软也加大了对Win10用户的驱赶力度。 最近&#xff0c;微软官宣了将要在今年6月份降低OneNote for Windows 10的同步速度。软件也将和Windows10在今年的10月14日一同停止支持和维护。 这将影响实时协作和多设备访问。 对OneNote…...

HarmonyOs-ArkUI List组件

列表是一个复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;使得列表内容超出其范围的时候&#xff0c;就会自动变为可以滚动。列表适合用来展现同类数据类型。 List组件支持使用&#xff0c;条件渲染&#xff0c;循环渲染&#xff0c;懒加载等渲染控制方式生成子组件…...

基于YOLOv8深度学习的PCB缺陷检测识别系统【python源码+GUI界面+数据集+训练代码+登录界面】

目录 一、界面全貌展示 二、前言摘要 三、GUI界面演示 &#xff08;一&#xff09;用户加载自定义模型 &#xff08;二&#xff09;单张图像检测 &#xff08;三&#xff09;检测图像文件夹 &#xff08;四&#xff09;检测视频 &#xff08;五&#xff09;摄像头检测 …...

鸿蒙生态圈暗战:数字孪生三强争霸谁将主宰消费电子未来?

IDC数据显示&#xff0c;2025年Q1华为以38.7%份额领跑中国折叠屏市场&#xff0c;Pura X首月销量突破120万台。这款搭载HarmonyOS 5的旗舰&#xff0c;通过灵犀通信技术实现5G A网络下载速率提升30%&#xff0c;并在离线环境下完成厘米级导航。其爆款逻辑背后&#xff0c;是鸿蒙…...