数据库第三次实验报告

  1. 使用SQL语句CREATE VIEW建立一个名为v_stu_c的视图,显示学生的学号、姓名、所学课程的课程编号,并利用视图查询学号为0003的学生情况。
CREATE VIEW v_stu_c(`学号`,`姓名`,`课程编号`)
AS
SELECT grade.`学号`,`姓名`,`课程编号`
FROM grade,student_info
WHERE grade.`学号`='0003' AND
grade.`学号`=student_info.`学号`;

  1. 使用SQL语句为curriculum表的课程编号创建唯一性索引,命名为cno_idx。
CREATE UNIQUE INDEX cno_idx ON curriculum(`课程编号`);
  1. 使用SQL语句为grade表的“分数”字段创建一个普通索引,命名为grade_idx。
CREATE  INDEX grade_idx ON grade(`分数`);
  1. 基于student_info表、curriculum表和grade表,建立一个名为v_stu_g的视图,视图包括所有学生的学号、姓名、课程名称、分数。使用视图v_stu_g查询学号为0001的学生的课程平均分。
创建视图:
CREATE VIEW v_stu_g(`学号`,`姓名`,`课程名称`,`分数`)
AS
SELECT grade.`学号`,`姓名`,`课程名称`,`分数`
FROM student_info,curriculum,grade
WHERE curriculum.`课程编号`=grade.`课程编号`
AND grade.`学号`=student_info.`学号`;
查询视图:
SELECT `学号`,  AVG(`分数`) AS '课程平均分'
FROM v_stu_g
WHERE `学号`='0001';

  1. 使用SQL语句修改视图v_stu_g,显示学生的学号、姓名、性别。
ALTER VIEW v_stu_g 
AS
SELECT `学号`,`姓名`,`性别`
FROM student_info 
WITH CHECK OPTION;

6.利用视图v_stu_g为student_info表添加一行数据:学号为0010、姓名为陈婷婷、性别为女。

INSERT INTO v_stu_g 
VALUES('0010','陈婷婷','女');

7.利用视图v_stu_g删除学号为0010的学生记录。

DELETE FROM  v_stu_g 
WHERE `学号`='0010';

8.利用视图v_stu_g修改姓名为张青平的学生的高等数学的分数为87。

UPDATE v_stu_g 
SET `分数`='87'
WHERE `课程名称`='高等数学';

9.使用SQL语句删除视图v_stu_c和v_stu_g。

DROP VIEW v_stu_c;
DROP VIEW v_stu_g;

  1. 在本地主机创建用户账号st_01,密码为123456。
CREATE USER 'st_01'@'localhost'IDENTIFIED by '123456';
  1. 使用studentsdb数据库中的student_info表。
    (1)授予用户账号st_01查询表的权限。
GRANT SELECT 
	on student_info
	to 'st_01'@'localhost';

(2)授予用户账号st_01更新家庭住址列的权限。

GRANT UPDATE(`家庭住址`)
	on student_info
	to 'st_01'@'localhost';

(3)授予用户账号st_01修改表结构的权限。

GRANT ALL 
on *
to st_01@localhost;

  1. 撤消用户账号st_01所有权限.
REVOKE all
on student_info
FROM st_01@localhost;

  1. 使用studentsdb数据库中的student_info表。
    (1)创建本地机角色student。
CREATE role student;

(2)授予角色student查询student_info表的权限。

GRANT SELECT
ON TABLE student_info
to student;

(3)创建本地机用户账号st_02,密码为123。

CREATE USER 'st_02'@'localhost'IDENTIFIED by '123';

(4)授予用户账号st_02角色student的权限。

GRANT student to st_02;

(5)以用户账号st_02连接MySQL服务器,查看student_info表信息。

USE st_02 SELECT *FROM student_info;

(6)撤消用户账号st_02角色student的权限。

REVOKE ON student FROM st_02@localhost;

(7)删除角色student。

drop role 'student';

12.删除用户账号st_01、st_02。

DROP USER 'st_01'@'localhost';
DROP USER 'st_02'@'localhost';

二、实验思考

  1. 建立索引的目的。什么情况下不适于在表上建立索引。
    1、在经常需要搜索的列上,可以加快搜索的速度。
    2、在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构。
    3、在经常用于连接两张表的列上,这些列主要是一些外键,可以加快连接的速度。
    4、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。
    5、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
    6、在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
    不适合建立索引:
    1、表记录太少。
    2、经常增删改的表。
    3、数据重复且分布平均的表字段,因此应该只为最经常查询和经常排序的数据列建立索引(如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果)。
  2. 能否在视图上建立索引。
    可以在视图上建立索引。
  3. 想通过视图修改表中数据,视图应具备哪些条件。
    视图知识单表的投影。
  4. 视图的作用。
    (1)提高了重用性,视图就像一个函数。
    (2) 对数据库重构,却不影响程序的运行。
    (3) 提高了安全性能。可以对不同的用户,设定不同的视图。
    (4) 让数据更加清晰。想要什么样的数据,就创建什么样的视图。
  5. 用户账号、角色和权限之间的关系是什么?没有角色能给用户授予权限吗?
    1.一个用户表可以有一个角色表,一个角色表可以有多个用户
    2.角色表和权限表是多对多的关系
    3.查询拥有某角色的用户信息
    4.查询某用户的对应的角色。
    5.查询拥有某权限的角色
    6.查询某角色拥有的权限。
    7.查询某用户拥有的权限,先查找用户和角色的信息,在通过角色查询权限

你可能感兴趣的:(作业,笔记,mysql,sql,数据库)