一、表的创建

  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. Android与MVC设计模式

    写在前面,之前做过一段时间移动开发,后来因为工作原因搁浅了,最新重新拿起Android权威编程指南学习,顺道做个学习笔记. 首先呢,我想说无论是计算机科班出身还是培训班出身,都听说过高内聚低耦合以及M ...

  2. 洛谷P2709 小B的询问

    题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...

  3. BZOJ - 1458 / P4311 最大流应用 贪心

    题意:给定n*m的图,每个士兵可以占领当前行和列,第i行至少要R[i]个士兵占领,第j列至少要C[j]个士兵占领,部分网格无法占领,求占领所用最少士兵数,若无解则输出orz 士兵的贡献情况有1(只有效 ...

  4. 一种简单快速的模板解析方法,活用with javascript版

    //一种简单快速的模板解析方法,活用with var parseTpl = function( str, data ) { var tmpl = 'var __p=[];' + 'with(obj|| ...

  5. mysqy 特别小点

    1从另外一个 表的查询结果中查数据(没有条件(无where)) SELECT * FROM (SELECT * FROM students) as aSELECT * FROM student     ...

  6. python 爬虫系列09-selenium+拉钩

    使用selenium爬取拉勾网职位 from selenium import webdriver from lxml import etree import re import time from s ...

  7. 在Spark shell中基于HDFS文件系统进行wordcount交互式分析

    Spark是一个分布式内存计算框架,可部署在YARN或者MESOS管理的分布式系统中(Fully Distributed),也可以以Pseudo Distributed方式部署在单个机器上面,还可以以 ...

  8. android应用签名详解

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

  9. vim脚本语言

    转自:http://man.chinaunix.net/newsoft/vi/doc/usr_41.html#usr_41.txt Vim 脚本语言在很多地方用到,包括 vimrc 文件, 语法文件, ...

  10. iis win7 注册

    http://blog.sina.com.cn/s/blog_7ed5a8080100rinj.html vs2010默认的是4.0框架,4.0的框架是独立的CLR,和2.0的不同,如果想运行4.0的 ...