MySQL多表查询实验

1.数据准备

-- 以下语句用于创建 students 表,该表存储学生的基本信息
-- 定义表名为 students
CREATE TABLE students (-- 定义学生的唯一标识符,类型为整数,作为主键,且支持自动递增student_id INT PRIMARY KEY AUTO_INCREMENT,-- 定义学生的姓名,类型为可变长度字符串,最大长度为 50student_name VARCHAR(50),-- 定义学生的年龄,类型为整数age INT
);-- 以下语句用于创建 courses 表,该表存储课程的相关信息以及选课的学生信息
-- 定义表名为 courses
CREATE TABLE courses (-- 定义课程的唯一标识符,类型为整数,作为主键,且支持自动递增course_id INT PRIMARY KEY AUTO_INCREMENT,-- 定义课程的名称,类型为可变长度字符串,最大长度为 50course_name VARCHAR(50),-- 定义选课学生的标识符,类型为整数,用于关联 students 表中的学生student_id INT,-- 定义外键约束,将 student_id 字段关联到 students 表的 student_id 字段FOREIGN KEY (student_id) REFERENCES students(student_id)
);-- 以下语句用于向 students 表中插入学生的基本信息
-- 插入学生的姓名和年龄数据
INSERT INTO students (student_name, age) VALUES
-- 插入名为 Alice,年龄为 20 的学生信息
('Alice', 20),
-- 插入名为 Bob,年龄为 21 的学生信息
('Bob', 21),
-- 插入名为 Charlie,年龄为 22 的学生信息
('Charlie', 22);-- 以下语句用于向 courses 表中插入课程信息以及选课的学生信息
-- 插入课程名称和选课学生的标识符
INSERT INTO courses (course_name, student_id) VALUES
-- 插入课程名为 Math,选课学生标识符为 1 的信息
('Math', 1),
-- 插入课程名为 Physics,选课学生标识符为 1 的信息
('Physics', 1),
-- 插入课程名为 Chemistry,选课学生标识符为 2 的信息
('Chemistry', 2),
-- 插入课程名为 Biology,选课学生标识符为 3 的信息
('Biology', 3);   

多表查询
多表查询用于从多个表中获取相关的数据。常见的多表查询类型有内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN,MySQL 不直接支持,可通过 UNION 模拟)。

1.内连接(INNER JOIN)
内连接返回两个表中匹配的行。例如,我们要查询每个学生所选的课程:

SELECT students.student_name, courses.course_name
FROM students
INNER JOIN courses ON students.student_id = courses.student_id;

这个查询会返回 students 表和 courses 表中 student_id 匹配的行,即每个学生所选的课程信息。

2.左连接(LEFT JOIN)
左连接返回左表中的所有行,以及右表中匹配的行。如果右表中没有匹配的行,则返回 NULL。例如,我们要查询所有学生及其所选的课程,如果学生没有选课,课程信息显示为 NULL:

SELECT students.student_name, courses.course_name
FROM students
LEFT JOIN courses ON students.student_id = courses.student_id;

3.索引
索引是一种数据结构,用于提高数据库查询的速度。在 MySQL 中,常见的索引类型有主键索引、唯一索引、普通索引等。

3.1创建索引
以下是创建索引的示例:
1.普通索引
如果你经常根据 students 表的 student_name 字段进行查询,可以为该字段创建一个普通索引:

CREATE INDEX idx_student_name ON students (student_name);

测试:

mysql> create index cl_na_in on class1(name);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 

2.唯一索引
如果你希望 courses 表的 course_name 字段的值是唯一的,可以为该字段创建一个唯一索引:

CREATE UNIQUE INDEX idx_course_name ON courses (course_name);

3.查看索引
可以使用以下语句查看表的索引信息:

SHOW INDEX FROM students;

4.删除索引
如果不再需要某个索引,可以使用以下语句删除它:

DROP INDEX idx_student_name ON students;

5.查询测试索引

SELECT * FROM stux.class1 WHERE name = 'zhangsan';

6使用 EXPLAIN 分析查询语句
在你原本的查询语句前加上 EXPLAIN 关键字,例如,你之前想要查询 name 为 ‘zhangsan’ 的记录,可执行如下语句:

EXPLAIN SELECT * FROM stux.class1 WHERE name = 'zhangsan';

在这里插入图片描述

执行该语句后,MySQL 会返回一个结果集,其中包含了查询执行计划的相关信息

---------------------------------------------
案例实操测试:

mysql> select * from crs;
+------+---------+-------+
| c_id | c_name  | st_id |
+------+---------+-------+
|    1 | jsj     |     1 |
|    2 | english |     1 |
|    3 | sx      |     2 |
|    4 | ty      |     3 |
+------+---------+-------+
4 rows in set (0.01 sec)mysql> select * from class1;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   20 |
|  2 | wanger   |   21 |
|  3 | xxw      |   25 |
+----+----------+------+
3 rows in set (0.00 sec)mysql> select class1.name,crs.c_name-> from class1-> INNER JOIN crs ON class1.id = crs.st_id;
+----------+---------+
| name     | c_name  |
+----------+---------+
| zhangsan | jsj     |
| zhangsan | english |
| wanger   | sx      |
| xxw      | ty      |
+----------+---------+
4 rows in set (0.00 sec)mysql> select class1.name,crs.c_name from class1 LEFT JOIN
crs ON class1.id = crs.st_id;
+----------+---------+
| name     | c_name  |
+----------+---------+
| zhangsan | jsj     |
| zhangsan | english |
| wanger   | sx      |
| xxw      | ty      |
+----------+---------+
4 rows in set (0.00 sec)mysql> insert into class1(name,age) values('zhaoyun',98);
Query OK, 1 row affected (0.00 sec)mysql> select class1.name,crs.c_name from class1 LEFT JOIN
crs ON class1.id = crs.st_id;
+----------+---------+
| name     | c_name  |
+----------+---------+
| zhangsan | jsj     |
| zhangsan | english |
| wanger   | sx      |
| xxw      | ty      |
| zhaoyun  | NULL    |
+----------+---------+
5 rows in set (0.00 sec)

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

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

相关文章

windows第二十章 单文档应用程序

文章目录 单文档定义新建一个单文档应用程序单文档应用程序组成:APP应用程序类框架类(窗口类)视图类(窗口类,属于框架的子窗口)文档类(对数据进行保存读取操作) 直接用向导创建单文档…

C++ 初阶总复习 (16~30)

C 初阶总复习 (16~30) 目的16. 2009. volatile关键字的作用17. 2010.什么是多态 简单介绍下C的多态18. 2011. 什么是虚函数 介绍下C中虚函数的原理19. 2012 构造函数可以是虚函数嘛20. 2013.析构函数一定要是虚函数嘛?21. 2015. 什么是C中的虚…

第一天 Linux驱动程序简介

目录 一、驱动的作用 二、裸机驱动 VS linux驱动 1、裸机驱动 2、linux驱动 三、linux驱动位于哪里? 四、应用编程 VS 内核编程 1、共同点 2、不同点 五、linux驱动分类 1、字符设备 2、块设备 3、网络设备 六、Linux驱动学习难点与误区 1、学习难点 …

PaddleX产线集成功能的使用整理

一、环境搭建 1.1 安装paddle-gpu 需要根据安装机器的cuda的版本,选择合适的版本进行安装 #安装paddle-gpu 官网链接 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/linux-pip.html python -m pip install paddle…

docker-compese 启动mysql8.0.36与phpmyadmin,并使用web连接数据库

1、找一个文件夹,比如 E:\zqy\file\mysql,cd到这个目录下创建文件docker-compose.yml 2、将下面的代码块复制到docker-compose.yml文件中 version: 3.3 services:mysql:image: mysql:8.0.36container_name: mysqlrestart: alwaysports:- 3306:3306netw…

解决 Gradle 构建错误:Could not get unknown property ‘withoutJclOverSlf4J’

解决 Gradle 构建错误:Could not get unknown property ‘withoutJclOverSlf4J’ 在构建 Spring 源码或其他基于 Gradle 的项目时,可能会遇到如下错误: Could not get unknown property withoutJclOverSlf4J for object of type org.gradle…

mcp 接freecad画齿轮

from mcp.server.fastmcp import FastMCP import freecad.gears.commands import os from freecad import app from freecad import part mcp FastMCP("Demo")mcp.tool() def create_gear(num_teeth20,height10,double_helix True):"""创建一个渐开线…

【大前端系列19】JavaScript核心:Promise异步编程与async/await实践

JavaScript核心:Promise异步编程与async/await实践 系列: 「全栈进化:大前端开发完全指南」系列第19篇 核心: 深入理解Promise机制与async/await语法,掌握现代异步编程技术 📌 引言 在JavaScript的世界中,异步编程是无…

如何排查java程序的宕机和oom?如何解决宕机和oom?

排查oom 用jmap生成我们的堆空间的快照Heap Dump(堆转储文件),来分析我们的内存占用 用可视化工具,例如java中的jhat分析Heap Dump文件 ,它分析完会通过一个浏览器打开一个可视化页面展示分析结果 根据oom的类型来调…

什么是 OLAP 数据库?企业如何选择适合自己的分析工具

引言:为什么企业需要 OLAP 数据库? 你是否曾经经历过这样的场景: 市场部门急需一份用户行为分析报告,数据团队告诉你:“数据太大了,报表要跑 4 个小时”;业务负责人在会议中提出一个临时性分析…

测试:认识Bug

目录 一、软件测试的生命周期 二、bug 一、软件测试的生命周期 软件测试贯穿于软件的生命周期。 需求分析: ⽤⼾⻆度:软件需求是否合理 技术⻆度:技术上是否可⾏,是否还有优化空间 测试⻆度:是否存在业务逻辑错误、…

综合实验2

1、sw1和sw2之间互为备份 [sw1]interface Eth-Trunk 0 (创建聚合接口) [sw1-Eth-Trunk0]trunkport g0/0/1 (将物理接口划入到聚合接口中) [sw1-Eth-Trunk0]trunkport g0/0/2 [sw2]interface Eth-Trunk 0 [sw2-Eth-T…

【ArcGIS】ArcGIS10.6彻底卸载和ArcGIS10.2安装全过程

卸载python3后,解决了ArcGIS与python3冲突问题后,软件可以正常打开使用了 但是还是出现了问题 用ArcGIS 进行空间分析时,中间操作没有任何报错和问题,但是就是没有运行结果 在别人的软件上操作一遍可以出现运行结果 关闭确有这个,但真的不是我给它的运行时间不够,反反复复试…

Django之旅:第五节--Mysql数据库操作(一)

Django开发操作数据库更简单,内部提供了ORM框架 一、安装第三方模块 pip install mysqlclient注:最新的django框架需要使用mysqlclient模块,之前pymysql模块与django框架有编码兼容问题。 二、ORM 1、ORM可以帮助我们做两件事:…

docker部署mongodb数据库

1、下载 MongoDB 镜像 使用Docker部署MongoDB 之前,我们需要从 Docker Hub 上下载 MongoDB 镜像。这里我们下载最新版本的 MongoDB 镜像,使用以下命令进行下载: docker pull mongo:latest 下载完成后,我们就拥有了最新版本的 Mon…

Enhanced PEC-YOLO:电力施工场景安全装备检测的轻量化算法解析

目录 一、核心概述 二、核心创新点 1. ​C2F_Faster_EMA模块 2. ​SPPF_CPCA多尺度模块 3. ​BiFPN颈部网络

【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,其推理能力在自然语言处理、代码生成等领域展现出巨大潜力。然而,单机部署难以满足高并发、低延迟的需…

RTMP推流服务器nginx在linux上的编译部署

RTMP(Real-Time Messaging Protocol)推流确实需要服务器支持‌。RTMP推流服务器的主要功能是接收来自推流客户端的数据流,对其进行处理和转发。服务器会根据RTMP协议与客户端建立连接,处理推流数据(如转码、录制等&…

PyQt6实例_批量下载pdf工具_主线程停止线程池

目录 前置: 代码: 视频: 前置: 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头,放在 【PyQt6实例】 专栏 2 本系列涉及到的PyQt6知识点: 线程池:QThreadPool,QRunnable; 信号与…

Tomcat生产服务器性能优化

试想以下这个情景:你已经开发好了一个程序,这个程序的排版很不错,而且有着最前沿的功能和其他一些让你这程序增添不少色彩的元素。可惜的是,程序的性能不怎么地。你也十分清楚,若现在把这款产品退出市场,肯…