[MySql] 集計関数 &&group by&&OJ トピック


この記事では主にmysqlの集計関数とgroup byの使い方を紹介し、最後にOJトピックの実践について紹介します。

集計関数

MySQL の集計関数は、データの計算とカウントに使用されます。一般的な集計関数には、次の集計関数が含まれます。

		函数									说明
COUNT([DISTINCT] expr) 				返回查询到的数据的数量
SUM([DISTINCT] expr) 				返回查询到的数据的总和,不是数字没有意义
AVG([DISTINCT] expr) 				返回查询到的数据的平均值,不是数字没有意义
MAX([DISTINCT] expr) 				返回查询到的数据的最大值,不是数字没有意义
MIN([DISTINCT] expr) 				返回查询到的数据的最小值,不是数字没有意义

上記の集計関数について、理解を深めるためにいくつかのケースを使用して集計関数を説明します。多くは説明しません。

  • クラスの生徒の数を数える
-- 使用 * 做统计,不受 NULL 影响
select count(*) from exam_result;

-- 使用表达式做统计
select count(1) from exam_result;

画像-20230614190926674

画像-20230614191010459

  • 統計の授業には数学の学年は何段階ありますか
select count(math) from exam_result;

画像-20230614191208856

しかし、数学のスコアが繰り返されていることがわかりました。どうすればそれらを取り除くことができるでしょうか? 明確

select distinct count(distinct math) from exam_result;

画像-20230614191642323

  • 統計数学の合計点
select sum(math) from exam_result;

画像-20230614191755416

  • 統計数学の成績平均点
select sum(math)/count(*) from exam_result;

select avg(math) from exam_result;

画像-20230614192404128

  • 英語の不合格者数の統計
 select count(*) from exam_result where english<60;

画像-20230614192613880

  • 英語の最高スコアを返します
select max(english) from exam_result;

画像-20230614192902514

  • 数学の最低スコア 70 以上を返します
select min(math) from exam_result where math>70;

画像-20230614193443797

用途ごとにグループ化

グループ化の目的は、グループ化後の集計統計を容易にすることです。

select で group by 句を使用して、指定した列に対してグループ クエリを実行します。

select column1, column2, .. from table group by column;

まずは従業員情報テーブルを作成します
EMP従業員テーブル
DEPT部門テーブル
SALGRADE給与等級テーブル
各部門の平均給与と最高給与の表示方法

画像-20230615000430588

画像-20230615000854934

  • 各部門の平均給与と最高給与を表示します
select deptno,max(sal) 最高,avg(sal) 平均 from emp group by deptno;

画像-20230615075542834

グループ化とは、グループを条件に応じて複数のグループに分割し、各グループ内で統計的にグループ化すること、テーブルを条件に応じて論理的に複数のサブテーブルに分割し、それぞれのサブテーブルに対して集計統計を行うことです。

  • 各分野の職種ごとの平均賃金と最低賃金を表示
select deptno,job, avg(sal) 平均,min(sal) 最低 from emp group by deptno,job;

画像-20230615084036318

  • 平均給与が2000未満の部門とその平均給与を表示します

各部門の平均給与の統計

select avg(sal) from EMP group by deptno

グループ化の結果をフィルタリングするには、have と group by を一緒に使用します。

select avg(sal) as myavg from EMP group by deptno having myavg<2000;

集計された統計データを条件でフィルタリングします。

  • と where の違いの理解と実行順序

画像-20230615093211253

条件付きフィルタリングの段階は異なります。ディスク上のテーブル構造をmysqlにインポートしたときだけ、実際のテーブルをテーブルと呼ぶのではなく、中間審査も最終結果もすべて論理的なテーブルであり、mysql内のすべてがテーブルであると理解できます。将来的には、単一標準の CURD を適切に処理できる限り、すべての SQL シナリオに統一されたメソッドを使用できるようになります。

上記の知識を学習した後、以下の OJ トピックの演習を行ってみましょう。トピックは Niuke.com と leetcode から取得しています。SQL を書く能力を向上させるために実行してください。

OJトピック

SQL228 バッチ挿入データ

説明

トピックはすでに次のステートメントを実行しています。

drop table if exists actor;
CREATE TABLE actor (
actor_id  smallint(5)  NOT NULL PRIMARY KEY,
first_name  varchar(45) NOT NULL,
last_name  varchar(45) NOT NULL,
last_update  DATETIME NOT NULL)

テーブル アクターに対して次のデータをバッチで挿入してください (挿入ステートメントを 2 つ使用しないでください)。

俳優ID ファーストネーム 苗字 最後の更新
1 ペネロペ ギネス 2006-02-15 12:34:33
2 ニック ウォールバーグ 2006-02-15 12:34:33

SQL ステートメントは次のとおりです。

insert into actor (actor_id,first_name,last_name,last_update) values (1,'PENELOPE','GUINESS','2006-02-15 12:34:33'),(2,'NICK','WAHLBERG','2006-02-15 12:34:33');

SQL202 全従業員の現在の給与を調べます

説明

給与表があり、給与概要は以下の通りです。

emp_no 給料 開始日 現在まで
10001 72527 2002-06-22 9999-01-01
10002 72527 2001-08-02 9999-01-01
10003 43311 2001-12-01 9999-01-01

全従業員の具体的な給与状況を調べてください。同じ給与の場合は 1 回だけ表示され、逆順に表示されます。上記の例の出力は次のとおりです。

給料
72527
43311

SQL ステートメントは次のとおりです。

select  distinct salary from salaries order by salary desc;

SQL195 最新の従業員のすべての情報を検索

説明

次のような従業員employeesテーブルプロファイルがあります。

emp_no 生年月日 ファーストネーム 苗字 性別 採用日
10001 1953-09-02 ゲオルギ ファセッロ M 1986-06-26
10002 1964-06-02 ベザレル 単純 F 1985-11-21
10003 1959-12-03 バンフォード M 1986-08-28
10004 1954-05-01 キリスト教徒 コブリック M 1986-12-01

「従業員」で最新の従業員のすべての情報を検索してください。上記の例の出力は次のとおりです。

emp_no 生年月日 ファーストネーム 苗字 性別 採用日
10004 1954-05-01 キリスト教徒 コブリック M 1986-12-01
select * from employees order by hire_date desc limit 1;

SQL196 入社時刻が最後から 3 番目の従業員の情報をすべて検索します

説明

次のような従業員employeesテーブルプロファイルがあります。

emp_no 生年月日 ファーストネーム 苗字 性別 採用日
10001 1953-09-02 ゲオルギ ファセッロ M 1986-06-26
10002 1964-06-02 ベザレル 単純 F 1985-11-21
10003 1959-12-03 バンフォード M 1986-08-28
10004 1954-05-01 キリスト教徒 コブリック M 1986-12-01

入社時刻が従業員内で下から 3 番目にランクされている従業員のすべての情報を検索してください。上記の例の出力は次のとおりです。

emp_no 生年月日 ファーストネーム 苗字 性別 採用日
10001 1953-09-02 ゲオルギ ファセッロ M 1986-06-26

注: 同じ日に入社した従業員がいる可能性があるため、時刻が最後から 3 番目の従業員が複数存在する可能性があります。

select * from employees 
where hire_date=(select distinct hire_date from employees order by hire_date desc limit 2,1);

SQL201 15 を超える給与レコードを持つ従業員番号 emp_no と、それに対応するレコード数 t を検索します。

select emp_no,count(*) as t from salaries group by emp_no having t>15;

タイトルテーブルからタイトルごとにグループ化します。

select title,count(title) as t from titles
group by title having t>=2;

182. 重複するメールを見つける

select email from Person group by email having count(email)>1;

595. ビッグカントリー

select name,population,area from world
where area >= 3000000 or population >= 25000000;

おすすめ

転載: blog.csdn.net/weixin_60478154/article/details/131247690