把 /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"; # 查看服務器存儲過程的代碼