前言

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


一、建立数据库和表

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

Logo

本社区面向用户介绍CSDN开发云部门内部产品使用和产品迭代功能,产品功能迭代和产品建议更透明和便捷

更多推荐