SQLコンテスト第1~12回の問題1を全て解いてみました

## はじめに
TOPSIC様が運営しているSQLコンテストの第13回目が2024年6月21日12時から24日12時までの間で開催されます。`まだ間に合いますよ！`
今回も参加しましたが反省点が多かったため、各コンテストの1問目を解いてみました。
コンテストは毎回4問出題され、問題ごとに難易度が上がっていきます。
今回は全て1問目のため、難易度はかなり優しめです。
自分のため、他の方の参考のため解答時間も計測したので記載します。(秒数は切り上げます。)

## まとめ
今回得た学びを下記にまとめます。

文字列Sに文字Aが含まれているレコードを検索する場合
```SQL
--文字Aが2文字以上含まれている条件
where S like '%A%A%'
--1文字の条件
where S like '%A%'
--先頭
where S like 'A%'
--語尾
where S like '%A'
--文字Aが1文字かつ文字Bが2文字かつ文字Cが3文字
where S like '%A%'
and S like '%B%B%'
and S like '%C%C%C%'
```

絶対値の取得はABS()で行える。
```SQL
where ABS(c.SCORE1 - c.SCORE2) >= 20
```



## [第1回 SQLコンテスト](https://topsic-contest.jp/contests/contest001/problems/contest001-1)
```sql
select
  DISTRICT_CODE as 地区コード,
  DISTRICT_NAME as 地区名,
  TOTAL_AMT as 総人口
from
  POPULATION
order by
  総人口 desc,
  地区コード desc
```
解答時間：2分

## [第2回 SQLコンテスト](https://topsic-contest.jp/contests/contest002/problems/contest002-1)
```sql
update
  POPULATION
set
  DISTRICT_NAME = '不明'
where
   DISTRICT_NAME is null
or DISTRICT_NAME = ''
```
解答時間：2分

## [第3回 SQLコンテスト](https://topsic-contest.jp/contests/contest003/problems/contest003-1)
```sql
select
  PF_CODE as CODE,
  TOTAL_VALUE as SALES_AMT
from
  CONVENIENCE
where
    SURVEY_YEAR = 2019
and KIND_CODE = '100'
order by
  SALES_AMT desc,
  CODE asc
```
解答時間：2分

## [第4回 SQLコンテスト](https://topsic-contest.jp/contests/contest004/problems/contest004-1)
```sql
select
  EMP_CODE as CODE,
  EMP_ENG_NAME as ENG_NAME
from
  EMP
where
  length(EMP_ENG_NAME) - 
  length(replace(lower(EMP_ENG_NAME), 's', '')) >= 2
order by
  EMP_CODE asc
```
解答時間：5分

社員英字名にSまたはsが2回以上含まれるデータを取得する問題でした。
引き出しの差が出たなあと思いました。
他の方は`where lower(EMP_ENG_NAME) like '%s%s%'` で対応されていました。
こちらの方がシンプルで可読性も良いですね。

## [第5回 SQLコンテスト](https://topsic-contest.jp/contests/contest005/problems/contest005-1)
```sql
select
  ITEM_CODE as ITEM,
  ITEM_NAME as I_NAME,
  CL_NAME as C_NAME,
  SIZE_NAME as S_NAME
from
  ITEM, SIZE_TBL, COLOR_TBL
where
  STOCK_MANAGEMENT_TYPE  = 1
order by
  ITEM_CODE asc,
  CL_CODE asc,
  SIZE_CODE asc
```
解答時間：3分

解答速度を上げるためにCROSS JOINを省略して書いています。
あとはコンテストのサイトでコードテストができるのですが、エラーにならなかったのでテーブルのエイリアスも省略して提出しています。

## [第6回 SQLコンテスト](https://topsic-contest.jp/contests/contest006/problems/contest006-1)
```sql
select
  ITEM_POPULAR_RANK as RANK,
  ITEM_CODE as CODE,
  ITEM_NAME as NAME
from
  ITEM
where
  SALE_END_DATE is null
order by
  ITEM_POPULAR_RANK asc,
  ITEM_CODE asc
```
解答時間：2分

## [第7回 SQLコンテスト](https://topsic-contest.jp/contests/contest007/problems/contest007-1)
```sql
select
  EMP_CODE as CODE,
  EMP_ENG_NAME as NAME,
  length(EMP_ENG_NAME) as WORD_CNT
from
  EMP
where
  length(EMP_ENG_NAME) >= 15
order by 
  WORD_CNT desc,
  EMP_CODE asc
```
解答時間：2分

## [第8回 SQLコンテスト](https://topsic-contest.jp/contests/contest008/problems/contest008-1)
```sql
select
  MEMBER_ID as ID,
  c.SCORE1 - c.SCORE2 as DIFF
from
  CONTEST_RESULTS c
where
   c.SCORE1 - c.SCORE2 >= 20
or c.SCORE2 - c.SCORE1 >= 20
order by
  DIFF desc,
  ID desc
```
解答時間：3分

`ABS()`で絶対値になるんですね。次から使います！

## [第9回 SQLコンテスト](https://topsic-contest.jp/contests/contest009/problems/contest009-1)
```sql
select
  EMP_CODE as CODE,
  upper(EMP_ENG_NAME) as ENG_NAME
from
  EMP
order by
  1 desc
```
解答時間：2分

## [第10回 SQLコンテスト](https://topsic-contest.jp/contests/contest010/problems/contest010-1)
```sql
select
  EMP_CODE as CODE,
  "'" || TRIM(EMP_KANA_NAME, '_') || "'" as KANA_NAME
from
  EMP
order by
  1 desc
```
解答時間：5分

## [第11回 SQLコンテスト](https://topsic-contest.jp/contests/contest011/problems/contest011-1)
```sql
delete from
  STOCK
where
    LAST_DELIVERY_DATE between '2023-01-01' and '2023-01-31'
and ACTUAL_AMT = 0
```
解答時間：1分

## [第12回 SQLコンテスト](https://topsic-contest.jp/contests/contest012/problems/contest012-1)
```sql
insert into DEPARTMENT
values (
'1100',
'2024-04-01',
NULL,
'営業1課',
2,
'1000',
'1',
'TANAKA',
'2024-04-01 00:00:00'
),
(
'2200',
'2024-04-10',
NULL,
'製造2課',
2,
'2000',
'1',
'YAMADA',
'2024-04-10 00:00:00'
)
```
解答時間：3分