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;