数据库的多表查询操作-查询只选修了1门课程的学生,显示学号、姓名、课程名。

2023-10-27


前言

在我看来数据库真的是一个神奇的东西,不但里面的只是点很深刻,而且对于我们学习起来还是有一定的压力的,关于数据的知识 ,我感觉还是需要我自己多钻研和实践。这次我主要是写关于数据库的一个查询操作,后面也还是会持续的更新这类型的内容的。


一、建立数据库和表

这次我把后面要用到的一次都建好:
这里的SQL是所有后面更新要用到的数据库操作,当然如果这里你要是建立不上该数据库的话,可能的原因也就是2种,一个是关于你的路径和我的不一致导致建库失败,第二个就是我们这里面默认的 FILEGROWTH 的大小,这次我主要是以SQLServer 为例子来建立数据库和表的。当然大家也可以使用mysql等一些常用的数据库来使用并建立数据库和表。

USE [master]
GO
CREATE DATABASE [Student] ON  PRIMARY 
( NAME = N'Student', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\Student.mdf' , SIZE = 4096KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'Student_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\Student_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [Student] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [Student].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [Student] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [Student] SET ANSI_NULLS OFF
GO
ALTER DATABASE [Student] SET ANSI_PADDING OFF
GO
ALTER DATABASE [Student] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [Student] SET ARITHABORT OFF
GO
ALTER DATABASE [Student] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [Student] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [Student] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [Student] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [Student] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [Student] SET CURSOR_DEFAULT  GLOBAL
GO
ALTER DATABASE [Student] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [Student] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [Student] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [Student] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [Student] SET  DISABLE_BROKER
GO
ALTER DATABASE [Student] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [Student] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [Student] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [Student] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [Student] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [Student] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [Student] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [Student] SET  READ_WRITE
GO
ALTER DATABASE [Student] SET RECOVERY FULL
GO
ALTER DATABASE [Student] SET  MULTI_USER
GO
ALTER DATABASE [Student] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [Student] SET DB_CHAINING OFF
GO
EXEC sys.sp_db_vardecimal_storage_format N'Student', N'ON'
GO
USE [Student]
GO
/****** Object:  Table [dbo].[专业]    Script Date: 10/16/2019 15:36:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[专业](
	[专业编号] [char](3) NOT NULL,
	[专业名称] [varchar](100) NULL,
	[学院编号] [char](3) NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[专业] ([专业编号], [专业名称], [学院编号]) VALUES (N'001', N'信息安全', N'101')
INSERT [dbo].[专业] ([专业编号], [专业名称], [学院编号]) VALUES (N'002', N'物联网工程', N'101')
INSERT [dbo].[专业] ([专业编号], [专业名称], [学院编号]) VALUES (N'003', N'计算机应用', N'102')
INSERT [dbo].[专业] ([专业编号], [专业名称], [学院编号]) VALUES (N'004', N'数字媒体', N'102')
INSERT [dbo].[专业] ([专业编号], [专业名称], [学院编号]) VALUES (N'005', N'网络工程', N'101')
INSERT [dbo].[专业] ([专业编号], [专业名称], [学院编号]) VALUES (N'006', N'软件工程', N'103')
/****** Object:  Table [dbo].[学院]    Script Date: 10/16/2019 15:36:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[学院](
	[学院编号] [char](3) NOT NULL,
	[学院名称] [varchar](100) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[学院] ([学院编号], [学院名称]) VALUES (N'101', N'网络空间安全')
INSERT [dbo].[学院] ([学院编号], [学院名称]) VALUES (N'102', N'计算机学院')
INSERT [dbo].[学院] ([学院编号], [学院名称]) VALUES (N'103', N'软件工程学院')
/****** Object:  Table [dbo].[学生]    Script Date: 10/16/2019 15:36:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[学生](
	[学号] [char](10) NOT NULL,
	[姓名] [varchar](50) NULL,
	[性别] [varchar](10) NULL,
	[出生日期] [datetime] NULL,
	[籍贯] [varchar](50) NULL,
	[班号] [char](6) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[学生] ([学号], [姓名], [性别], [出生日期], [籍贯], [班号]) VALUES (N'2018001001', N'张三', N'男', CAST(0x00008AE000000000 AS DateTime), N'成都', N'001001')
INSERT [dbo].[学生] ([学号], [姓名], [性别], [出生日期], [籍贯], [班号]) VALUES (N'2018001002', N'李四', N'男', CAST(0x00008B3C00000000 AS DateTime), N'成都', N'001001')
INSERT [dbo].[学生] ([学号], [姓名], [性别], [出生日期], [籍贯], [班号]) VALUES (N'2018001003', N'王红', N'女', CAST(0x00008C4C00000000 AS DateTime), N'绵阳', N'001002')
INSERT [dbo].[学生] ([学号], [姓名], [性别], [出生日期], [籍贯], [班号]) VALUES (N'2018001007', N'李小森', N'女', CAST(0x00008AC100000000 AS DateTime), N'乐山', N'004001')
INSERT [dbo].[学生] ([学号], [姓名], [性别], [出生日期], [籍贯], [班号]) VALUES (N'2018002001', N'张小明', N'男', CAST(0x00007FD400000000 AS DateTime), N'北京', N'001002')
/****** Object:  Table [dbo].[选修]    Script Date: 10/16/2019 15:36:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[选修](
	[学号] [char](10) NOT NULL,
	[课号] [char](4) NOT NULL,
	[成绩] [int] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'2018001001', N'1   ', 45)
INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'2018001001', N'2   ', 80)
INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'2018001002', N'1   ', 70)
INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'2018001002', N'2   ', 60)
INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'2018001003', N'2   ', 80)
INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'2018001007', N'2   ', 90)
INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'2018002001', N'1   ', 80)
INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'2018002001', N'2   ', 60)
/****** Object:  Table [dbo].[课程]    Script Date: 10/16/2019 15:36:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[课程](
	[课号] [char](4) NOT NULL,
	[课程名称] [varchar](50) NULL,
	[学分] [float] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[课程] ([课号], [课程名称], [学分]) VALUES (N'1   ', N'数据库', 4)
INSERT [dbo].[课程] ([课号], [课程名称], [学分]) VALUES (N'2   ', N'C语言', 2)
INSERT [dbo].[课程] ([课号], [课程名称], [学分]) VALUES (N'3   ', N'数据结构', 3)
/****** Object:  Table [dbo].[班级]    Script Date: 10/16/2019 15:36:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[班级](
	[班号] [char](6) NOT NULL,
	[班级名称] [varchar](50) NULL,
	[专业编号] [char](3) NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[班级] ([班号], [班级名称], [专业编号]) VALUES (N'001001', N'信安181', N'001')
INSERT [dbo].[班级] ([班号], [班级名称], [专业编号]) VALUES (N'001002', N'信安182', N'001')
INSERT [dbo].[班级] ([班号], [班级名称], [专业编号]) VALUES (N'004001', N'计算机应用181', N'004')
INSERT [dbo].[班级] ([班号], [班级名称], [专业编号]) VALUES (N'006001', N'软件工程171', N'006')

二、数据库展示

这里展示的是所有建库之后的操作,大致也就是这些表的操作,后面更新的内容也都是在这些表中的操作。
在这里插入图片描述

2.查询只选修了1门课程的学生,显示学号、姓名、课程名。

这里我们有2种方法可以查询到该问题的答案。
首先我就来说一下关于第一种查询操作就是:可以使用having子句对分组后的结果再次进行选择操作。
SQL查询的语句为:

--查询只选修了1门课程的学生,显示学号、姓名、课程名
select 选修.学号,学生.姓名,课程.课程名称
from 学生 INNER JOIN 选修 ON 学生.学号=选修.学号 INNER JOIN 课程 ON 选修.课号=课程.课号
where 选修.学号 in(select 选修.学号
from 学生 INNER JOIN 选修 ON 学生.学号=选修.学号 INNER JOIN 课程 ON 选修.课号=课程.课号
GROUP BY 选修.学号
HAVING count(*)=1)


这里查询的结果是为,如果说兄弟们把表建好之后课可以看到该结果是正确的:
在这里插入图片描述
那么问题来了第二种方式是什么呢?
当我们使用group by的时候无法直接查询出课程名称,那么需要怎么做才可以把这些表连接起来呢。这里我们就需要再次创建出一个新表,作为一个跳板使用;废话不多说,直接上SQL

SELECT 选修.学号,姓名 INTO OneCourse
FROM 学生 INNER JOIN 选修 ON 学生.学号=选修.学号 INNER JOIN 课程 ON 选修.课号=课程.课号
GROUP BY 选修.学号,姓名
HAVING COUNT(*)=1
SELECT 选修.学号,姓名,课程名称
FROM OneCourse INNER JOIN 选修 ON OneCourse.学号=选修.学号 INNER JOIN 课程 ON 选修.课号=课程.课号

查询之后的结果展示:
在这里插入图片描述
其实我们这里的第一句就可以查到该结果了,但是无法建立和课程表建立连接,在这里我们就是建立了一张新表 OneCourse表来保存之前查询到的数据,然后再和课程表建立连接查询到该课程名称就可以了,也是很简单的一个操作吧。我相信大家不用我多说,也是可以看的出来的。下面是OneCourse中的数据。
在这里插入图片描述


总结

好了,今天就到这里了,这个问题困扰了2天,最开始我一直都是使用单个查询,感绝连接三张表确实很困难,到后面才发现自己及一开始的思路就错了,其实这种题还是很简单的,只要我们思路稍微清晰一点,先查询出单个需求,最后再之后需要加上去的东西加上就可以,也还是很简单的操作,不要一开始就想着连接三张表一起操作,那样做只是很浪费时间,后面我也会慢慢更新一些关于多表查询的操作,多练练也还是没什么问题的,加油。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库的多表查询操作-查询只选修了1门课程的学生,显示学号、姓名、课程名。 的相关文章

随机推荐

  • 【解决ElementUI 和Antd的对话弹窗样式冲突问题】

    项目中使用了Antd 和element UI两种UI库 Antd是全局样式 element ui则是按需引入 在使用element ui的页面处点击退出 弹出的对话框就会样式失效 首先在随便一个地方点击退出登录看一下正常效果 再打开F12查
  • Unity3D中的ref、out、Params三种参数的使用

    目录 ref out Params ref 作用 将一个变量传入一个函数中进行 处理 处理 完成后 再将 处理 后的值带出函数 语法 使用时形参和实参都要添加ref关键字 using System Collections using Sys
  • JavaSE学习总结:面向对象编程

    Java面向对象编程 1 类与对象 1 1面向对象的理解 1 1 1面向对象和面向过程的区别 1 1 2面向对象的好处 1 1 3面向对象的思考步骤 1 2类与对象 1 2 1什么是类 1 2 2什么是对象 1 2 3二者的区别 1 2 4
  • ubuntu设置环境变量

    vim bashrc export VCPKG FORCE SYSTEM BINARIES 1 export VCPKG HOME PATH vcpkg export X VCPKG ASSET SOURCES x azurl http 1
  • GPT-4最强竞争对手Claude 2震撼发布,据说超过GPT-4?

    OpenAI 发布了 GPT 4 的 API 和令人兴奋的 最强插件 代码解释器 这无疑给竞争对手们敲响了警钟 而最近 Anthropic 旗下的 Claude 揭开了它的第二代面纱 免费使用Claude 2请加微信wyxyellow 相较
  • GAN之生成对抗网络(Matlab)

    代码来源 代码全文 clear all close all clc Basic Generative Adversarial Network Load Data load mnistAll mat trainX preprocess mni
  • DMRS在5G NR各种物理信道上的配置

    笔者在微信公众号GiveMe5G定期发布学习文章 更多更及时 欢迎订阅和分享 文章下方有二维码 本篇文章旨在介绍DMRS DeModulation Reference Signal 在5G中 DMRS广泛存在于各个重要的物理信道当中 如下行
  • MMdetection的Proposal原理和代码解析

    一 算法原理 接受N级score bbox pred anchor和image shape作为输入 通过anchor和框的偏移 bbox pred 得到proposal 然后对这些proposal做NMS 最后选出前num个 二 执行步骤
  • golang 组成树形格式

    该封装受到前端 js filter函数的启发看着特别简洁 一 封装一个函数 比较简单就是循环根据传入的 回调函数 进行过滤组成新的数组返回 func Filter T any arr T f func item T bool list T
  • 震动传感器介绍及实战(中断)

    项目要求 利用震动传感器实现点灯效果 当传感器察觉震动 led灯亮 否则不亮 接线及引脚 传感器信号引脚DO接PA4 led1灯的引脚接PB8 所以中断的信号源就是PA4引脚 配置STM32 PB8设置成output 输出给led 打开使能
  • 红黑树结构算法原理与代码解析

    红黑树 Red Black Tree 平衡二叉B树 是一种自平衡二叉查找树 是在计算机科学中用到的一种数据结构 典型的用途是实现关联数组 典型的普通顺序数组结构的增 删 查效率都是O n 但是红黑树进行读写操作时的效率可以稳定在O log
  • JAVA笔记

    目录 模板模式的理解 使用模板模式的例子 整合工厂模式 模板模式的理解 模板模式简单理解就是创建一个抽象父类作为模板 可以分两部分 一部分是定义了所有子类都需要执行的公共方法 这样就不用在每个子类中重复写相同代码 另一部分就是强制规定每个子
  • php面试题之四——PHP面向对象(基础部分)

    1 写出 php 的 public protected private 三种访问控制模式的区别 新浪网技术部 public 公有 任何地方都可以访问 protected 继承 只能在本类或子类中访问 在其它地方不允许访问 private 私
  • (Oracle技能篇) oracle数据库分页查询和各大数据库的分页查询

    1 oracle数据库分页 select from select a rownum rc from 表名 where rownum lt endrow a where a rc gt startrow 2 DB2数据库分页 Select f
  • 堆与栈的区别详细总结

    常见的数据结构 数组 栈 队列 链表 树 图 散列表 哈希表 堆与栈的区别 堆 队列优先 先进先出 FIFO firstinfirstout 栈 先进后出 FILO First In Last Out 一般情况下 如果有人把堆栈合起来说 那
  • js浏览器回到顶部方法_js 返回顶部按钮

    要求 当鼠标从顶部滚动后 显示返回顶部按钮 点击按钮 页面平滑滚动到顶部 按钮隐藏 1 css scrollTop position fixed bottom 20px right 20px height 0px width 45px li
  • [ Android实战 ] 开机时通过广播启动应用,但是很长时间才能接收到,如何解决?

    Android实战 开机时通过广播启动应用 但是很长时间才能接收到 如何解决 背景 测试 发送广播流程 广播分发流程 解决方案 思考 系统层面 应用层面 总结 转载请注明出处 我的博客 背景 前段时间在做一个项目 在适配客户应用的过程中发现
  • jmeter自动调试系统接口配置流程

    1 起因 最近测试的同事需要用jmeter工具压测一下我们项目的接口 因为接口中有token或者加密登录密码等逻辑 有的地方需要从上一步接口中拿到结果作为下一步的参数 进行传递 因为涉及的有点麻烦 就帮测试看了下这个工具 顺便记录一下 帮助
  • Markdown 实现页内跳转

    Markdown 实现页内跳转 在使用 Markdown 做一些论文笔记或者说写文档时 通常会出现这样一种情况 我们在文档的某个地方定义了一个 t a b l e o
  • 数据库的多表查询操作-查询只选修了1门课程的学生,显示学号、姓名、课程名。

    文章目录 前言 一 建立数据库和表 二 数据库展示 2 查询只选修了1门课程的学生 显示学号 姓名 课程名 总结 前言 在我看来数据库真的是一个神奇的东西 不但里面的只是点很深刻 而且对于我们学习起来还是有一定的压力的 关于数据的知识 我感