zoukankan      html  css  js  c++  java
  • mysql

    mysql

    一. 基本操作

    1.显示

    show databases;

    show tables;

    use 数据库名称;

    desc 表名;

    select * from 表名;

    show create table 表名;

    show create table 表名 G;

    msyql备份:

        mysqldump -u root db1 > db1.sql -p 

         mysqldump -u root -d db1 > db1.sql -p

    执行文件:

        create database db5;

        mysql -u root -d db5 < db1.sql -p

    2. 自增步长

      基于会话级别:

        show session variables like 'auto_inc%';  查看全局变量

        set session auto_increment_increment=2;  设置会话步长

        set session auto_increment_offset=10   设置从哪里开始

      基于全局级别:

        show global variables like 'auto_inc%';

        set global auto_increment_increment=2;

        set global auto_increment_offset=10    设置从哪里开始

    alter table 表名 AUTO_INCREMENt=20

      基础表级别:

        create table t1(

          pid,int(11) not null auto_increment,primary key

          )engine=innobd auto_increment=4 default charset=utf8

    3.增删改查

      1.创建用户:

        create user 'alex'@'192.168.1.1' identified by '123';

        create user 'alex'@'%' identified by '123';

      2.授权

        grant select,insert,update on db1.t1 to 'alex'@'%';

        grant all privileges on *.* to 'alex'@'%';

        revoke all privileges on db1.t1 from 'alex'@'%';

      3.操作文件

      建表:

        create table t1(

        id int not null auto_increment primary key,

        name char(10),

        )engine=innodb default charset=utf8

      清空表:

        清空数据,但保留表定义结构

        delete from t1;

        truncate from t1;  清除自增的

        删除表:

        drop table t1;

        插入数据:

        insert into t1(id,name) values(1,'alex'),(2,'susy');

        insert into t1(age,name) select age,name from t2; 

        删除:

        delete from t1 where id<6;

        delete from t1 where id !=2;

        delete from t1 where id >=2;

        delete from t1 where id <=2 or name='alex';

        修改:

        update t1 set age=18 where age=17;

        查看:

        select * from t1;

        select id,name from t2 where id > 10 or name='xx';

        select * from t2 where id !=1;

        select * from t2 where id in (1,4,12);

        select * from t2 where id not in (1,5,12);

        select * from t2 where id in (select id from t3);

        select * from t2 where id between 5 and 12;

        通配符:

        select * from t2 where name like "ale%";  ale开头的所有(多个字符串)

        select * from t2 where name like "ale_";   ale开头的所有(1个字符串)

        限制:

        select * from t1 limit 5;      前5行

        select * from t1 limit 4,5;   从第5行开始往后5行

        select * from t1 limit 5 offset 4   从第5行开始读5行

        排序:

        select * from t1 order by age asc;    从小到大

        select * from t1 order by age desc;  从大到小

        select * from t1 order by age desc,sid asc    age大到小,sid小到大

        分组:

        select num from t1 group by num;

        select num,nid from t1 group by num,nid;

        select num,nid from t1 where nid > 10 group by num,nid order nid desc;

        select num,nid,count(*)

        排序:

            order by desc/asc

        条件:

            

        select from 表 where id > 1 and name != 'alex' and num = 12;
     
        select from 表 where id between and 16;
     
        select from 表 where id in (11,22,33)
        select from 表 where id not in (11,22,33)
        select from 表 where id in (select nid from 表)

        连表:

            left join

            right join

            inner join

        临时表:

          select * from (select * from tb where id<10 ) as B;

        通配符:

          select * from 表 where name like 'ale%';    #ale开头的所有(多个字符)

          select * from 表 where name like 'ale_';  #ale开头的所有(一个字符)

        分页: limit

        

        组合: union()  ,union all()

          select id,name from t1 union select num,name from t2  #自动去重

          select sid,sname from student union all  select sid,sname from student  #不去重

        

        4.视图(虚拟)

          1.创建

            create view 视图名称 as SQL

          2.修改

            alter view 视图名称 as SQL

          3.删除

            drop view 视图名称

        5.触发器

          当对某张表做:  增删改查,可以使用触发器自定义关联行为

          insert into tb (

          delimiter //

          create trigger t1 BEFORE insert on student for each row

          BEGIN

          INSERT into teacher(tname) values(NEW.sname);

          INSERT into teacher(tname) values(NEW.sname);

          INSERT into teacher(tname) values(NEW.sname);

          END //

          delimiter ;

          )

        6.函数

          内置函数:

            执行函数 select CURDATE();

            

        自定义函数(有返回值)

          delimiter \

            create function f1(

            i1 int,

            i2 int)

            return int

            BEGIN

              declare num int default 0;

              set num = i1 +i2

              return(num);

                END \

            delimiter ;

            select f1(1,100)

        7.存储过程

          保存在MySQL上的一个别名

          1.创建存储过程

             delimiter  //

             create procedure p1()

               BEGIN

                select * from t1;

               END  //

             delimiter  ;

             call  p1()          #执行存储过程

              或者  cursor.callproc('p1')

          2.接收的参数:

            1.in              仅用于传入参数用

            2.out    仅用于返回值用

            3.inout    既可以传入又可以当做返回值

          3.事务

            delimiter \

            create procedure p4(

              out p_return_code tinyint

            )

            BEGIN

              DECLARE exit handler for sqlexception

              BEGIN

                -- ERROR

                set p_return_code = 1;

                rollback;

              END;

              START TRANSACTION;

                delete from tb1;

                insert into tb2(name)values('seven');

              COMMIT;

              

              -- SUCCESS

              set p_return_code = 2;

              END \

          4. 游标

            delimiter //

              create procedure p6()

            begin

              declare row_id int;   ---- 自定义变量1

              declare row_num int;    ----自定义变量2

              declare done INT default FALSE;

              declare temp int;

            

              declare my_cursor CURSOR for select id,num from A;

              declare continue handler for not found set done = TRUE;

        

              open my_cursor;

                xxoo: LOOP

                    fetch my_cursor into row_id,row_num;

                    if done then

                      leave xxoo;

                    END IF;

                    set temp  = row_id + row_num;

                    insert into B(number) values(temp);

                end loop xxoo;

              close my_cursor;

            end //

            delimiter;

          

          动态执行SQL(防止SQL注入)

              delimiter  //

              create procedure p7(

                  in  tpl varchar(255),

                  in  arg  int

              )        

              begin

                1. 预检测某个东西  SQL语句合法性

                2. SQL=格式化 tpl + arg

                3. 执行SQL语句

                set  @xo = arg;

                PREPARE xxx FROM 'select from students where sid > ?'

                EXECUTE xxx USING @xo;

                DEALLOCATE prepare prod;

              end //

              delimiter  ;

              call p7("select  *  from  tb  where id  > ?",9)

        8.索引

          1.作用

            -- 约束

            -- 加速查找

          2.分类

            -- 主键索引:加速查找 + 不能为空 + 不能重复

            -- 普通索引:加速查找

            -- 唯一索引: 加速查找 + 不能重复 + 可以为空

            -- 联合索引(多列):

              -- 联合主键索引

              -- 联合唯一索引

              -- 联合普通索引

          

          普通索引:

              create table userinfo(

                  nid int not null auto_increment primary key,

                  name varchar(32) not null,

                  email varchar(64) not null,

                  index ix_name (name)

              )

          或者     create index index_name on userinfo(name)

              create index ix_extra on userinfo(extra(32));  ##对于创建索引时如果是BLOB和TEXT类型,必须制定length

              drop index_name on userinfo

              show index from userinfo;

          唯一索引

              create table n1(

                nid int not null auto_incrment primary key,

                name varchar(32) not null,

                email varchar(32) not null,

                extra text,

                unique ix_name (name)

    )

          或者  create unique index index_name on userinfo(name)  

              drop unique index index_name on userinfo    

          主键索引

              create table userinfo(

                  nid int not null auto_increment primary key,

                  name varchar(32) not null,

                  email varchar(64) not null,

                  index ix_name (name)

    )

          alter table userinfo add primary key(name);          

          alter table userinfo drop primay key;

          alter table userinfo modify age int,drop primary key;

          

          组合索引(最左前缀匹配):

              create unique index 索引名称 on 表名(列名,列名)

              drop unique index 索引名称 on 表名

              create index ix_name_email on userinfo(name,email,)

              最左前缀匹配

                select * from userinfo where name='alex'   #最左前缀            

                select * from userinfo where name='alex' and email='alex@qq.com'

                select * from userinfo where email='alex@qq.com'     # 这个查不到!!!

              组合索引效率 > 索引合并      

                组合索引

                  -(name,email,)

                   select  * from userinfo where name='alex' and email='alex@qq.com'

                   select  * from userinfo where name='alex'

                索引合并

                  -name

                  -email

                    select  * from userinfo where name='alex' and email='alex@qq.com'

                    select  * from userinfo where name='alex'               

                    selcct  * from userinfo where email='alex@qq.com'

                名词:

                  覆盖索引:

                    -- 在索引文件中直接获取数据

                  索引合并:

                    -- 把多个单列索引合并使用

                

          3.分类(某种格式存储)

            hash索引:(规定的数字索引)

              单值快

              范围

            btree索引:btree索引

              二叉树

            建立索引:

              -a. 额外的文件保存特殊的数据结构

              -b. 查询快,插入更新删除慢

              -c. 命中索引

                select * from userinfo where email='abc'  !!

                select * from userinfo where email like 'abc'  慢

          4.时间

            执行计划: 让mysql预估执行操作

              all < index < range < index_merge < ref < eq_ref < system/const

            慢:

              explain select * from userinfo where name='alex'

               type: ALL(全表扫描)

            快:

               type:const(走索引)

                ALL             全表扫描,对于数据表从头到尾找一遍
                                select * from tb1;
                                特别的:如果有limit限制,则找到之后就不在继续向下扫描
                                       select * from tb1 where email = 'seven@live.com'
                                       select * from tb1 where email = 'seven@live.com' limit 1;
                                       虽然上述两个语句都会进行全表扫描,第二句使用了limit,则找到一个后就不再继续扫描。
    
                INDEX           全索引扫描,对索引从头到尾找一遍
                                select nid from tb1;
    
                RANGE          对索引列进行范围查找
                                select *  from tb1 where name < 'alex';
                                PS:
                                    between and
                                    in
                                    >   >=  <   <=  操作
                                    注意:!= 和 > 符号
    
    
                INDEX_MERGE     合并索引,使用多个单列索引搜索
                                select *  from tb1 where name = 'alex' or nid in (11,22,33);
    
                REF             根据索引查找一个或多个值
                                select *  from tb1 where name = 'seven';
    
                EQ_REF          连接时使用primary key 或 unique类型
                                select tb2.nid,tb1.name from tb2 left join tb1 on tb2.nid = tb1.nid;
    
    
    
                CONST           常量
                                表最多有一个匹配行,因为仅有一行,在这行的列值可被优化器剩余部分认为是常数,const表很快,因为它们只读取一次。
                                select nid from tb1 where nid = 2 ;
    
                SYSTEM          系统
                                表仅有一行(=系统表)。这是const联接类型的一个特例。
                                select * from (select nid from tb1 where nid = 1) as A;

          5.慢日志查询

            a.配置mysql自动记录慢日志

              slow_query_log = OFF  是否开启慢日志记录

              long_query_time = 2  时间限制,超过此时间,则记录

              slow_query_log_file = /usr/slow.log  日志文件

              log_queries_not_using_indexes = OFF  为使用索引的搜索是否记录

            查看当前配置信息: show variables like '%query%'

            修改当前配置:  set global 变量名 = 值

          6.分页

            a.select * from userinfo limit 200,10'

            b.select * from userinfo limit where id in (select id from userinfo limit 2000,10)

            c.select * from userinfo where id<max_id order by id desc limit 10;

            d.select * from userinfo where id in (

              select id from (select id from userinfo where id > max_id limit 30) as N order by N.id desc limit 10

    )

      

        

       

  • 相关阅读:
    实现FTP断点续传
    系统软件自动部署实现方案
    QT实现多语言切换
    QTreeWidget实现动态加载本地文件系统
    QuaZip实现多文件打包
    FileZilla命令行实现文件上传以及CreateProcess实现静默调用
    ctkPlugin插件系统实现项目插件式开发
    Windows与Linux下文件操作监控的实现
    QT皮肤系统的动态切换
    OpenGL 学习
  • 原文地址:https://www.cnblogs.com/jiangshitong/p/6957342.html
Copyright © 2011-2022 走看看