[mysql のレビュー]——単一テーブル クエリの知識のレビュー

私は次の一文がとても好きです。この世界には真の英雄主義はただ 1 つしかありません。それは、人生の真実を認識しながらもそれを愛するということです。

目次

条件付きクエリ(条件を満たすデータをクエリ)

注意点:

        数式や並べ替えなどのキーワードを学習するときは、まずそれらがステートメント内のどこで使用されているか、形式要件などを理解する必要があります。

データのソート(フィールド順)

キーワードの書き順

選択する ...

から ...

どこ ...

...でグループ化 

...までに注文してください

執行順序

から ...

どこ ...

...でグループ化

持っている...

選択する ...

...までに注文してください

共通機能

一般的な単一行処理関数

グループ化機能

注意点:

グループクエリ(グループ化可能)

主な結論:

select ステートメントに group by ステートメントがある場合、select の後には、グループ化に参加しているフィールドとグループ化関数のみが続きます。他には何も続きません。

2 つのフィールドを 1 つのフィールドに結合することもできます (2 つのフィールドの結合グループ化)。

注意点

have はグループ化後にデータをフィルタリングできますが、group by と組み合わせて使用​​する必要があります (ただし、単独で使用すると非効率的です)。

単一テーブルクエリの概要



条件付きクエリ(条件を満たすデータをクエリ)

一般的な条件付きクエリ (クエリ ステートメントの後に where + 条件を追加します):

  1. = (等しい)、<> または != (等しくない)、以上など。

  2. .... と .... (2 つの値の間)

    • 注: 左が小さく、右が大きいという原則に従い、間隔を詰める必要があります。

  3. null です、null ではありません

    • データベース内の Null は等号を使用して測定することはできません。実際の意味は、値がない、または何もないということなので、構文 (=null) は存在しません。

       where  salary is null;
  4. そして (そして)、または (または)

     where job = "MANAGER" and salary > 3000;
     where job = "MANAGER" or salary > 3000;
    • and and or は同時に出現するため優先度が高く、同時に出現する場合には括弧を使用できます。

     //找出工资大于2500并且编号是10或20的;
     where sal > 2500 and deptno = 10 or deptno =20;//这么写容易出现歧义
     where sal > 2500 and (deptno = 10 or deptno =20);
  5. in (include、or と同等)、not in

     //找出工资大于2500并且编号是10或20的;
     where sal > 2500 and deptno in (10,20)

    注: ここでの は間隔ではなく、セットです。

  6. like (あいまいクエリ)、% またはアンダースコアの一致。

    注: % は任意の文字に一致します。アンダースコアは 1 文字のみに一致します。

     //名字中含有A
     where dname like '%A%';
     //第二个字母是A
     where dname like '_A%';
     //找出名字中带有下划线的
     where name like '%_%';//这样就会查出所有
     where name like '%\_%'//转义字符

注意点:

        数式や並べ替えなどのキーワードを学習するときは、まずそれらがステートメント内のどこで使用されているか、形式要件などを理解する必要があります。

データのソート(フィールド順)

一般的な並べ替え方法:

  1. asc 昇順

  2. 降順

 order by salary asc, ename asc;
 //salary在前,起主导作用,只有salary相同时,才会使用ename升序排列;

キーワードの書き順

キーワードが使用される順序は変更できません。

選択する ...
から ...
どこ ...
...でグループ化 
...までに注文してください

執行順序

から ...
どこ ...
...でグループ化
持っている...
選択する ...
...までに注文してください

共通機能

一般的な関数は、単一行処理関数 (複数行を処理して複数行を出力) と複数行処理関数 (複数行を処理して 1 行の結果を返す) に分かれています。

一般的な単一行処理関数
  1. lower() は小文字に変換されます

    select lower(uname) as ename from emp;
  2. upper() は大文字に変換されます

  3. substr() は部分文字列を受け取ります。形式: substr (インターセプトされた文字列、開始添え字、インターセプトされた長さ)

    注: 開始インデックスは 1 から始まります

     where substr(ename,1,1) = 'A';
  4. length() は長さを受け取ります

  5. スペースを削除するには、trim()

  6. str_to_date() は文字列を日付に変換します

  7. date_format() 日付の形式

  8. Round() ラウンド

  9. rand() は乱数を生成します

  10. ifnull() は null を特定の値に変換できます


グループ化機能

グループ化機能は複数行処理機能とも呼ばれます

  1. count カウント、sum 合計、avg 平均値、max 最大値、min 最小値

  2. 注: グループ化関数は、使用する前に最初にグループ化する必要があります。つまり、実行順序に従って、グループ化関数は group by の後に使用できます。

        エラーのデモンストレーション:

    select ename,sal from emp where sal > min(sal);

    これは理論上は問題ありませんが、実際にはエラーが報告されます。

     正しい例:

    select min(sal) from emp;
  3. グループ化がない場合、デフォルトでテーブルはグループになります。

    select max(salary) from emp;

注意点:

  1. データベースの操作中に null が検出された場合、結果は null になりますが、null はグループ化関数で自動的に除外されます。

  2. null は値ではなく、何も意味しません。

  3. count (特定のフィールド) によって得られる結果は、データ テーブル内の null ではないフィールドの数です。

グループクエリ(グループ化可能)

実際のニーズでは、最初にデータ テーブルをグループ化し、グループ化した後にクエリを実行する必要があります。

  ケースデモンストレーション:

 select ename,job ,sum(sal) from emp group by job;

上記のステートメントは MySQL でのみ実行できます。それ自体は意味がありませんが、Oracle では構文要件が mysql よりも厳しいため、エラーが報告されます。

主な結論:
select ステートメントに group by ステートメントがある場合、select の後には、グループ化に参加しているフィールドとグループ化関数のみが続きます。他には何も続きません。
2 つのフィールドを 1 つのフィールドに結合することもできます (2 つのフィールドの結合グループ化)。
 select deptno,job,max(sal) from emp group by deptno,job;

注意点

  1. group by を追加した後、select 以降のフィールドを自由に書き込むことはできません。group by の後にのみフィールドとグループ化関数を書き込むことができます。

  2. グループ化関数は実行順序に関係するため、where の後には記述できません。グループ化してからグループ化関数を使用してください。

  3. select の後にグループ化機能が使えるのはなぜですか? これは実行順序にも関係しており、select は group by の後に実行されます。

 //找出每个部门中薪资最高的,显示的最高薪资要大于3000
 select ename,job,max(sal) from emp where sal>3000  group by ename,job;
have はグループ化後にデータをフィルタリングできますが、group by と組み合わせて使用​​する必要があります (ただし、単独で使用すると非効率的です)。

非効率的なコードのデモ:

 select ename,job,max(sal) from emp   group by ename,job having sal>3000;

上記の効率が悪い問題を解決するには、whereとhaveを併用することが考えられますが、このとき、条件付き削除ではwhereが優先され、whereが完了できない場合にのみhaveが考慮されます。

最適化された戦略:

 select ename,job,max(sal) from emp where sal>3000  group by ename,job having sal>30;
//这个having加的没有意义,我只想在此处强调where和having可以联合使用以及优先级;

このような最適化は愚かに思えますが、実際のアプリケーションでは、どこで解決できず、あることで解決する必要がある問題が存在します。たとえば、各部門の平均給与を調べ、表示される平均給与を次のように要求します。このニーズに対処するには、次のことを解決する必要があります。

単一テーブルクエリの概要

  1. まずテーブルのデータを確認し、場所でフィルタリングし、次に次の条件でフィルタリングされた結果をフィルタリングできます。

  2. グループ化関数の場合、その文法上の位置は select の後です。

  3. group by を使用してグループ クエリを実行した後は、select の後のフィールドに特に注意してください。

  4. キーワードの実行順序、from -- where -- group by -- getting -- select -- order by;

おすすめ

転載: blog.csdn.net/m0_64231944/article/details/132069240