创建视图说明

作者:高天阳

邮箱:[email protected]

更改历史

* 2018-05-16        高天阳     完善文档示例
* 2018-05-16        乔继超     初始化文档

现有如下两张表:

1.年级表(ID,年级名称)

2.学生表(ID,姓名,年龄,地址,年级)

现在要满足以下需求

创建一张视图,要求这个视图把学生表和年级表的信息都带出来,通过查询这张视图返回学生信息和所对应的年级信息。

注意

若要多表关联,相互关联的两张表之间必须存在关联字段!

再次案例中,关联字段是学生表中的“grade_id”,通过学生表中的“grade_id”找到年级表中的主键ID带出数据

创建视图

创建视图的基本语句:

CREATE VIEW view_name(视图名称)
AS sql查询语句

创建学生表和年级表的视图:

CREATE VIEW student_grade_view
AS select stu.*,gra.* from student as stu INNER join grade as gra on stu.grade_id=gra.id

注意:‘as’指的是另起一个别名

上述语句展示信息为学生表所有字段和年级表的所有字段(因为都是*)

那么就存在一个问题:两张表共同存在的字段就会重名

怎么解决呢?

第二张表的字段用‘表名.字段名’的方式进行展示,这样就可以给字段名其别名了

那么修改后的语句就是:

CREATE VIEW student_grade_view
AS select stu.*,gra.id as gra_id,gra.grade_name as gra_gradeName from student as stu INNER join grade as gra on stu.grade_id=gra.id

4 最佳实践

4.1 通过表student带出表grade

CREATE VIEW student_grade_view
select stu.*,gra.* from student stu left join grade gra on stu.grade_id=gra.id

4.1.1 分步骤讲解

  • 筛选哪些字段出来
select stu.*,gra.*
  • 从哪个表(起别名)
from student stu
  • 带出哪个表
left join grade gra
  • 通过哪个字段
on stu.grade_id=gra.id

4.1.2 问题点

  • 注意:上面语句存在问题 因为student表和grade表都有id字段 不可一张表同时存在两个相同名称的列 因此需要下面方法将同名的字段取别名
CREATE VIEW student_grade_view
AS select stu.*,gra.id as gra_id,gra.grade_name as gra_gradeName from student as stu left join grade as gra on stu.grade_id=gra.id

4.2 通过表middle带表student和表grade

CREATE VIEW student_grade_view
As select stu.*,gra.* from middle mid left join grade gra on mid.grade_id=gra.id left join student stu on mid.student_id=stu.id

4.3 通过表middle(字段重复写别名)带表student和表grade

CREATE VIEW student_grade_view
As select stu.*,mid.id as mid_id,mid.grade_id as mid_grade_id from middle as mid left join student as stu on mid.student_id=stu.id

4.4 通过表middle带表student再带出表grade

CREATE VIEW student_grade_view
As select stu_mid.*,gra.grade_name,gra.id as gra_id from (SELECT stu.*,mid.id as mid_id,mid.grade_id as mid_grade_id from middle as mid left join student as stu on mid.student_id=stu.id) as stu_mid
left join grade gra on stu_mid.grade_id=gra.id

4.5 通过表student的两个字段带出两次表grade

CREATE VIEW student_grade_view
select stu.*,gra.grade_name as gra_gradeName,gra2.grade_name as gra2_gradeName 
from student stu 
left join grade gra on stu.grade_id=gra.id 
left join grade gra2 on stu.grade2_id=gra2.id

results matching ""

    No results matching ""