云计算百科
云计算领域专业知识百科平台

mysql视图和三表

一、视图的介绍
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;
 

赞(0)
未经允许不得转载:网硕互联帮助中心 » mysql视图和三表
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!