本人新手一枚,將自己學習時的經驗總結一下,其中若有錯誤,還望各位多多指教。
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;#正確
總結
本人的一點總結,如有錯誤,請批評指正。