1.mysql語言
1.1 分類
1.2 變量
1) 用戶變量
set @name = "小明" ---初始化並賦值
--在沒有ser關鍵字下,不能使用“=”作爲賦值 比如 @name2 = “王”這樣是錯誤的,因爲“=”會被解釋爲關係運算的相等。不帶set想用賦值使用“:=”,它作爲賦值運算符。
select @t2 := (@t2:=5)+2 as t2;
--顯示結果是t2是7
--自己理解@符號的含義:取會話上用戶變量的值,當在程序塊中取局部變量,取值不同@
2) 系統變量
①一般取系統變量前要加兩個@@,有些特定值省略了@@,如current_user、current_time、current_timestamp
②設置系統變量
SET 【GLOBAL | SESSION]】| 【@@ global. | @@ session.】 系統變量 = 新值
eg.
設置全局變量
set @@global.sort_buffer_size = 20000;
設置會話變量
set @@session.sql_select_limit = 20;
③ 查看變量
show variables = show session variables
show global variables
3)局部變量
①聲明, 在begin end程序塊中, 必須使用declare 聲明,語法如下
declare 變量名【,變量名2....】 datatype 【default 值】
eg.
declare num int default 0;
declare str1,str2 varchar(6); ---一下聲明兩個varchar變量
② 賦值
兩種賦值方法
1.set 變量名 = 表達式【,變量名 = 表達式…】
set num = 1,str = ‘ccc’;
2.利用select 賦值
select 列名 into 變量名 from 表 where 條件;
2 過程式存儲對象
2.1 procedure 存儲過程
上幾個的例子
delimiter $$
create procedure delete_stu(int xh char(6))
begin
delete from xs where xuehao = xh;
end$$
delimiter ;
--- 根據不同參數返回 不同結果
delimiter $$
create procedure result1(in str varchar(4),out sex varchar(4))
begin
case str
when 'm' then set sex = '女';
when 'f' then set sex = '男';
else set sex = '無';
/* case 第二種寫法
case when ste = 'm' the set sex = '女';
when ste = 'f' the set sex = '男';
else set sex = '無';
*/
end case;
end$$
delimiter;
---循環
delimiter $$
create procedure whiletest()
begin
declare i int default 5;
while i >0 do
select i;
set i = i -1;
end while;
end$$
delimiter;
--call 調用
call whiletest();
2.2 function 存儲函數
(1)與存儲過程區別:它沒有輸出參數,其本身就是輸出參數。不同call 來調用。他有return 語句,而procedure不允許有return。
(2) 創建
create function function_name(參數[,參數2,..])
return type
存儲函數主體begin end$$ 此主體中必須含有return
eg.
create function counts_xs()
return integer
begin
return (select count(*) from xs);
end $$
(3) 調用 使用select function_name(參數…);
select counts_xs();
(4)刪除
drop function function_name;
查看: show function status;
2.3cursor 遊標
它是保存select返回的多條語句,jdbc中ResultSet類似。
遊標像局部變量一樣,使用前要提前聲明,而且它也只存在begin end 之中。
(1)聲明遊標(在所有局部變量聲明之後)
declare cursor_name for cursor for select 語句
(2) 打開遊標 open cursor_name
(3) 讀取遊標 fetch cursor_name into 變量【,變量1,…】
(4) 關閉遊標 close cursor_name;
2.4 trigger 觸發器
(1)創建語法
create trigger trigger_name 觸發時刻 觸發事件 on table_name
for each row 觸發動作
觸發時刻:決定觸發器是在那個時刻觸發,在語句之前還是之後,after、before
觸發事件:insert、update、delete
each row:指觸發事件的每一行都會觸發觸發器動作,即行級觸發器
觸發動作:trigger被激活後,要執行的動作
(2)例子
delimiter $$
create trigger xs_del After Delete on xs for Each Row
begin
delete from xs_ks where xuehao = xs.xuehao;
end $$
delimiter;
---調用
delete from xs where xuehao = '2021122';
---驗證下xs_ks表是否也同一塊刪除
select * from xs_ks;
2.5 event 事件
(1) 事件是:在相應的時刻調用過程式數據庫對象。它可以週期性調用也可只調用一次。事件也稱 臨時性觸發器
(2)作用:關閉賬號、打開或關閉數據庫指示器、使數據在某個間隔後刷新、執行對數據庫的檢查工作
(3)創建語句
create event event_name on schedule 時間描述 Do sql語句;
時間描述:At 時間點【+ interval 時間間隔】
| every 時間間隔【starts 時間點【+interval 時間間隔】】
【ends 時間點【+interval 時間間隔】】
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
(4)例子
---立即啓動的事件
create event direct on schedule at now() do....
---30s 後啓動
create event direct30 on schedule at now()+30 second do.....
--每月啓動一次,並開始於下一個月,結束於2020-12-31
create event startmonth on schedule every 1 month
starts curdate + 1 month ends '2020-12-31'
(5)修改事件
alter event direcr rename to direct2;
drop event direct2;
3. Mysql備份與恢復
- 數據庫備份:通過導出數據或複製表文件
1.1 SQL語句備份與恢復: 只能導入導出數據,表結構無法備份
1.1.1. 導出語句 select * from table_name outfile ‘d:/file/tb.txt’
select * from table_name outfile 'd:/file/tb.txt'
fields terminated by ','
optionally enclosed by '"'
lines terminated by '?';
---導出後的格式是列字段用','分割,字符類型數據用’”‘雙引號包裹,行結束符是?
1.1.2 導入語句 load data infile ‘d:/file/tb.txt’ into table
load data infile 'd:/file/tb.txt' into table table_name
fields terminated by ','
optionally enclosed by '"'
lines terminated by '?';
1.2 客戶端工具
1.2.1 mysqldump
導出表的結構和數據,導出文件是.sql
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
備份多個表
>mysqldump -uroot -p123 databasename tb1 tb2 >twotb.sql
---(默認在用戶目錄下,win是C:\Users\Administrator 不用分號)
備份整個數據庫
>mysqldump -uroot -p123 --databases mydatabase > D:/file/data.sql
備份所有數據庫實例
mysqldump -uroot -p123 --all--databases >all.sql
恢復
mysqldump -uroot -p123 database_name<tb.sql
1.2.2 mysqlimport
mysqlimport是通體load data infile語句實現,大部分參數與它相似。
如恢復xscj庫中xs表,
mysqlimport -uroot -p123 --low-priority --replace xscj d:/file/xs.txt
-
二進制日誌文件:記錄並保存了更新數據的所有語句
2.1 copy數據庫中對應磁盤二進制文件
2.1.1 *.frm 表結構文件
2.1.2 *.myd 數據文件
2.1.3 *.myi 索引文件2.2 mysqlbinlog工具
2.2.1 啓動日誌在my.ini中【mysqld】下添加log-bin或也可指定日誌文件目錄log-bin=path/文件名,若文件目錄沒有給出,默認文件名 是主機名 . 【注】使用mysqlbinlog 時,日誌必須在bin下,log-bin=c:/program/mysql5.7/bin/bin_log
2.2.2 恢復
mysqlbinlog bin_log002 | mysql -uroot =p123 -
數據庫複製:主從服務器,從做備份