背景:
在項(xiàng)目開發(fā)中,有時候需要手動處理一下數(shù)據(jù)庫表的數(shù)據(jù)。涉及到數(shù)據(jù)得到備份、恢復(fù),清洗,計算,合并等操作。
舉例記錄一下最近對數(shù)據(jù)的一些處理過程。
1、對數(shù)據(jù)表進(jìn)行數(shù)據(jù)量統(tǒng)計
select count(*) from table_a;
2、記住數(shù)據(jù)庫表的數(shù)據(jù),然后進(jìn)行備份
create table table_a_bak as select * from table_a where 1 = 1;
3、我們再對數(shù)據(jù)進(jìn)行處理之前一定記得進(jìn)行備份,以防錯誤的操作后能將數(shù)據(jù)恢復(fù),或最大程度的恢復(fù),這是一個好習(xí)慣。然后我們才開始對數(shù)據(jù)進(jìn)行處理。
4、建立一個臨時表導(dǎo)入需要處理的數(shù)據(jù)。一般臨時表最好是 tmp_開頭,這也是一個好習(xí)慣,方便數(shù)據(jù)計算完后,對臨時表進(jìn)行刪除,以免誤刪。
create table tmp_table_a as select * from table_a where 1 = 2;
5、對表數(shù)據(jù)進(jìn)行去重的操作,先查詢看看有多少手機(jī)號重復(fù)的記錄。
select count(1) from (
select phone ,count(1) cn from table_a where phone is not null group by phone ) t where t.cn > 1 ;
6、多數(shù)據(jù)進(jìn)行去重。先對table_a表進(jìn)行接收
drop table tmp_table_a_1;
create table tmp_table_a_1 as
select * from (
select phone ,count(1) cn from table_a where phone is not null group by phone ) t where t.cn > 1 ;
7、tmp_table_a_1增加一個自增的id字段,先建立一個SEQUENCE
CREATE SEQUENCE tmp_table_a_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
給id增加自增約束
alter table tmp_table_a_1 alter column id set default nextval('tmp_table_a_id_seq');
8、將數(shù)據(jù)重新插回tmp_table_a_1 ,先清空tmp_table_a_1
清空數(shù)據(jù)
truncate table tmp_table_a_1 ;
插回數(shù)據(jù)
INSERT INTO tmp_table_a_1
( user_id, phone, user_name, id_card, wx_account, state, app_id, app_name, head_icon, sex, sex_name, reg_time, user_state, user_state_name, open_id, opt_user, birthday_type, birthday, org_name, last_trading_time, org_code, union_id, orig_phone, update_time, belong_code, belong_name, data_type, client_num, client_name, country_code, inviter, channel_id, channel_name, company)
select user_id, phone, user_name, id_card, wx_account, state, app_id, app_name, head_icon, sex, sex_name, reg_time, user_state, user_state_name, open_id, opt_user, birthday_type, birthday, org_name, last_trading_time, org_code, union_id, orig_phone, update_time, belong_code, belong_name, data_type, client_num, client_name, country_code, inviter, channel_id, channel_name, company
from table_a;
9、去重操作
DELETE FROM tmp_table_a_1
WHERE id
NOT IN (
SELECT max(id)
FROM tmp_table_a_1
GROUP BY phone
);
10、A表中有但是B表中沒有的數(shù)據(jù)
drop table if exists tmp_table_a_2;
create table tmp_table_a_2 as
select t1.* from tmp_table_a_1 t1
left join tmp_table_b_1 t2
on t1.phone = t2.phone
where t2.phone is null;
MySQL 存儲過程是一組為了完成特定功能的 SQL 語句集合。你可以將存儲過程看作是一個在數(shù)據(jù)庫中存儲的腳本,它可以被多次調(diào)用,并在需要時執(zhí)行。存儲過程可以包含邏輯控制語句和數(shù)據(jù)操作語句,可以接受參數(shù)、返回單個或多個結(jié)果,也可以不返回任何結(jié)果。
存儲過程的基本語法
-
創(chuàng)建存儲過程
sql復(fù)制代碼
文章來源地址http://www.zghlxwxcb.cn/news/detail-465809.html
DELIMITER // |
|
CREATE PROCEDURE procedure_name([parameters]) |
|
BEGIN |
|
-- SQL語句 |
|
END // |
|
DELIMITER ; |
其中,DELIMITER
?是用來改變SQL語句的結(jié)束符的。因?yàn)榇鎯^程中可能包含多條 SQL 語句,所以我們需要改變默認(rèn)的結(jié)束符(;
)以避免沖突。
2.?調(diào)用存儲過程
sql復(fù)制代碼
CALL procedure_name(arguments); |
- 查看存儲過程
使用?SHOW CREATE PROCEDURE procedure_name;
?可以查看存儲過程的定義。
4.?刪除存儲過程
sql復(fù)制代碼
DROP PROCEDURE IF EXISTS procedure_name; |
存儲過程的參數(shù)類型
- IN:輸入?yún)?shù),表示該參數(shù)的值必須在調(diào)用存儲過程時指定,在存儲過程中修改該參數(shù)的值不會被返回。
- OUT:輸出參數(shù),可以在存儲過程中改變其值,并可返回。
- INOUT:輸入輸出參數(shù),調(diào)用時指定,并且可被改變和返回。
存儲過程的優(yōu)點(diǎn)
- 代碼重用:存儲過程只需要編寫一次,然后可以在多個地方多次調(diào)用。
- 性能優(yōu)化:MySQL 會對存儲過程進(jìn)行編譯和優(yōu)化,提高執(zhí)行效率。
- 安全性:可以通過權(quán)限設(shè)置來限制對數(shù)據(jù)的訪問,只允許用戶通過特定的存儲過程來訪問數(shù)據(jù)。
- 減少網(wǎng)絡(luò)通信:多個 SQL 語句可以在一個存儲過程中執(zhí)行,從而減少客戶端和服務(wù)器之間的通信次數(shù)。
- 更好的錯誤處理:可以使用 TRY...CATCH 來處理執(zhí)行過程中可能出現(xiàn)的錯誤。
示例:一個簡單的存儲過程
下面是一個簡單的存儲過程示例,該存儲過程接受一個參數(shù)(學(xué)生ID),并返回該學(xué)生的姓名和年齡。
sql復(fù)制代碼
DELIMITER // |
|
CREATE PROCEDURE GetStudentInfo(IN student_id INT, OUT student_name VARCHAR(100), OUT student_age INT) |
|
BEGIN |
|
SELECT name, age INTO student_name, student_age FROM students WHERE id = student_id; |
|
END // |
|
DELIMITER ; |
調(diào)用這個存儲過程的示例:文章來源:http://www.zghlxwxcb.cn/news/detail-465809.html
sql復(fù)制代碼
CALL GetStudentInfo(1, @name, @age); |
|
SELECT @name AS 'Name', @age AS 'Age'; |
到了這里,關(guān)于JAVA開發(fā)(手工處理數(shù)據(jù)庫表數(shù)據(jù)的一些示例算法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!