mysql数据库操作(一),mysql数据库操作
1、mysql常识
本文前面主要是对《mysql_5.5中文参考手册》部分内容的整理。
说明:登录mysql后,可以看到mysql> 的提示符,可以输入相关命令;输入命令后,需要以“;”号结束,否则会一直等待,少数的命令不需要“;”号,如QUIT;系统默认“;”号结束处才是一条命令的结束,才真正开始执行;多个短命令,可以放在一起,中间用“;”号隔开;我们也可借助外部工具,如navicat来管理数据为库,在navicat中单个查询命令也可以以“;”号结束,但在复杂查寻的内部,则不能有“;”号;可以将多条命令写在一个sql文件中,不同的命令之间用“;”号隔开,否则会出错,如下所示
CREATE TABLE person (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,name CHAR(60) NOT NULL,PRIMARY KEY (id));
create table shirt (id smallint unsigned not null auto_increment,style enum('t-shirt','polo','dress') not null,color enum('red','blue','orange','white','black') not null,owner smallint unsigned not null references person(id),primary key (id));
insert into person values (null,'Antonio Paz');
select @last:=last_insert_id();
insert into shirt values (null,'polo','blue',@last),(null,'dress','white',@last),(null,'t-shirt','blue',@last);
insert into person values (null,'Lilliana Angelovska');
select @last:=last_insert_id();
insert into shirt values (NULL, 'dress', 'orange', @last),(NULL, 'polo', 'red', @last),(NULL, 'dress', 'blue', @last),(NULL, 't-shirt', 'white', @last);
select * from person;
select s.* from person p,shirt s where p.name like 'Lilliana%' and s.owner=p.id and s.color !='white';
然后使用source命令批量执行。
mysql中命令不区分大小写,但创建数据库的时候要注意大小写,大写的数据库名称,查询的时候用小写查不出来,同时也要与linux shell和python相区别,它们的编程是区分大小写的;
使用navicat将txt文本load进数据库出现乱码,首先查看txt文件是否是utf-8格式;然后在navicat中设置数据库属性,字符集选utf8mb4 – UTF-8 Unicode或utf8 – UTF-8 Unicode,排序规则选utf8mb4_general_ci或utf8_general_ci;
mysql状态表:
提示符 | 含义 |
---|---|
mysql> | 准备好接受新的命令 |
-> | 等待多选命令的下一行 |
‘> | 等待下一行,等待以单引号“’”开始的字符串的结束 |
“> | 等待下一行,等待以双引号“””号开始的字符串的结束 |
`> | 等待下一行,等待以反斜点“`”号开始的字符串的结束 |
/*> | 等待下一行,等待以/*号开始的注释的结束 |
2、mysql基本操作汇总
操作 | 代码 | 解释 |
---|---|---|
mysql连接 | mysql -h 主机名 -u mysql用户名 -p | 连接mysql通常需要提供用户名和密码,如果登录服务器之外的其他机器,还需要指定主机名称,运行后会提示输入密码,登录mysql后,会出现mysql>; windows下直接在命令行客户端输入密码则可以登录mysql的shell |
查看版本信息 | SELECT VERSION(); | 当前mysql版本信息 |
查看用户信息 | SELECT USER(); | |
断开mysql连接 | QUIT | linux下也可以按ctrl+D键断开连接 |
取消正在输入的语句 | \c | 回到mysql>命令等待状态 |
查看日期 | SELECT CURRENT_DATE; | mysql中日期是以2017-11-07为标准形式的,mysql有好一些对日期进行格式化及日期计算的函数 |
计算器 | 比如SELECT (4+1)*5; | 可以得到结果25 |
查看mysql中的数据库 | SHOW DATABASES; | 显示一列已存在的数据库名称 |
找出当前选择了哪个数据库 | SELECT DATABASE(); | |
选择某数据库 | USE 数据库名称; | 之后就可以对数据进行相关操作 |
创建数据库 | CREATE 数据库名称; | 注意数据库名称是区分大小写的,后续访问要与之相同;数据只要创建一次就行,刚创建的数据库是空的 |
显示数据库表 | SHOW TABLES; | |
创建数据库表 | CREATE TABLE PET (name VARCHAR(20),ower VARCHAR(20),species VARCHAR(20),sex CHAR(1),birth DATE,death DATE); | VARCHAR是可变字长,可以是1~65535中的任何一个,如果后面发现之前的设置不合理,可以使用ALTER TABLE来更改 |
查看数据库表的结构信息 | DESCRIBE PET; | |
将数据装入数据库表 | LOAD DATA LOCAL INFILE ‘/path/pet.txt’ INTO TABLE PET; | 如果是在window下,使用“\r\n”作为行结束符的,应该使用LOAD DATA LOCAL INFILE ‘/path/pet.txt’ INTO TABLE PET LINES TERMINATED BY ‘\r\n’;同时要注意txt文本的编码格式,有可能开关会多出一些字符 |
插入数据到数据库表 | INSERT INTO PET VALUES (“Buffy”,”Harold”,”dog”,”f”,”1989-05-13 “,null); | 在插入数据时,都需要用”“号,但是空值时不能用”“号,直接用null或\N都可以 |
操作 | 代码 | 解释 |
---|---|---|
数据库中检索信息 | SELECT what_to_select FROM which_table WHERE conditions_to_satisfy; | 可以获取整个表,也可以只获取一部分字段,可以作用WHERE来筛选符合特定要求的数据,还可以用AND和OR对多个条件组合,可以用GROUP BY按某些字段分组,可以用ORDER BY按某字段排序;更复杂的条件需要逻辑运算的,通过()号将一部分运算结果作为一整体,另一部分运算结果用()作为一个整体,中间通过逻辑运算符连接;我们也查询到的列进行重命名 |
按条件查询 | select * from STUDENT HAVING STU_AGE in(11,12); | HAVING具有与where相同的效果,但是where是在获得查询结果前进行筛选,而HAVING是在获取查询结果后在结果中筛选,因而可以用在更复杂的情景中,比如HAVING可以order by 、group by等关键词之后,而where则在这些关键词之前 |
查询一个字段对应的多个值 | select * from STUDENT where STU_AGE in(11,12); | IN关键字可以判断某个字段的值是否在指定的集合中。如果字段的值在集合中,则满足查询条件,该纪录将被查询出来。如果不在集合中,则不满足查询条件。 |
按范围查询 | 用between 值1 and 值2,或大于and小于 | 虽然几乎所有的数据库都支持 BETWEEN … AND 运算符,但不同的数据库对 BETWEEN … AND 处理方式是有差异的。在 MySQL 中,BETWEEN 包含了 value1 和 value2 边界值,如上面选取 uid 在 2 到 5 之间的用户数据例子。而有的数据库则不包含 value1 和 value2 边界值(类似于大于 and 小于),也有数据库包含 value1 而不包含 value2(类似于 大于等于 and小于)。所以在使用 BETWEEN … AND 的时候,请检查你的数据库是如何处理 BETWEEN 边界值的。 |
查询唯一值 | SELECT DISTINCT what_to_select FROM which_table WHERE conditions_to_satisfy; | 选出符合条件的记录并去重,其实通过group by 也能达到 去重的目的,有的时候更方便更好控制结果按自己想要的方式呈现 |
从某一行开始查询 | select * from table_name limit 第几行,行数; | 第几行是从0开始的,即0代表第一行 |
读取最后几行 | select * from table_name order by id desc limit 第几行,行数; | |
排序 | SELECT name, species, birth FROM pet ORDER BY species, birth DESC; | DESC表示按降序排序结果, order by 多个条件时,先按第一个条件排再按第二个条件排 |
复合查询 | SELECT * FROM (SELECT name, species, birth FROM pet)AS TABLE1 ORDER BY species, birth DESC; | DESC表示按降序排序结果, order by 多个条件时,先按第一个条件排再按第二个条件排 |
删除表中数据 | DELETE FROM which_table; | |
修改数据 | UPDATE pet SET DEATH=”1999-09-12” WHERE NAME=”Claws”; UPDATE temp_id_area SET SF = CONCAT(split(SF,’市’,1),’市’) WHERE LOCATE(‘市’,SF); UPDATE temp_id_area SET SF = CONCAT(split(SF,’地区’,1),’地区’) WHERE LOCATE(‘地区’,SF); UPDATE temp_id_area SET SF = CONCAT(split(SF,’自治区’,1),’自治区’) WHERE LOCATE(‘自治区’,SF); UPDATE temp_id_area SET SF = CONCAT(split(SF,’省’,1),’省’) WHERE LOCATE(‘省’,SF); UPDATE temp_id_area SET SFBM = SUBSTR(SSBM,1,2); |
|
时间与日期 | SELECT CURRENT_DATE;或SELECT CURDATE(); | 获取当前日期 |
获取日期的年、月、日 | SELECT YEAR(CURDATE()); SELECT MONTH(CURRENT_DATE); SELECT DAY(CURRENT_DATE); |
CURRENT_DATE也可以换成其他日期格式的数据;也可以用取模的方式来间接获取月份,如SELECT MOD(CURDATE(),12);但注意,此时的范围是0-11,因而如果是12月份要加1 |
加上时间隔 | SELECT DATE_ADD(CURDATE(),INTERVAL 1 MONTH); | 假如当前日期是2017-11-07,得到的结果将是2017-12-07 |
null操作 | 使用IS NULL或IS NOT NULL来作为判断; | mysql中null表示空,没有值,null不能与用算术比较符操作; 在GROUP BY中,两个null视为相同;执行ORDER BY ,null排在最前面,加上DESC则排在最后面 |
标准SQL模式匹配 | 使用LIKE或NOT LIKE,而不能使用=或!= | mysql提供标准的SQL模式匹配,以及基于像linux实用程序vi,grep,sed的正则表达式模式匹配,在mysql中模式默认忽略大小写 |
“_” | 匹配任何单个字符 |
|
“%” | 匹配任意数目字符,包括零字符 |
|
扩展正则表达式 | REGEXP或NOT REGEXP或RLIKE或NOT RLIKE | 为了定位一个模式,以便匹配被测试值的开始或结束,以”^”在模型的开头,表示匹配以某模式开始的记录;以”$”在模式的结尾,表示匹配以某模式结束的记录;要想使用regexp来强制区分大小写需要使其中一个字符转换为二进制字符 |
‘.’ | 匹配任意单个的字符 |
|
“[XXX]” | 匹配在方括号内的任意字符,如”[abc]”匹配”a”或”b”或”c”;”[a-z]”匹配任何字母,因为mysql不区分大小写;”[0-9]”匹配任何数字 |
|
“*” | 匹配一个或任意多个出现在它前面的字符,如”x*”匹配任意数量的x,”[0-9]*”匹配任何数量数字,”.*”匹配任何数量的任意字符 | |
要想找出以“b”开头的名字 | SELECT * FROM PET WHERE name LIKE ‘b%’; | SELECT * FROM PET WHERE name REGEXP ‘^b’; |
要想找出以“b”开头的名字,只要小写b开头的 | SELECT * FROM PET WHERE name REGEXP BINARY ‘^b’; | |
要想找出以“fy”结尾的名字 | SELECT * FROM PET WHERE name LIKE ‘%fy’; | SELECT * FROM PET WHERE name REGEXP ‘fy$’; |
要想找出包含“w”的名字 | SELECT * FROM PET WHERE name LIKE ‘%w%’; | SELECT * FROM PET WHERE name REGEXP ‘W’; |
要想找出正好包含5个字符的名字,使用“_”模式字符 | SELECT * FROM PET WHERE name LIKE ‘_____’; | SELECT * FROM PET WHERE name REGEXP ‘^…..$’; 或者用.{5}代替5个点 |
计数 | SELECT COUNT(*) FROM PET ; SELECT COUNT(*) FROM PET GROUP BY SEX ; |
使用计数如果不需要检索整个表,应该用where来限定范围提高效率 |
最大值 | MAX() | (请注意,MIN和MAX函数会忽略NULL值) |
最小值 | MIN() | (请注意,MIN和MAX函数会忽略NULL值) |
平均值 | AVG() | |
求和 | SUM() | 以上几个都需要配合group by使用 |
使用一个以上的表 | SELECT pet.name,event.remark FROM pet,event where pet.name =event.name AND event.type=’little’; | FROM子句列出两个表,因为查询需要从两个表提取信息。当从多个表组合(联结)信息时,你需要指定一个表中的记录怎样能匹配其它表的记录。这很简单,因为它们都有一个name列。查询使用WHERE子句基于name值来匹配2个表中的记录。因为name列出现在两个表中,当引用列时,你一定要指定哪个表。把表名附在列名前即可以实现 |
一个表的记录与同一个表的其它记录进行比较 | SELECT p1.*,p2.* FROM pet as p1,pet as p2 WHERE p1.species = p2.species AND p1.sex = ‘f’ AND p2.sex = ‘m’; | |
批量运行 | mysql> source filename ; | filename 中的多条sql语句末尾一定要加上“;”号,否则出错 |
mysq NULL值替换
将mysql数据库中的NULL值替换为空
UPDATE qrt_order_info
SET order_num=” WHERE order_num=”NULL”;
原本在数据库的NULL是被当成字符串了,不同的语言,表示空的方法都不一样,mysql中是”\N”;所有可以在加载数据前,对NULL作替换,这样一次性导入后就自动为空,而不需要像上面那样去数据库里UPDATE了。
mysql内NULL判断的是空,就是没有任何值,此时用navicat查看的时候可以看淡灰色的”(Null)”字样;有时会在数据库记录的某一栏看不到任务记录,此时未必是NULL,有可能是空字符,”,只不过字符串里没任何内容,此时要用where xx=”;
MySQL数据导出
数据表导出:
在navicat中直接导出已存在的数据表,导出格式很多,最常用的导出格式是.sql,.excel;
查询结果导出:
navicat中查询结果也是可以直接导出的,不用再复制粘贴了。
linux下查询结果可通过如下方式导出:
在已连接数据库情况下,select * from edu_iclass_areas into outfile test.xls #这里需要绝对路径
使用命令导出:
window下
1.导出整个数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u dbuser -p dbname > dbname.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u dbuser -p dbname users> dbname_users.sql
3.导出一个数据库结构
mysqldump -u dbuser -p -d --add-drop-table dbname >d:/dbname_db.sql
-d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table
linux下
一、导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):
1、导出数据和表结构:
mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql
#/usr/local/mysql/bin/ mysqldump -uroot -p abc > abc.sql
敲回车后会提示输入密码
2、只导出表结构
mysqldump -u用户名 -p密码 -d 数据库名 > 数据库名.sql
#/usr/local/mysql/bin/ mysqldump -uroot -p -d abc > abc.sql
注:/usr/local/mysql/bin/ —> mysql的data目录
MySQL数据导入
关于批量导入数据到mysql数据库,首先可以从数据库导出批量文件,有多种格式,如excel,txt或sql;对于txt文件后期可以利用load导入其他数据库,但出要先创建数据库,如下面的命令所示,在navicat中使用load,文件名中不能有中文;对于sql文件,它导出得到的是包含一系列insert 语句的文件,有的会包含类似下面的完整命令,此时直接在navicat中运行该.sql文件即可;如果是在mysql的shell里直接运行的话,可用source *.sql
。
DROP TABLE IF EXISTS `temp_integrated`;
CREATE TABLE `temp_integrated` (
`cust_code` varchar(32) NOT NULL COMMENT 'xx',
`cust_name` varchar(32) DEFAULT NULL COMMENT 'xx',
`id_card_no` varchar(32) DEFAULT NULL COMMENT 'xx',
`province` varchar(32) DEFAULT NULL COMMENT 'xx',
`cust_add` varchar(32) DEFAULT NULL COMMENT 'xx',
`county` varchar(32) DEFAULT NULL COMMENT 'xx'
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO temp_integrated VALUES ('xxx', 'xx','xx', 'xx', 'xx', 'xx');
跨数据库操作
在表的前面加上数据进行限定,如select * from 库.表 where …….
关于数据乱码
在R读入mysql数据库出现中文乱码,首先确保mysql数据库中字符集编码格式为utf-8;然后再本地电脑上的数据源设置中(控制面板–管理工具–数据源–配置–detail)设置好对应mysql数据库连接的字符集编码为utf-8,然后在R中channel_temp=odbcConnect(“数据库连接的名称”,uid =”xx” ,pwd =”xx”,DBMSencoding=”UTF-8”),指定编码,则不会出现乱码。
如何判断mysql数据库中是否存在某张表
方法1、 DROP TABLE IF EXISTS tablename;
方法2、 做一个sql查询,比如:select * from tablename/select count(*) from tablename,如果返回值为空,则表不存在。
方法3、 查询:SHOW TABLES LIKE table1,判断返回值。如:
if(mysql_num_rows(mysql_query(“SHOW TABLES LIKE ‘”.$table.”’”)==1)
{
echo “Table exists”;
}
else
{
echo “Table does not exist”;
}
方法4、 CREATE TABLE IF NOT EXISTS yourdb
.yourtable
(…)
mysql判断数据库是否存在
(1) 判断数据库存在, 则删除:
drop database if exists db_name;
(2) 如果单纯显示是否存在数据库, 则可用:
show databases like ‘db_name’;
mysql中的函数
函数名 | 用途 | 举例 | 解释 |
---|---|---|---|
abs(N) | 返回N的绝对值 | select ABS(-32); | 32 |
sign(N) | 返回参数的符号(为-1、0或1) | select SIGN(-32); select SIGN(0); |
-1 0 |
mod(N,M) | 取模运算,返回N被M除的余数(同%操作符) | select MOD(234, 10); | 4 |
floor(N) | 返回不大于N的最大整数值 | select FLOOR(-1.23); | -2 |
ceiling(N) | 返回不小于N的最小整数值 | select CEILING(1.23); | 2 |
round(N, D) | 返回N的四舍五入值,保留D位小数(D的默认值为0) | select ROUND(-1.23); | -1 |
exp(N) | 返回值e的N次方(自然对数的底) | select EXP(2); | 7.389056 |
log(N) | 返回N的自然对数 | select LOG(2); | 0.693147 |
pow(X,Y)或power(X,Y) | 返回值X的Y次幂 | select POW(2,2); | 4 |
sqrt(N) | 返回非负数N的平方根 | select SQRT(4); | 2 |
pi() | 返回圆周率 | select PI(); | 3.141593 |
cos(N) | 返回N的余弦值 | select COS(PI()); | -1.000000 |
sin(N) | 返回N的正弦值 | select SIN(PI()); | 0.000000 |
tan(N) | 返回N的正切值 | select TAN(PI()+1); | 1.557408 |
acos(N) | 返回N反余弦(N是余弦值,在-1到1的范围,否则返回NULL) | select ACOS(1); | |
asin(N | 返回N反正弦值 | select ASIN(0.2); | 0.201358 |
atan(N) | 返回N的反正切值 | select ATAN(2); | 1.107149 |
atan2(X,Y) | 返回2个变量X和Y的反正切(类似Y/X的反正切,符号决定象限) | select ATAN(-2,2); | -0.785398 |
cot(N) | 返回X的余切 | select COT(12); | -1.57267341 |
RAND() | 返回在范围0到1.0内的随机浮点值(可以使用数字N作为初始值) | select RAND(); | 0.5925 |
degrees(N) | 把N从弧度变换为角度并返回 | select DEGREES(PI()); | 180.000000 |
radians(N) | 把N从角度变换为弧度并返回 | select RADIANS(90); | 1.570796 |
truncate(N,D) | 保留数字N的D位小数并返回 | select TRUNCATE(1.223,1); | 1.2 |
least(X,Y,…) | 返回最小值(如果返回值被用在整数(实数或大小敏感字串)上下文或所有参数都是整数(实数或大小敏感字串)则他们作为整数(实数或大小敏感字串)比较,否则按忽略大小写的字符串被比较) | select LEAST(2,0); | 0 |
greatest(X,Y,…) | 返回最大值(其余同LEAST()) | select GREATEST(2,0); select GREATEST(“B”,”A”,”C”); |
2 ”C” |
STD | 估算总体方差,根号内除以n,对应excel函数:STDEVP | select STD(字段名) from 数据表; | |
STDDEV_SAMP | 即估算样本方差,根号内除以(n-1),对应excel函数:STDEV | select STD(字段名) from 数据表; |
mysql中自定义函数
mysql中可以通过自定义函数来完成一些功能。
新建一个函数:
语法结构:
Create function function_name(参数列表)returns返回值类型
函数体
函数名,应该合法的标识符,并且不应该与已有的关键字冲突。
一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。
参数部分,由参数名和参数类型组成。
返回值类类型
函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。
多条语句应该使用begin end语句块包含。在给变量赋值时一定要使用set ……
注意,一定要有return返回值语句。
#下面的程序自定义了一个分割字符串的函数,参数f_string为待分割的字符串,f_delimiter参数为定义的分割字符,参数f_order为从分割好的字符串数组中取第几个值;
#mysql中默认的命令分隔符为;号,当遇到;号时就要执行命令,这里自定义了$$为命令分隔符,这样后面的不同命令之间就可以使用$$分隔,与;不同的是,它不需立即执行,可以等到所有的命令读取完毕后再由mysql解释器一次性执行
DELIMITER $$
DROP function IF EXISTS `func_splitString` $$
CREATE FUNCTION `func_splitString`
( f_string varchar(1000),f_delimiter varchar(5),f_order int)
RETURNS varchar(255) CHARSET utf8
BEGIN
declare result varchar(255) default '';
set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));
return result;
END$$
上面函数的使用方法,先运行该函数,这样函数就会存在mysql所在计算机的内存中,这样其他命令就可以像调用内置函数一样调用该函数,如下:
SELECT func_splitString('a,b,c',',','2')
将得到结果b
MySQL存储过程的创建
语法:
CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体
DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;
分隔符:
MySQL默认以”;”为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个”//”之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。
参数:
存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用”,”分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:
IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT:该值可在存储过程内部被改变,并可返回
INOUT:调用时指定,并且可被改变和返回
过程体:
过程体的开始与结束使用BEGIN与END进行标识。
条件语句
IF-THEN-ELSE语句:
#条件语句IF-THEN-ELSE
DROP PROCEDURE IF EXISTS proc3;
DELIMITER //
CREATE PROCEDURE proc3(IN parameter int)
BEGIN
DECLARE var int;
SET var=parameter+1;
IF var=0 THEN
INSERT INTO t VALUES (17);
END IF ;
IF parameter=0 THEN
UPDATE t SET s1=s1+1;
ELSE
UPDATE t SET s1=s1+2;
END IF ;
END ;
//
DELIMITER ;
下面是一个往表格中插入行的例子
#条件语句IF-THEN-ELSE
DROP PROCEDURE IF EXISTS proc3;
DELIMITER //
CREATE PROCEDURE proc3(IN date_string varchar(32))
BEGIN
IF MONTH(date_string)=12 THEN
INSERT INTO temp_month_interval VALUES(
CONCAT(year(CURDATE()),'11','01'),CONCAT(year(CURDATE()),'11','30'),CONCAT(year(CURDATE()),'11','01'),CONCAT(year(CURDATE()),'11','30'),
CONCAT(year(CURDATE()),'10','01'),CONCAT(year(CURDATE()),'10','31'),CONCAT(year(CURDATE()),'10','01'),CONCAT(year(CURDATE()),'10','31'),
CONCAT(year(CURDATE()),'09','01'),CONCAT(year(CURDATE()),'09','30'),CONCAT(year(CURDATE()),'09','01'),CONCAT(year(CURDATE()),'09','30'),
CONCAT(year(CURDATE()),'08','01'),CONCAT(year(CURDATE()),'08','31'),CONCAT(year(CURDATE()),'08','01'),CONCAT(year(CURDATE()),'08','31'),
CONCAT(year(CURDATE()),'07','01'),CONCAT(year(CURDATE()),'07','31'),CONCAT(year(CURDATE()),'07','01'),CONCAT(year(CURDATE()),'07','31'),
CONCAT(year(CURDATE()),'06','01'),CONCAT(year(CURDATE()),'06','30'),CONCAT(year(CURDATE()),'06','01'),CONCAT(year(CURDATE()),'06','30'));
ELSE
INSERT INTO temp_month_interval VALUES(
CONCAT(year(CURDATE()),'11','01'),CONCAT(year(CURDATE()),'11','30'),CONCAT(year(CURDATE()),'11','01'),CONCAT(year(CURDATE()),'11','30'),
CONCAT(year(CURDATE()),'10','01'),CONCAT(year(CURDATE()),'10','31'),CONCAT(year(CURDATE()),'10','01'),CONCAT(year(CURDATE()),'10','31'),
CONCAT(year(CURDATE()),'09','01'),CONCAT(year(CURDATE()),'09','30'),CONCAT(year(CURDATE()),'09','01'),CONCAT(year(CURDATE()),'09','30'),
CONCAT(year(CURDATE()),'08','01'),CONCAT(year(CURDATE()),'08','31'),CONCAT(year(CURDATE()),'08','01'),CONCAT(year(CURDATE()),'08','31'),
CONCAT(year(CURDATE()),'07','01'),CONCAT(year(CURDATE()),'07','31'),CONCAT(year(CURDATE()),'07','01'),CONCAT(year(CURDATE()),'07','31'),
CONCAT(year(CURDATE()),'06','01'),CONCAT(year(CURDATE()),'06','30'),CONCAT(year(CURDATE()),'06','01'),CONCAT(year(CURDATE()),'06','30'));
END IF ;
END ;
//
DELIMITER ;
调用过程:
call proc3(CURDATE())
这样表里的数据就得到更新。
存储过程的更详细信息可查阅该文
MySql赋值操作符”=”与”:=”
“:=” 是真正意义上的赋值操作,左边的变量设置为右边的值。
www.2cto.com
“=” 则只在两种情况下作为赋值用,第一种就是在SET语句里面,SET var = value;
另一种是在UPDATE语句里面的那个SET,如update table_name set column_name where….。
除了方面这两种情况外”=”则作为比较操作符使用。
MySQL性能提升
1、能先用where 缩减查询范围先缩减
此条对运行速度影响最大
2、先想清楚要实现的功能,尽量在查询一个表的时候完成
多生成一些新的字段都没关系,对性能影响不大,但反复查询就很影响性能
3、少自己创建函数
调用自己创建的函数速度很慢
版权声明:本文为博主原创文章,未经博主允许不得转载。