CTGUデータベースのまとめ


データベースsqlセクション
自分がぼんやりしていたところを書いただけで、大物は軽く噴き出し、間違いがあれば指摘しなければならない.
1.distinct
distinctは一般的にクエリー結果の重複レコードを除去するために使用され、insert、update、select、deleteではselectのみが使用できます.
select distinct expression[,expression...] from tables [where conditions];

1列のみの操作
select distinct country from person

複数列の操作
select distinct country, province from person

注:distinctが複数のフィールドに使用される場合、その適用範囲は、隣接するフィールドではなく、その後ろのすべてのフィールドです.distinctはすべてのフィールドの前にしか置けません.
SELECT country, distinct province from person; //        

またdistinctはNULLをフィルタしない.
2.group by
GROUP BY私たちはまず字面から理解することができて、GROUPはパケットを表して、BYの後ろの字のセグメント名、どのフィールドによってパケットを行うかを表して、GROUP BYは重合関数に合わせて使わなければならなくて、パケットの後であなたはカウント(COUNT)、和(SUM)、平均数(AVG)などを求めることができます.
一般的な集約関数
  • count()カウント
  • sum()和
  • avg()平均数
  • max()最大値
  • min()最小値
  • 構文
    SELECT column_name, aggregate_function(column_name)
    FROM table_name
    WHERE column_name operator value
    GROUP BY column_name;
    

    HAVING
    グループbyに言及すると、HAVINGに言及せざるを得ません.HAVINGは条件フィルタに相当しますが、whereとの違いは、HAVINGがグループオブジェクトをフィルタすることです.
    groupbyの使い方
    3.サブクエリ
    サブクエリとは、他のSQL文に表示されるSELECT文です.
    例:
    select * from t1 where col1=(select col2 from t2)
    

    サブクエリは、クエリの内部にネストされ、常にカッコ内に表示される必要があります.サブクエリは、次の4つに分けられます.
  • スカラー量子クエリー:単一値のスカラーを返し、最も簡単な形式
  • 列サブクエリ:返される結果セットは、N行1列
  • です.
  • 行サブクエリ:返される結果セットは、1行N列
  • です.
  • 表サブクエリ:返される結果はN行N列
  • である.
    比較演算子付きサブクエリ
    演算子
    説明
    >
    より大きい
    >=
    以上
    =
    に等しい
    !=または<>
    等しくない
    <
    より小さい
    <=
    以下
    比較演算子を持つサブクエリとは、親クエリとサブクエリが比較演算子を使用して接続されたネストされたクエリを指します.
    ≪シーンの使用|Use Scene|oem_src≫:内層クエリが単一の値を返すことをユーザーが正確に認識できる場合、比較演算子を使用します.
    ALL,ANY,SOME,INの4種類のキーワード
    カラムサブクエリが返す結果はN行1列であるため,直接演算法を用いて操作することはできず,カラムサブクエリではALL,ANY,SOME,INなどのキーワードオペレータを用いることができる.
    ALL
    ALLは、サブクエリから返されるすべての値の比較がTRUEであることを示す比較演算子の後に接続されなければならない.
    SELECT col1 FROM table1 WHERE col1 > ALL (SELECT col2 FROM table2)
    

    col 1の値はcol 2のすべての値より大きくなければ返されません
    ANYとSOME
    ANYは比較オペレータと併用され、サブクエリから返される任意の値がTRUEと比較されるとTRUEに戻ることを示す.
    SOMEはANYの別名で一般的に使われていない.
    IN
    INとは、指定した値がこのセットにあるかどうか、trueを返すとfalseを返すことを意味します.
    inは=anyの別名であり、両者は同じであるが、not inの別名は<>anyではなく<>someである.
    4.exists
    私はexistsとinの違いをずっと理解していないので、サブクエリに必要なものだと感じたので、ここに書いておきます.
    in
    指定した値がサブクエリまたはリストの値と一致するかどうかを決定します.inクエリーの場合、まずサブクエリーのテーブルをクエリーし、内部テーブルと外観をデカルト積にし、条件に従ってフィルタします.だから内表が比較的小さい時、inの速度は比較的に速いです.
    SELECT
        *
    FROM
        `user`
    WHERE
        `user`.id IN (
            SELECT
                `order`.user_id
            FROM
                `order`
        )
    

    この文は簡単です.サブクエリで調べたuser_idのデータはuserテーブルのidに一致して結果を得る.
    では、彼の照会の順序はどうなっているのでしょうか.
    1.サブクエリを最初に実行
          SELECT
                `order`.user_id
            FROM
                `order`
    

    2.結果とuserテーブルをデカルト積にする
    3.この場合、私たちのuser.に従います.id in order.user_idの条件は,結果をフィルタリングし,最後に条件に合致するデータを得る.
    exists
    ローの存在を検出するサブクエリを指定します.外見をループして、外見の記録が内表のデータと同じかどうかを見ます.一致すると、結果セットに結果が挿入されます.
    SELECT
        `user`.*
    FROM
        `user`
    WHERE
        EXISTS (
            SELECT
                `order`.user_id
            FROM
                `order`
            WHERE
                `user`.id = `order`.user_id
        )
    

    注意:inとexistsを使用して返される結果は同じです.
    しかし、彼らの実行プロセスは異なります.
    existsキーワードを使用してクエリーを行う場合、まず、サブクエリーの内容ではなく、メインクエリーのテーブルを調べます.つまり、先に実行するsql文は次のとおりです.
    SELECT `user`.* FROM `user` 
    

    次に、テーブルの各レコードに基づいて、whereの後の条件が成立しているかどうかを順次判断する文を実行します.
    EXISTS (
            SELECT
                `order`.user_id
            FROM
                `order`
            WHERE
                `user`.id = `order`.user_id
        )
    

    成立するとtrueが成立しないとfalseが返されます.trueを返すと、ローの結果は保持され、falseを返すと、ローが削除され、最後に得られる結果が返されます.
    existsは結果セットを返さずtrueまたはfalseのみを返します
    シーンの区別と適用
    inとexistsの違い:サブクエリで得られた結果セットのレコードが少ない場合、メインクエリのテーブルが大きく、インデックスがある場合はinを使用します.逆に、外側層のメインクエリのレコードが少ない場合、サブクエリのテーブルが大きく、インデックスがある場合はexistsを使用します.実はinとexistsを区別するのは主に駆動順序の変化(これが性能の変化の鍵である)をもたらしたので、existsであれば外層表を駆動表として先にアクセスされ、INであれば先にサブクエリを実行するので、駆動表の迅速な戻りを目標とし、インデックスと結果セットの関係を考慮し、またINではNULLを処理しない.
    inは外見と内表をhash接続し,existsは外表に対してloopループを行い,loopループのたびに内表をクエリーする.従来existsはinより効率が高いと考えられていた説は正確ではない.
    5.like
    likeはwhere式で、一致するフィールドで指定した内容を検索します.その中でnot likeとlikeの表現の意味は正反対です.
    likeは通常ワイルドカード%と組み合わせて使用されますが、%を付けない場合は、正確な一致、すなわち=
    SELECT * FROM [user] WHERE u_name LIKE '% %' //  u_name        
    SELECT * FROM [user] WHERE u_name LIKE '% %' AND u_name LIKE '% %'  //u_name                  
    SELECT * FROM [user] WHERE u_name LIKE '_ _' //       3          
    SELECT * FROM [user] WHERE u_name LIKE '[   ] ' //                        
    SELECT * FROM [user] WHERE u_name LIKE '[^   ] ' //