实验三 视图和索引实验【数据库原理】
实验三 视图和索引实验【数据库原理】
实验三 视图和索引实验【数据库原理】
前言
以下内容源自数据库原理实验
仅供学习交流使用
推荐
数据库原理
实验三 视图和索引实验
一、 实验目的
(1)理解索引和视图的概念。
(2)掌握索引的使用方法。
(3)掌握视图的定义和使用方法。
二、实验内容
1)建立索引。对JWGL数据库的学生选课表SC建立索引,要求按照Cno升序、Grade降序建立一个名为SC_ind的索引。
USE JWGL
IF EXISTS(SELECT name FROM sysindexes WHERE name = 'SC_ind')
DROP INDEX SC. SC_ind;
GO
USE JWGL
CREATE INDEX SC_ind ON SC ( Cno, Grade DESC);
2)视图的定义和操作。
①在JWGL数据库中,完成视图的定义和视图上的查询、更新操作:
(1)建立计算机系学生的视图,并要求进行修改和插入操作时需保证该视图只能对计算机系的学生进行操作。
(2)建立选择了2号课程且成绩在80分以上的学生视图。
(3)建立一个反映学生出生年份的视图。
(4)在计算机系的视图c_student上查询年龄在18~20岁之间的学生的学号和姓名。
(5)在(4)的学生视图上查询成绩在90分以上的女学生的学号和姓名。
(6)在例(1)的视图上进行如下操作,将学号为950002的学生的姓名改为“张良”。
(7)在(1)的视图上进行如下操作,插入一个学生的信息。
(8)在(1)的视图进行如下操作,删除学号为980013的学生信息。
②在Market数据库中,在Market数据库上,试用SQL语句完成以下各项操作:
(1)请为北京客户建立一个订单情况的视图,包括订单编号、商品名称、订货数量、客户编号、客户名称。
(2)针对(1)中定义的视图,完成查询,查找客户张三的所有订单信息。
三、实验环境
MySQL,SQLyog。
四、实验前准备
学习建立视图和索引的T-SQL语言
五、实验步骤
根据实验内容书写相应的T-SQL语言,完场要求。
六、实验结果
1.建立索引
#实验三 视图和索引实验
#实验6 实验6 索引和视图
# 1)建立索引。对JWGL数据库的学生选课表SC建立索引,要求按照Cno升序、Grade降序建立一个名为SC_ind的索引。
#索引的建立
#① ALTER TABLE ... ADD ...
ALTER TABLE SC ADD INDEX SC_ind ON SC(Cno, Grade DESC);
#② CREATE INDEX ... ON ...
CREATE INDEX SC_ind ON SC(Cno, Grade DESC);
#查索引
SHOW INDEX FROM SC ;
/*
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
sc 0 PRIMARY 1 Sno A 2 \N \N BTREE YES \N
sc 0 PRIMARY 2 Cno A 5 \N \N BTREE YES \N
sc 1 SC_ind 1 Cno A 3 \N \N BTREE YES \N
sc 1 SC_ind 2 Grade D 5 \N \N YES BTREE YES \N
*/
#索引的删除
#方式1:ALTER TABLE .... DROP INDEX ....
ALTER TABLE SC
DROP INDEX SC_ind;
#方式2:DROP INDEX ... ON ...
DROP INDEX SC_ind ON SC;
2.视图的定义和操作
(1)在JWGL数据库中,完成视图的定义和视图上的查询、更新操作
①建立计算机系学生的视图,并要求进行修改和插入操作时需保证该视图只能对计算机系的学生进行操作。
#2)视图的定义和操作。
#① 在JWGL数据库中,完成视图的定义和视图上的查询、更新操作:
#(1) 建立计算机系学生的视图,并要求进行修改和插入操作时需保证该视图只能对计算机系的学生进行操作。
CREATE VIEW c_student(Sno,Sname,Sex,Age,Phonenumber,Sdept)
AS(SELECT * FROM student WHERE Sdept='CS');
SELECT * FROM c_student;
/*
Sno Sname Sex Age Phonenumber Sdept
20221101 李勇 男 15 188820221101 CS
20221102 刘晨 女 19 188820221102 CS
*/
②建立选择了2号课程且成绩在80分以上的学生视图。
#(2)建立选择了2号课程且成绩在80分以上的学生视图。
CREATE VIEW sc_student(Sno,Sname,Sex,Age,Phonenumber,Sdept,Cno,Grade)
AS(
SELECT student.*,sc.`Cno`,sc.`Grade`
FROM student
INNER JOIN sc
ON student.`Sno`=sc.`Sno`
WHERE Cno=2 AND Grade>80
);
SELECT * FROM sc_student;
/*
Sno Sname Sex Age Phonenumber Sdept Cno Grade
20221102 刘晨 女 19 188820221102 CS 2 90
20221101 李勇 男 15 188820221101 CS 2 85
*/
③建立一个反映学生出生年份的视图。
#(3)建立一个反映学生出生年份的视图。
CREATE VIEW y_student(Sno,Sname,Sex,Age,Phonenumber,Sdept,birth)
AS(
SELECT student.*,(YEAR(CURDATE()) - Age)"birth"
FROM student
);
SELECT * FROM y_student;
/*
Sno Sname Sex Age Phonenumber Sdept birth
20221101 李勇 男 15 188820221101 CS 2007
20221102 刘晨 女 19 188820221102 CS 2003
20221103 王敏 女 18 188820221103 MA 2004
20221104 张立 男 19 188820221104 IS 2003
*/
④在计算机系的视图c_student上查询年龄在18~20岁之间的学生的学号和姓名。
#(4)在计算机系的视图c_student上查询年龄在18~20岁之间的学生的学号和姓名。
SELECT Sno,Sname
FROM c_student
WHERE Age>18 AND Age<20;
/*
Sno Sname
20221102 刘晨
*/
⑤在(4)的学生视图上查询成绩在90分以上的女学生的学号和姓名。
#(5)在(4)的学生视图上查询成绩在90分以上的女学生的学号和姓名。
SELECT Sno,Sname
FROM sc_student
WHERE Sex='女' AND Grade>=90;
/*
Sno Sname
20221102 刘晨
*/
⑥在例(1)的视图上进行如下操作,将学号为950002的学生的姓名改为“张良”。
#(6)在例(1)的视图上进行如下操作,将学号为950002的学生的姓名改为“张良”。
UPDATE c_student
SET Sname='张良'
WHERE Sno='20221101';
#student也会改变
SELECT * FROM c_student;
/*
Sno Sname Sex Age Phonenumber Sdept
20221101 张良 男 15 188820221101 CS
20221102 刘晨 女 19 188820221102 CS
*/
⑦在(1)的视图上进行如下操作,插入一个学生的信息。
#(7)在(1)的视图上进行如下操作,插入一个学生的信息。
INSERT INTO c_student
VALUES(980013,'李勇','男',15,'188820221126','CS');
/*
Sno Sname Sex Age Phonenumber Sdept
20221101 张良 男 15 188820221101 CS
20221102 刘晨 女 19 188820221102 CS
980013 李勇 男 15 188820221126 CS
*/
⑧在(1)的视图进行如下操作,删除学号为980013的学生信息。
#(8)在(1)的视图进行如下操作,删除学号为980013的学生信息。
DELETE FROM c_student
WHERE Sno='20221101';
#有外键约束,删除失败
(2)在Market数据库中,在Market数据库上,试用SQL语句完成以下各项操作:
①请为北京客户建立一个订单情况的视图,包括订单编号、商品名称、订货数量、客户编号、客户名称。
#实验三 视图和索引实验
#实验6 实验6 索引和视图
#2)视图的定义和操作。
#② 在Market数据库中,在Market数据库上,试用SQL语句完成以下各项操作:
#(1)请为北京客户建立一个订单情况的视图,包括订单编号、商品名称、订货数量、客户编号、客户名称。
CREATE VIEW v_orders AS(
SELECT OrderID,GoodsName,Quantity,customers.CustomerID,Cname
FROM orders
INNER JOIN goods
ON orders.`GoodsID`=goods.`GoodsID`
INNER JOIN customers
ON orders.`CustomerID`=customers.`CustomerID`
);
SELECT * FROM v_orders;
/*
OrderID GoodsName Quantity CustomerID Cname
1 Red_Computer 100 1 李彦宏
2 Green_Computer 100 2 马云
3 Blue_Computer 100 3 马化腾
4 Red_Keyboard 100 4 黄峥
5 Green_Keyboard 100 5 天天
6 Blue_Keyboard 100 6 西西
7 Red_Mouse 100 1 李彦宏
8 Green_Mouse 100 2 马云
9 Blue_Mouse 100 3 马化腾
*/
②针对(1)中定义的视图,完成查询,查找客户张三的所有订单信息。
#(2)针对(1)中定义的视图,完成查询,查找客户张三的所有订单信息。
SELECT * FROM v_orders
WHERE Cname='马云';
/*
OrderID GoodsName Quantity CustomerID Cname
2 Green_Computer 100 2 马云
8 Green_Mouse 100 2 马云
*/
七、评价分析及心得体会
通过本次实验,我理解了索引和视图的概念,掌握了索引的使用方法,掌握视图的定义和使用方法。
八、代码附录
jwgl3.sql
#实验三 视图和索引实验
#实验6 实验6 索引和视图
# 1)建立索引。对JWGL数据库的学生选课表SC建立索引,要求按照Cno升序、Grade降序建立一个名为SC_ind的索引。
#索引的建立
#① ALTER TABLE ... ADD ...
ALTER TABLE SC ADD INDEX SC_ind ON SC(Cno, Grade DESC);
#② CREATE INDEX ... ON ...
CREATE INDEX SC_ind ON SC(Cno, Grade DESC);
#查索引
SHOW INDEX FROM SC ;
/*
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
sc 0 PRIMARY 1 Sno A 2 \N \N BTREE YES \N
sc 0 PRIMARY 2 Cno A 5 \N \N BTREE YES \N
sc 1 SC_ind 1 Cno A 3 \N \N BTREE YES \N
sc 1 SC_ind 2 Grade D 5 \N \N YES BTREE YES \N
*/
#索引的删除
#方式1:ALTER TABLE .... DROP INDEX ....
ALTER TABLE SC
DROP INDEX SC_ind;
#方式2:DROP INDEX ... ON ...
DROP INDEX SC_ind ON SC;
#2)视图的定义和操作。
#① 在JWGL数据库中,完成视图的定义和视图上的查询、更新操作:
#(1) 建立计算机系学生的视图,并要求进行修改和插入操作时需保证该视图只能对计算机系的学生进行操作。
CREATE VIEW c_student(Sno,Sname,Sex,Age,Phonenumber,Sdept)
AS(SELECT * FROM student WHERE Sdept='CS');
SELECT * FROM c_student;
/*
Sno Sname Sex Age Phonenumber Sdept
20221101 李勇 男 15 188820221101 CS
20221102 刘晨 女 19 188820221102 CS
*/
#(2)建立选择了2号课程且成绩在80分以上的学生视图。
CREATE VIEW sc_student(Sno,Sname,Sex,Age,Phonenumber,Sdept,Cno,Grade)
AS(
SELECT student.*,sc.`Cno`,sc.`Grade`
FROM student
INNER JOIN sc
ON student.`Sno`=sc.`Sno`
WHERE Cno=2 AND Grade>80
);
SELECT * FROM sc_student;
/*
Sno Sname Sex Age Phonenumber Sdept Cno Grade
20221102 刘晨 女 19 188820221102 CS 2 90
20221101 李勇 男 15 188820221101 CS 2 85
*/
#(3)建立一个反映学生出生年份的视图。
CREATE VIEW y_student(Sno,Sname,Sex,Age,Phonenumber,Sdept,birth)
AS(
SELECT student.*,(YEAR(CURDATE()) - Age)"birth"
FROM student
);
SELECT * FROM y_student;
/*
Sno Sname Sex Age Phonenumber Sdept birth
20221101 李勇 男 15 188820221101 CS 2007
20221102 刘晨 女 19 188820221102 CS 2003
20221103 王敏 女 18 188820221103 MA 2004
20221104 张立 男 19 188820221104 IS 2003
*/
#(4)在计算机系的视图c_student上查询年龄在18~20岁之间的学生的学号和姓名。
SELECT Sno,Sname
FROM c_student
WHERE Age>18 AND Age<20;
/*
Sno Sname
20221102 刘晨
*/
#(5)在(4)的学生视图上查询成绩在90分以上的女学生的学号和姓名。
SELECT Sno,Sname
FROM sc_student
WHERE Sex='女' AND Grade>=90;
/*
Sno Sname
20221102 刘晨
*/
#(6)在例(1)的视图上进行如下操作,将学号为950002的学生的姓名改为“张良”。
UPDATE c_student
SET Sname='张良'
WHERE Sno='20221101';
#student也会改变
SELECT * FROM c_student;
/*
Sno Sname Sex Age Phonenumber Sdept
20221101 张良 男 15 188820221101 CS
20221102 刘晨 女 19 188820221102 CS
*/
#(7)在(1)的视图上进行如下操作,插入一个学生的信息。
INSERT INTO c_student
VALUES(980013,'李勇','男',15,'188820221126','CS');
/*
Sno Sname Sex Age Phonenumber Sdept
20221101 张良 男 15 188820221101 CS
20221102 刘晨 女 19 188820221102 CS
980013 李勇 男 15 188820221126 CS
*/
#(8)在(1)的视图进行如下操作,删除学号为980013的学生信息。
DELETE FROM c_student
WHERE Sno='20221101';
#有外键约束,删除失败
Market3.sql
#实验三 视图和索引实验
#实验6 实验6 索引和视图
#2)视图的定义和操作。
#② 在Market数据库中,在Market数据库上,试用SQL语句完成以下各项操作:
#(1)请为北京客户建立一个订单情况的视图,包括订单编号、商品名称、订货数量、客户编号、客户名称。
CREATE VIEW v_orders AS(
SELECT OrderID,GoodsName,Quantity,customers.CustomerID,Cname
FROM orders
INNER JOIN goods
ON orders.`GoodsID`=goods.`GoodsID`
INNER JOIN customers
ON orders.`CustomerID`=customers.`CustomerID`
);
SELECT * FROM v_orders;
/*
OrderID GoodsName Quantity CustomerID Cname
1 Red_Computer 100 1 李彦宏
2 Green_Computer 100 2 马云
3 Blue_Computer 100 3 马化腾
4 Red_Keyboard 100 4 黄峥
5 Green_Keyboard 100 5 天天
6 Blue_Keyboard 100 6 西西
7 Red_Mouse 100 1 李彦宏
8 Green_Mouse 100 2 马云
9 Blue_Mouse 100 3 马化腾
*/
#(2)针对(1)中定义的视图,完成查询,查找客户张三的所有订单信息。
SELECT * FROM v_orders
WHERE Cname='马云';
/*
OrderID GoodsName Quantity CustomerID Cname
2 Green_Computer 100 2 马云
8 Green_Mouse 100 2 马云
*/
最后
这篇博客能写好的原因是:站在巨人的肩膀上
这篇博客要写好的目的是:做别人的肩膀
开源:为爱发电
学习:为我而行
更多推荐
所有评论(0)