mysql笔记

创建mysql服务的时候一定要定位到bin目录下再开始创建
source [文件名称]导入数据库
 

 

在 eclipse 菜单 Window > Open Perspecive > Plugin Development 找到 Plugin 视图
 
更改停靠方式为到主窗口,可以合并查询窗口到mysql管理页面
 
 
测试CURRENT_TIMESTAMP
 
ALTER table testtable MODIFY id int  NOT NULL AUTO_INCREMENT
 
PowerDesigner设置表字符编码
 
5,568浏览
在用PowerDesigner创建表的时候可以设置表的字符编码,以PowerDesigner 15为例来说明,进入到Physical Options标签,在左侧列表中有
 
一个charset=utf8或GBK等之类的选项,选中这个即可。
 
但如果没有看到这个字符编码选项,则需要自己手动进行设置,在PowerDesigner 15的安装目录Resource Files\DBMS下,找到mysql50.xdb
 
这个文件(以mysql为例说明),然后找到这一行:checksum = %d : list = 0 | 1, default = 0,在其前一行或后一行加入:charset = 
 
%s : list = UTF8 | GBK | GB2312, default = UTF8,表示默认字符编码为UTF8,如下图:
 
效果如下:
 
create table test
(
id                   bigint not null auto_increment,
password             varchar(40),
primary key (id)
)
charset = UTF8;
 
 
 
select TIMESTAMPDIFF(MINUTE,NOW(),'2015-10-13 15:00:00') as a
 
 
 
SELECT 24*60
 
 
 
select now()
 
 
 
    select 
 
    payMoney
 
    from g_uber_payment
 
    where gatheringUser = 1 and status = 6001 and TIMESTAMPDIFF(MINUTE,NOW(),payDate)>1440
 
 
 
find_in_set 函数使用方法   
 
个例子来说:
有个文章表里面有个type字段,它存储的是文章类型,有 1头条、2推荐、3热点、4图文...1,12,13 等等 。
现在有篇文章他既是 头条,又是热点,还是图文,
type中以 1,3,4 的格式存储。
那我们如何用sql查找所有type中有4图文标准的文章呢??
这就要我们的 find_in_set 出马的时候到了。
以下为引用的内容:
 代码如下 复制代码
select * from article where FIND_IN_SET('4',type)
----------------------------------------------------------
MySQL手册中find_in_set函数的语法:
 代码如下 复制代码
FIND_IN_SET(str,strlist)
假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。
一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则   
 
FIND_IN_SET() 函数被优化,使用比特计算。
如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个
 
逗号(‘,’)时将无法正常运行。
 代码如下 复制代码
mysql> SELECT FIND_IN_SET('b', 'a,b,c,d');
-> 2 因为b 在strlist集合中放在2的位置 从1开始
--------------------------------------------------------
select FIND_IN_SET('1', '1');  返回 就是1 这时候的strlist集合有点特殊 只有一个字符串 其实就是要求前一个字符串 一定要在后一
 
个字符串集合中 才返回 大于0的数
 代码如下 复制代码
select FIND_IN_SET('2', '1,2'); 返回2
select FIND_IN_SET('6', '1');  返回0
----------------------------------------------------------
注意:
 代码如下 复制代码
select * from treenodes where FIND_IN_SET(id, '1,2,3,4,5');
使用find_in_set函数一次返回多条记录
id 是一个表的字段,然后每条记录分别是id等于1,2,3,4,5的时候
有点类似in (集合)
 代码如下 复制代码
select * from treenodes where id in (1,2,3,4,5);
 
弄个测试表来说明两者的区别
 代码如下 复制代码
CREATE TABLE `test` (
  `id` int(8) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `list` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
)
 
INSERT INTO `test` VALUES (1, 'name', 'daodao,www.111cn.net,xiaoqin');
INSERT INTO `test` VALUES (2, 'name2', 'xiaohu,daodao,xiaoqin');
INSERT INTO `test` VALUES (3, 'name3', 'xiaoqin,daodao,www.111cn.net');
 
原来以为MySQL可以进行这样的查询:
 代码如下 复制代码
select id, list, name from table where 'daodao' IN (list);
(一)
实际上这样是不行的,这样只有当name是list中的第一个元素时,查询才有效,否则都得不到结果,即使'daodao'真的在list中。
再来看看这个:
 代码如下 复制代码
select id, list, name from table where 'daodao' IN ('libk', 'zyfon', 'daodao');
(二)
这样是可以的。
----------------------------------------------------------------
这两条到底有什么区别呢?为什么第一条不能取得正确的结果,而第二条却能取得结果。
原因其实是(一)中 (list) list是变量, 而(二)中 ('libk', 'zyfon', 'daodao')是常量。
所以如果要让(一)能正确工作,需要用find_in_set():
 代码如下 复制代码
select id, list, name from table where find_in_set('daodao',list);
(一)的改进版。
总结:
所以如果list是常量,则可以直接用IN, 否则要用find_in_set()函数。
 
 
 CREATE PROCEDURE showChildLst (IN rootId INT)
     BEGIN
      CREATE TEMPORARY TABLE IF NOT EXISTS tmpLst 
       (sno int primary key auto_increment,id int,depth int);
      DELETE FROM tmpLst;
set max_sp_recursion_depth=100;
      CALL createChildLst(rootId,0);
    
      select MENUID as id, MENUNAME  as text, PARENTID  as parentid, seq, LINKURL as urls, ISACTIVE, CREATETIME, reslevel  
from tmpLst,g_uber_menu where tmpLst.id=g_uber_menu.menuId order by tmpLst.sno;
     END;
DROP PROCEDURE showchildlst;
 
 CREATE PROCEDURE createChildLst (IN rootId INT,IN nDepth INT)
     BEGIN
      DECLARE done INT DEFAULT 0;
      DECLARE b INT;
      DECLARE cur1 CURSOR FOR SELECT menuId FROM g_uber_menu where parentid=rootId;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
      insert into tmpLst values (null,rootId,nDepth);
 
    
      OPEN cur1;
    
      FETCH cur1 INTO b;
      WHILE done=0 DO
              CALL createChildLst(b,nDepth+1);
              FETCH cur1 INTO b;
      END WHILE;
    
      CLOSE cur1;
     END;
 
drop PROCEDURE CREATEchildLst;
 
set max_sp_recursion_depth=100;
CALL showChildLst(1);
 
The user specified as a definer ('goujia'@'%') does not exist
可能是因为盗过来的数据库里的函数或者是存储过程里隐含的有以前的用户,所以需要进行授权,然后,就可以了:
mysql> grant all privileges on *.* to root@"%" identified by ".";
Query OK, 0 rows affected (0.00 sec)
 
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
 
-----------------------------------------------------
 
a. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称
b. show databases; -- 显示mysql中所有数据库的名称
c. show columns from table_name from database_name; 或show columns from database_name.table_name; -- 显示表中列名称
d. show grants for user_name; -- 显示一个用户的权限,显示结果类似于grant 命令
e. show index from table_name; -- 显示表的索引
f. show status; -- 显示一些系统特定资源的信息,例如,正在运行的线程数量
g. show variables; -- 显示系统变量的名称和值
h. show processlist; -- 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果
 
他们拥有process权限,就可以查看所有人的进程,包括密码。
i. show table status; -- 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间
j. show privileges; -- 显示服务器所支持的不同权限
k. show create database database_name; -- 显示create database 语句是否能够创建指定的数据库
l. show create table table_name; -- 显示create database 语句是否能够创建指定的数据库
m. show engies; -- 显示安装以后可用的存储引擎和默认引擎。
n. show innodb status; -- 显示innoDB存储引擎的状态
o. show logs; -- 显示BDB存储引擎的日志
p. show warnings; -- 显示最后一个执行的语句所产生的错误、警告和通知
q. show errors; -- 只显示最后一个执行语句所产生的错误
r. show [storage] engines; --显示安装后的可用存储引擎和默认引擎
s. show procedure status --显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过
程名称,创建时间等
t. show create procedure sp_name --显示某一个存储过程的详细信息
 
一下午研究了两个内容:触发器与过程.
 
触发器是在执行某种操作(插入,更新,删除)时(前,后)进行的操作. 这个功能完全可以由C语言实现,而且更简单. mysql中触发器的使用还要
 
涉及到变量之类的,不如用C实现起来简单,所以这里就不介绍了.
 
过程(procedure)相当于C语言中的子函数:
 
1,创建:
 
mysql show命令集合 - 天命执行官 - 人生如梦create procedure procedure_name() select * from table_name;
 
2,调用:
 
mysql show命令集合 - 天命执行官 - 人生如梦call procedure_name;
 
3,查看:
 
mysql show命令集合 - 天命执行官 - 人生如梦查看过程的内容有三种方法:
mysql show命令集合 - 天命执行官 - 人生如梦1,show create procedure procedure_name;
mysql show命令集合 - 天命执行官 - 人生如梦2,show procedure status like 'procedure_name'
mysql show命令集合 - 天命执行官 - 人生如梦3,select * from mysql.proc where name='procedure_name'
 
4,删除:
 
mysql show命令集合 - 天命执行官 - 人生如梦drop procedure procedure_name;
 
一些存储过程以及函数的例子
 
delimiter |
定义procedure
create procedure p2_test1 (OUT para1 int)
begin
select sum(val) into para1 from test1;
end
|
调用procedure
call p2_test1(@sum)|
select @sum|
 
alter procedure没有研究出来
 
定义函数
create function f_test1(name char(20)) returns char(20) //参数没有IN,OUT,都是IN
begin
return concat('Hello ',name,' !');
end
|
调用函数
select f_test1('hongjian')|
 
三种不同的show的用法
show procedure status
show function status
show triggers //注意,没有status
 
语法:
CREATE PROCEDURE sp_name ([IN |OUT |INOUT] param type,...)
begin
rou
 
在命令行里面执行批量语句的时候,用delimiter //开始,然后以后的分号都可以用//  代替,或者是中间的代码要顶头写可以继续使用分
 
号,最后记得用//代表执行结束
 
 
SELECT IFNULL(null,1) 
 
问题:工程部署时,报错误
Log4j: ERROR Failed to load driver.
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
..................
但是mysql数据库驱动确实存在。并且访问应用时,日志也可以写入到数据库。但部署时的错误很奇怪。
 
 
解决:参考了http://www.rsky.com.cn/Article/java/201004/11573.html
将log4j.properties 中每行后面的空格都删除就解决了。
 
DECLARE EXIT (continue) HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION set o_isErr=-1; 
记得紧跟着begin写
 
call sp_add();
是不是你定义的过程有问题吧,并没有指出返回结果来
像我这样是可以的:
 
CREATE PROCEDURE sp_add(a int, b int,out c int)
begin
 
set c=a+ b;
 
end;
调用过程:
call sp_add (1,2,@a);
select @a;
 
SELECT left ('3423\542',2)
 
SELECT QUOTE('453535')
 
1.ctrl+q           打开查询窗口
2.ctrl+/            注释sql语句
3.ctrl+shift +/  解除注释
4.ctrl+r           运行查询窗口的sql语句
5.ctrl+shift+r   只运行选中的sql语句
6.F6               打开一个mysql命令行窗口
7.ctrl+l            删除一行
8.ctrl+n           打开一个新的查询窗口
9.ctrl+w          关闭一个查询窗口
MySQL服务器支持3种注释风格:
 
·         从‘#’字符从行尾。
 
·         从‘-- ’序列到行尾。请注意‘-- ’(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格、tab、换行符等等)。
 
该语法与标准SQL注释语法稍有不同,后者将在1.8.5.7, “‘--’作为注释起始标记”中讨论。
 
·         从/*序列到后面的*/序列。结束序列不一定在同一行中,因此该语法允许注释跨越多行。
 
 
 
如果你想去掉【message】中的所有空格的话
  【replace(message,' ','')】
 
Communications link failure的解决办法
 
show variables like '%timeout%';
 
set  wait_timeout=31536000;  
set interactive_timeout = 31536000; 
 
select group_concat(COLUMN_NAME separator ',') from information_schema.COLUMNS 
where table_name ='base_city_dredge' and table_schema = 'gjw';
 
更改字段:
alter table base_customer change building_id building_name varchar(100) null comment '注释';
 
创建用户并赋予权限
create user xxx
show grants for xxx
grant all privileges on *.* to xxx
 
启动1067错误:
我的mysql版本是5.6.12,解压后,按网上说的创建my.ini文件,如同你那样。也遇到你所遇到的问题,找不到答案,快疯了。

后来想想,为什么不要自带的my-default.ini呢。于是去掉my-default.ini 中#注释的配置。
cmd下运行:
mysqld.exe --install
net start mysql
 
 

mysql: unknown variable “basedir 。。。。

 
 刚安装完成时root账号默认密码为空,此时可以将密码修改为指定的密码。如:123456
    c:>mysql –uroot
    mysql>show databases;
    mysql>use mysql;
在这一步的时候用mysql -u root -p (密码输入空)来完成,否则权限不够
    mysql>UPDATE user SET password=PASSWORD("123456") WHERE user='root';
    mysql>FLUSH PRIVILEGES;
    mysql>QUIT
 
  设置主键alter table base_customer_reserve_log CHANGE id id BIGINT AUTO_INCREMENT PRIMARY KEY; 

 

posted @ 2016-06-04 17:41  oceanyang  阅读(225)  评论(0编辑  收藏  举报