当前位置:Gxlcms > 数据库问题 > mysql笔记

mysql笔记

时间:2021-07-01 10:21:17 帮助过:5人阅读

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()函数。   http://www.cnblogs.com/kingteach/archive/2011/07/05/2098046.html    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; 

 

技术分享

mysql笔记

标签:

人气教程排行