0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Sequel ProでSQL文を実行しデータを検索する方法

Last updated at Posted at 2021-05-31

データを検索する


usersテーブル

カラム名 内容
last_name 苗字
first_name 名前
age 年齢
prefecture 出身の都道府県
  • WHERE句

WHERE句は取得するレコードの条件を指定し、その条件が正のレコードを取得します。(WHERE句はSELECT句、FROM句と合わせてSQL文を実行します。)以下を実行。

SELECT *
FROM users
WHERE last_name = "佐藤"

実行結果:usersテーブルからlast_nameが"佐藤"さんのレコードが取得できました。

  • LIKE句

LIKE句とは、WHERE句と併用して使うことで「文字列検索」を行うことができる句です。

WHERE 《列名》 LIKE '検索文字'

曖昧検索として%というワイルドカードも使用できます。下記を実行。

SELECT *
FROM users
WHERE prefecture
LIKE '%都'

実行結果:usersテーブルからprefectureが"東京都"のレコードが取得できました。

  • AND演算子
     AND演算子は複数の条件を指定して式を作り、その条件が全て正のレコードを取得します。下記を実行。
SELECT *
FROM users
WHERE age <= 30 AND prefecture = "神奈川県"

実行結果:usersテーブルからageが30以下かつprefectureが神奈川県のレコードが取得できました。

  • OR演算子
     OR演算子は複数の条件を指定して式を作り、その条件のうちどれか1つ以上が正となれば式は正となり、レコードを取得します。下記を実行。
SELECT *
RFOM users
WHERE age <=25 OR prefecture = "東京都"

実行結果:usersテーブルからageが25以下もしくは、prefectureが東京都であるレコードを取得できました。

  • NOT演算子
     NOT演算子は1つの条件を指定して式を作り、その条件に当てはまらないものを取得します。下記を実行。
SELECT *
FROM users
WHERE NOT prefecture = "東京都"

実行結果:prefectureが東京都ではないレコードを取得できました。

  • BETWEEN演算子
     BETWEEN演算子は1つのカラムに対し上限と下限を指定して式を作り、カラムの値がその範囲に含まれるとき、その式は正になり、レコードを取得します。下記を実行。
【例】 WHERE 《カラム名》 BETWEEN 《下限》 AND 《上限》

SELECT *
FROM users
WHERE age BETWEEN 21 AND 24

実行結果:usersテーブルからageが21~24の範囲に含まれるレコードが取得できました。

  • IN演算子
    IN演算子は1つのカラムに対してリストを指定して、カラムの値がそのリストに含まれるときその式は正になり、レコードを取得します。下記を実行。
SELECT *
FROM users
WHERE prefecture IN ("東京都", "神奈川県")

実行結果:usersテーブルからprefectureが"東京都"もしくは"神奈川県"であるレコードが取得できました。

複雑な条件に合ったデータを取得


shiftsテーブル

カラム名 内容
date シフトの日付
start_time シフトの開始時間
user_id このシフトが属するユーザーのid
  • JOIN句

 JOIN句は、指定したテーブルのカラムに登録された値が一致するデータを元に、各テーブルのレコードを結合できます。JOIN句はFROM句のあとに記述し、結合対象となるテーブルを指定します。そして、結合する元となるカラムを、ONの後に =(イコール)を用いて指定します。shiftsテーブルとusersテーブルを結合させる場合、下記のようになります。

SELECT *
FROM shifts
JOIN users ON shifts.user_id = users.id

実行結果:shiftsテーブルのuser_idと、usersテーブルのidが一致するレコードを結合させることができました。

このとき、ONの後にshiftsやusersとテーブル名を再度書くのは冗長です。各テーブルに別名を付け、その名前で扱うのが良いです。各テーブルの頭文字を取ってあげるのが一般的です。下記を実行。

SELECT *
FROM shifts s
JOIN users u ON s.user_id = u.id
  • CONCAT関数

CONCAT関数は、複数の文字列を連結できる関数です。

  • GROUP BY句

 GROUP BY句は、ある特定のデータごとに、平均値や総量などを集計するときに用いる句です。例えばカラム名にuser_idが入れば、user_idがグループ化されます。すると、user_idごとの平均値や総量を集計できます。

GROUP BY カラム名
  • COUNT関数

COUNT関数は、グループ化されたデータに対して使用できる、データの総量をカウントするための関数です。カラムを指定することで、そのカラムのデータの行数を取得できます。

SELECT COUNT(カラム名) # カラムの値が「NULL」だとエラーになるので注意。ただし、SELECT COUNT(*)と記述すると「行の値がすべてNULL」であるレコードも取得します。

上記を使って**「特定の日にちに誰が何コマシフトに入ったか」**を検索します。下記を実行。

SELECT
  CONCAT(last_name, first_name) "名前"
  COUNT(*) "コマ数"
FROM shifts s
JOIN users u ON s.user_id = u.id
WHERE date = "2021-05-31"
GROUP BY user_id

上記で行ったこと:

  • SELECTで表示されるものを「名前(CONCATを使用)」「入ったコマ数(COUNTを使用)」の表示しました

  • WHEREを用いて特定の日にちを指定しました

  • GROUP BYで各ユーザーごとに集計ができるようにしました

  • サブクエリ
    サブクエリとは、ある検索結果を使用して、別のSQL文を実行する仕組みのことです。

**「特定の日にち("2021-5-31")にシフトに入っていない人」**を検索する場合の工程を見てみます。下記。

まず、"2021-5-31"にシフトに入っている人の一覧を取得します。

SELECT user_id
FROM shifts
WHERE date = "2021-5-31"

次に、上記を実行して取得したリストを使って、usersテーブルからidがリストに含まれていないレコードのみを取得するSQL文を記述します。WHERE句で、NOT INを使用して下記のように記述できそうです。

SELECT *
FROM users
WHERE id NOT IN (リスト)

(リスト)という部分に、先ほど取得した"2021-5-31"にシフトに入っている人のリストを取得するSQL文を埋め込みます。下記を実行。

SELECT *
FROM users
WHERE id NOT IN (
    SELECT user_id
    FROM shifts
    WHERE date = "2021-5-31"
)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?