背景
SQLの学習サイトは多種多様存在するが、実際のアプリケーションでどのように扱っているのかが学習しにくいという体験があったため
※SQL主眼のため、MyBatisの詳細やMVC関連の説明は割愛、下記のみでは同様の結果は起こりません、ご容赦ください
基本的な検索
<select id="findPageByCriteria" parameterType="Information" resultType="Information">
SELECT
id,
title,
content,
created_at
FROM
osirases
<where>
<if test="title != null and title != ''">
AND title LIKE CONCAT('%', #{title}, '%')
</if>
<if test="content != null and content != ''">
AND content LIKE CONCAT('%', #{content},'%')
</if>
</where>
- LIKE CONCAT()部分は曖昧検索ですが、MySQL使用上の記述
- %はワイルドカードで前方一致・後方一致などの厳密ではない検索に扱うことが可能
- パラメーターとして扱う値の前後に記述
検索フォームを作成し、AND検索を行うことを想定。
タイトルフォームに「ページネーション」
内容フォームに「練習」と入力し、検索ボタンを押下
その結果が下記のようなもの。
SQL学習当初の場合は下記のような例を頻繁に観測した経験がある。
SELECT * FROM zoo WHERE animal = 'cat';
「zooテーブルからanimalカラムがcatであるものを全件取得する」
↓
「ズーテーブルノアニマルカラムガキャットデアルモノヲ...」
簡潔的な例なので理解はもちろん可能ですが、実際の使われ方の用途が不透明でした。
基本は大切です。しかし、SQLをどのような用途で扱うのか想像が出来なかったために、クエリした結果でも消化不良が払拭出来ないような心持ちでした。
今回のような簡易的なものですが、プログラムと共に扱うことで体感的なものとして昇華し、今後も邁進して行けたらと思います。
おまけ
<select id="findPageByCriteria" parameterType="Information" resultType="Information">
SELECT
id,
title,
content,
created_at
FROM
osirases
WHERE
1 = 1
<if test="title != null and title != ''">
AND title LIKE CONCAT('%', #{title}, '%')
</if>
<if test="content != null and content != ''">
AND content LIKE CONCAT('%', #{content},'%')
</if>
</select>
こちらでも結果は同様になります。異なるものは下記。
WHERE 1 = 1
こちらはMybatisの
<where></where>
のような使い方が可能で、冒頭の物と同様にWhere句内の条件が当て嵌まらない場合は全件を取得したい(Where句が可変の場合とも言う)、そのような場合に使用します。また、用途によってはプログラムの視認性が向上することもあります。
最後は蛇足であったかもしれませんが、多様な書き方を学び選択できるようになれたらと思います。
ご覧いただきありがとうございました。