MySQL中視圖的那點東西


本人新手一枚,將自己學習時的經驗總結一下,其中若有錯誤,還望各位多多指教。

1,什么是視圖

  視圖(view)是一種虛擬的表,並不在數據庫中實際存在。通俗的來說,視圖就是執行select語句后返回的結果。

2,為什么要使用視圖

  1,簡單

  對於數據庫的用戶來說,很多時候,需要的關鍵信息是來自多張復雜關聯表的。這時用戶就不得不使用十分復雜的SQL語句進行查詢,給用戶造成極差的體驗感。使用視圖之后,可以極大的簡化操作,使用視圖的用戶不需要關心相應表的結構、關聯條件等。對於用戶來說,視圖就是他們想要查詢的結果集。

  2,安全

  使用視圖的用戶只能訪問被允許查詢的結果,使用視圖可以限制用戶訪問一些敏感信息列。

3,使用視圖的小案例

  1,在案例中學習代碼永遠都是最快的

 創建如下三個表格:

#users表的創建
CREATE TABLE `users` (
  `u_id` int(4) NOT NULL auto_increment,
  `username` varchar(20) default NULL,
  `age` int(4) default NULL,
  `country` varchar(20) default NULL,
  PRIMARY KEY  (`u_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

#course表的創建
CREATE TABLE `course` (
  `c_id` int(4) NOT NULL auto_increment,
  `coursename` varchar(20) default NULL,
  `description` varchar(255) default NULL,
  PRIMARY KEY  (`c_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

#user_course表的創建
CREATE TABLE `user_course` (
  `u_c_id` int(4) NOT NULL auto_increment,
  `userid` int(4) NOT NULL,
  `courseid` int(4) NOT NULL,
  PRIMARY KEY  (`u_c_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

 

向表中插入如下數據:

接下來我們的任務是:查詢tom所修的課程,顯示tom的名字和課程名

#方法一:子查詢的方式
select username,coursename from users u,course c where u.username = 'tom' and c.c_id in (
        select courseid from user_course where userid = (
                select u_id from users where username = 'tom'))
#方法二:外鏈接的方式
select username,coursename from 
        user_course
        left join course on user_course.courseid = course.c_id
        left join users on user_course.userid = users.u_id
        where username = 'tom'

 

可以看出,並不是很復雜的關聯表的查詢已經如此的復雜

如果我們使用視圖

#使用視圖進行查詢
select username,coursename from user_course_view where username = 'tom'

 

這就是最簡單的查詢語句

  2,見識了視圖的便捷,再來看看視圖是如何使用的。

    1,視圖的創建

#創建視圖
create view user_course_view as
    select * from 
    user_course
    left join course on user_course.courseid = course.c_id
    left join users on user_course.userid = users.u_id

 

結果如下:

如上圖所示,我們已經將三張表格放在了一張視圖里面

對於想要查詢的內容,我們可以在這個視圖中進行,極大的簡化了操作。

#創建視圖,隱藏課程的描述信息
create view user_course_view as
    select user_course.*,users.*,course.c_id,course.coursename from 
    user_course
    left join course on user_course.courseid = course.c_id
    left join users on user_course.userid = users.u_id

 

假設課程的描述信息是隱秘信息,不希望用戶查詢的話,可以使用以上代碼進行隱藏,效果如下:

與之前相比,課程的描述信息已經隱藏了,這就是視圖的另一個優點。

  2,視圖的相關操作

  上面我們已經講了視圖的查詢操作,那么除了查詢還可以進行哪些操作呢?

  視圖與表是一對一的關系:此時視圖和表的操作是一樣的。

  視圖與表是一對多的關系:上面的小案例中,視圖與表是一對三的關系

    只可以對視圖進行改的操作,而且是在沒有其他約束的情況下

 

insert into user_course_view(userid,courseid,coursename) value(3,2,'java');#錯誤的

 

update user_course_view set coursename = 'java web' where u_c_id = 1;#正確

 

總結

  本人的一點總結,如有錯誤,請批評指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM