Mysql視圖,

把 /etc/passwd的數據導入db7的user表裏

一mysql 視圖

    2.1  視圖介紹(什麼是視圖)

 是一張虛擬表,內容與真實的表相似,有字段的記錄 ,視圖並不在數據庫中以存儲的數據存在

    2.2  爲什麼要使用視圖 (視圖的優點)

簡單 --用戶不需要關心視圖中的數據如何查詢獲得,視圖中的數據已經是過濾好符合條件的集合

安全---用戶只能看到視圖中的數據

數據獨立--視圖的結構一旦確定,可以 屏蔽表結構對用戶的影響

    2.3 視圖使用規則(創建視圖時,要滿足規則要求)

         create view db9.v1 as select name,uid from db9.user;

   2.4 視圖管理

                        2.4.1 創建視圖

create  view   視圖名  sql 命令

mysql> create view db9.v1  as select name,uid from user;
 

create view 視圖名(字段名)  sql 命令

mysql> create view db9.v2(a,b,c)  as select name,uid,shell from  db9.user;
mysql>  show tables;
mysql>  desc db9.v2;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| a     | char(50) | YES  |     | NULL    |       |
| b     | int(11)  | YES  |     | NULL    |       |
| c     | char(50) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
 

                      2.4.2 驗證視圖特點

[root@host50 ~]# mysql  -h192.168.4.55  -uyaya10 -p123qqq...A;

mysql>    show grants;
mysql>  對數據做操作驗證特點

             更新視圖的數據,就是更新基表的數據

               更新基表的數據,視圖的數據也會跟着改變

                      2.4.3 查看視圖

  mysql> show table status where comment="view"\G;   # 查看哪些是視圖表
mysql>  show create view v2\G;   #  查看該視圖的基表
 

                       2.4.4 刪除視圖

                      drop view 表名

mysql> drop view v1;

                     2.4.5 限制對視圖的製作

2.5視圖進階

   2.5.1創建視圖時,定義字段別名

mysql> create table t2 select  name,uid,shell from user limit 3;
mysql> create table t3 select name,uid,password,homedir from  user limit 5;
mysql> select * from t2,t3  where t2.uid=t3.uid;
mysql> select * from  t2 left join t3 on t2.uid=t3.uid;
 

mysql> create view v4 
    -> as
    -> select a.name x1,a.uid x2,a.shell x3,
    -> b.name x4,b.uid x5,b.password x6,
    -> b.homedir x7
    -> from 
    -> t2 a left join t3 b on a.uid=b.uid;
Query OK, 0 rows affected (0.04 sec)
             

mysql> select * from  t2 left join t3 on t2.uid=t3.uid;
+--------+------+---------------+--------+------+----------+---------+
| name   | uid  | shell         | name   | uid  | password | homedir |
+--------+------+---------------+--------+------+----------+---------+
| root   |    0 | /bin/bash     | root   |    0 | x        | /root   |
| bin    |    1 | /sbin/nologin | bin    |    1 | x        | /bin    |
| daemon |    2 | /sbin/nologin | daemon |    2 | x        | /sbin   |
 

mysql>  create view v5 as select * from t2 left join t3 on t2.uid=t3.uid;    #  會報錯,所以需要重新定義字端別名
ERROR 1060 (42S21): Duplicate column name 'name'

2.5.2   覆蓋創建新視圖  or replace

mysql> create view v4 as select uid,gid,name from user;
ERROR 1050 (42S01): Table 'v4' already exists   # 已經存在
 

mysql>   create or replace view v4  as select uid,gid,name from user;
mysql>  select  * from v4;
 

2.5.3 算法(algorithm)  訪問視圖時,mysql 服務的處理方式

merage 替換方式

temptable,具體化方式   # 指的是要先在基表裏面執行sql 命令 紅色字體,create view db9.v2(a,b,c)  as select name,uid,shell from  db9.user;,最後執行 select * from v4

undefined,  未定義  =merage    #直接執行select * from v4

mysql> create algorithm=temptable view v5 as select uid,gid,name from user;
 

2.5.4  with  check option 限制對視圖的操作

            1 LOCAL 對視圖操作時,必須滿足視圖自身的限制

          2. CASCADED  對視圖操作時,既要滿足視圖對自身的限制,又要滿足基表的限制

 

    1 LOCAL 對視圖操作時,必須滿足視圖自身的限制

mysql>  create table  t5  select name,uid,gid,shell from user where gid >=20 and gid <=1000;
mysql>   select  * from  t5;
 

mysql>  create view v7 as select * from  t5 where gid<=500 with local check option;
Query OK, 0 rows affected (0.04 sec)
 

mysql> select * from v7;
 

mysql> update v7 set gid=501 where name="games";   # 在視圖v7不能把gid修改爲大於500,  因爲with local check option;   gid限制了小於等於500
ERROR 1369 (HY000): CHECK OPTION failed 'db9.v7'

 

 2. CASCADED  對視圖操作時,既要滿足視圖對自身的限制,又要滿足基表的限制

mysql> create view v8 as  select * from v7 where gid>=100 with cascaded check option;
Query OK, 0 rows affected (0.04 sec)

mysql>   select  * from v8;
+-------+------+------+---------------+
| name  | uid  | gid  | shell         |
+-------+------+------+---------------+
| games |   12 |  501 | /sbin/nologin |
+-------+------+------+---------------+
1 row in set (0.01 sec)

 

使不同的用戶訪問不同的數據

二mysql 存儲過程:

  2.1 存儲過程介紹 : 是mysql 服務裏面的腳本

       指的是數據庫中保存的一系列SQL命令的結合

      可以在存儲過程中使用變量,流程控制,條件判斷

2.2 存儲過程的優點

        提高性能

       可減輕網絡負擔

       可以防止對錶的直接訪問

       避免重複編寫sql操作

2.3使用存儲過程

     2.3.1 基本使用

              1 創建存儲過程

delimited //        修改命令結束的符號,不能是;分號

 create procedure  庫名.名稱

begin

       功能代碼

         select * from 庫名。表名;

end

//

delimited ;  修改回;爲結束命令

             2.執行

          call  庫名.名稱();

           3 查看

                 3.1 查看服務器上已有的存儲過程

show procedure status;

mysql>    desc mysql.proc\G;

                       庫名  名稱           存儲                             類型               
mysql> select  db,name from mysql.proc where type="procedure";
 

                 3.2 查看存儲過程代碼

mysql> select  db,name,body from mysql.proc where type="procedure" and name="ps_setup_save"\G;    #  body裏面含有代碼
 

              4刪除 

             drop  procedure  庫名.名稱;

 

  2.3.2 進階

         1.變量(變量類型)

                 會話變量:用戶在連接之後產生的變量,,,,斷開後就會消失

show session variables;

show session variables like "sort_buffer_size";

set 

                  全局變量:

show global variables;

selete   @@變量   #查看全局變量

                  用戶變量:      

mysql> set @x=99;
Query OK, 0 rows affected (0.00 sec)

mysql> set @name="bob";
Query OK, 0 rows affected (0.00 sec)

mysql> select @x,@name;
+------+-------+
| @x   | @name |
+------+-------+
|   99 | bob   |
+------+-------+

 

                 局部變量 :在存儲過程裏定義

                              declare      變量名 類型;  只能放在begin 和end 之間

mysql> delimiter //
mysql> create procedure db9.p2()
    -> begin
    -> declare x int;
    -> declare y int;
    -> set x = 99;
    -> set y = 11;
    -> select x,y;
    -> end
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> call db9.p2();
+------+------+
| x    | y    |
+------+------+
|   99 |   11 |
+------+------+
1 row in set (0.00 sec)

 

使用查詢結果給變量復值

          mysql>  select count(name) into 變量名  from  db9.user;

          mysql> select count(name)  into @x   from  db9.user;


         mysql>  select  @x;
 

mysql>  delimiter //
mysql> create procedure db9.p3()
    -> begin 
    -> declare x int;
    -> declare y int;
    -> select count(name) into x from   db9.user where gid <= 1000;
    -> select count(name) into y from   db9.user where gid > 1000;
    -> select  x,y;
    -> end
    -> //
 

mysql>  delimiter ;
mysql> call db9.p3();
+------+------+
| x    | y    |
+------+------+
|   40 |    1 |
+------+------+
1 row in set (0.00 sec)
 

           2.存儲過程的參數()參數類型)

//   參數作用:

       參數類型:

                 in類型    給存儲過程傳值

                                   in   變量名   數據類型

                 out 類型: 接收存儲過程中的處理結果

                                  out  變量名   數據類型

                inout 類型 :  兩者的結合

                               inout  變量名  數據類型

        in類型    給存儲過程傳值

mysql> delimiter //
mysql> create procedure db9.p9(in username char(10))
    -> begin
    -> select  * from  db9.user where name=username;
    -> end
    -> //

 

mysql>  delimiter ;
mysql>  call  p9("root");       #必須是user表裏面的有的內容

+----+------+----------+------+------+---------+---------+-----------+
| id | name | password | uid  | gid  | comment | homedir | shell     |
+----+------+----------+------+------+---------+---------+-----------+
|  1 | root | x        |    0 |    0 | root    | /root   | /bin/bash |
+----+------+----------+------+------+---------+---------+-----------+
1 row in set (0.00 sec)

 

mysql>  call  p9("bob");         #  user 表裏面沒有bob  所以不能查找出來
Empty set (0.00 sec)


   out 類型: 接收存儲過程中的處理結果

mysql> delimiter //
mysql> create procedure p10(in x int,in y int,out z int)
    -> begin
    -> set z = x + y;
    -> select z;
    -> end
    -> //
mysql> mysql> call p10(10,7,@i);
+------+
| z    |
+------+
|   17 |
+------+
1 row in set (0.00 sec)
 

mysql>  select @i;
+------+
| @i   |
+------+
|   17 |
+------+

 

mysql> delimiter //
mysql> create procedure p11(in uid_num int,in shell_name char(50),out x int)
    -> begin
    -> declare i int;
    -> declare j int;
    -> select count(shell) into j from  user where shell = shell_name;
    -> select count(uid) into i from  user where uid = uid_num;
    -> set x = i + j;
    -> select x;
    -> end
    -> //
 

mysql>    delimiter ;
mysql>    call p11(6,"abc",@w);
+------+
| x    |
+------+
|    1 |
+------+
 

mysql>    call p11(11,"/bin/bash",@w);
+------+
| x    |
+------+
|    3 |
+------+
 

mysql> delimiter //
mysql> create procedure p12(inout x char(30))
    -> begin
    -> select name from user where name=x;
    -> select count(*) into x from  user;
    -> select x;
    -> end 
    -> //
 

mysql> delimiter ;
mysql> set @i="root";
mysql> call p12(@i);

+------+
| name |
+------+
| root |
+------+
1 row in set (0.00 sec)

+------+
| x    |
+------+
| 41   |

 

 

 

        3.四則計算   + - * /   DIV  %

mysql> delimiter //
mysql> create procedure db9.p4()
    -> begin
    -> declare x int;
    -> declare y int;
    -> declare z int;
    -> select count(name) into x from  db9.user where gid=1000;
    -> select count(name) into z from db9.user where gid >1000;
    -> set z = x + y;
    -> select x,y,z;
    -> end
    -> //
 

mysql>  call db9.p4();
    -> //
+------+------+------+
| x    | y    | z    |
+------+------+------+
|    1 | NULL | NULL |
+------+------+------+
1 row in set (0.00 sec)
 

mysql> delimiter ;

         4.條件判斷(是給流程控制使用)

                數值比較符號   字符比較符號   空  非空

                 範圍內比較    邏輯比較    正則匹配   模糊匹配

        5. 流程控制(控制代碼的執行順序)

        1. if 選擇結構(根據條件判斷執行操作)

                    格式1:

                             if  條件測試  then

                                 代碼。。。。

                               end if  ;

                格式2:

                        if  條件測試  then

                              代碼一

                          else

                                代碼2

                        end if;        

       mysql> delimiter //
mysql> create procedure db9.p13(in line_num int)
    -> begin
    -> if line_num > 10 then
    -> select * from  user where id >= line_num;
    -> else
    -> select * from user where id <= line_num;
    -> end if;
    -> end
    -> //


  mysql> delimiter ;
    

mysql> call p13(2);
    -> //
+----+------+----------+------+------+---------+---------+---------------+
| id | name | password | uid  | gid  | comment | homedir | shell         |
+----+------+----------+------+------+---------+---------+---------------+
|  1 | root | x        |    0 |    0 | root    | /root   | /bin/bash     |
|  2 | bin  | x        |    1 |    1 | bin     | /bin    | /sbin/nologin |
               

mysql> call p13(12);
 

 

          2. 循環結構  ( 需要重複執行的代碼放在循環結構裏)

              循環結構1  while  

                               while 條件 do  

                                 循環體

                              ....

                          end  while  ;

 

mysql> delimiter //
mysql> create procedure p15()
    -> begin
    -> declare x int;
    -> set x =1;
    -> while x <= 10  do 
    -> select x;
    -> set x=x+1;
    -> end while;
    -> end
    -> //


mysql> delimiter ;
mysql> call p15();   #  顯示從1到10 的數字
 

        循環結構  2 loop                 是一個死循環

           loop

           循環體 

         end loop;

例子:

mysql> create procedure p16()

         begin loop select * from  user limit1;

        end loop;

       end

       //
mysql> call p16();          #會一直執行 begin loop select * from  user limit1;這條命令

 

        循環結構3  repeat

        repeat 

            循環體          先執行代碼     ,,無論條件是否成立,都會先執行代碼 

       untl 條件判斷             條件成立了就結束循環,如果不成立就重新在執行代碼

        end   repeat;

 

mysql> create procedure p17()

              begin declare x int;

            set x = 10;

            repeat  select x;

           set x = x +1;

           until x >  20

            end  repeat;

           end

           //
mysql>  call p17();   #  輸出10 到20 的數字

 

流程控制函數(控制循環結構執行命令)

leave  結束循環

iterate  結束本次循環,並開始下一次循環

例子:

1   

  mysql> create procedure db9.p19()

              begin

             abc:while 1 = 1 do

                 leave abc;

                select name from user where name="root;

                  endwhile;

                  end

                   //    

 mysql> call p20();    #  輸出結果爲沒有任何值,因爲sql 命令

2     mysql> create procedure db9.p20()

              begin

              abc: while 1 = 1 do

              select name from user where name="root";

                leave abc;

                  endwhile;

                  end

                   //      
           mysql> call p20();
    -> //
+------+
| name |
+------+
| root |
+------+
 

3  mysql> delimiter //
mysql> create procedure p21()
    -> begin
    -> declare x int;
    -> set x = 1;
    -> plj:repeat
    -> if x = 3 or x = 5 then
    -> set x = x + 1;

         iterate plj;
    -> else 
    -> select x;
    -> end if;
    -> set x = x + 1;
    -> until x > 10
    -> end repeat;
    -> end
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql>  call p21();    輸出除  3  和 5 外的1到10 的數字, 

綜合:
mysql> delimiter //
mysql> create procedure p30(in line_num int)
    -> begin
    -> if line_num is not null then
    -> select * from  user  limit line_num;
    -> else
    -> select * from  user limit 1;
    -> end if;
    -> end
    -> //

mysql>  delimiter ;
 

mysql>   call p30(5);   顯示前5行的內容


mysql> set @z = null;
Query OK, 0 rows affected (0.00 sec)

mysql> call p30(@z);   # 顯示第一行的內容
 

創建存儲過程;

mysql> delimiter //
mysql> create procedure db9.p1()    #  一定要存在庫裏面
    -> begin
    -> select  count(*) from db9.user where shell != "/bin/bash";
    -> select  count(*) from db9.user where shell = "bin/bash";
    -> end
    -> //
mysql>  delimiter ;
mysql>  
mysql>  call db9.p1();         #執行存儲代碼

+----------+
| count(*) |
+----------+
|       39 |
+----------+
1 row in set (0.00 sec)

+----------+
| count(*) |
+----------+
|        0 |
+----------+
 

mysql> select  db,name from  mysql.proc where name="p1" and type="procedure";  # 查看服務器創建的存儲過程
mysql> select  body  from  mysql.proc where name="p1" and type="procedure";       #  查看服務器存儲過程的代碼

 

 

 

 


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章