drop table if exists class;
create table class (
id bigint primary key auto_increment,
name varchar(20)
);
insert into class(name) values ('Java001班'), ('C++001班'), ('前端001班');
SELECT * FROM class;
2.学生表
sql复制代码
drop table if exists student;
create table student (
id bigint primary key auto_increment,
name varchar(20) not null,
sno varchar(10) not null,
age int default 18,
gender tinyint(1),
enroll_date date,
class_id bigint,
foreign key (class_id) references class(id)
);
insert into student (name, sno, age, gender, enroll_date, class_id) values
('唐三藏', '100001', 18, 1, '1986-09-01', 1),
('孙悟空', '100002', 18, 1, '1986-09-01', 1),
('猪悟能', '100003', 18, 1, '1986-09-01', 1),
('沙悟净', '100004', 18, 1, '1986-09-01', 1),
('宋江', '200001', 18, 1, '2000-09-01', 2),
('武松', '200002', 18, 1, '2000-09-01', 2),
('李莲', '200003', 18, 1, '2000-09-01', 2),
('不想毕业', '200004', 18, 1, '2000-09-01', 2);
SELECT * FROM student;
3.课程表
sql复制代码
drop table if exists course;
create table course (
id bigint primary key auto_increment,
name varchar(20)
);
insert into course (name) values ('Java'), ('C++'), ('MySQL'), ('操作系统'), ('计算机网络'), ('数据结构');
SELECT * FROM course;
CREATE VIEW v_student_score AS
select
s.id, s.name, s.sno, s.age, s.gender, s.enroll_date,
c.id AS class_id,
c.`name` AS class_name,
co.id AS course_id,
co.`name` AS course_name,
sc.id AS score_id,
sc.score
from
student s,
class c,
course co,
score sc
where s.class_id = c.id
and sc.student_id = s.id
and sc.course_id = co.id
order by s.id;
执行结果:
【注意:v_student_score的select语句中含有order by】
a.在视图列表直接为字段重命名,创建视图 v_student_score_v1
sql复制代码
create view v_student_score_v1 ( # 视图列表
id, name, sno, age, gender, enroll_date,
class_id, class_name, # 班级id和名称的重命名
course_id, course_name, # 课程id和名称的重命名
score_id, score # 分数id的重命名
) AS
select s.id, s.name, s.sno, s.age, s.gender, s.enroll_date, c.id, c.`name`,
co.id, co.`name`, sc.id, sc.score from student s, class c, course co, score sc
where s.class_id = c.id
and sc.student_id = s.id
and sc.course_id = co.id;
执行结果:
【注意:v_student_score_v1的select语句中没有order by】
2. 视图的查询
2.1 查看数据库中的视图
视图是和表放在一起统一管理的,所以我们可以使用show tables直接查看。
sql复制代码
show tables;
注意:没有show views这样的语法。
2.2 查看创建视图的语句
语法:
show create {view | table} 表名;
使用 show create view 或 show create table 都可以查看创建视图的语句,但是不能使用 show create view 来查看创建表的语句。
-- 例1:查看创建v_student_score视图的语句【view关键字】
sql复制代码
show create view v_student_score;
"创建时使用的语句"的完整展示如下:
-- 例2:查看创建v_student_score视图的语句【table关键字】
sql复制代码
show create table v_student_score_v1;
2.3 查看视图结构
使用desc关键字即可查看视图的结构。
语法:
desc 视图名;
真实表中的 not null 约束和 default 约束会被视图保留下来,但是key级约束不会继承过来。
create view v_student_total_points as
select s.id, s.name, sum(sc.score) total
from student s, score sc
where s.id = sc.student_id
group by s.id order by s.id;
sql复制代码
SELECT * FROM v_student_total_points;
-- 例2:视图可以与真实表进行表连接查询
sql复制代码
SELECT * FROM v_student_total_points v, student stu where v.id = stu.id;