一、表的创建

  1、直接创建表

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 '' 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;

  2、存储过程动态创建表

-- 动态创建表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;

二、列的增删改

  1、查询表中列的情况   

SHOW COLUMNS FROM shops_info;

  2、增加列

    (1)、普通增加列

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

    (2)、存储过程增加列

--通过存储过程增加列
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;

  3、删除列

alter table shops_info drop bak1;

  4、修改表字段

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

  5、修改字段的默认值

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

  6、删除字段的默认值

ALTER TABLE shops_info ALTER bak1 DROP DEFAULT;

  7、修改数据表的名称

ALTER TABLE shops_info_bak RENAME TO shops_info;

  8、修改存储引擎:修改为myisam

alter table tableName engine=myisam;

  9、删除外键约束:keyName是外键别名

alter table tableName drop foreign key keyName;

三、索引

  1、普通索引

--------普通索引-------------
--添加普通索引
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)
)

  2、唯一索引

------------唯一索引,唯一索引不能有重复值(除了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)
)

  3、使用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);

  4、删除自增长的主键

------------删除自增长的主键(分两步)---------------------
--1、删除自增长
ALTER TABLE shops_info MODIFY column id INT NOT NULL;
--2、删除主键
alter table shops_info drop primary key ;

  5、查询索引

SHOW INDEX FROM shops_info;

四、插入数据

1、直接插入数据
-- 直接插入数据
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');

2、存储过程插入数据

-- 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;

3、循环插入数据

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 () ;

五、游标的使用

1、游标的使用步骤

  游标的使用一般分为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;

2、游标的具体使用 

-- 1、未使用循环的游标实例
-- 从表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;

-- 2、使用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 '' 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;

-- 3、使用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 '' 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;

-- 4、使用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 '' 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;

 

mysql_01_游标的使用的更多相关文章

  1. 用游标实现查询当前服务器所有数据库所有表的SQL

    declare @name varchar(100) DECLARE My_Cursor CURSOR --定义游标 FOR (SELECT Name FROM Master..SysDatabase ...

  2. 使用rowid抽取数据方法以及大数据量游标卡住的应对

    平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...

  3. Mysql - 游标/动态sql/事务

    游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...

  4. SQL Server 游标运用:鼠标轨迹字符串分割

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 游标模板(Cursor Template) 鼠标轨迹字符串分割SQL脚本实现(SQL Code ...

  5. 读书笔记--SQL必知必会21--使用游标

    21.1 游标 结果集(result set),SQL查询说检出的结果. 游标(cusror),是一个存储在DBMS服务器上的数据库查询. 游标不是一条SELECT语句,而是被该句检索出来的结果集. ...

  6. sqlserver 游标的使用

    declare @temp_temp uniqueidentifier--临时变量 DECLARE aaa CURSOR for select Id from A ------------------ ...

  7. MySQL动态游标

    通过(准备语句+视图+静态游标)实现 -- 建立测试表和数据 create table webuser (username varchar(10)); insert into webuser valu ...

  8. SQL Server游标(转)

    清晰地介绍了SQL游标,很好的学习资料. 转自 http://www.cnblogs.com/knowledgesea/p/3699851.html 什么是游标 结果集,结果集就是select查询之后 ...

  9. ABAP游标的使用

    在Oracle,SQLServer中游标的使用是经常的,所以在ABAP不懂是不行的......     1.声明游标 OPEN CURSOR [WITH HOLD] <c> FOR SEL ...

随机推荐

  1. 江西理工大学南昌校区排名赛 A: 单身狗的卡片游戏

    题目描述 萌樱花是一只单身狗. 萌樱花今天在桌子上摆出了N张卡片,每张卡片i写着一个数字Ai 他不喜欢卡片上的数字多个出现,于是他想搞点事情拆分它们. 从桌子上选出三张卡,去掉一张数字最大,一张数字最 ...

  2. FLUENT 流体计算应用教程

    温正 清华大学出版 2013.1                                          子谓颜渊曰,用之则行,舍之则藏,惟我与尔有是夫!         非常合适的一本书. ...

  3. [转] javascript 判断对象是否存在的10种方法总结

    [From] http://www.jb51.net/article/44726.htm Javascript语言的设计不够严谨,很多地方一不小心就会出错.举例来说,请考虑以下情况.现在,我们要判断一 ...

  4. PIE SDK Pansharp融合

    1.算法功能简介 Pansharp 融合是基于最小二乘逼近法来计算多光谱影像和全色影像之间灰度值关系,具体过程是利用最小方差技术对参与融合的波段灰度值进行最佳匹配,以减少融合后的颜色偏差.该融合方法不 ...

  5. Dubbo解析及原理浅析

    原文链接:https://blog.csdn.net/chao_19/article/details/51764150 一.Duboo基本概念解释 Dubbo是一种分布式服务框架. Webservic ...

  6. android应用签名详解

    1.Eclipse工程中右键工程,弹出选项中选择 android工具-生成签名应用包: 2.选择需要打包的android项目工程: 3.如果已有私钥文件,选择私钥文件 输入密码,如果没有私钥文件见 第 ...

  7. 基于 CentOS 搭建 WordPress 个人博客

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 腾讯云提供了开发者实验室帮助用户搭建 WordPress 个人博客,教程内容如下,用户可以点击开发者实验室快速上机完成实验. 准备 LNMP ...

  8. 求大神帮忙解决一下c#winfrom bindingNavigatorPositionItem加载直接跳转问题

    c# winfrom bindingNavigatorPositionItem控件问题加载直接跳转到相对应的行的问题

  9. C# 调用者信息获取

    做日志组件时,常常会记录调用者信息,通常都是通过反射来获取相应信息.不过.Net 4.5引入了三个新的特性,即CallerFilePathAttribute,CallerLineNumberAttri ...

  10. 工作流-----WorkFlow

    我们都知道对于一个OA系统来说,最重要的也是不可或缺的一个重要环节那就是对于工作流的实现,为此,最近专门在学习如何使用WorkFlow,问前辈,前辈也说道K2工作流引擎挺不错,自己同时也翻阅了一些资料 ...