musql视图介绍
1.1视图简介(一)
在后台,我们提供了一个 teachers 表的视图 v_teachers, 现在需要你查看这个视图中的内容。
SELECT *
FROM v_teachers;
1.2视图简介(二)
现在我们需要查看当前数据库中的所有表和视图名称和它的类型,请编写 SQL 语句来实现
show full tables;
第二章:创建视图
2.1CREATE VIEW(一)
现在,你的上级主管要求你写一个简单的视图,命名为 v_courses_teachers。要求提供 courses 表的所有信息,并且以 teacher_id、teacher_name 和 teacher_email 来展示关联表 teachers 中的主键、讲师姓名和讲师邮箱。
CREATE VIEW v_courses_teachers
AS
SELECT c.*,t.name AS teacher_name ,t.email AS teacher_email
FROM courses c
left join teachers t on c.teacher_id=t.id
2.2CREATE VIEW(二)
现在,你的上级主管要求你写一个简单的视图(v_courses)。要求从教师表(teachers)和课程表(courses)中查询国籍不为 USA 和 JP 的老师所教的课程和所对应的学生数量 student_count。
CREATE VIEW v_courses
AS
SELECT c.id AS id, c.name AS name, c.student_count AS student_count
FROM courses c --询国籍不为 USA 和 JP 的老师所教的课程
LEFT JOIN teachers t ON t.id = c.teacher_id
WHERE t.`country` NOT IN ('USA', 'JP')
OR t.country IS NULL
2.3CREATE VIEW(三)
我们提供了一个视图 v_courses,包含了教师 id 和该教师教授的总学生数。现在我们想要进一步获取更多的教师信息,请基于视图 v_courses ,创建一个新的视图 v_teachers 展示更多的信息。
CREATE VIEW v_teachers AS
SELECT teacher_id, t.name, email, age, country, c.student_count
FROM teachers t RIGHT JOIN v_courses c
ON t.id = c.teacher_id
ORDER BY t.id;
第三章 MySQL视图处理
3.1MySQL 视图处理算法(一)
请创建一个视图 v_teachers 查看 teachers 表中年龄大于25岁的教师信息,并使用 Merge 的视图算法
CREATE ALGORITHM = MERGE
VIEW v_teachers AS
SELECT * FROM teachers
WHERE age>25;
3.2MySQL 视图处理算法(二)
请创建一个视图 v_teachers 查看 teachers 表中国籍为 CN 的教师信息,并使用 TEMPTABLE 的视图算法
CREATE ALGORITHM=TEMPTABLE VIEW v_teachers
AS
SELECT * FROM teachers WHERE country ='CN';
第四章:MySQL ALTER VIEW
4.1MySQL ALTER VIEW语句(一)
张三曾经有一个梦想,想要听遍学校里的每一位教师的课程,于是写了一个视图 v_mydream 展示了所有的课程与授课教师的信息,并按教师姓名升序去实现,但是张三发现课程实在是太多太多,梦想需要改一改,于是他把梦想改成了去听每一位教师最受欢迎的课程(听课学生越多越受欢迎,如果该教师没有教授课程则课程与学生数显示为 NULL),学校也非常支持他,听说他最近在学 MySQL,就给了他 2 张表的数据让他自己去找,teachers 表中记录着教师的信息,courses 表中记录着课程信息。张三一看,“ 哇~ 这也太简单了,感谢学校大大提供的数据 ”,可是他正要把原来的梦想视图改写,就发现李四从旁边过。李四肚子饿的呱呱叫,看到张三就问要不要一起去吃饭,张三灵光一闪,“ 这么巧~ 我也打算去吃饭,但是现在我这里有一个很简单的问题,你帮我解决了我就请你吃饭 ”,李四一听还有这等好事,立马答应下来了,结果发现不会。为了不掉面子并且能吃上一顿,就偷偷联系了你,请求你帮他解决。
alter view v_mydream as
select t.`name` as teacher_name, c.`name` as course_name, c.`student_count` as student_count
from teachers t
left join courses c on t.id = c.teacher_id
where student_count = (select max(student_count) from courses where teacher_id = t.id)
or student_count is null
order by student_count,t.id;
第五章:创建 MySQL 可更新视图
5.1 MySQL 可更新视图(一)
这里提供了一个可更新的视图 v_teachers,请你编写 SQL 语句对 Linghu Chong 老师的年龄修改为 30 岁。
update v_teachers
set age = 30
where name = 'Linghu Chong';
5.2 MySQL 可更新视图(二)
这里提供了一个可更新的视图 v_teachers,请你编写 SQL 语句删除 Linghu Chong 老师的信息。
DELETE from v_teachers
where name = 'Linghu Chong';
第六章:MySQL 视图和 WITH CHECK OPTION
WITH CHECK OPTION 子句
现在要求创建一个可更新视图 v_teachers,只允许查看和插入年龄小于 30 岁的教师信息,请编写 SQL 语句实现
CREATE VIEW v_teachers AS
SELECT * FROM teachers WHERE age<30
WITH CHECK OPTION;
第七章:MySQL 显示视图
MySQL SHOW VERSION
现在我们需要查看当前数据库中的所有视图,请编写 SQL 语句来实现
SHOW FULL TABLES
WHERE table_type = 'VIEW'
第八章:MySQL 重命名视图
MySQL RENAME VIEW
现在我们有一个视图 v_teachers 需要重命名为 v_teachers_1,请编写 SQL 语句来实现
RENAME TABLE v_teachers to v_teachers_1;
第九章:MySQL 删除视图
9.1MySQL DROP VIEW(一)
现在我们要删除一个视图,名为 v_teachers ,请编写 SQL 语句来实现
DROP VIEW v_teachers;
9.2MySQL DROP VIEW(二)
现在我们要删除一个视图,名为 v_courses_teachers ,请编写 SQL 语句来实现
DROP VIEW IF EXISTS v_courses_teachers;
第十章:MySQL 视图本地和级联
现在我们一个可更新视图 v_teachers,只允许查看年龄小于 30 岁的教师信息,要求基于 v_teachers 视图实现另一个视图 v_teachers_1,查看年龄小于 20 岁的教师信息,视图采用本地检查,请编写 SQL 语句实现。
CREATE OR REPLACE VIEW v_teachers_1 AS
SELECT id,name,email,age,country
FROM v_teachers
WHERE age<20;
第十一章:MySQL 管理视图
11.1MySQL 管理视图(一)
我们有一个视图 v_teachers,但是现在我们想要显示这个视图的定义,请编写 SQL 语句来实现
show create view v_teachers;
11.2MySQL 管理视图(二)
张三在宿舍里打游戏,今天运气不太好,总是被匹配的队友坑,气得张三直接就把游戏给卸载了。没心情去吃饭的张三打开 QQ,发现有 999+ 的信息,原来是学校的老师给他发来的消息,想要他帮忙创建一个 SQL 视图 v_best_teachers,要他赶紧写好发过去。张三看了看需求,边看要求边写 SQL,结果发现...不对!学校的要求是查出每个国家最受欢迎的老师信息(听课学生数越多越受欢迎),并按国籍升序排序。现在张三在知识分享过程中,拿这道题来考你,并嘲讽你不能做出来……小伙子,打脸张三的时候到了,还在等什么 ?冲
create or replace view v_best_teachers
as
select teacher_id, student_count, country, email
from(
select teacher_id, sum(student_count) student_count, country, email
from courses c
inner join teachers t
on c.teacher_id = t.id
group by teacher_id, country, email) a
where (student_count, country) in(
select max(student_count), country
from(
select teacher_id, sum(student_count) student_count, country, email
from courses c
inner join teachers t
on c.teacher_id = t.id
group by teacher_id, country, email) aa
group by country)
order by country;