一、视图的介绍
1、定义:视图是一个虚拟表 它不在数据库中以存储的形式保存,(本身不包含数据),是在使用视图的时候动态生成。
2、视图的优点?
(1)提高查询效率
数据库中的数据查询非常复杂,可以简化sql语句
(2)安全
有些保密字段,可以通过创建视图限制用户对某些字段进行操作
(3)简单
不需要关心后面对应的表结构
3、视图的缺点?
(1)性能差
把视图查询结果转换成对表的查询
(2)修改限制
修改视图数据,必须把它转化为对基础表的修改
二、试图使用
1、创建一个视图
格式:create view 视图名 as (sql语句)
如;create view st1 as (
select sid,dept_name,name from dept INNER JOIN emp on dept1=dept2
)
select * from st1 ;
案例:
create view st10 as(
select * from emp where dept2=101
);
2、查看所有的表(物理表中没有视图)
show tables
3、查询视图
格式:select * from 视图名 ;
如:select * from st1 ;
4、查看创建好的视图
show create view 视图名
如:show create view st1 ;
5、删除视图
格式:drop view 视图名 ;
如:drop view st2 ;
三、试图的特点
1、视图是由基础表产生的虚拟表;
如:基础表删除,视图就无效
2、视图的创建不影响基础表
如:创建多个视图,都不影响基础表
3、删除视图不影响基础表
4、视图删除数据,基础表也同时删除数据(合表的表无法删除,单表可以删除)
5、基础表删除数据,视图也删除数据,
6、视图不能修改表字段,不能对表字段删除
四、面试题
1、什么是视图?
2、视图是用来干什么?
3、视图的优缺点?
4、如何创建视图?
5、如何删除一个视图?
一、建表
create table student1(
stu_no int,
stu_name varchar(10),
sex char(1),
age int(3),
edit varchar(20) )
DEFAULT charset=utf8;
insert into student1 values
(1,'wang','男',21,'hello'),
(2,'小明','女',22,'haha2'),
(3,'hu','女',23,'haha3'),
(4,'li','男',25,'haha4');
create table course(
c_no int,
c_name varchar(10)
)
DEFAULT charset=utf8;
insert into course values
(1,'计算机原理'),
(2,'java'),
(3,'c'),
(4,'php'),
(5,'py');
#drop table sc;
create table sc(
sc_no int,
stu_no int,
c_no int,
score int(3))
DEFAULT charset=utf8;
insert into sc values
(1,1,1,80),
(2,2,2,90),
(3,2,1,85),
(4,2,3,70),
(5,2,4,95),
(6,2,5,89);
select * from sc;
select * from student1;
select * from course;
二、分析表
Student1学生表(学生学号、姓名、性别、年龄、编辑)
Course课程表(课程编号、课程名称)
sc选课表(选课编号、学生学号、课程编号、成绩)
关联关系:
都和sc表关系
Course .课程编号= sc.课程编号
Student1.学生学号=sc.学生学号
三、三表连接
(1)先连接2个表,在和第三表连接
格式:
如“select a.* ,b.sc_no,b.c_no ,b.score from student1 a INNER JOIN sc b on a.stu_no=b.stu_no
备注:有重复列的解决方法:显示一个表所有内容,在进行关联
如:a.*显示所有的a表 ,对应的表增删改查
(2)内连接
格式:
select * from 表1 别名1 INNER JOIN 表2 别名2 on 表1.关联字段=表2.关联字段 INNER JOIN 表三 表名 on 表2.关联字段=表3关联字段
如:select * from student1 x INNER JOIN sc y on x.stu_no=y.stu_No INNER JOIN course c on y.c_no=c.c_no
(3)左连接
格式:
select * from 表1 别名1 left JOIN 表2 别名2 on 表1.关联字段=表2.关联字段 left JOIN 表三 表名 on 表2.关联字段=表3关联字段
(4)右连接
格式:
select * from 表1 别名1 right JOIN 表2 别名2 on 表1.关联字段=表2.关联字段 right JOIN 表三 表名 on 表2.关联字段=表3关联字段
如
select * from student1 x right JOIN sc y on x.stu_no=y.stu_no right JOIN course c on y.c_no=c.c_no
(5)内连接的三表连接
格式:
select * _name from 表1 a ,表2 b ,表3 c where 表1.关联字段=表2.关联字段 and 表2.关联字段=表3.关联字段
案例:
select a.stu_no,a.stu_name from student1 a ,sc b ,course c where a.stu_no=b.stu_no and b.c_no=c.c_no ;
三、作业:
(1)写一个SQL语句,查询选修了“计算机原理”的学生学号和姓名
select a.stu_no,a.stu_name from student1 a inner join sc b on a.stu_no=b.stu_no inner join course c on b.c_no=c.c_no where c.c_name="计算机原理"
(2)写一个SQL语句,查询“小明”同学选修的课程名称
select c_name from student1 x inner join sc y on x.stu_no=y.stu_no
INNER JOIN course z on y.c_no=z.c_no where stu_name="小明";
(3)写一个SQL语句,查询选修了5门课程的学生学号和姓名
select s.stu_no,s.stu_name
from student1 s
join sc on s.stu_no=sc.stu_no
group by s.stu_no
having count(sc.c_no)=5;
网硕互联帮助中心


评论前必须登录!
注册