1. 程式人生 > >mysql 的 佔位符使用 以及一次執行多行sql語句

mysql 的 佔位符使用 以及一次執行多行sql語句

佔位符的使用:

drop PROCEDURE if EXISTS test12;
-- 使用drop 來刪除儲存過程或者表

create PROCEDURE test12()
-- 建立儲存過程 命名為test12 

BEGIN

  set @tableNames = CONCAT('background');
  -- '@' 先在使用者變數中儲存值然後在以後引用它

  set @beanId = 6;

  set @sqlStr = CONCAT('select * from ' ,@tableNames ,
   ' where background_id = ?' );
   -- 拼接查詢總記錄的SQL語句 

  prepare stmt from
@sqlStr; -- 預定義一個語句,並將它賦給 stmt execute stmt using @beanId; -- 執行語句 deallocate prepare stmt; -- 要釋放一個預定義語句的資源 END; call test12(); -- 儲存過程的執行測試

注意點:

1、MySQL 儲存過程時候,需要在過程名字後面加“()”,即使沒有一個引數,也需要“()”。
2、sql注入的只是,字串得拼接進去,不然報錯,這是找到的一個解決方式。

一次執行多行sql

一種方式:普通的sql語句 使用 union 及 union all來拼接執行。
但是!!!

UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。

請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每條 SELECT 語句中的列的順序必須相同。

註釋:預設地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALLUNIONUNION ALL關鍵字都是將兩個結果集合併為一個,但這兩者從使用和效率上來說都有所不同。

1、對重複結果的處理:UNION在進行錶鏈接後會篩選掉重複的記錄,Union All不會去除重複記錄。

2、對排序的處理:Union將會按照欄位的順序進行排序;UNION
ALL只是簡單的將兩個結果合併後就返回。 3、從效率上說,UNION ALL 要比UNION快很多,所以,如果可以確認合併的兩個結果集中不包含重複資料且不需要排序時的話,那麼就使用UNION ALL

一種方式:

delimiter 
select bg_title from background where background_id = 6;
select bg_title from background where background_id =7;

這種方式就相當於oracle 的 \ ,一起執行語句,沒有列數量、型別相同的要求,結果分別顯示~~

這裡寫圖片描述
這裡寫圖片描述

另一種方式:(儲存過程的呼叫 )

create PROCEDURE tests2222(tableName varchar(20)) -- 字串要拼接
BEGIN
  set @tableNames = CONCAT(tableName);
    set @sqlStr = CONCAT('select * from ', @tableNames);
    prepare stmt from @sqlStr;
    execute stmt ;
    deallocate prepare stmt;

    set @sqlStr1 = CONCAT('select * from tuser');
    prepare stmt2 from @sqlStr1;
    EXECUTE stmt2;
END;

call tests2222('background');

這種方式也相當於oracle 的 \ ,一起執行語句,沒有列數量、型別相同的要求,結果分別顯示~~

如果不懂儲存過程的,可以看我的其他兩篇mysql的文章,上面有詳細的註釋說明。

每日一句:
No man or woman is worth your tears, and the one who is,
won’t make you cry.

沒有人值得你流淚,值得讓你這麼做的人不會讓你哭泣。

以上是博主開發中遇到的一些個人總結,希望能幫助到大家,歡迎點贊、頂、歡迎留下寶貴的意見、多謝支援!