【Sql Server】快速创建表模拟系、课程、老师、学生以及分数(下)

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 在本篇文章中,主要是创建表以及如何快速模拟表数据,方便快速用于查询测试和验证相对于增删改,查询对于任何系统来说,都是主要的功能,并且是在有一定量数据后才能进行的一些操作,比如:学生成绩平均分统计等
作者:小5聊基础
简介:一只喜欢全栈方向的程序员,欢迎咨询,尽绵薄之力答疑解惑
编程原则:Write Less Do More
  • 主要知识点列表
编号 语言或插件 知识点 说明
1 sql server create table 关键词,创建表
2 sql server indentity 自增长函数
3 sql server primary key 设置主键标识
4 sql server len() 统计长度
5 sql server rand() 随机函数,0~1之间的值
6 sql server substring() 截取字符串,substring('',1,1)
7 sql server convert() 数据类型转换,convert(int,'')
8 sql server left join 做关联,以左边表为主,会出现3 * 5=15条记录的情况,需要合理使用好on条件
9 sql server avg() 求平均值

接着上篇文章内容
4)学生表

系编号、课程编号、教师编号、学生编号、学生姓名、性别

create table student_table
(
    student_id int identity(1,1) primary key,
    student_name nvarchar(50),
    sex int, --1=男生,0=女生
    teacher_id int,
    course_id int,
    system_id int
)
  • 数据模拟
declare @myName nvarchar(50)
declare @surname_arr nvarchar(1000)
declare @name_arr nvarchar(1000)
set @surname_arr='王李张刘陈杨黄赵吴周徐孙马朱胡郭'
set @name_arr='爱梦想箱钰郁思裴诗紫弦锐月夏幻音影暗依舞玲滴羽樱莹'

declare @sn_length int
declare @rand_index int

--模拟数据:计算机系、C语言课程、张三老师下的30名学生
declare @student_count int
set @student_count=30
declare @index int 
set @index=0
declare @sex int
set @sex=1

while @index<@student_count begin
    set @myName='' --赋初始值,否则无法使用+加号
    
    --获取姓值
    if len(@surname_arr)>0 begin
        set @sn_length=len(@surname_arr)
        set @rand_index=convert(int,(rand()*@sn_length))-1
        set @myName+=substring(@surname_arr,@rand_index,1)
    end

    --获取名字
    if len(@name_arr)>0 begin
        set @sn_length=len(@name_arr)
        set @rand_index=convert(int,(rand()*@sn_length))-1
        set @myName+=substring(@name_arr,@rand_index,2)
    end
    
    --性别
    set @sex=convert(int,(rand()*2))
    
    insert into student_table(student_name,sex,teacher_id,course_id,system_id)
    values(@myName,@sex,1,1,3)
    
    set @index+=1
end
  • 查询
select a.*,b.teacher_name,c.course_name,d.system_name
from student_table a
left join teacher_table b on b.teacher_id=a.teacher_id
left join course_table c on c.course_id=a.course_id
left join system_table d on d.system_id=a.system_id

image.png

5)学生成绩表

学生编号、系编号、课程编号、教师编号、分数

create table student_score_table
(
    score_id int identity(1,1) primary key,
    score int,
    student_id int,
    teacher_id int,
    course_id int,
    system_id int
)
  • 模拟数据
declare @index int
set @index=1
declare @score int
set @score=0

while @index<=30 begin
    
    set @score=convert(int,(rand()*50))+50
    
    insert into student_score_table(score,student_id,teacher_id,course_id,system_id)
    values(@score,@index,1,1,3)

    set @index+=1
end
  • 查询
select a.*,a2.student_name,b.teacher_name,c.course_name,d.system_name
from student_score_table a
inner join student_table a2 on a2.student_id=a.student_id
left join teacher_table b on b.teacher_id=a.teacher_id
left join course_table c on c.course_id=a.course_id
left join system_table d on d.system_id=a.system_id

image.png

【正式查询前面提到的要求】

1)列出存在86分以上成绩的学生名称和课程编号

select a.score,c.student_name,a.course_id,b.course_name
from student_score_table a
left join course_table b on b.course_id=a.course_id
left join student_table c on c.student_id=a.student_id
where a.score>86

image.png

2)列出“C语言”成绩比平均成绩低的同学

这里使用了,内联子查询的方式进行对比平均分

select a.score,b.avg_score,a.student_id,c.student_name
from student_score_table a
left join(
    --C语言课程的平均分
    select course_id,avg(score) as avg_score
    from student_score_table 
    where course_id=1
    group by course_id
) as b on b.course_id=a.course_id
left join student_table c on c.student_id=a.student_id
where a.score<b.avg_score

image.png

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
3月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
85 13
|
2月前
|
SQL 关系型数据库
关系型数据库SQLserver创建表
【8月更文挑战第2天】
34 3
|
3月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
3月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
56 6
|
2月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
324 0
|
3月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
247 1
|
3月前
|
SQL 监控 数据库
SQL Server 查询超时问题排查
【7月更文挑战第8天】排查 SQL Server 查询超时涉及五个主要方面:检查复杂查询、评估服务器性能、审视配置参数、更新统计信息和分析执行计划。关注点包括查询的结构(如连接、子查询和索引),服务器资源(CPU、内存、网络延迟),连接和内存设置,以及统计信息的时效性。通过这些步骤可定位并解决性能瓶颈。
105 0
|
4月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
3月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
220 3