mysql_01_遊標的使用

1、表的建立mysql

  一、直接建立表sql

DROP TABLE IF EXISTS shops_info;
/*EMP產品版本版本信息表*/ 
CREATE TABLE shops_info
(
    ID INT PRIMARY KEY NOT NULL AUTO_INCREMENT,        /*自增ID*/
    name VARCHAR(20) DEFAULT '' NOT NULL,
    price INT DEFAULT 0 NOT NULL,    
    pdesc VARCHAR(20) DEFAULT '0' NOT NULL,
    CREATETIME DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',    /*建立時間*/
   SENDTIME TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, /*默認當前時間*/
MEMO VARCHAR(128) DEFAULT '' NOT NULL /*備註*/ ) ENGINE=INNODB DEFAULT CHARSET=UTF8;

  二、存儲過程動態建立表數據庫

-- 動態建立表shops_info201812
DROP PROCEDURE IF EXISTS CREATETABLE;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE CREATETABLE(PIYM INT)
BEGIN
DECLARE STR VARCHAR(4000);
DECLARE TABLENAME VARCHAR(16);
SET TABLENAME=CONCAT('shops_info',PIYM);
SET STR=CONCAT('CREATE TABLE ',TABLENAME,
' (
            ID INT PRIMARY KEY NOT NULL AUTO_INCREMENT,        /*自增ID*/
            name VARCHAR(20)  NOT NULL,
            price INT DEFAULT 0 NOT NULL,    
            pdesc VARCHAR(20)  NOT NULL,
            CREATETIME DATETIME NOT NULL ,    /*建立時間*/
            MEMO VARCHAR(128)  NOT NULL /*備註*/
  ) ENGINE=INNODB DEFAULT CHARSET=UTF8;');
-- @SQL 在MySQL以@開頭的變量是SESSION變量,不須要聲明,也不能聲明
SET @SQL=STR;
-- 預處理須要執行的動態SQL,
PREPARE SL FROM @SQL;
-- 執行動態sql
EXECUTE SL;
-- 釋放掉預處理段
DEALLOCATE PREPARE SL;
END
;;
DELIMITER ;

-- 存儲過程的調用
CALL CREATETABLE(201811);
DROP PROCEDURE IF EXISTS CREATETABLE;

2、列的增刪改oop

  一、查詢表中列的狀況   fetch

SHOW COLUMNS FROM shops_info;

  二、增長列spa

    (1)、普通增長列code

alter table shops_info add COLUMN bak1 varchar(20) DEFAULT '' NOT NULL;

    (2)、存儲過程增長列blog

--經過存儲過程增長列
DELIMITER ;;
drop PROCEDURE  if EXISTS ADDCOL;
CREATE DEFINER=`root`@`%` PROCEDURE ADDCOL()
BEGIN
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND COLUMN_NAME='bak3' AND TABLE_NAME='shops_info') THEN
    ALTER TABLE shops_info ADD bak3 INT DEFAULT 0 NOT NULL;
END IF;
END;; 
DELIMITER ;

--執行存儲過程
CALL ADDCOL();
drop PROCEDURE  if EXISTS ADDCOL;

  三、刪除列索引

alter table shops_info drop bak1;

  四、修改表字段產品

alter table shops_info modify COLUMN bak1 varchar(64)  default '' NOT NULL;

  五、修改字段的默認值

ALTER TABLE shops_info ALTER bak1 SET DEFAULT '哈哈';

  六、刪除字段的默認值

ALTER TABLE shops_info ALTER bak1 DROP DEFAULT;

  七、修改數據表的名稱

ALTER TABLE shops_info_bak RENAME TO shops_info;

  八、修改存儲引擎:修改成myisam

alter table tableName engine=myisam;

  九、刪除外鍵約束:keyName是外鍵別名

alter table tableName drop foreign key keyName;

3、索引

  一、普通索引

--------普通索引-------------
--添加普通索引
create index price_index on shops_info(price);
--刪除索引
DROP INDEX price_index ON shops_info; 
--修改表結構(添加索引)
alter Table shops_info add index price_index(price)
--建立表的時候直接指定索引
create table mytable(
    id int,
    username varchar(20),
    index username_index(username)
)

  二、惟一索引

------------惟一索引,惟一索引不能有重複值(除了null)------------
--建立索引
create unique index price_index on shops_info(price);
--修改表的結構(添加惟一索引)
alter Table shops_info add unique index price_index(price)
--建立表的時候直接指定惟一索引
create table mytable(
    id int,
    username varchar(20),
    unique index username_index(username)
)

  三、使用ALTER 命令添加和刪除索引

------------使用ALTER 命令添加和刪除索引----------------------
--添加一個主鍵,主鍵只能做用於一個列上,這意味着索引值必須是惟一的,且不能爲NULL
alter Table mytable add primary key(id) ;
--添加惟一索引,建立索引的值必須是惟一的(除了NULL外,NULL可能會出現屢次)。
alter Table mytable add unique index username_index(username);
--添加普通索引
alter table mytable add index username_index(username);

  四、刪除自增加的主鍵

------------刪除自增加的主鍵(分兩步)---------------------
--一、刪除自增加
ALTER TABLE shops_info MODIFY column id INT NOT NULL;
--二、刪除主鍵
alter table shops_info drop primary key ;

  五、查詢索引

SHOW INDEX FROM shops_info;

4、插入數據

一、直接插入數據
-- 直接插入數據
insert into shops_info(name,price,pdesc,CREATETIME)
SELECT '電飯煲2',3002,'煮飯2',NOW() FROM DUAL
WHERE NOT EXISTS(SELECT * FROM shops_info WHERE name='電飯煲2');

  二、存儲過程插入數據

-- 二、存儲過程插入數據
DELIMITER ;;
drop PROCEDURE  if EXISTS insert_test;
CREATE DEFINER=`root`@`%` PROCEDURE insert_test(
  name1 VARCHAR(20),
    price1 INT,
    pdesc1 VARCHAR(20)
)
BEGIN
    IF NOT EXISTS(SELECT * FROM shops_info WHERE name=name1 AND price=price1 AND pdesc=pdesc1 ) THEN
            INSERT INTO shops_info(name,price,pdesc,CREATETIME) VALUES(name1,price1,pdesc1,NOW());
    END IF;
END;;
DELIMITER ;

-- 存儲過程的調用
CALL insert_test('海爾冰箱1',3080,'冷凍食品1');
DROP PROCEDURE IF EXISTS insert_test;

  三、循環插入數據

delimiter $$    
drop PROCEDURE if EXISTS pre;
CREATE PROCEDURE pre()
BEGIN
    DECLARE
        i INT ;
    SET i = 1 ;
    WHILE i < 30000 DO
        INSERT INTO Lf_Keywords (keywoed, kw_state)
    VALUES
        (CONCAT('ouyangyu', i), 1) ;
    SET i = i + 1 ;
    END
    WHILE ;
    END$$

CALL pre () ;

 

5、遊標的使用

 一、遊標的使用步驟

  遊標的使用通常分爲5個步驟,主要是:定義遊標->打開遊標->使用遊標->關閉遊標->釋放遊標。

-- (1).定義遊標

        DECLARE <遊標名> CURSOR FOR select語句;

-- (2).打開遊標
        open <遊標名>
        
-- (3).使用遊標
        -- 使用遊標須要用關鍵字fetch來取出數據,而後取出的數據須要有存放的地方,咱們須要用declare聲明變量存放列的數據其語法格式爲:

        -- declare 變量1 數據類型(與列值的數據類型相同)
        -- declare 變量2 數據類型(與列值的數據類型相同)
        -- declare 變量3 數據類型(與列值的數據類型相同)
        -- FETCH [NEXT | PRIOR | FIRST | LAST] FROM <遊標名> [ INTO 變量名1,變量名2,變量名3[,…] ]
        -- NEXT:取下一行的數據,遊標一開始默認的第一行以前,故要讓遊標指向第一行,就必須第一次就執行FETCH NEXT操做

        -- INTO:將一行中每一個對應的列下的數據放到與列 的數據類型相同的變量中。

-- (4).關閉遊標:
            close mycursor;
-- (5).釋放遊標
            deallocate mycursor;

二、遊標的具體使用 

-- 一、未使用循環的遊標實例
-- 從表shops_info中使用遊標對每一行進行fetch
-- 注意:存儲過程申明的變量名稱不能和數據庫中字段名稱同樣,不然取不到值

DELIMITER $$
drop PROCEDURE  if EXISTS cursor_test;
create PROCEDURE cursor_test()
BEGIN
    DECLARE id1 INT;
    DECLARE name1 VARCHAR(20);
    DECLARE price1 INT;
    DECLARE pdesc1 VARCHAR(20);
    -- 定義遊標
    DECLARE mycursor CURSOR for select id,name,price,pdesc from shops_info;
    -- 打開遊標
    open mycursor;
    -- 使用遊標
    FETCH next from mycursor into id1,name1,price1,pdesc1;
    -- 顯示結果
    select id1,name1,price1,pdesc1;
    -- 關閉遊標
    close mycursor;
END $$
DELIMITER ;

-- 存儲過程的調用
CALL cursor_test();
DROP PROCEDURE IF EXISTS cursor_test;

-- 二、使用while循環的遊標實例

DELIMITER $$
drop PROCEDURE  if EXISTS cursor_test;
create PROCEDURE cursor_test()
BEGIN
    DECLARE tmpName VARCHAR(20) default '' ;
    DECLARE allName  varchar(255) default '';
    -- 定義遊標
    DECLARE mycursor CURSOR for select name from shops_info;
    -- MySQL遊標異常後捕捉,並設置循環使用變量 tmpname 爲 null 跳出循環
    DECLARE CONTINUE HANDLER FOR  SQLSTATE '02000' SET tmpName = null;
    -- 打開遊標
    open mycursor;
    -- 使用遊標
    FETCH mycursor into tmpName;
    while (tmpName is not null) do
        set tmpName = CONCAT(tmpName ,";") ; 
        set allName = CONCAT(allName ,tmpName) ; 
        FETCH mycursor into tmpName;
    END WHILE;
    -- 顯示結果
    select allName;
    -- 關閉遊標
    close mycursor;
END $$
DELIMITER ;

-- 存儲過程的調用
CALL cursor_test();
DROP PROCEDURE IF EXISTS cursor_test;

 -- 三、使用loop循環的遊標實例

DELIMITER $$
drop PROCEDURE  if EXISTS cursor_test;
CREATE PROCEDURE cursor_test()
begin 
    -- 設置終止標記
    DECLARE STOPFLAG INT DEFAULT 0;
    DECLARE tempName VARCHAR(20) default '' ;
    DECLARE allName VARCHAR(256) default '' ;
    DECLARE mycursor CURSOR for select name from shops_info;
    DECLARE CONTINUE HANDLER FOR  SQLSTATE '02000' SET STOPFLAG = 1;
    open mycursor;
    -- loop循環開始標記,myloop爲本身隨意取得名稱
    myloop:loop
            fetch mycursor into tempName;
            -- loop循環退出標記
          if STOPFLAG = 1 then
         leave myloop;
      end if;
            -- mysql賦值語句
          set tempName = CONCAT(tempName,';');
            set allName = CONCAT(allName,tempName);    
    -- loop循環結束標記
    end loop myloop;
    select allName;
    -- 關閉遊標
    close mycursor;
END $$
DELIMITER ;

-- 存儲過程的調用
CALL cursor_test();
drop PROCEDURE if EXISTS cursor_test;

  -- 四、使用repeat循環的遊標實例

DELIMITER $$
drop PROCEDURE  if EXISTS cursor_test;
CREATE PROCEDURE cursor_test()
begin 
    -- 設置終止標記
    DECLARE STOPFLAG INT DEFAULT 0;
    DECLARE tempName VARCHAR(20) default '' ;
    DECLARE allName VARCHAR(256) default '' ;
    DECLARE mycursor CURSOR for select name from shops_info;
    DECLARE CONTINUE HANDLER FOR  SQLSTATE '02000' SET STOPFLAG = 1;
    open mycursor;
    -- repeat循環開始標記,repeat爲本身隨意取得名稱
    repeat
            fetch mycursor into tempName;
            -- mysql賦值語句
            if STOPFLAG = 0 then
                set tempName = CONCAT(tempName,';');
                set allName = CONCAT(allName,tempName);    
            end if;
    -- repeat循環結束標記
    until STOPFLAG = 1
    end repeat;
    select allName;
    -- 關閉遊標
    close mycursor;
END $$
DELIMITER ;

-- 存儲過程的調用
CALL cursor_test();
drop PROCEDURE if EXISTS cursor_test;
相關文章
相關標籤/搜索