Mysqlベースシリーズ(二)


この章の内容:
  • 表示作成使用データベースの削除
  • ユーザー管理及び授権実戦
  • ローカルエリアネットワークリモート接続法
  • 「作成」「使用」「削除」「クリア」「データベース表の変更」
  • .
  • 表内容の添削調査
  • where条件、ワイルドカード_%、制限limit、ソートdescasc、連表join、組合せunion
  • 構築文の表示、テーブル構造の表示、インデックスの有無の表示
  • データ型
  • インデックス!

  • 一、データベース操作
    1、データベースの表示
    SHOW DATABASES;
    
    #      :
      mysql -         
      test -         
      information_schema - MySQL        

    2、データベースの作成
    # utf-8   
    CREATE DATABASE       DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 
    # gbk   
    CREATE DATABASE       DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

    3、データベースの使用
    USE db_name;
    #        

     4、ユーザー管理
    #     
        create user '   '@'IP  ' identified by '  ';
    #     
        drop user '   '@'IP  ';
    #     
        rename user '   '@'IP  '; to '    '@'IP  ';;
    #     
        set password for '   '@'IP  ' = Password('   ')
      
    PS:           mysql    user  ,             (   )
    #       
            select user();
    #       
            select host,user from mysql.user;
    #          
            SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
    #          
            show grants for 'nick'@'%';
    mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
    +---------------------------+
    | query                     |
    +---------------------------+
    | User: 'nick'@'%';         |
    | User: 'root'@'localhost'; |
    +---------------------------+
    rows in set (0.00 sec)
    
    mysql>
    mysql>
    mysql>
    mysql>
    mysql> select host,user from mysql.user;
    +-----------+------+
    | host      | user |
    +-----------+------+
    | %         | nick |
    | localhost | root |
    +-----------+------+
    rows in set (0.00 sec)
    
    mysql> show grants for 'nick'@'%';
    +-----------------------------------------------------------------------------------------------------+
    | Grants for nick@%                                                                                   |
    +-----------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'nick'@'%' IDENTIFIED BY PASSWORD '*ECE7D02DCD7D4EF7CFE8E3B249FD1D5062A821F7' |
    | GRANT ALL PRIVILEGES ON `kaoshi`.* TO 'nick'@'%'                                                    |
    | GRANT ALL PRIVILEGES ON `xxxxx`.* TO 'nick'@'%'                                                    |
    | GRANT ALL PRIVILEGES ON `xxxxxx`.`chouti` TO 'nick'@'%'                                              |
    +-----------------------------------------------------------------------------------------------------+
    rows in set (0.00 sec)
    
    mysql>

    5、授権管理
    #     
        show grants for '  '@'IP  '
    #   
        grant     on    .  to   '  '@'IP  '
    #     
        revoke    on    .  from '  '@'IP  '
        :
                all privileges    grant      
                select               
                select,insert          
                usage                 
    
                 :
                    .*                  
                    .                     
                    .                    
                *.*                      
    
         IP:
                   @IP                 IP     
                   @192.168.1.%         IP      (   %    )
                   @%                    IP   (  IP   %)

    権限の詳細:
    all privileges   grant      
                select              
                select,insert         
                ...
                usage                        
                alter                     alter table
                alter routine             alter procedure drop procedure
                create                    create table
                create routine            create procedure
                create temporary tables   create temporary tables
                create user               create user、drop user、rename user revoke  all privileges
                create view               create view
                delete                    delete
                drop                      drop table
                execute                   call     
                file                      select into outfile   load data infile
                grant option              grant   revoke
                index                     index
                insert                    insert
                lock tables               lock table
                process                   show full processlist
                select                    select
                show databases            show databases
                show view                 show view
                update                    update
                reload                    flush
                shutdown                  mysqladmin shutdown(  MySQL)
                super                     change master、kill、logs、purge、master set global。   mysqladmin    
                replication client              
                replication slave              

    追加管理者の追加
    mysql> delete from mysql.user;
    Query OK, 2 rows affected (0.00 sec)
    mysql> grant all privileges on *.* to system@'localhost' identified by 'mackei' with grant option;
    Query OK, 0 rows affected (0.00 sec)
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    mysql> select user,host from mysql.user;
    +--------+-----------+
    | user   | host      |
    +--------+-----------+
    | system | localhost |
    +--------+-----------+
    row in set (0.00 sec)
    mysql>

    簡単な例:
    grant all privileges on db1.tb1 TO '   '@'IP'
    
                grant select on db1.* TO '   '@'IP'
    
                grant select,insert on *.* TO '   '@'IP'
    
                 revoke select on db1.t

    一般ユーザーの追加
    create user mackei@localhost identified by 'admin';
    GRANT ALL ON test.* TO 'mackei'@'localhost';        #  
    show grants for admin@localhost;
    flush privileges;

    6、ローカルエリアネットワーク内ホストのリモート接続データベースを許可する
    #      
        grant all on *.* to 'test'@'192.168.200.%' identified by 'test123';
    #       
        grant all on *.* to 'test'@'192.168.200.0/255.255.255.0' identified by 'test123';
    #    
        flush privileges;
    #      
        mysql -utest -ptest123 -h 192.168.200.96

     二、表操作
    1、テーブルの作成
    #     :
    create table   (
                                   ,
                      
    )ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    not null         #      
    default 1        #     1
    auto_increment   #   
    primary key      #   
    constraint     foreign key (    ’  ‘) references   (    )    #   
        ,
         null   ,                
         not null    -    
         null        -   
         ,           ,             ,        
    
    create table tb1(
                    nid int not null defalut 2,
                    num int not null
                )
      ,          ,           ,     (          )
                create table tb1(
                    nid int not null auto_increment primary key,
                    num int null
                )
                 
                create table tb1(
                    nid int not null auto_increment,
                    num int null,
                    index(nid)
                )
                  :1、     ,     (   )。
                     2、              
                         show session variables like 'auto_inc%';
                         set session auto_increment_increment=2;
                         set session auto_increment_offset=10;
    
                         shwo global  variables like 'auto_inc%';
                         set global auto_increment_increment=2;
                         set global auto_increment_offset=10;
      ,         ,      ,         ,        ,     ,        。
                create table tb1(
                    nid int not null auto_increment primary key,
                    num int null
                )
                 
                create table tb1(
                    nid int not null,
                    num int not null,
                    primary key(nid,num)
                )
      ,       ,       
                creat table color(
                    nid int not null primary key,
                    name char(16) not null
                )
    
                create table fruit(
                    nid int not null primary key,
                    smt char(32) null ,
                    color_id int not null,
                    constraint fk_cc foreign key (color_id) references color(nid)
                )

     2、テーブルの削除
    drop table   

    3、テーブルを空にする
    #     ,     delete from   
    truncate table   

    4、表の修正
    #    :
            alter table    add      
    #    :
            alter table    drop column   
    #    :
            alter table    modify column      ;  --   
            alter table    change           ; --   ,  
    #     :        alter table    add primary key(  );
    #     :        alter table    drop primary key;
                        alter table     modify     int, drop primary key;
    #     :        
    alter table    add constraint     (  :FK_  _  ) foreign key   (    ) references   (    );
    #     :
    alter table    drop foreign key     
    #      :
            ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;#      :
            ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
    #     
             rename table     to    ;
           
    
    #     ,altertable 。
    1>      : altertable    add         ;
    2>       ,  sex。
    mysql> alter table student add sex char(4);
    Query OK, 3 rows affected (0.01 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> select * from student;
    +----+----------+-----+------+------+
    | id | name     | age | dept | sex  |
    +----+----------+-----+------+------+
    |  2 | oldsuo   |   0 | NULL | NULL |
    |  3 | kangknag |   0 | NULL | NULL |
    |  4 | kangkang |   0 | NULL | NULL |
    +----+----------+-----+------+------+
    rows in set (0.00 sec)
    3>        suo  name  。
    mysql> alter table student add suo int(4) after name;
    Query OK, 6 rows affected (0.00 sec)
    Records: 6  Duplicates: 0  Warnings: 0
    4>        qq    。
    mysql> alter table student add qq varchar(15) first;
    Query OK, 6 rows affected (0.00 sec)
    Records: 6  Duplicates: 0  Warnings: 0
    
    #     ,rename 。
    1>      : rename table     to    ;
    2>      oldsuo  oldning。
    mysql> rename table oldsuo to oldning;
    Query OK, 0 rows affected (0.00 sec)
    mysql> show tables;
    +--------------------------+
    | Tables_in_nick_defailt |
    +--------------------------+
    | oldning                  |
    | student                  |
    +--------------------------+
    rows in set (0.00 sec)
    
    #   
    1>      :drop table ;
    2>         test 。
    mysql> drop table test;
    Query OK, 0 rows affected (0.00 sec)

    三、表内容操作
    1、増加 :insert into ( , ...) values ( , , ...)
    #       
            insert into   (  ,  ...) values ( , , ...)
    #       
           insert into   (  ,  ...) values ( , , ...),( , , ...)
    #             
            insert into   (  ,  ...) select   ,  ... from  

    2、削除 :delete from
    delete from  ;
    delete from   where id=1;

    3、変更 :update set name = 'mackei' where id>1
    update   set name = 'nick' where id>1

    4、調べる :select * from
    select * from  
    select * from   where id > 1
    select nid,name,gender as gg from   where id > 1
    
    # as    

    5、条件 :select * from where id > 1
    select * from   where id > 1 and name != 'nick' and num = 12;    #     
    select * from   where id between 5 and 16;                       # id 5 16  
    select * from   where id in (11,22,33);                          # id    
    select * from   where id not in (11,22,33);                      # id     
    select * from   where id in (select nid from  );                # id      

    6、ワイルドカード :select * from where name like '_n%'
    select * from   where name like 'ni%'  # ni     (     )
    select * from   where name like 's_'   # s     (    )

    7、制限 :select * from limit 9,5;
    select * from   limit 5;            #  5 
    select * from   limit 9,5;          #   9    5 
    select * from   limit 5 offset 9    #   9    5 

    8、並べ替え :select * from order by 1 desc, 2 asc
     select * from   order by   asc             #    “ ”       
     select * from   order by   desc            #    “ ”       
     select * from   order by  1 desc, 2 asc   #    “ 1”       ,       2      

    9、グループ化 :select num from group by num
    select num from   group by num           #   num  
        select num,nid from   group by num,nid   #   num nid  
        select num,nid from    where nid > 10 group by num,nid order nid desc
        select num,nid,count(*),sum(score),max(score),min(score) from   group by num,nid  #     
        select num from   group by num having max(id) > 10    #              
     
         :group by    where  ,order by  
    count(*)、count(1) #     
    sum(score)        #    
    max(score)        #      
    min(score)        #      
    
    having            #           having。

    10、連結表 :inner join . onleft join . onright join . on
             
        select A.num, A.name, B.name
        from A,B
        Where A.nid = B.nid
     
                 
        select A.num, A.name, B.name
        from A inner join B
        on A.nid = B.nid
     
        A     ,  B      ,   null
        select A.num, A.name, B.name
        from A left join B
        on A.nid = B.nid
     
        B     ,  B      ,   null
        select A.num, A.name, B.name
        from A right join B
        on A.nid = B.nid

    11、組み合わせ :unionunion all
      ,      
        select nickname
        from A
        union
        select name
        from B
     
          ,     
        select nickname
        from A
        union all
        select name
        from B

    四、その他の命令
    1、建表文の表示 show create table \G 
    mysql> use mackei_defailt
    Database changed
    mysql> create table student (
          id int(4) not null,
          name char(20) not null,
          age tinyint(2) NOT NULL default '0',
          dept varchar(16) default NULL
          );
    Query OK, 0 rows affected (0.05 sec)
    mysql> show create table student\G        #      
    *************************** 1. row ***************************
           Table: student
    Create Table: CREATE TABLE `student` (      #CREATE TABLE         ,student   。
      `id` int(4) NOT NULL,                     #   ,    ,   4,    。
      `name` char(20) NOT NULL,                 #   ,      ,  20,    。
      `age` tinyint(2) NOT NULL DEFAULT '0',    #   ,       ,   2   ,  0。
      `dept` varchar(16) DEFAULT NULL           #   ,      ,  16,    。
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1      #      ,    InnoDB,   lantin1。
    row in set (0.00 sec)

    2、表構造の表示desc ;
    mysql> desc student;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(4)      | NO   |     | NULL    |       |
    | name  | char(20)    | NO   |     | NULL    |       |
    | age   | tinyint(2)  | NO   |     | 0       |       |
    | dept  | varchar(16) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    rows in set (0.04 sec)

    3、索引付けの有無を確認する explain select * from where name ='nick' \G 
    このコマンドを使用して、sql文に最適化の余地があるかどうかを確認します.
    mysql> explain select * from student where name ='student' \G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: student
             type: ref     # 
    possible_keys: index_name
              key: index_name  #   ,     
           key_len: 20
              ref: const
             rows: 1           #     
            Extra: Using where
    row in set (0.00 sec)

    五、データ型
    新しいことを学ぶにはデータ型が欠かせない.MySQLのデータ型は簡単だ.
    大きく分けて数字、文字列、時間です.
    では、詳しく見てみましょう.
    bit[(M)]
                    (101001),m         (1-64),  m=1
    
            tinyint[(m)] [unsigned] [zerofill]
    
                   ,                   :
                   :
                    -128 ~ 127.
                   :
    ~ 255
    
                   : MySQL     ,  tinyint(1)  。
    
            int[(m)][unsigned][zerofill]
    
                  ,                   :
                       :
                        -2147483648 ~ 2147483647
                       :
    ~ 4294967295
    
                   :      m     ,        。  : int(5),     2 ,select       : 00002
    
            bigint[(m)][unsigned][zerofill]
                   ,                   :
                       :
                        -9223372036854775808 ~ 9223372036854775807
                       :
     ~  18446744073709551615
    
            decimal[(m[,d])] [unsigned] [zerofill]
                      ,m      (    ),d       。 m    65,d    30。
    
                   :               
                       decaimal                      。
    
            FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
                      (      ),m      ,d       。
                       :
                        -3.402823466E+38 to -1.175494351E-38,
                        1.175494351E-38 to 3.402823466E+38
                       :
                        1.175494351E-38 to 3.402823466E+38
    
                ****     ,     ****
    
            DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
                      (      ),m      ,d       。
    
                       :
                        -1.7976931348623157E+308 to -2.2250738585072014E-308
                        2.2250738585072014E-308 to 1.7976931348623157E+308
                       :
                        2.2250738585072014E-308 to 1.7976931348623157E+308
                ****     ,     ****
    
    
            char (m)
                char                ,       255   。  m        。
                PS:       m  ,    m  
            varchar(m)
                varchars            ,       255   。  m                     ,                           。
    
                 :  varchar        ,              ,char           ,        varchar     50%。  ,                     ,         
    
            text
                text               ,     65535 (2**16  1)   。
    
            mediumtext
                A TEXT column with a maximum length of 16,777,215 (2**24  1) characters.
    
            longtext
                A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32  1) characters.
    
    
            enum
                    ,
                An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
                  :
                    CREATE TABLE shirts (
                        name VARCHAR(40),
                        size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
                    );
                    INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');
    
            set
                    
                A SET column can have a maximum of 64 distinct members.
                  :
                    CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
                    INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
    
            DATE
                YYYY-MM-DD(1000-01-01/9999-12-31)
    
            TIME
                HH:MM:SS('-838:59:59'/'838:59:59')
    
            YEAR
                YYYY(1901/2155)
    
            DATETIME
    
                YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)
    
            TIMESTAMP
    
                YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037    )

    六、索引
    1、索引の概要
    インデックスはテーブルのインデックスディレクトリであり、コンテンツを検索する前にディレクトリ内のインデックス位置を調べて、クエリーデータを迅速に位置決めします.
    新華字典のインデックスと理解できる.
    インデックスは追加のファイルに保存されます.
    2、索引の種類
    一般的なインデックスの種類と機能:
  • 一般インデックス:クエリー
  • のみを高速化
  • 一意インデックス:クエリーの加速+カラム値一意(null可能)
  • プライマリ・キー・インデックス:クエリーの加速+カラム値一意+テーブルにnullは1つのみ(nullは不可)
  • コンポジットインデックス:複数のカラム値からなるインデックスで、コンポジット検索に特化しており、インデックスマージ
  • よりも効率的です.
  • 全文インデックス:テキストの内容を分詞し、検索する 

  • ≪索引のマージ|Index Merge|emdw≫:複数の単一列の索引の組合せを使用して索引を検索します.selectのデータ列は索引からのみ取得できます.データ行を読み込む必要はありません.つまり、問合せ列は構築された索引で上書きされます.
    a、普通索引
    #     +   
    create table in1(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        index ix_name (name)
    )
    #     
    create index index_name on table_name(column_name)
    #     
    drop index_name on table_name;
    #     
    show index from table_name;
    #  :          BLOB   TEXT   ,    length。
    create index ix_extra on in1(extra(32));

    b、一意索引
    #     +     
    create table in1(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        unique ix_name (name)
    )
    #       
    create unique index     on   (  )
    #       
    drop unique index     on   

    c、主キーインデックス
    #     +     
    create table in1(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        index ix_name (name)
    )
    
    OR
    
    create table in1(
        nid int not null auto_increment,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        primary key(ni1),
        index ix_name (name)
    )
    #     
    alter table    add primary key(  );
    #     
    alter table    drop primary key;
    alter table     modify     int, drop primary key;

    d、コンビネーションインデックス
    結合インデックスは、複数のカラムを1つのインデックスに結合してクエリーします.
    適用シーン:where name='Mackei'and age=22など、頻繁に複数のカラムを使用してクエリーを行います.
    #    
    create table mess(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        age int not null
    )
    
    #       
    create index ix_name_age on mess(name,age);

    前述のように、結合インデックスを作成した後、クエリは次の点に注意してください.
  • name and email  -->インデックスを使用するには、nameは必ず前の
  • に配置します.
  • name                 -->インデックス
  • の使用
  • email                 -->インデックスを使用しない
  • 注:複数の条件を同時に検索する場合、結合インデックスのパフォーマンスは、複数の単一インデックスのマージよりも優れています.
    3、関連命令
    #     
        show index from    
     
    #       
        set profiling = 1;  #   profiling
        SQL...              #   SQL  
        show profiles;      #     

    4、インデックスを正しく使用する方法
    # like '%xx',  %_    
        select * from tb1 where name like '%n';
    
    #     
        select * from tb1 where reverse(name) = 'nick';
    
    # or
        select * from tb1 where nid = 1 or email = '[email protected]';
         : or              ,      
    
    #      
                 ,             。
        select * from tb1 where name = 999;
    
    # !=,   
        select * from tb1 where name != 'nick'
         :     ,       
            select * from tb1 where nid != 123
    
    # >,  
        select * from tb1 where name > 'nick'
         :             ,       
            select * from tb1 where nid > 123
            select * from tb1 where num > 123
    
    # order by
        select email from tb1 order by name desc;
                 ,           ,     
         :       ,      :
            select * from tb1 order by nid desc;
     
    #         
               :(name,email),    :
        name and email       --     
        name                 --     
        email                --      

    5、注意事項
    #     select *
    # count(1) count( )    count(*)
    #         char    varchar
    #                
    #             (           )
    #        
    #     (JOIN)      (Sub-Queries)
    #             
    #      (   )      , :     

    6、実行計画explain + SQL   SQL実行情報パラメータを表示するために使用され、参照情報に基づいてSQL最適化が可能
    mysql> explain select * from testdb;
    +----+-------------+---------+------+---------------+------+---------+------+------+-------+
    | id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra |
    +----+-------------+---------+------+---------------+------+---------+------+------+-------+
    |  1 | SIMPLE      | testdb | ALL  | NULL          | NULL | NULL    | NULL |    4 |       |
    +----+-------------+---------+------+---------------+------+---------+------+------+-------+
    row in set (1.67 sec)
    id
                  
                 :mysql> explain select * from (select nid,name from tb1 where nid  | ALL   | NULL          | NULL    | NULL    | NULL |    9 | NULL        |
                |  2 | DERIVED     | tb1        | range | PRIMARY       | PRIMARY | 8       | NULL |    9 | Using where |
                +----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
               :    union       null
    
    
        select_type
                
                SIMPLE              
                PRIMARY              
                SUBQUERY              
                DERIVED            
                UNION             
                UNION RESULT           
                ...
        table
                   
    
    
        type
                    ,  :all    >=     
    
    
                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;
        possible_keys
                   
    
        key
                 
    
        key_len
            MySQL         
    
        rows
            mysql                  ------      
    
        extra
                MySQL         
            “Using index”
                    mysql       ,      。        index       。
            “Using where”
                    mysql                  ,  where          , (    )      ,         ,       where         “Using where”。  “Using where”         :           。
            “Using temporary”
                    mysql                 。
            “Using filesort”
                    mysql              ,              。mysql         ,                    ,explain     mysql          ,                    。
            “Range checked for each record(index map: N)”
                            ,                 ,N    possible_keys       ,      。