zoukankan      html  css  js  c++  java
  • mysql常见操作汇总 专题

    SELECT REPLACE
        ( url, 'http://baidu.com', 'http://hello.com' ),
        url 
    FROM
        tb_banner 
    WHERE
        url LIKE 'http://baidu.com%';


     
    mysql中in多个字段

    1. 基本用法

    SELECT
        *
    FROM
        USER
    WHERE
        user_id IN (600, 601, 602);

    2. 多个字段同时使用

    SELECT
        *
    FROM
        USER
    WHERE
        (user_id, type) IN ((568, 6),(569, 6),(600, 8));

    3. 多表同时多个字段使用

    SELECT
        *
    FROM
        USER
    WHERE
        (legal_id, type) NOT IN (
            SELECT
                a.legal_id,
                a.type
            FROM
                USER AS a,
                role_user_relation AS b
            WHERE
                a.legal_id = b.legal_id
            AND a.type = b.legal_type
        )
    LIMIT 0,10;

    https://blog.csdn.net/Guanjs2016/article/details/80237490

    mysql limit在分页中的应用:

    mysql中用limit 进行分页有两种方式

    例1,假设数据库表student存在13条数据。

    代码示例:
    // 语句1和2均返回表student的第10、11、12、13行 ,
    语句1:

    select * from student limit 9,4 //第一个参数表示从该参数的下一条数据开始,第二个参数表示每次返回的数据条数。

    语句2:

    slect * from student limit 4 offset 9  //语句2中的4表示返回4行,9表示从表的第十行开始

    例2,通过limit和offset 或只通过limit可以实现分页功能。
    假设 pageSize表示每页要显示的条数,pageNumber表示页码,那么 返回第pageNumber页,每页条数为pageSize的sql语句:

    代码示例:
    语句3:select * from studnet limit (pageNumber-1)*pageSize,pageSize
    语句4:select * from student limit pageSize offset (pageNumber-1)*pageSize

    https://www.cnblogs.com/ahang/p/5644535.html

    mysql limit offset

    /*
    Navicat MySQL Data Transfer
    
    Source Server         : dev-192.168.38.109
    Source Server Version : 50622
    Source Host           : 192.168.38.109:3306
    Source Database       : test
    
    Target Server Type    : MYSQL
    Target Server Version : 50622
    File Encoding         : 65001
    
    Date: 2018-10-29 17:26:12
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for t_test
    -- ----------------------------
    DROP TABLE IF EXISTS `t_test`;
    CREATE TABLE `t_test` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
    
    -- ----------------------------
    -- Records of t_test
    -- ----------------------------
    INSERT INTO `t_test` VALUES ('1', 'name1');
    INSERT INTO `t_test` VALUES ('2', 'name2');
    INSERT INTO `t_test` VALUES ('3', 'name3');
    INSERT INTO `t_test` VALUES ('4', 'name4');
    INSERT INTO `t_test` VALUES ('5', 'name5');
    SELECT * FROM t_test ORDER BY id asc;
    
    SELECT * FROM t_test ORDER BY id asc limit 0,1;
    
    SELECT * FROM t_test ORDER BY id asc limit 1,1;
    
    SELECT * FROM t_test ORDER BY id asc limit 0,2;
    
    SELECT * FROM t_test ORDER BY id asc limit 2,2;

    今天无意间发现mysql的coalesce,
    coalesce()解释:返回参数中的第一个非空表达式(从左向右依次类推);

    使用示例:a,b,c三个变量。

    select coalesce(null,2,3); // Return 2
    select coalesce(null,null,3); // Return 3
    select coalesce(1,2,3); // Return 1

    通过上面例子可以看出,他的作用是将返回传入的参数中第一个非null的值,再比如

    SELECT COALESCE(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1);
    -- Return 1
    如果传入的参数所有都是null,则返回null,比如
    SELECT COALESCE(NULL, NULL, NULL, NULL);
    -- Return NULL

    这个参数使用的场合为:假如某个字段默认是null,你想其返回的不是null,而是比如0或其他值,可以使用这个函数
    SELECT COALESCE(字段名,0) as value from t;//(如果数据库提成字段默认值不是为0值的话肯定是开发那个的错,个人观点请勿喷哈)。

    无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,
    专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任。
    不忘初心 方得始终!
    https://www.cnblogs.com/phpper/p/6903464.html

    在mysql中sum函数查出的最终结果为0的时候会显示null,这时候就需要将null转为0:

    方法1:使用IFNULL(expr1,expr2)函数:

    SELECT
        IFNULL(sum(SS), 0.0) AS sum
    FROM
        fd_order fo
    WHERE
        fo2.BUYER_ID = '11'

    结果为:

    方法2:

    使用COALESCE(value,...) 函数:

    SELECT
        COALESCE (sum(SS), 0.00) AS sum
    FROM
        fd_order fo2
    WHERE
        fo2.BUYER_ID = '11'

    结果为:

    方法3:使用 case when 函数进行判断

    SELECT
        CASE
    WHEN ISNULL(sum(SS)) THEN
        0
    ELSE
        sum(SS)
    END AS sum
    FROM
        fd_order fo2
    WHERE
        fo2.BUYER_ID = '11'

    结果为:

    备注:这三种方法的结果稍微有点不一样,方法1和方法2的结果精确度可以在第二个参数中定义。

    case when函数相当于一个判断语句,返回的结果可以定义成0,也可以定义成其他字母甚至汉字。
    ---------------------
    作者:ZhuangYQ丶
    来源:CSDN
    原文:https://blog.csdn.net/iilegend/article/details/80363724
    版权声明:本文为博主原创文章,转载请附上博文链接!




    sql优化小结:
    之前3m+,现在 300ms~400ms
    解决思路:去掉冗余的查询条件,尽量使用3星索引。

    更改字段长度,字段imei 由varchar(1024)更改为varchar(45) ,索引中涉及到imei字段的由imei(255)变为imei
    梳理api接口使用中查询所需字段,优化查询条件,将一些不需要的查询参数去掉。
    将经典场景使用的查询条件,单独建索引
    将关键字段单独建索引,这个场景中,只将imei字段单独建立索引,其它字段不需要
     

    SELECT IF(id=2,4,id) ,id from people ORDER BY id DESC;

      

    MySql查看与修改auto_increment方法

    查看表当前auto_increment
    表的基本数据是存放在MySQL的information_schema库的tables表中,我们可以使用sql查出:

    SELECT
        auto_increment
    FROM
        information_schema. TABLES
    WHERE
        table_schema = 'db name'
    AND table_name = 'table name';

    例子:查看 test_user 库的 user 表 auto_increment

    mysql> select auto_increment from information_schema.tables where table_schema='test_user' and table_name='user';
    +----------------+
    | auto_increment |
    +----------------+
    |           1002 |
    +----------------+
    1 row in set (0.04 sec)

    修改表 auto_increment

    alter table tablename auto_increment=NUMBER;

    1、
    创建表时指定AUTO_INCREMENT自增值的初始值(即起始值)不设置或设置为0时,会从1开始:

    CREATE TABLE XXX (
       ID INT (5) PRIMARY KEY AUTO_INCREMENT
    ) AUTO_INCREMENT = 100;

    2、

    通过 ALTER TABLE 修改初始值(但是要大于表中的 AUTO_INCREMENT 自增值,否则设置无效):

    ALTER TABLE XXX AUTO_INCREMENT=100;

    3、

    如果自增序列的最大值被删除了,则在插入新记录时,该值被重用:
    就是说如果表中原本有AUTO_INCREMENT属性值连续为78、100的值,但100这个数据被删除了,下此再添加数据的时候自增值为101,100被重用了。
    即使在你将整个表中的所有数据delete清空后,之前的自增序列最大值还是会被重用。
    解决办法是:
    使用

    ALTER TABLE XXX AUTO_INCREMENT=0;

     重新设置自增初始值。

    mysql中的字符串的拼接

    字符串的拼接
    1、Mysql
    在Java、C#等编程语言中字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"、"a"+"b"。
    在MYSQL中也可以使用加号“+”来连接两个字符串,比如下面的SQL:

    SELECT '12'+'33',FAge+'1' FROM T_Employee   

     执行结果

     
    '12'+'33'  FAge+'1'   
    45    26   
    45  29   
    45  24   
    45  26   
    45  29   
    45  28   
    45  24   
    45  29   
    45  23 

    MYSQL会尝试将加号两端的字段值尝试转换为数字类型,如果转换失败则认为字段值为
    0,比如我们执行下面的SQL语句:

    SELECT 'abc'+'123',FAge+'a' FROM T_Employee   

    执行完毕我们就能在输出结果中看到下面的执行结果:

    'abc'+'123'  FAge+'a'   
    123  25   
    123  28   
    123  23   
    123  25   
    123  28   
    123  27   
    123  23   
    123  28   
    123  22   

       在MYSQL中进行字符串的拼接要使用CONCAT函数,CONCAT函数支持一个或者多个参数,参数类型可以为字符串类型也可以是非字符串类型,对于非字符串类型的参数MYSQL将尝试将其转化为字符串类型,CONCAT函数会将所有参数按照参数的顺序拼接成一个字符串做为返回值。比如下面的SQL语句用于将用户的多个字段信息以一个计算字段的形式查询出来:

    SELECT CONCAT('工号为:',FNumber,'的员工的幸福指数:',FSalary/(FAge-21))   

    FROM T_Employee 执行完毕我们就能在输出结果中看到下面的执行结果:

    CONCAT('工号为:',FNumber,'的员工的幸福指数:',FSalary/(FAge-21))   
    工号为:DEV001的员工的幸福指数:2075.000000   
    工号为:DEV002的员工的幸福指数:328.685714   
    工号为:HR001的员工的幸福指数:1100.440000   

    MYSQL中还提供了另外一个进行字符串拼接的函数CONCAT_WS,CONCAT_WS可以在待拼接的字符串之间加入指定的分隔符,它的第一个参数值为采用的分隔符,而剩下的参数则为待拼接的字符串值,比如执行下面的SQL: 

    SELECT CONCAT_WS(',',FNumber,FAge,FDepartment,FSalary) FROM T_Employee   

    执行完毕我们就能在输出结果中看到下面的执行结果:

    CONCAT_WS(',',FNumber,FAge,FDepartment,FSalary)   
    DEV001,25,Development,8300.00   
    DEV002,28,Development,2300.80   
    HR001,23,HumanResource,2200.88   
    HR002,25,HumanResource,5200.36   
    IT001,28,InfoTech,3900.00   
    IT002,27,InfoTech,2800.00   
    SALES001,23,Sales,5000.00   
    SALES002,28,Sales,6200.00   
    SALES003,22,Sales,1200.00  

    2,oracle

      Oracle中使用“||”进行字符串拼接,其使用方式和MSSQLServer中的加号“+”一样。
    比如执行下面的SQL语句:

    SELECT '工号为'||FNumber||'的员工姓名为'||FName FROM T_Employee   
    WHERE FName IS NOT NULL   

    执行完毕我们就能在输出结果中看到下面的执行结果:

    工号为||FNUMBER||的员工姓名为||FNAME   
    工号为DEV001的员工姓名为Tom   
    工号为DEV002的员工姓名为Jerry   
    工号为SALES001的员工姓名为John   
    工号为SALES002的员工姓名为Kerry   
    工号为SALES003的员工姓名为Stone   
    工号为HR001的员工姓名为Jane   
    工号为HR002的员工姓名为Tina   
    工号为IT001的员工姓名为Smith   

       除了“||”,Oracle还支持使用CONCAT()函数进行字符串拼接,比如执行下面的SQL语句:

    SELECT CONCAT('工号:',FNumber) FROM T_Employee   

    执行完毕我们就能在输出结果中看到下面的执行结果:

    CONCAT(工号:,FNUMBER)   
    工号:DEV001   
    工号:DEV002   
    工号:HR001   
    工号:HR002   
    工号:IT001   
    工号:IT002   
    工号:SALES001   
    工号:SALES002   
    工号:SALES003  

    如果CONCAT中连接的值不是字符串,Oracle会尝试将其转换为字符串,
    与MYSQL的CONCAT()函数不同,Oracle的CONCAT()函数只支持两个参数,不支持两个以
    上字符串的拼接。如果要进行多个字符串的拼接的话,可以使用多个CONCAT()函数嵌套使用。

    SELECT CONCAT(CONCAT(CONCAT('工号为',FNumber),'的员工姓名为'),FName) FROM   
    T_Employee   
    WHERE FName IS NOT NULL  

    执行完毕我们就能在输出结果中看到下面的执行结果:

    CONCAT(CONCAT(CONCAT(工号为,FNUMBER),的员工姓名为),FNAME)   
    工号为DEV001的员工姓名为Tom   
    工号为DEV002的员工姓名为Jerry   
    工号为SALES001的员工姓名为John   
    工号为SALES002的员工姓名为Kerry   
    工号为SALES003的员工姓名为Stone   
    工号为HR001的员工姓名为Jane   
    工号为HR002的员工姓名为Tina   
    工号为IT001的员工姓名为Smith 

    http://honly-java.iteye.com/blog/1633033

    where 1071 Specialfied key war too long; max key length is 767 bytes

    在为数据库中的某两个字段设置unique索引的时候,出现了Specified key was too long; max key length is 1000 bytes错误
    经过查询才知道,是Mysql的字段设置的太长了,于是我把这两个字段的长度改了一下就好了。

    建立索引时,数据库计算key的长度是累加所有Index用到的字段的char长度后再按下面比例乘起来不能超过限定的key长度1000:
    latin1 = 1 byte = 1 character
    uft8 = 3 byte = 1 character
    gbk = 2 byte = 1 character
    举例能看得更明白些,以GBK为例:
    CREATE UNIQUE INDEX `uk_record` ON reports (`report_name`, `report_client`, `report_city`);
    其中report_name varchar(200), report_client varchar(200), report_city varchar(200)
    (200 + 200 +200) * 2 = 1200 > 1000,所有就会报1071错误,只要将report_city改为varchar(100)那么索引就能成功建立。
    如果表是UTF8字符集,那索引还是建立不了

    http://www.jb51.net/article/24499.htm

    mysql中索引类型选择:  btree(O(log(n))),hash

    mysql最常用的索引结构是btree(O(log(n))),但是总有一些情况下我们为了更好的性能希望能使用别的类型的索引。
    hash就是其中一种选择,例如我们在通过用户名检索用户id的时候,他们总是一对一的关系,用到的操作符只是=而已,假如使用hash作为索引数据结构的话,时间复杂度可以降到O(1)。
    不幸的是,目前的mysql版本(5.6)中,hash只支持MEMORY和NDB两种引擎,而我们最常用的INNODB和MYISAM都不支持hash类型的索引。

    不管怎样,还是要了解一下这两种索引的区别,下面翻译自mysql官网文档中对这两者的解释。
    B-Tree 索引特征
    B-Tree索引可以被用在像=,>,>=,<,<=和BETWEEN这些比较操作符上。而且还可以用于LIKE操作符,只要它的查询条件是一个不以通配符开头的常量。像下面的语句就可以使用索引:

    SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
    SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';

    下面这两种情况不会使用索引:

    SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
    SELECT * FROM tbl_name WHERE key_col LIKE other_col;

    第一条是因为它以通配符开头,第二条是因为没有使用常量
    假如你使用... LIKE '%string%'而且string超过三个字符,MYSQL使用Turbo Boyer-Moore algorithm算法来初始化查询表达式,然后用这个表达式来让查询更迅速。
    一个这样的查询col_name IS NULL是可以使用col_name的索引的。
    任何一个没有覆盖所有WHERE中AND级别条件的索引是不会被使用的。也就是说,要使用一个索引,这个索引中的第一列需要在每个AND组中出现。
    下面的WHERE条件会使用索引:

    ... WHERE index_part1=1 AND index_part2=2 AND other_column=3
        /* index = 1 OR index = 2 */
    ... WHERE index=1 OR A=10 AND index=2
        /* 优化成 "index_part1='hello'" */
    ... WHERE index_part1='hello' AND index_part3=5
        /* 可以使用 index1 的索引但是不会使用 index2 和 index3 */
    ... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

    下面的WHERE条件不会使用索引:

        /* index_part1 没有被使用到 */
    ... WHERE index_part2=1 AND index_part3=2
        /* 索引 index 没有出现在每个 where 子句中 */
    ... WHERE index=1 OR A=10
        /* 没有索引覆盖所有列 */
    ... WHERE index_part1=1 OR index_part2=10

    有时候mysql不会使用索引,即使这个在可用的情况下。例如当mysql预估使用索引会读取大部分的行数据时。(在这种情况下,一次全表扫描可能比使用索引更快,因为它需要更少的检索)。然而,假如语句中使用LIMIT来限定返回的行数,mysql则会使用索引。因为当结果行数较少的情况下使用索引的效率会更高。
    Hash 索引特征
    Hash类型的索引有一些区别于以上所述的特征:
    1.它们只能用于对等比较,例如=和<=>操作符(但是快很多)。它们不能被用于像<这样的范围查询条件。假如系统只需要使用像“键值对”的这样的存储结构,尽量使用hash类型索引。
    2.优化器不能用hash索引来为ORDER BY操作符加速。(这类索引不能被用于搜索下一个次序的值)
    3.mysql不能判断出两个值之间有多少条数据(这需要使用范围查询操作符来决定使用哪个索引)。假如你将一个MyISAM表转为一个依靠hash索引的MEMORY表,可能会影响一些语句(的性能)。
    4.只有完整的键才能被用于搜索一行数据。(假如用B-tree索引,任何一个键的片段都可以用于查找。我觉得可能意味着带通配符LIKE操作符会不起作用)。
    后记
    顺便记录一下在使用mysql过程中碰到的一些问题:
    有时候使用脚本迁移数据时会碰到乱码的问题,即使将表字符集设置成utf8也无济于事,这个时候在执行sql之前加一句set names utf8即可。

     http://www.jb51.net/article/62533.htm

    DROP TABLE if EXISTS `people`;
    CREATE TABLE people(
        id BIGINT UNSIGNED auto_increment primary key,
        zip_code char(32) not null default '',
        address varchar(128) not null default '',
        last_name char(64) not null default '',
        first_name char(64) not null default '',
        birthdate char(10) not null default ''
    );
    
    DROP TABLE IF EXISTS `people_car`;
    CREATE TABLE people_car(
        people_id BIGINT UNSIGNED,
        plate_number varchar(16) not null default '',
        engine_number varchar(16) not null default '',
        lasttime timestamp
    );
    
    insert into people
    (zip_code,address,last_name,first_name,birthdate)
    values
    ('230031','henan','fan','li','516-09-15'),
    ('100000','anhui','zhang','san','1987-03-11'),
    ('200000','shanghai','wang','wu','1988-08-25');
    
    insert into people_car
    (people_id,plate_number,engine_number,lasttime)
    values
    (1,'A121311','12121313','2013-11-23 :21:12:21'),
    (2,'B121311','1S121313','2011-11-23 :21:12:21'),
    (3,'C121311','1211SAS1','2012-11-23 :21:12:21');
    
    
    ALTER TABLE `people`
    ADD INDEX `idx_zipcode_firstname_lastname` (`zip_code`, `last_name`, `first_name`) USING BTREE ,
    ADD INDEX `idx_zipcode` (`zip_code`) USING BTREE ;
    
    
    EXPLAIN SELECT * from people;
    EXPLAIN SELECT zip_code,first_name,last_name from people;
    EXPLAIN SELECT * from people;

     http://www.cnblogs.com/zhanjindong/p/3439042.html

    Tips:

    Tom Smith中“Tom”是 first name,即名;“Smith”是last name=family name,即姓

    1、Mysql服务突然启不来了,报错:

    在分析时发现
    MySQL Server 5.0data下面有个名称为用户名,扩展名为.err的文件:

    150725 20:01:19 [Note] 自己的安装目录MySQLMySQL Server 5.0inmysqld-nt: Shutdown complete
    
    150725 21:26:35  InnoDB: Error: unable to create temporary file; errno: 9
    150725 21:26:35 [ERROR] Default storage engine (InnoDB) is not available
    150725 21:26:35 [ERROR] Aborting
    
    150725 21:26:35 [Note] 自己的安装目录MySQLMySQL Server 5.0inmysqld-nt: Shutdown complete

    按照网上找的解决办法,
    (1)在MySQLMySQL Server 5.0my.ini中增加配置
    tmpdir="自己的安装目录/MySQL/MySQL Server 5.0/Temp"

    (2)更改引擎:
    # The default storage engine that will be used when create new tables when
    #default-storage-engine=INNODB
    default-storage-engine=MyISAM

    后,重新启动MySQL服务即可。

    成功启动后 MySQL Server 5.0data当前用户名.err中的内容如下:

    150725 20:01:19 [Note] C:Program FilesMySQLMySQL Server 5.0inmysqld-nt: Shutdown complete
    
    150725 21:26:35  InnoDB: Error: unable to create temporary file; errno: 9
    150725 21:26:35 [ERROR] Default storage engine (InnoDB) is not available
    150725 21:26:35 [ERROR] Aborting
    
    150725 21:26:35 [Note] C:Program FilesMySQLMySQL Server 5.0inmysqld-nt: Shutdown complete
    
    150725 21:28:12  InnoDB: Error: unable to create temporary file; errno: 9
    150725 21:28:12 [Note] C:Program FilesMySQLMySQL Server 5.0inmysqld-nt: ready for connections.
    Version: '5.0.96-community-nt'  socket: ''  port: 3306  MySQL Community Edition (GPL)

    从上面的信息可以看到temporary file仍然创建失败,但Mysql服务器启动成功了

    mysql> show engines;
    +------------+----------+----------------------------------------------------------------+
    | Engine     | Support  | Comment
    +------------+----------+----------------------------------------------------------------+
    | MyISAM     | DEFAULT  | Default engine as of MySQL 3.23 with great performance
    | MEMORY     | YES      | Hash based, stored in memory, useful for temporary tables      |
    | InnoDB     | DISABLED | Supports transactions, row-level locking, and foreignkeys     |
    | BerkeleyDB | NO       | Supports transactions and page-level locking
    | BLACKHOLE  | YES      | /dev/null storage engine (anything you write to it disappears) |
    | EXAMPLE    | NO       | Example storage engine
    | ARCHIVE    | YES      | Archive storage engine
    | CSV        | NO       | CSV storage engine
    | ndbcluster | NO       | Clustered, fault-tolerant, memory-based tables
    | FEDERATED  | YES      | Federated MySQL storage engine
    | MRG_MYISAM | YES      | Collection of identical MyISAM tables
    | ISAM       | NO       | Obsolete storage engine
    +------------+----------+----------------------------------------------------------------+
    12 rows in set (0.00 sec)

     2、MySQL 参数autoReconnect=true 解决8小时连接失效
    (1). 即使在创建Mysql时url中加入了autoReconnect=true参数,一但这个连接两次访问数据库的时间超出了服务器端wait_timeout的时间限制,还是会CommunicationsException: The last packet successfully received from the server was xxx milliseconds ago. 
    (2) 服务器端的参数可以用   
    show global variables like 'wait_timeout';   

    28800s=8h
    set global wait_timeout=10;   
    来进行设置,但是wait_timeout值不应该设的太高. 
    (3). 较好的策略是对处于idle状态的connection定时发送一个sql,来刷新服务器上的时间戳.这可以使用c3p0r的连接池.http://bzhang.iteye.com/blog/321832 
    (4). 对于tomcat的server.xml中使用的连接池,http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html,http://commons.apache.org/dbcp/configuration.html使用DBCP的连接池可以采用 

    <Resource name="jdbc/test" auth="Container"  
                  type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" 
                  url="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8"  
                  username="root" password="test" maxActive="500" maxIdle="10"  
                  maxWait="-1" timeBetweenEvictionRunsMillis="10000" minEvictableIdleTimeMillis="10000" />


    4.1 设置validationQuery,这样每次borrow(默认为开启)时会通过这个sql校验连接的有效性,但是增加了时间.   
    4.2 设置timeBetweenEvictionRunsMillis="10000" minEvictableIdleTimeMillis="10000" 依赖evictor thread线程来把超时的连接关闭.   
    4.3 设置testWhileIdle="true" timeBetweenEvictionRunsMillis="10000" validationQuery="select 1" 使得定时去用query检测处于idle状态的连接,也就刷新了服务器端的时间.

    (5).每次提交的最大packet大小  show global variables like 'max_allowed_packet';  set global max_allowed_packet=1024*1024;

    http://www.linuxidc.com/Linux/2012-10/72245.htm
     

    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password

    mysql ERROR 1045 (28000): Access denied for user解决方法

    问题重现(以下讨论范围仅限Windows环境):

    C:AppServMySQL> mysql -u root -p 
    Enter password:
     ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    编辑mysql配置文件my.ini(不知道在哪请搜索),在[mysqld]这个条目下加入   skip-grant-tables 保存退出后重启mysql

    1.点击“开始”->“运行”(快捷键Win+R)。
    2.启动:输入 

    net stop mysql

    3.停止:输入 

    net start mysql

    这时候在cmd里面输入mysql -u root -p就可以不用密码登录了,出现password:的时候直接回车可以进入,不会出现ERROR 1045 (28000),但很多操作都会受限制,因为我们不能grant(没有权限)。按下面的流程走(红色部分为输入部分,粉红色的是执行后显示的代码不用输入):

    1.进入mysql数据库:

    mysql> use mysql; 
    Database changed

    2.给root用户设置新密码,蓝色部分自己输入:

    mysql> update user set password=password("新密码") where user="root"; 
    Query OK, 1 rows affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0

    3.刷新数据库 

    mysql> flush privileges; 
    
    Query OK, 0 rows affected (0.00 sec)

    4.退出mysql: 

    mysql> quit Bye

    改好之后,再修改一下my.ini这个文件,把我们刚才加入的"skip-grant-tables"这行删除,保存退出再重启mysql就可以了。

    http://blog.csdn.net/hsg77/article/details/39159191

    在windows平台下MySql启动时的1067错误的解决方法及反思

    一、

    1、打开my.ini文件,找到default-storage-engine=InnoDB这一行,把它改成default-storage-engine=MyISAM。

    2、删除在MySQL安装目录下的Data目录中的ib_logfile0和ib_logfile1 3。找到在配置MySQL服务器时指定的InfoDB目录删除掉ibdata1

    根据my.ini文件中:

    #*** INNODB Specific options *** innodb_data_home_dir="D:/"。 4。重新启动MySQL的Service  

    根据我自己的实践,只要进行第三步就能解决问题。

    二、

     err文件内容:

    090417  9:02:55  InnoDB: Error: unable to create temporary file; errno: 2 090417  9:02:55 [ERROR] Plugin 'InnoDB' init function returned error. 090417  9:02:55 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 090417  9:02:55 [ERROR] Unknown/unsupported table type: INNODB 090417  9:02:55 [ERROR] Aborting

    090417  9:02:55 [Warning] Forcing shutdown of 1 plugins 090417  9:02:55 [Note] MySQL: Shutdown complete 

    经过一翻Google,找出了无法启动的原因:MySQL在安装的时候不会自动初始tmpdir(临时文件目录),所以要在配置文件my.ini中添加如下内容:

     [mysqld]

    #自己指定的临时文件目录

     tmpdir="D:/MySQL/MySQL Server 5.1/Temp"

     再次启动MySQL一切正常,在Temp文件夹下生成了一些*.tmp的临时文件。

     最后还是存在一些疑问:如果是由于没有初始化tmpdir,为什么在我第一次安装的时候也没有初始化,但也没有出现这样的问题?

    三、

     以前手动安装MySQL5.0.16的windows service时很顺利,昨晚为5.0.83安装service时,总是提示1067的错误。网上有人说把my.ini放到C:WINDOWS下就可以了,但我遇到的情况是问题仍然没有解决。我的解决办法是将参数中的--defaults-file用--defaults-extra-file取代,如下:

    mysqld-nt--install MySQL --defaults-file=E:/mysql-5.0.83-win32/my.ini

    改为

    mysqld-nt--install MySQL --defaults-extra-file=E:/mysql-5.0.83-win32/my.ini

     执行mysqld-nt --verbose --help能看到mysqld的用法,其中就有这两个参数的说明。

    C:UsersAdministrator>mysqld-nt --verbose --help|more
    mysqld-nt  Ver 5.0.96-community-nt for Win32 on ia32 (MySQL Community Edition (G
    PL))
    Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Starts the MySQL database server.
    
    Usage: mysqld-nt [OPTIONS]
    NT and Win32 specific options:
      --install                     Install the default service (NT)
      --install-manual              Install the default service started manually (NT
    )
      --install service_name        Install an optional service (NT)
      --install-manual service_name Install an optional service started manually (NT
    )
      --remove                      Remove the default service from the service list
     (NT)
      --remove service_name         Remove the service_name from the service list (N
    T)
      --enable-named-pipe           Only to be used for the default server (NT)
      --standalone                  Dummy option to start as a standalone server (NT

    根据我自己的实践,引起这个问题最大的可能性是数据表存储引擎(Engine,而言之,存储引擎就是指表的类型,即Table Type

    )引起的。MySQL数据库支持的数据表存储引擎有多种,可以用命令:show engines进行查看,在MySQL的配置文件my.ini中可以也看到(默认的是MyISAM):

    # The default storage engine that will be used when create new tables when default-storage-engine=MyISAM。

     

        常用的存储引擎还有InnoDB,InnoDB有多种优点,InnoDB给MySQL的表提供了事务、回滚、崩溃修复能力、多版本并发控制的事务安全.同时,InnoDB也是MySQL上第一个提供外键约束的引擎,而且InnoDB存储引擎对事务处理的能力也是MySQL其他存储引擎所无法与之比拟的。 

        InnoDB与MyISAM的区别:

        以InnoDB存储引擎存储的表,存储表结构的.frm与存储的表数据文件(ibdata1)是分开存放的,存储表数据的文件位置可以通过修改my.ini文件自行设置:

     #*** INNODB Specific options ***

    innodb_data_home_dir="D:/"

        以MyISAM存储引擎存储的表,一共包括3个文件:.frm(存储表的结构)文件,.MYD(MYouData的缩写,存储表的数据)文件,.MYI(MYIndex的缩写,存储表的索引),这个三个文件同时存放在MySQL数据库安装时存放数据的目录下,如F:ProgramDataMySQLMySQL Server 5.1dataDatabasename中。

        另外,通过对这次问题的解决,我认识到了查看错误日志的重要性,当遇到问题的时候,我们首先想到的应该是去查看错误日志,而不是不加思索去Google或者去baidu,其实从错误日志中我们能得到真正造成问题的原因,对症下药,才能药到病除。MySQL的错误日志(.err)位于F:ProgramDataMySQLMySQL Server 5.1data目录下,文件名一般为你的计算机名。

     http://blog.sina.com.cn/s/blog_600357e40100q5ub.html

    下面我建两个表,并执行一系列sql语句,仔细观察sql执行后表中数据的变化,很容易就能理解多表联合更新的用法

    student表                                                                         class表

        

    1. 执行 UPDATE student s , class c SET s.class_name='test00',c.stu_name='test00' WHERE s.class_id = c.id

    student表                                                                class表

        

    2. 执行 UPDATE student s JOIN class c ON s.class_id = c.id SET s.class_name='test11',c.stu_name='test11'

    student表                                                                  class表

        

    3. 执行 UPDATE student s LEFT JOIN class c ON s.class_id = c.id SET s.class_name='test22',c.stu_name='test22'

    student表                                                                      class表

        

    4. 执行 UPDATE student s RIGHT JOIN class c ON s.class_id = c.id SET s.class_name='test33',c.stu_name='test33'

    student表                                                                class表

        

    5. 执行 UPDATE student s JOIN class c ON s.class_id = c.id SET s.class_name=c.name , c.stu_name=s.name

    student表                                                                class表

        
    ---------------------
    作者:dapeng94
    来源:CSDN
    原文:https://blog.csdn.net/u012604745/article/details/80642015
    版权声明:本文为博主原创文章,转载请附上博文链接!

    mysql操作查询结果case when then else end用法举例

    Case具有两种格式。简单Case函数和Case搜索函数。 
    --简单Case函数 
    CASE sex 
             WHEN '1' THEN '男' 
             WHEN '2' THEN '女' 
    ELSE '其他' END 
    --Case搜索函数 
    CASE WHEN sex = '1' THEN '男' 
             WHEN sex = '2' THEN '女' 
    ELSE '其他' END 

    这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。 
    还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。 

    --比如说,下面这段SQL,你永远无法得到“第二类”这个结果 
    CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类' 
             WHEN col_1 IN ('a')       THEN '第二类' 
    ELSE'其他' END 
    https://www.cnblogs.com/clphp/p/6256207.html

    在日常开发中由于业务逻辑较为复杂,常常需要用到UPDATE和CASE...WHEN...THEN...ELSE...END一起做一些复杂的更新。有时候因为对这几个字句理解得不透彻会带来很大的困扰。因此对UPDATE和CASE WHEN结构的特性做进一步的测试。

      CASE WHEN的两种写法:
        Type 1: CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
        Type 2: CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

      结论:
        在第一个方案的返回结果中,value=compare-value.而第二个方案的返回结果是第一种情况的真实结果.
        如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为NULL,如果字段为NOT NULL则会根据不同数据类型返回不同的值(字符串类型时返回空字符串,数值类型时返回0,其它类型未做测试).

    注意:如果CASE...WHEN...THEN...END没有WHERE字句的话会将相应表的记录遍历一遍。

    创建测试表

    CREATE TABLE `goods` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL DEFAULT '',
      `type` varchar(255) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

    测试数据

    1
    2
    3
    4
    5
    6
    7
    8
    id name type
    1    1    1
    2    2    1
    3    3    2
    4    4    2
    5    5    3
    6    6    3
    7    7    4
    • 没有WHERE字句时会遍历所有记录
    UPDATE `goods` SET `type` = (
        CASE `name` WHEN 1 THEN 999  
        WHEN 2 THEN 1000  
        WHEN 3 THEN 1024  
        END)

      执行结果

    1
    2
    3
    4
    (7 row(s) affected, 4 warning(s))
    Execution Time : 00:00:00:000
    Transfer Time  : 00:00:00:047
    Total Time     : 00:00:00:047

      type为字符串时返回空字符串,执行后的数据

    1
    2
    3
    4
    5
    6
    7
    1   1   999
    2   2   1000
    3   3   1024
    4   4  
    5   5  
    6   6  
    7   7  

      type为整形时返回0,执行后的数据

    1
    2
    3
    4
    5
    6
    7
    1   1   999
    2   2   1000
    3   3   1024
    4   4   0
    5   5   0
    6   6   0
    7   7   0
    • 添加where字句
    UPDATE `goods` SET `type` = (
        CASE `name` WHEN 1 THEN 999  
        WHEN 2 THEN 1000  
        WHEN 3 THEN 1024  
        END)
    WHERE ID in(1, 2, 3);

      执行结果

    1
    2
    3
    4
    (3 row(s) affected)
    Execution Time : 00:00:00:000
    Transfer Time  : 00:00:00:016
    Total Time     : 00:00:00:016

      执行后的数据

    1
    2
    3
    4
    5
    6
    7
    1   1   999
    2   2   1000
    3   3   1024
    4   4   4
    5   5   5
    6   6   6
    7   7   7

      由此可见,做UPDATE时WHERE字句是多么的重要。做UPDATE更新时请时刻记住WHERE这条尾巴。

    https://www.cnblogs.com/rwxwsblog/p/4512061.html

  • 相关阅读:
    Linux 命令
    oracle sqlplus链接和sid
    sql 应用记录
    数据库接口基础类 oracle,sql server
    oracle 触发器
    js json -> <-object
    Docker学习总结(三)--常用命令
    MySQL之binlog日志
    Redis学习总结(九)-- Redis常用技巧
    Redis学习总结(八)--Redis云平台
  • 原文地址:https://www.cnblogs.com/softidea/p/4676427.html
Copyright © 2011-2022 走看看