SQL基础(九)视图与索引实战演练

简介: SQL基础(九)视图与索引实战演练

实验任务 1

studen 数据库中,以 tb_studenttb_coursetb_score 表为基础完成下列视图的设计与创建

表结构

  • tb_student(sno,sn,dept,sex,birthday,polity)
  • tb_score(sno,cno,score)
  • tb_cource(cno,cn,ct,th)

任务题解

任务一

创建学生的基本情况视图 V_STU。

CREATE VIEW V_STU
AS
SELECT *
FROM tb_student
SELECT * FROM V_STU

任务二

创建视图 V_Sco,显示学生成绩信息。

CREATE VIEW V_Sco
AS
SELECT sno,score
FROM tb_score
SELECT * FROM V_Sco

任务三

创建视图 V_SCORE, 要求只显示学生的学号、姓名、系别、课号、课程名称及成绩。

CREATE VIEW V_SCORE
AS
SELECT s.sno,sn,dept,sc.cno,cn,score
FROM tb_student s,tb_score sc,tb_course co
WHERE s.sno=sc.sno AND sc.cno=co.cno
SELECT * FROM V_SCORE

任务四

各系学生人数、平均年龄创建视图 V_NUM_AVG。

CREATE VIEW V_NUM_AVG
AS
SELECT dept,COUNT(*) AS 学生人数, -- 同时包含聚合函数和基本字段,需要分组 GROUP BY
AVG(year(GETDATE())-year(birthday)) AS 平均年龄
FROM tb_student
GROUP BY dept
SELECT * FROM V_NUM_AVG

任务五

创建一个反映学生出生年份的视图 V_YEAR。

CREATE VIEW V_YEAR
AS
SELECT sno,sn,YEAR(birthday) AS 出生年份 -- 计算公式
FROM tb_student
SELECT * FROM V_YEAR

任务六

将各位学生选修课程的门数及平均成绩创建视图 V_AVG_S_G。

CREATE VIEW V_AVG_S_G
AS
SELECT sno,COUNT(*) 选修课程数,AVG(score) 平均分 
FROM tb_score
GROUP BY sno
SELECT * FROM V_AVG_S_G

任务七

将各门课程的选修人数及平均成绩创建视图 V_AVG_C_G。

CREATE VIEW V_AVG_C_G
AS
SELECT cno,COUNT(*) 课程选修人数,AVG(score) 平均成绩
FROM tb_score
GROUP BY cno
SELECT * FROM V_AVG_C_G

任务八

创建视图 V_YEAR_RJ,显示软件工程系出生日期在 2001 年之后出生的学生信息。

CREATE VIEW V_YEAR_RJ
AS
SELECT * 
FROM tb_student
WHERE major='软件工程' AND YEAR(birthday)>2001
SELECT * FROM V_YEAR_RJ

任务九

基于视图 V_STU,创建视图 V_SEX,查看男党员的信息。

CREATE VIEW V_SEX
AS
SELECT * FROM V_STU
WHERE sex='男' AND polity='党员'
SELECT * FROM V_SEX

任务十

修改视图 V_YEAR,显示软件工程系出生日期在 2000 年之前出生的学生信息,并删除视图 V_YEAR。

ALTER VIEW V_YEAR
AS
SELECT * FROM tb_student
WHERE dept='软件工程' AND YEAR(birthday) < 2002
SELECT * FROM V_YEAR
DROP VIEW V_YEAR

任务十一

向视图 V_Sco 中添加学号为‘xxx’,课程号为‘10002’,成绩为87 的信息。

INSERT INTO V_Sco(sno,cno,score)
VALUES('xxx','10002',87)

任务十二

修改视图 V_Sco,将学号为‘XXX’的学生,选修的课程号为10002 的成绩更改为 90。

UPDATE VIEW V_Sco -- 修改值,实质为更新视图,关键字 UPDATE
SET score=90
WHERE sno='XXX' AND cno='10002'

任务十三

在视图 V_Sco 中,将学号为‘XXX’的学生,选修的课程号为10002 的记录删除。

DELETE FROM V_Sco
WHERE sno='XXX' AND cno='10002'

任务十四

查询以上所建视图结果

-- (1) 查询平均成绩为 90 分以上的学生的学号、姓名和成绩。
-- method1
SELECT sno,sn,score
FROM v_score
WHERE sno in(SELECT sno 
       FROM V_AVG_S_G
       WHERE 平均分>85)
-- method2
SELECT s.sno,s.sn,score
FROM v_score s,v_avg_s_g s2
WHERE s.sno=s2.sno AND s2.平均分>85
-- (2) 查询各课程成绩均大于平均成绩的学生的学号、姓名、课程和成绩。
SELECT sno,sn,cno,score
FROM v_score
WHERE score>ANY(SELECT 平均分 FROM v_avg_c_g)
-- (3) 按系别统计各系平均成绩在 80 分以上的人数,结果按降序排列。
-- method1
SELECT dept 系别,COUNT(*) 总人数
FROM v_stu
WHERE sno IN(SELECT sno 
       FROM v_avg_s_g
       WHERE 平均分 > 80)
GROUP BY dept
ORDER BY 人数 DESC
-- method2
SELECT dept,COUNT(*) 人数
from v_stu s,v_avg_s_g s2
WHERE s.sno=s2.sno AND s2.平均分 > 80
GROUP BY dept
ORDER BY 人数 DESC

实验任务 2

student 数据库中,以 tb_studenttb_coursetb_score 表为基础完成下列索引的设计与创建。

-- (1) 对学生信息表 tb_student 中的学号 sno 创建聚集索引,并按降序排列。
CREATE CLUSTERED INDEX IX_SNO ON tb_student(sno DESC)
-- (2) 对学生成绩信息表 tb_score 先按上课编号 cno 升序排列,再按学生成绩 score 降序排列。
SELECT cno,score
FROM tb_score
ORDER BY cno ASC ,score desc
-- (3) 对课程信息表 tb_course 中的课程编号创建唯一索引,并按升序排列。
CREATE UNIQUE INDEX IX_CNO ON tb_course(cno ASC)
-- (4) 在 tb_student 表中的 sn 列创建唯一索引
CREATE CLUSTERED INDEX IX_SN ON tb_student(sn)

总结

1.查看与删除索引

-- 查看索引
Sp_helpindex name -- name:数据库表名
-- 删除索引的方式
-- method1
DROP INDEX <table or view name>.<index name>
-- method2
DROP INDEX <index name> ON <table or view name>

2.索引类型

类型名称 关键字
普通索引 INDEX
唯一索引 UNIQUE INDEX
聚集索引 CLUSTERED INDEX
非聚集索引 NONCLUSTERED INDEX
全文索引 FULLTEXT

3.索引分析

索引相当于一本书的目录,优缺点分析如下:

虽然索引很大程度上提高了查询速度,但同时也会降低更新表的速度,如:对表进行 insertupdatedelete。这是因为更新表时,不仅要保存数据,还要保存一下索引文件

索引只是提高效率的一个因素,如果有大数据量的表,则需要花时间研究建立最优秀的索引,或优化查询语句

建立索引会占用磁盘空间的索引文件。如果在一个大表上创建了多种组合索引,索引文件的增速会很快

4.查看视图创建源码

Sp_helptext name -- name:视图名



相关文章
|
21天前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
168 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
21天前
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
12天前
|
SQL 存储 索引
SQL Server的Descending Indexes降序索引
【9月更文挑战第21天】在SQL Server中,降序索引允许指定列的排序顺序为降序,可显著优化涉及降序排序的查询性能,特别是在复合索引中。通过创建降序索引,可以更高效地满足特定业务需求,如按交易时间降序获取最新记录。然而,使用时需考虑查询频率、数据分布及维护成本,以确保最佳性能。
|
1月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
59 0
|
2月前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
76 0
|
2月前
|
测试技术 Java
全面保障Struts 2应用质量:掌握单元测试与集成测试的关键策略
【8月更文挑战第31天】Struts 2 的测试策略结合了单元测试与集成测试。单元测试聚焦于单个组件(如 Action 类)的功能验证,常用 Mockito 模拟依赖项;集成测试则关注组件间的交互,利用 Cactus 等框架确保框架拦截器和 Action 映射等按预期工作。通过确保高测试覆盖率并定期更新测试用例,可以提升应用的整体稳定性和质量。
59 0
|
2月前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
38 0
|
2月前
|
前端开发 Java JSON
Struts 2携手AngularJS与React:探索企业级后端与现代前端框架的完美融合之道
【8月更文挑战第31天】随着Web应用复杂性的提升,前端技术日新月异。AngularJS和React作为主流前端框架,凭借强大的数据绑定和组件化能力,显著提升了开发动态及交互式Web应用的效率。同时,Struts 2 以其出色的性能和丰富的功能,成为众多Java开发者构建企业级应用的首选后端框架。本文探讨了如何将 Struts 2 与 AngularJS 和 React 整合,以充分发挥前后端各自优势,构建更强大、灵活的 Web 应用。
41 0
|
2月前
|
SQL 存储 数据库
|
2月前
|
存储 SQL 数据库
下一篇
无影云桌面