数据库的多表查询操作-查询只选修了1门课程的学⽣,显⽰学号、姓名、课程
名。
⽂章⽬录
前⾔script的音标
在我看来数据库真的是⼀个神奇的东西,不但⾥⾯的只是点很深刻,⽽且对于我们学习起来还是有⼀定的压⼒的,关于数据的知识 ,我感觉还是需要我⾃⼰多钻研和实践。这次我主要是写关于数据库的⼀个查询操作,后⾯也还是会持续的更新这类型的内容的。
⼀、建⽴数据库和表
这次我把后⾯要⽤到的⼀次都建好:
这⾥的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 =1 024KB , 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
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
什么是c语言的主要组成部分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,
[学院编号][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(0x00008AE000000000AS DateTime), N'成都', N'001001')
INSERT[dbo].[学⽣]([学号],[姓名],[性别],[出⽣⽇期],[籍贯],[班号])VALUES(N'2018001002', N'李四', N'男', CAST(0x00008B3C00000000AS DateTime), N'成都', N'001001')
INSERT[dbo].[学⽣]([学号],[姓名],[性别],[出⽣⽇期],[籍贯],[班号])VALUES(N'2018001003', N'王红', N'⼥', CAST(0x00008C4C00000000AS DateTime), N'绵阳', N'001002')
INSERT[dbo].[学⽣]([学号],[姓名],[性别],[出⽣⽇期],[籍贯],[班号])VALUES(N'2018001007', N'李⼩森', N'⼥', CAST(0x00008AC100000000AS DateTime ), N'乐⼭', N'004001')
INSERT[dbo].[学⽣]([学号],[姓名],[性别],[出⽣⽇期],[籍贯],[班号])VALUES(N'2018002001', N'张⼩明', N'男', CAST(0x00007FD400000000AS 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)
setattribute用法javaINSERT[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
SET ANSI_PADDING ON
GO
CREATE TABLE[dbo].[课程](
[课号][char](4)NOT NULL,
[课程名称][varchar](50)NULL,
[学分][float]NULL
)ON[PRIMARY]
GO
SET ANSI_PADDING OFF
union select是什么意思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
controller层可以写业务代码吗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')
mysql语句多表查询⼆、数据库展⽰
这⾥展⽰的是所有建库之后的操作,⼤致也就是这些表的操作,后⾯更新的内容也都是在这些表中的操作。
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选修.课号=课程.课号
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论