WHERE句#

WHERE句(WHERE clause)は、SQL文において、特定の条件を満たす行を選択するために使用されます。WHERE句は、SELECTUPDATEDELETEなどのSQL文で使用されます。

Boolean式#

https://www.sqlite.org/lang_expr.html

The SQL language features several contexts where an expression is evaluated and the result converted to a boolean (true or false) value. These contexts are:

  • the WHERE clause of a SELECT, UPDATE or DELETE statement,

  • the ON or USING clause of a join in a SELECT statement,

  • the HAVING clause of a SELECT statement,

  • the WHEN clause of an SQL trigger, and

  • the WHEN clause or clauses of some CASE expressions.

To convert the results of an SQL expression to a boolean value, SQLite first casts the result to a NUMERIC value in the same way as a CAST expression. A numeric zero value (integer value 0 or real value 0.0) is considered to be false. A NULL value is still NULL. All other values are considered true.

For example, the values NULL, 0.0, 0, ‘english’ and ‘0’ are all considered to be false. Values 1, 1.0, 0.1, -0.1 and ‘1english’ are considered to be true.

Beginning with SQLite 3.23.0 (2018-04-02), SQLite recognizes the identifiers “TRUE” and “FALSE” as boolean literals, if and only if those identifiers are not already used for some other meaning. If there already exists columns or tables or other objects named TRUE or FALSE, then for the sake of backwards compatibility, the TRUE and FALSE identifiers refer to those other objects, not to the boolean values.

The boolean identifiers TRUE and FALSE are usually just aliases for the integer values 1 and 0, respectively. However, if TRUE or FALSE occur on the right-hand side of an IS operator, then the IS operator evaluates the left-hand operand as a boolean value and returns an appropriate answer.

演算子#

以下のstudentsテーブルを例に、WHERE句で使用される演算子を説明します。

CREATE TABLE students (
    StudentID TEXT PRIMARY KEY,
    Name TEXT NOT NULL,
    Age INTEGER CHECK (Age >= 18),
    Department TEXT,
    Gender TEXT
);
INSERT INTO students (StudentID, Name, Age, Department, Gender) VALUES
('S001', 'Alice', 20, 'Computer Science', 'Female'),
('S002', 'Bob', 22, 'Mathematics', 'Male'),
('S003', 'Charlie', 19, 'Computer Science', 'Male'),
('S004', 'David', 21, 'Physics', 'Male');

比較演算子#

比較演算子は、左右の値を比較し、正しければ真(TRUE)、そうでなければ偽(FALSE)を返します。

演算子

説明

= or ==

等しい

<> or !=

等しくない

>

より大きい

<

より小さい

>=

以上

<=

以下

以下は,年齢が20歳より大きい学生を選択するSQL文の例です。

SELECT * FROM students
WHERE Age > 20;

以下は,所属が「Computer Science」の学生を選択するSQL文の例です。

SELECT * FROM students
WHERE Department = 'Computer Science';

論理演算子#

論理演算子は,複数の式を組み合わせて、真偽値を返すものです。

演算子

説明

AND

かつ

OR

または

NOT

否定

pとqを論理変数とした場合の真理値表は次の通りです。

p

q

p AND q

p OR q

NOT p

T

T

T

T

F

T

F

F

T

F

F

T

F

T

T

F

F

F

F

T

以下は,所属が「Computer Science」の男性学生の人数を選択するSQL文の例です。

SELECT COUNT(*) FROM students
WHERE Department = 'Computer Science' AND Gender = 'Male';

BETWEEN演算子#

BETWEEN演算子は、ある値が指定した範囲内にあるかどうかを確認するために使用されます。x BETWEEN y AND zは、x>= y AND x <= zと論理的に同等です。ただし、BETWEENを使用すると、xの式は一度だけ評価されます。

構文は次の通りです。

SELECT column1, column2, ...
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

以下は,年齢が18歳から25歳の学生を選択するSQL文の例です。

SELECT * FROM students
WHERE Age BETWEEN 18 AND 25;

IN演算子,NOT IN演算子#

IN演算子は,値のリストのいずれかに一致するかを判定する演算子です.

構文は次の通りです。

SELECT column1, column2, ...
FROM table_name
WHERE column_name IN (value1, value2, ...);

以下は,所属が「Computer Science」または「Mathematics」の学生を選択するSQL文の例です。

SELECT * FROM students
WHERE Department IN ('Computer Science', 'Mathematics');

or演算子を使用して同じ結果を得ることもできますが、IN演算子を使用すると、より簡潔に記述できます。

SELECT * FROM students
WHERE Department = 'Computer Science' OR Department = 'Mathematics';

NOT IN演算子を使用すると、値のリストに一致しない行を選択できます。

以下は,所属が「Computer Science」または「Mathematics」以外の学生を選択するSQL文の例です。

SELECT * FROM students
WHERE Department NOT IN ('Computer Science', 'Mathematics');

LIKE演算子#

LIKE演算子は,文字列のパターンマッチング(pattern matching)を行う演算子です。

symbol

説明

%

任意の0文字以上の文字列

_

任意の1文字

以下は,名前が「ali」で始まる学生を選択するSQL文の例です。

SELECT * FROM students
WHERE Name LIKE 'ali%';

以下は,学籍番号が「02」で終わる学生を選択するSQL文の例です。

SELECT * FROM students
WHERE StudentID LIKE '%02';

以下は,名前の3文字目が「b」である学生を選択するSQL文の例です。

SELECT * FROM students
WHERE Name LIKE '__b%';

以下は,名前に「i」が含まれる学生を選択するSQL文の例です。

SELECT * FROM students
WHERE Name LIKE '%i%';

練習#

student.dbというデータベースを作成し、WHERE句の練習を行います。

CREATE TABLE students (
    student_id TEXT PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT NOT NULL
);

CREATE TABLE classes (
    class_id TEXT PRIMARY KEY,
    name TEXT NOT NULL
);

CREATE TABLE enrollments (
    student_id TEXT NOT NULL,
    class_id TEXT NOT NULL,
    enrollment_date TEXT NOT NULL,
    grade INTEGER,
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (class_id) REFERENCES classes(class_id)
    PRIMARY KEY (student_id, class_id)
);

INSERT INTO students (student_id, name, email) VALUES
('S001', 'Alice', 's001@example.ac.jp'),
('S002', 'Bob', 's002@example.ac.jp'),
('S003', 'Charlie', 's003@example.ac.jp');

INSERT INTO classes (class_id, name) VALUES
('C001', 'Mathematics'),
('C002', 'Physics'),
('C003', 'Chemistry');

INSERT INTO enrollments (student_id, class_id, enrollment_date, grade) VALUES
('S001', 'C001', '2023-04-21', 85),
('S001', 'C002', '2023-05-01', 90),
('S001', 'C003', '2023-04-01', 53),
('S002', 'C001', '2023-04-11', 78),
('S002', 'C002', '2023-04-14', 82),
('S002', 'C003', '2023-04-24', 75),
('S003', 'C001', '2023-04-25', 88),
('S003', 'C002', '2023-05-04', 92),
('S003', 'C003', '2023-04-01', 88);

練習問題#

  1. studentsテーブルから、名前が「Alice」の学生のメールアドレスを選択してください。

  2. studentsテーブルから、名前に「e」が含まれる学生のIDと名前を選択してください。

  3. studentsテーブルから、名前が「A」で始まる学生のIDと名前を選択してください。

  4. 科目C001の成績が60点以上の学生のIDを選択してください。

  5. C001C002のいずれかの科目で成績が80点以上の学生のIDを選択してください。ただし,DISTINCTを使用して重複を除外してください。

  6. IN演算子を使用して、C001またはC002のいずれかの科目に登録している学生のIDを選択してください。

  7. BETWEEN演算子を使用して、C001の成績が80点以上かつ100点以下の学生数を選択してください。

解答例#

SELECT email FROM students
WHERE name = 'Alice';
SELECT student_id, name FROM students
WHERE name LIKE '%e%';
SELECT student_id, name FROM students
WHERE name LIKE 'A%';
SELECT student_id FROM enrollments
WHERE class_id = 'C001' AND grade >= 60;
SELECT DISTINCT student_id FROM enrollments
WHERE (class_id = 'C001' OR class_id = 'C002') AND grade >= 80;
SELECT DISTINCT student_id FROM enrollments
WHERE class_id IN ('C001', 'C002');
SELECT COUNT(*) FROM enrollments
WHERE class_id = 'C001' AND grade BETWEEN 80 AND 100;