Mysql入門第四課「データ照会」


原文は私のGithubで、購読を歓迎します.
前言
前の文章
  • Mysql入門第一課「建表、改表、削除表」
  • Mysql入門第2課「データ型」
  • Mysql入門第三課「データの削除」
  • データ照会を1つの文章にまとめるのは,照会に関する知識点が多いためであり,添削改ざんでは検索の複雑さが最も高いといえる.WHERE id=2のような非常に簡単な条件文は以前から知られていた.
    単一テーブルクエリーは非常に簡単ですが、開発ではマルチテーブルクエリーが多いので、マルチテーブルクエリーで説明します.
    ウォーミングアップ
    データを処理するときに、あるフィールドを使用して別の情報を調べます.データベースでよく行われるほか、フロントエンドでも同様の状況があります.
    まず、フロントエンドでよく遭遇するデータを見てみましょう.
    {
        province:'   ',
        citys:[
            '   ',
            '   ',
            '   '
        ]
    }

    上は省市を揉んで2階しかネストしていませんが、4、5階がネストされている場合は、このようにします.
    {
       province:'   ',
       children:[
        {
            name:'  1',
            children:[
                name:'   ',
                children:[
                    name:'XX  '
                ]
            ]
        },
        {
            name:'  2',
            children:[
                name:'AA ',
                children:[
                    name:'BB  '
                ]
            ]
        }
       ]
    }

    このデータは解析すると気が狂う.
    私たちはずっとデータが扁平化されていると言っています.
    //  
    const provice = [
        {
            province:'   ',
            province_id: 1001
        },
        {
            province:'   ',
            province_id: 1002
        },
        ...
    ]
    
    //  
    const citys = [
        {
          name:'   ',
          province_id: 1001
        },
        {
          name:'   ',
          province_id: 1001
        },
        
        {
          name:'   ',
          province_id: 1002
        },
        {
          name:'   ',
          province_id: 1002
        },
        ...
    ]
    
    //           
    const result = citys.filter(i => i.province_id === 1001);

    データの扁平化の利点は、 を探す必要がない場合、citysのデータは私には関係なく、provinceに関心を持つだけでよく、検索性能が速く(再帰を免れることがある).
    上記の例では、データベースでテーブルをいくつかのフィールドで関連付けます.これがリレーショナル・データベースのコアです.
    表を何枚か用意する
    図にはstudentの表にclass_idが表示され、 class_idを通じて関連付けられ、開発ではclassの情報を検索することができます.
    検索
    上記のいくつかのテーブルを使用して、いくつかの要件を調べます.
  • 成績が60点より大きい学生を検索し、学生の名前と成績
  • を表示する.
  • の先生の個数
  • を調べます
  • 調べ 先生の授業を習ったことがない学生の名前
  • すべての学生の名前、選択科目の数、成績の合計
  • を検索します.
    私たちは一つ一つ分析します.
    60点以上の学生を検索し、学生の名前と成績を表示します.
    SELECT t1.student_name, t2.number FROM 
    student t1 LEFT JOIN score t2 ON t1.id=t2.student_id 
    WHERE t2.number>60;

    まず結果を見てください.正しいデータが得られました.
    分析文:t1t2は、それぞれstudentとscoreの別名です.注意深い学友は见ることができて、私は上のsql文を3行で表示して、これは寓意があります:
  • 最初の行:クエリーするフィールド、これは非常によく理解されています
  • 行目:実はその結果は一時表です!すなわち、対応するクエリ文のtable_name !
  • 第3行:通俗的で分かりやすいWHERE条件文
  • つまり、共通の文法に合致しています.
    SELECT column_name,column_name
    FROM table_name
    [WHERE Clause]
    [LIMIT N][ OFFSET M]

    2行目にテンポラリ・テーブルが生成されただけです.
    ここではJOIN ONの文法に関連しています.後の章で詳しく話します.ここではいくつかの関連文章をお勧めします.
  • SQLの中の各種JOIN
  • を図解します
  • SQLのinner join、left/right join、outer join区別
  • を図解する
  • SQLマルチテーブルクエリー:SQL JOIN接続クエリー様々な使い方まとめ空が青くない
  • 馬という先生の数を調べる
    SELECT COUNT(id) AS teacher_num FROM teacher WHERE teacher_name LIKE ' %';

    解析:
  • COUNT(fieldName):フィールド数を統計するCOUNT関数
  • AS:別名を取る
  • LIKE:一般的に%と使用され、ファジイ検索は、%を使用しない場合、正確な検索に相当します.
  • %:任意の文字を表し、正規表現の*
  • に似ています.
    すべての学生の名前、選択科目の数、成績の合計を検索します.
    このクエリは複雑です.まずsqlに行きます.
    SELECT 
    t1.student_name, 
    IFNULL(t2.course_num,0) AS course_num, 
    IFNULL(t2.sum_number,0) AS sum_number FROM 
    student t1 
    LEFT JOIN 
    (SELECT student_id,count(id) course_num, SUM(number) AS sum_number FROM score GROUP BY student_id) t2 
    ON t1.id=t2.student_id;

    結果を見てみましょう.
    先に!いや!はい!あわてて!私たちは少しずつ解析します.
    共通のクエリー文が頭に浮かぶはずです.
    SELECT column_name,column_name
    FROM table_name
    [WHERE Clause]
    [LIMIT N][ OFFSET M]

    図のクエリ文を翻訳すると、次のようになります.
    SELECT    ,     ,      FROM  ;

    次に、上の図のクエリーを分割します.まずSELECT student_id,count(id) course_num, SUM(number) AS sum_number FROM score GROUP BY student_idを見て、私たちは単独でこの結果を見てみましょう.
    この文は私たちのために表を生成しました.それは学生id、選択科目数、総成績を示しているので、この表現は核心を表していますが、需要は私たちにすべての学生を見せることです.だから、私たちはstudentに頼って調べなければなりません.
    上図で検出された結果をt2と命名すると、
    SELECT 
    t1.student_name, IFNULL(t2.course_num,0) AS course_num, IFNULL(t2.sum_number,0) AS sum_number 
    FROM student t1 LEFT JOIN t2 
    ON t1.id=t2.student_id;

    余分な部分を削除します.
    SELECT 
    t1.student_name, t2.course_num, t2.sum_number 
    FROM student t1 LEFT JOIN t2 
    ON t1.id=t2.student_id;

    ははは、すぐにわかるのではないでしょうか.
    ここでは、文の中で見たことのないものを紹介します.
  • IFNULL(a,b):よくあるif文のように、aがnullであるか否かを判断し、そうであればbを表示する.
  • COUNT():読み込まれたデータの中のフィールドに対して個数を計算し、一般的にデータのエントリ数をクエリーするために使用されます.
  • SUM():合計を求め、読み出しデータのフィールドの合計を求める.
  • GROUP BY:GROUP BYで読み込んだデータをどのフィールドでグループ化するか(デフォルト昇順)を設定できますが、GROUP BYにはグループ集約機能があります.
  • GROUP BYについていくつかの文章を見ることができます.
  • Group byの理解
  • Group Byのパケット集約プロセス
  • を詳細に理解するための図
    テーブル文の添付
    以下に、いくつかのテーブルの構築文を示します.
    --    
    CREATE TABLE class(
        id INT UNSIGNED PRIMARY KEY auto_increment,
        caption VARCHAR(30) COMMENT '   '
    );
    
    --    
    CREATE TABLE student(
        id INT UNSIGNED PRIMARY KEY auto_increment,
        student_name CHAR(30) COMMENT '   ',
        gender CHAR(30) DEFAULT NULL    COMMENT '    ',
        class_id INT DEFAULT NULL COMMENT '  id'
    );
    
    --    
    CREATE TABLE teacher(
        id INT UNSIGNED PRIMARY KEY auto_increment,
        teacher_name CHAR(30) COMMENT '   '
    );
    
    --    
    CREATE TABLE course(
     id INT UNSIGNED PRIMARY KEY auto_increment,
     course_name CHAR(30) COMMENT '   ',
     teacher_id INT DEFAULT NULL COMMENT'  id'
    );
    
    --    
    CREATE TABLE score(
        id INT UNSIGNED PRIMARY KEY auto_increment,
        number INT DEFAULT NULL COMMENT '  ',
        student_id INT DEFAULT NULL COMMENT '  id',
        course_id INT DEFAULT NULL COMMENT '  id'
    );
    

    まとめ
    この文章は主に照会を理解しているが、これもただの練習にすぎず、実際の開発ではこれより難しい照会が多く、自分が普段何もしないで練習しなければならない.
    今日は仕事が比较的忙しいので、文章の书き方がちょっと雑かもしれません.