200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 数据库的多表查询操作-查询只选修了1门课程的学生 显示学号 姓名 课程名。

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

时间:2022-11-02 17:25:05

相关推荐

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

文章目录

前言一、建立数据库和表二、数据库展示2.查询只选修了1门课程的学生,显示学号、姓名、课程名。 总结

前言

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


一、建立数据库和表

这次我把后面要用到的一次都建好:

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

USE [master]GOCREATE 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%)GOALTER DATABASE [Student] SET COMPATIBILITY_LEVEL = 100GOIF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))beginEXEC [Student].[dbo].[sp_fulltext_database] @action = 'enable'endGOALTER DATABASE [Student] SET ANSI_NULL_DEFAULT OFFGOALTER DATABASE [Student] SET ANSI_NULLS OFFGOALTER DATABASE [Student] SET ANSI_PADDING OFFGOALTER DATABASE [Student] SET ANSI_WARNINGS OFFGOALTER DATABASE [Student] SET ARITHABORT OFFGOALTER DATABASE [Student] SET AUTO_CLOSE OFFGOALTER DATABASE [Student] SET AUTO_CREATE_STATISTICS ONGOALTER DATABASE [Student] SET AUTO_SHRINK OFFGOALTER DATABASE [Student] SET AUTO_UPDATE_STATISTICS ONGOALTER DATABASE [Student] SET CURSOR_CLOSE_ON_COMMIT OFFGOALTER DATABASE [Student] SET CURSOR_DEFAULT GLOBALGOALTER DATABASE [Student] SET CONCAT_NULL_YIELDS_NULL OFFGOALTER DATABASE [Student] SET NUMERIC_ROUNDABORT OFFGOALTER DATABASE [Student] SET QUOTED_IDENTIFIER OFFGOALTER DATABASE [Student] SET RECURSIVE_TRIGGERS OFFGOALTER DATABASE [Student] SET DISABLE_BROKERGOALTER DATABASE [Student] SET AUTO_UPDATE_STATISTICS_ASYNC OFFGOALTER DATABASE [Student] SET DATE_CORRELATION_OPTIMIZATION OFFGOALTER DATABASE [Student] SET TRUSTWORTHY OFFGOALTER DATABASE [Student] SET ALLOW_SNAPSHOT_ISOLATION OFFGOALTER DATABASE [Student] SET PARAMETERIZATION SIMPLEGOALTER DATABASE [Student] SET READ_COMMITTED_SNAPSHOT OFFGOALTER DATABASE [Student] SET HONOR_BROKER_PRIORITY OFFGOALTER DATABASE [Student] SET READ_WRITEGOALTER DATABASE [Student] SET RECOVERY FULLGOALTER DATABASE [Student] SET MULTI_USERGOALTER DATABASE [Student] SET PAGE_VERIFY CHECKSUMGOALTER DATABASE [Student] SET DB_CHAINING OFFGOEXEC sys.sp_db_vardecimal_storage_format N'Student', N'ON'GOUSE [Student]GO/****** Object: Table [dbo].[专业] Script Date: 10/16/ 15:36:50 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[专业]([专业编号] [char](3) NOT NULL,[专业名称] [varchar](100) NULL,[学院编号] [char](3) NOT NULL) ON [PRIMARY]GOSET ANSI_PADDING OFFGOINSERT [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/ 15:36:50 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[学院]([学院编号] [char](3) NOT NULL,[学院名称] [varchar](100) NULL) ON [PRIMARY]GOSET ANSI_PADDING OFFGOINSERT [dbo].[学院] ([学院编号], [学院名称]) VALUES (N'101', N'网络空间安全')INSERT [dbo].[学院] ([学院编号], [学院名称]) VALUES (N'102', N'计算机学院')INSERT [dbo].[学院] ([学院编号], [学院名称]) VALUES (N'103', N'软件工程学院')/****** Object: Table [dbo].[学生] Script Date: 10/16/ 15:36:50 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[学生]([学号] [char](10) NOT NULL,[姓名] [varchar](50) NULL,[性别] [varchar](10) NULL,[出生日期] [datetime] NULL,[籍贯] [varchar](50) NULL,[班号] [char](6) NULL) ON [PRIMARY]GOSET ANSI_PADDING OFFGOINSERT [dbo].[学生] ([学号], [姓名], [性别], [出生日期], [籍贯], [班号]) VALUES (N'001001', N'张三', N'男', CAST(0x00008AE000000000 AS DateTime), N'成都', N'001001')INSERT [dbo].[学生] ([学号], [姓名], [性别], [出生日期], [籍贯], [班号]) VALUES (N'001002', N'李四', N'男', CAST(0x00008B3C00000000 AS DateTime), N'成都', N'001001')INSERT [dbo].[学生] ([学号], [姓名], [性别], [出生日期], [籍贯], [班号]) VALUES (N'001003', N'王红', N'女', CAST(0x00008C4C00000000 AS DateTime), N'绵阳', N'001002')INSERT [dbo].[学生] ([学号], [姓名], [性别], [出生日期], [籍贯], [班号]) VALUES (N'001007', N'李小森', N'女', CAST(0x00008AC100000000 AS DateTime), N'乐山', N'004001')INSERT [dbo].[学生] ([学号], [姓名], [性别], [出生日期], [籍贯], [班号]) VALUES (N'002001', N'张小明', N'男', CAST(0x00007FD400000000 AS DateTime), N'北京', N'001002')/****** Object: Table [dbo].[选修] Script Date: 10/16/ 15:36:50 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[选修]([学号] [char](10) NOT NULL,[课号] [char](4) NOT NULL,[成绩] [int] NULL) ON [PRIMARY]GOSET ANSI_PADDING OFFGOINSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'001001', N'1 ', 45)INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'001001', N'2 ', 80)INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'001002', N'1 ', 70)INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'001002', N'2 ', 60)INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'001003', N'2 ', 80)INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'001007', N'2 ', 90)INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'002001', N'1 ', 80)INSERT [dbo].[选修] ([学号], [课号], [成绩]) VALUES (N'002001', N'2 ', 60)/****** Object: Table [dbo].[课程] Script Date: 10/16/ 15:36:50 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[课程]([课号] [char](4) NOT NULL,[课程名称] [varchar](50) NULL,[学分] [float] NULL) ON [PRIMARY]GOSET ANSI_PADDING OFFGOINSERT [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/ 15:36:50 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[班级]([班号] [char](6) NOT NULL,[班级名称] [varchar](50) NULL,[专业编号] [char](3) NOT NULL) ON [PRIMARY]GOSET ANSI_PADDING OFFGOINSERT [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 OneCourseFROM 学生 INNER JOIN 选修 ON 学生.学号=选修.学号 INNER JOIN 课程 ON 选修.课号=课程.课号GROUP BY 选修.学号,姓名HAVING COUNT(*)=1SELECT 选修.学号,姓名,课程名称FROM OneCourse INNER JOIN 选修 ON OneCourse.学号=选修.学号 INNER JOIN 课程 ON 选修.课号=课程.课号

查询之后的结果展示:

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


总结

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。