MySQLのいくつかの模様の技

12314 ワード

彼は、ここはたくさん游んでいるようですが、データベースの文が面白いものはありませんか?しかし、手書きで何本か書いたので、本を読んで実践するのはいいと思います.
  • CASE WHEN
    じょうけんけっていしき
  • #         ,    
    mysql> SELECT `name`,`age`,`sex` FROM `admin`;
    +----------+-----+-----+
    | name     | age | sex |
    +----------+-----+-----+
    | AlicFeng |  21 |   1 |
    | Alice    |  20 |   0 |
    +----------+-----+-----+
    
    #   CASE WHEN         
    mysql> SELECT `name`,`age`,CASE `sex` WHEN 1 THEN ' ' WHEN 0 THEN ' ' ELSE '   ' END AS `sex` FROM `admin`;
    +----------+-----+-----+
    | name     | age | sex |
    +----------+-----+-----+
    | AlicFeng |  21 |    |
    | Alice    |  20 |    |
    +----------+-----+-----+
    
  • IFNULL
    空併処理であるか否かを判断し、空値を判断する処理は、空値を許容する列があれば自動的にインデックスが削除されるので、使用は推奨されません.知っていればいいのに.
  • #        ,     
    mysql> SELECT `name`,`message` FROM `admin`;
    +----------+--------------------------------------------+
    | name     | message                                    |
    +----------+--------------------------------------------+
    | AlicFeng |       ,      。               |
    | Alice    | NULL                                       |
    +----------+--------------------------------------------+
    
    #     ,    
    mysql> SELECT `name`,IFNULL(`message`,"    ,        。") AS `message` FROM `admin`;
    +----------+--------------------------------------------+
    | name     | message                                    |
    +----------+--------------------------------------------+
    | AlicFeng |       ,      。               |
    | Alice    |     ,        。                |
    +----------+--------------------------------------------+
    
    
  • IF(EXP1,VALUE1,VALUE2)
    IF条件判断、EXP式が成立していればVALUE 1、そうでなければVALUE 2
  • # default SELECT
    mysql> SELECT `name`,`age` FROM `admin`;
    +----------+-----+
    | name     | age |
    +----------+-----+
    | AlicFeng |  21 |
    | Alice    |  20 |
    +----------+-----+
    
    #                    
    mysql> SELECT `name`,IF(`age`>20,"     ","     ") AS `who` FROM `admin`;
    +----------+-----------------+
    | name     | who             |
    +----------+-----------------+
    | AlicFeng |            |
    | Alice    |            |
    +----------+-----------------+
    
  • UNIONおよびUNION ALL合併です.これは何も面白くありません.ただし、クエリーのフィールド名は同じでなければなりません.どのテーブルから来ても、ALLでは同じローは削除されません.使用はなるべく括弧で囲んでください.そうしないとLIMIT、ORDER BYでエラーが表示されます.
  • # UNION 
    mysql> (SELECT `name` FROM `admin`) UNION (SELECT `name` FROM `user`);
    +----------+
    | name     |
    +----------+
    | AlicFeng |
    | Alice    |
    |        |
    +----------+
    
    # UNION ALL
    mysql> (SELECT `name` FROM `admin`) UNION (ALL SELECT `name` FROM `user`);
    +----------+
    | name     |
    +----------+
    | AlicFeng |
    | Alice    |
    |        |
    | AlicFeng |
    +----------+
    
  • GROUP BY + SUM + COUNT + ORDER BY
    これは何も言わないで、よく使うのでよく知っています.グループ+合計+カウント+ソート
  • mysql> SELECT `age`,COUNT(*) AS `number` FROM `admin` GROUP BY `age` ORDER BY `number` DESC;
    +-----+--------+
    | age | number |
    +-----+--------+
    |  21 |      2 |
    |  20 |      1 |
    +-----+--------+
    
  • WHEREHAVINGを併用
    説明havingならORDER BYがあるはずなので、グループ分けしてからカッコつけます
  • mysql> SELECT `age`,COUNT(*) FROM `admin` WHERE `age`>18 GROUP BY `age` HAVING COUNT(*) >=1;
    +-----+----------+
    | age | COUNT(*) |
    +-----+----------+
    |  20 |        1 |
    |  21 |        2 |
    +-----+----------+
    
  • FROM
    ここではFROMサブクエリについて説明します.例を挙げてみましょう.今、小学校の子供が2科以上不合格になった学生の平均点数と名前を調べます.一歩一歩!
  • #                   
    mysql> SELECT `name`,COUNT(*) AS `number_class` FROM `user` WHERE `score`<60 GROUP BY `name` HAVING `number_class`>=2;
    +----------+--------------+
    | name     | number_class |
    +----------+--------------+
    | AlicFeng |            2 |
    |        |            2 |
    +----------+--------------+
    
    #           ,         
    mysql> SELECT `name` FROM (SELECT `name`,COUNT(*) AS `number_class` FROM `user` WHERE `score`<60 GROUP BY `name` HAVING `number_class`>=2) AS `user_t`;
    +----------+
    | name     |
    +----------+
    | AlicFeng |
    |        |
    +----------+
    
    #     ,             
    mysql> SELECT `name`,AVG(`score`) FROM `user`  WHERE `name` IN (SELECT `name` FROM (SELECT `name`,COUNT(*) AS `number_class` FROM `user` WHERE `score`<60 GROUP BY `name` HAVING `number_class`>=2) AS `user_t`) GROUP BY `name`;
    +----------+--------------+
    | name     | AVG(`score`) |
    +----------+--------------+
    | AlicFeng |      59.6667 |
    |        |      61.6667 |
    +----------+--------------+
    
    # PS:        ,        ,            (  、       )。
    mysql> desc user;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(10) | NO   |     | NULL    |                |
    | sub   | varchar(10) | NO   |     | NULL    |                |
    | score | int(11)     | NO   |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    
  • WHERE WHEREサブクエリ、一言で言えば、内層クエリの結果は外層で使用されます.あまり話さないで、例を挙げてください.
  • #     user               
    mysql> SELECT `name`,`message` FROM `admin` WHERE `name`=(SELECT `name` FROM (SELECT `name`,max(`score`) FROM `user`) AS `temp_t`);
    +--------+---------+
    | name   | message |
    +--------+---------+
    |      |       |
    +--------+---------+
    # PS:        ,       。THIS IS DEMO
    
  • EXISTS
    簡単な説明:外層クエリーの結果は内層クエリーを取得し、成立するかどうか.
  • mysql> SELECT `name`,`message` FROM `admin` WHERE EXISTS(SELECT `name` FROM `user` WHERE `user`.`name`=`admin`.`name`);
    +----------+--------------------------------------------+
    | name     | message                                    |
    +----------+--------------------------------------------+
    | AlicFeng |       ,      。               |
    |        |                                          |
    +----------+--------------------------------------------+
    

    操作すると、まずデータテーブルのデータを印刷して、観察しやすいです.
    mysql> SELECT * FROM `admin`;
    +----+----------+-----+-----+--------------------------------------------+
    | id | name     | age | sex | message                                    |
    +----+----------+-----+-----+--------------------------------------------+
    |  1 | AlicFeng |  21 |   1 |       ,      。               |
    |  2 | Alice    |  20 |   0 | NULL                                       |
    |  3 |        |  21 |   1 |                                          |
    +----+----------+-----+-----+--------------------------------------------+
    3 rows in set (0.00 sec)
    
    mysql> SELECT * FROM `user`;
    +--------+----------+---------+-------+
    | id     | name     | sub     | score |
    +--------+----------+---------+-------+
    |      1 |        | chinese |    48 |
    |      2 | AlicFeng | math    |    28 |
    |      3 |        | math    |    38 |
    |      4 | AlicFeng | english |    98 |
    |      5 | AlicFeng | math    |    53 |
    |      6 |        | english |    99 |
    |      7 |        | math    |    88 |
    +--------+----------+---------+-------+
    
    
  • 単純連結テーブルクエリー
    単純な2つのテーブル接続クエリでは、WHEREJOIN ONを使用してクエリの結果は等価です.
  • # JOIN ON
    mysql> SELECT `admin`.`name`,`admin`.`message`,`user`.`score` FROM `admin` JOIN `user` ON `admin`.`name`=`user`.`name`;
    +----------+--------------------------------------------+-------+
    | name     | message                                    | score |
    +----------+--------------------------------------------+-------+
    |        |                                          |    48 |
    | AlicFeng |       ,      。               |    28 |
    |        |                                          |    38 |
    | AlicFeng |       ,      。               |    98 |
    | AlicFeng |       ,      。               |    53 |
    |        |                                          |    99 |
    +----------+--------------------------------------------+-------+
    
    # WHERE
    mysql> SELECT `admin`.`name`,`admin`.`message`,`user`.`score` FROM `admin`, `user` WHERE `admin`.`name`=`user`.`name`;
    +----------+--------------------------------------------+-------+
    | name     | message                                    | score |
    +----------+--------------------------------------------+-------+
    |        |                                          |    48 |
    | AlicFeng |       ,      。               |    28 |
    |        |                                          |    38 |
    | AlicFeng |       ,      。               |    98 |
    | AlicFeng |       ,      。               |    53 |
    |        |                                          |    99 |
    +----------+--------------------------------------------+-------+
    
  • 、推奨
    特徴:左の表を基準にして、右の表に行ってデータを探して、もし一致するデータがないならばnullで空席を補って、結果の数>=左の表の元の祖先の数を出力します
  • mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` LEFT JOIN `user` ON `admin`.`name`=`user`.`name`;
    +----------+--------------------------------------------+
    | name     | message                                    |
    +----------+--------------------------------------------+
    | AlicFeng |       ,      。               |
    | AlicFeng |       ,      。               |
    | AlicFeng |       ,      。               |
    | Alice    | NULL                                       |
    |        |                                          |
    |        |                                          |
    |        |                                          |
    +----------+--------------------------------------------+
    

  • 特徴:右の表を基準にして、左の表に行ってデータを探して、もし一致するデータがないならばnullで空席を補って、結果の数を出力します>=右の表の元の元祖数
  • mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` RIGHT JOIN `user` ON `admin`.`name`=`user`.`name`;
    +----------+--------------------------------------------+
    | name     | message                                    |
    +----------+--------------------------------------------+
    |        |                                          |
    | AlicFeng |       ,      。               |
    |        |                                          |
    | AlicFeng |       ,      。               |
    | AlicFeng |       ,      。               |
    |        |                                          |
    | NULL     | NULL                                       |
    +----------+--------------------------------------------+
    

  • 特徴:左右の接続の交差.実はWHEREJOIN ONのクエリ結果と同じです.
  • mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` INNER JOIN `user` ON `admin`.`name`=`user`.`name`;
    +----------+--------------------------------------------+
    | name     | message                                    |
    +----------+--------------------------------------------+
    |        |                                          |
    | AlicFeng |       ,      。               |
    |        |                                          |
    | AlicFeng |       ,      。               |
    | AlicFeng |       ,      。               |
    |        |                                          |
    +----------+--------------------------------------------+
    
  • 効率的なクエリー
    これを游ぶには必ず大量のデータが必要です.よし~sheelスクリプトを作って大量のデータを挿入します.
  • #     MySQL      
    mysql> set global max_connections=100000;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show variables like 'max_connections';
    +-----------------+--------+
    | Variable_name   | Value  |
    +-----------------+--------+
    | max_connections | 100000 |
    +-----------------+--------+
    1 row in set (0.00 sec)
    
    shell
    #!/bin/bash  
    date
    for i in `seq 1 100000`
    do
    {
        mysql -usamego -p!@#$%^&123 demo -e "insert into user(name,score,sub)   values('ALicFeng',78,'math');"  
        sleep 0.01
    } &
    done
    wait
    date
    exit 0
    

    ここのデータはまだ少なくて、最后に多くなって、このshを実行する时、私の目はいつもシステムの温度などの情报を见て、手はすでにCTRL+Cの上に置いて、O(∩∩)Oははははは~
    続きは...