【データベース】「SQLの実践」簡単速習‼【②WHERE句・関数/MySQL】

SQL

こんにちはヤク学長です。
データサイエンティスト兼ファーマシストで、アルゴリズムやBI開発を行っています。

本記事の目的は、「SQLの基本操作を知る」ことを目的としています。

【本記事のもくじ】

まず、「SQL」に真剣に取り組むための概要を解説します。
下記の方法で、簡単に概要を抑えることができます。

  • 3.WHERE句
  • 4.関数の様々な利用方法

それでは、上から順番に見ていきます。
なお、本上記の方法を順番に抑えれば成果が出ます。

記事の内容は「転載 & 引用OK」問題ありません。

3.WHERE句

MySQLにおいて、WHERE句を使用してデータの取得条件を指定することができます。WHERE句を使用することで、指定した条件に合致するデータのみを取得することができます。

以下は、WHERE句を使用してデータの取得条件を指定する例です。テーブルとして、顧客情報を保持する customers テーブルを使用します。

SELECT * FROM customers WHERE age >= 20 AND gender = 'female';

上記の例では、customers テーブルから、年齢が 20 歳以上で、性別が女性の顧客情報を取得する SQL 文を実行しています。WHERE句の後に指定された条件が、AND演算子で結合されており、条件が両方成立する場合に結果に含まれます。

また、以下は OR演算子を使用した例です。

SELECT * FROM customers WHERE age >= 20 OR gender = 'female';

上記の例では、年齢が 20 歳以上であるか、または性別が女性である顧客情報を取得する SQL 文を実行しています。OR演算子を使用することで、いずれかの条件が成立する場合に結果に含まれます。

WHERE句には、比較演算子や論理演算子を組み合わせて、より複雑な条件を指定することができます。また、文字列型のデータについては、LIKE演算子を使用して部分一致検索を行うことができます。以下は、LIKE演算子を使用した例です。

SELECT * FROM customers WHERE name LIKE '%山田%';

上記の例では、名前に「山田」を含む顧客情報を取得する SQL 文を実行しています。LIKE演算子には、%記号を使用して部分一致検索を行うことができます。

MySQLのWHERE句を使用することで、条件に合致するデータのみを取得することができます。WHERE句は、データの取得条件を指定する際に非常に便利な構文です。

UPDATE DELETE

SQLにおけるUPDATEとDELETEの説明です。

UPDATE: UPDATE文は、データベース内のテーブルのレコードを更新するために使用されます。UPDATE文では、変更したいテーブル名、更新したいカラム名、新しい値が指定されます。また、WHERE句を使用して、更新するレコードを指定することができます。

UPDATE table_name SET column_name = new_value WHERE condition;

上記の例では、table_name テーブルから、conditionに一致するレコードのcolumn_name列の値をnew_valueに更新する SQL 文を実行しています。

DELETE: DELETE文は、データベース内のテーブルからレコードを削除するために使用されます。DELETE文では、削除したいテーブル名と削除するレコードを指定するためのWHERE句が指定されます。

DELETE FROM table_name WHERE condition;

上記の例では、table_name テーブルから、conditionに一致するレコードを削除する SQL 文を実行しています。

UPDATE文とDELETE文は、データベースのデータを変更するための重要な構文です。ただし、UPDATE文やDELETE文を実行する場合は、事前にバックアップを取得しておくことを推奨します。

3値論理について

3値論理とは、真(True)、偽(False)、未定義(Null)の3つの値を扱う論理です。真偽値論理では、真と偽の2つの値しか扱えませんが、3値論理では、未定義の値も扱うことができます。

未定義(Null)の値は、真でも偽でもなく、データが存在しないことを示します。3値論理を扱う場合、演算子や比較式などの論理式の結果は、真、偽、未定義のいずれかになることがあります。

例えば、以下のような論理式があるとします。

A and B

この場合、AとBがともに真であれば、結果は真となります。しかし、AとBのどちらかが偽であれば、結果は偽となります。しかし、AまたはBのどちらかが未定義であれば、結果は未定義となります。3値論理を扱う場合は、未定義の値に対する考慮が必要になります。

3値論理は、主にデータベースやプログラミング言語の条件式において使用されます。例えば、データベースのテーブルには、カラムにNULL値を許容することができます。その場合、条件式にNULL値が含まれる可能性があるため、3値論理を使用して、条件式の評価結果が真、偽、未定義のいずれかになるようにします。

NULL BETWEEN LIKE

SQLにおけるNULL、BETWEEN、LIKEの説明です。

NULL: NULLは、値が存在しないことを示す特別な値です。NULLは値が存在しないことを表すため、比較演算子を使用しても値を比較することができません。IS NULL句を使用して、NULL値かどうかを判定することができます。また、IS NOT NULL句を使用して、NULL値でないことを判定することができます。

SELECT * FROM table_name WHERE column_name IS NULL;

上記の例では、table_name テーブルから、column_name列がNULL値であるレコードを取得する SQL 文を実行しています。

BETWEEN: BETWEENは、ある範囲の値を検索するために使用されます。BETWEEN句は、範囲を指定するために最小値と最大値を含みます。BETWEEN句は、AND句を使用して最小値と最大値を区切ります。

SELECT * FROM table_name WHERE column_name BETWEEN min_value AND max_value;

上記の例では、table_name テーブルから、column_name列がmin_valueとmax_valueの間にあるレコードを取得する SQL 文を実行しています。

LIKE: LIKE演算子は、ある文字列を含む値を検索するために使用されます。LIKE演算子は、ワイルドカードを使用して検索条件を指定することができます。%記号は、0個以上の任意の文字列を表し、_記号は、任意の1文字を表します。

SELECT * FROM table_name WHERE column_name LIKE 'search_string%';

上記の例では、table_name テーブルから、column_name列が、search_stringで始まるレコードを取得する SQL 文を実行しています。

SQLにおいて、NULL、BETWEEN、LIKEは、データの検索や条件指定に非常に便利な機能です。

空白を取り出す

MySQL で空白を取り出す場合、通常は LIKE 演算子を使用します。以下に具体例を示します。

例1:空白を含むデータの検索

SELECT * FROM table_name WHERE column_name LIKE '% %';

上記の例では、table_name テーブルの column_name 列に空白を含むデータを検索します。% % は、空白を含む任意の文字列に一致するワイルドカードです。

例2:空白以外の文字列を取り出す

SELECT TRIM(BOTH ' ' FROM column_name) AS trimmed_string FROM table_name;

上記の例では、table_name テーブルの column_name 列から空白以外の文字列を取り出します。TRIM 関数を使用して、文字列の先頭と末尾の空白を取り除き、BOTH キーワードを使用して、先頭と末尾の両方から空白を取り除きます。AS キーワードを使用して、新しい列名 trimmed_string を指定します。

4.関数の様々な利用方法

IN, NOT IN

IN および NOT IN は、MySQLで使用される演算子の一つで、特定の値があるかどうかを確認するために使用されます。

IN演算子は、指定された一連の値の中に、特定の列の値が含まれている場合に、真の値を返します。例えば、次のクエリは、employeesテーブルのjob_title列に「Manager」または「Director」のどちらかがある場合に、その行を返します。

SELECT * FROM employees WHERE job_title IN ('Manager', 'Director');

NOT IN演算子は、IN演算子と逆の動作をします。つまり、指定された一連の値の中に、特定の列の値が含まれていない場合に、真の値を返します。例えば、次のクエリは、employeesテーブルのjob_title列に「Manager」または「Director」のどちらもない場合に、その行を返します。

SELECT * FROM employees WHERE job_title NOT IN ('Manager', 'Director');

IN演算子とNOT IN演算子は、複数の値を比較する場合に特に有用です。また、サブクエリを使用して、別のSELECTステートメントの結果と比較することもできます。

ANY

ANYは、MySQLで使用される演算子の一つで、サブクエリの結果が値のリストのいずれかと一致する場合に真を返します。

以下は、ANY演算子の例です。employeesテーブルのsalary列が、departmentsテーブルの任意の部門の平均給与よりも高い場合、employeesテーブルのレコードを返します。

SELECT * FROM employees WHERE salary > ANY (SELECT AVG(salary) FROM departments);

このクエリでは、サブクエリ(SELECT AVG(salary) FROM departments)が実行され、departmentsテーブル内の各部門の平均給与が計算されます。次に、employeesテーブルのsalary列が、この平均給与リストのいずれかよりも高い場合、その従業員のレコードが返されます。

ANY演算子は、サブクエリの結果を単一の値と比較することができるため、SQLクエリの柔軟性を高めるために使用されます。ただし、複雑なクエリになる可能性があるため、注意が必要です。

ALL

ALLは、MySQLで使用される演算子の一つで、サブクエリの結果が値のリストのすべてと一致する場合に真を返します。

以下は、ALL演算子の例です。employeesテーブルのsalary列が、departmentsテーブルの任意の部門の平均給与よりも高い場合、employeesテーブルのレコードを返します。

SELECT * FROM employees WHERE salary > ALL (SELECT AVG(salary) FROM departments);

このクエリでは、サブクエリ(SELECT AVG(salary) FROM departments)が実行され、departmentsテーブル内の各部門の平均給与が計算されます。次に、employeesテーブルのsalary列が、この平均給与リストのすべてよりも高い場合、その従業員のレコードが返されます。

ALL演算子は、サブクエリの結果を単一の値と比較することができるため、SQLクエリの柔軟性を高めるために使用されます。ただし、複雑なクエリになる可能性があるため、注意が必要です。また、ALL演算子は、条件式に指定されたすべての値が一致する場合にのみ真を返すため、条件式が非常に厳密になる傾向があります。

AND、OR、NOT

AND、OR、NOTは、MySQLで使用される論理演算子です。

AND演算子は、2つの条件式が両方とも真である場合に真を返します。例えば、以下のクエリは、employeesテーブルからjob_titleが「Manager」であり、salaryが50000以上の従業員のレコードを返します。

SELECT * FROM employees WHERE job_title = 'Manager' AND salary >= 50000;

OR演算子は、2つの条件式のいずれかが真である場合に真を返します。例えば、以下のクエリは、employeesテーブルからjob_titleが「Manager」またはsalaryが50000以上の従業員のレコードを返します。

SELECT * FROM employees WHERE job_title = 'Manager' OR salary >= 50000;

NOT演算子は、条件式を否定します。つまり、条件式が真である場合に偽を返し、条件式が偽である場合に真を返します。例えば、以下のクエリは、employeesテーブルからjob_titleが「Manager」でない従業員のレコードを返します。

SELECT * FROM employees WHERE NOT job_title = 'Manager';

これらの論理演算子を組み合わせることで、複雑な条件を指定することができます。

NULLの注意点

NULLは、MySQLにおいて、値が未知であることを示す特別な値です。NULLは、データベースにおいて非常に重要な役割を果たしていますが、その使用にはいくつかの注意点があります。

比較演算子の使用に注意が必要
NULLは、値が未知であることを示すため、比較演算子を使用して他の値と比較することはできません。例えば、以下のクエリは、結果が0件になります。

SELECT * FROM employees WHERE salary = NULL;

正しいクエリは、IS NULL演算子を使用する必要があります。

SELECT * FROM employees WHERE salary IS NULL;

NULLはインデックスされない
NULL値は、インデックスされないため、検索のパフォーマンスに影響を与える可能性があります。NULLが多数のレコードに存在する場合、クエリのパフォーマンスが低下することがあります。

NULLは集計関数で扱いにくい
NULL値は、集計関数(SUM、AVG、COUNTなど)によって扱いにくくなる場合があります。これは、NULL値が含まれるレコードは、集計関数の結果から除外されるためです。この問題を解決するためには、COALESCE関数やIFNULL関数を使用する必要があります。

NULLを使用するカラムに対してNOT NULL制約を使用しない
NULLを許容するカラムにNOT NULL制約を使用すると、データベースにエラーが発生します。また、NOT NULL制約を使用しないことにより、NULL値を使用できるカラムを設計できます。

以上の点を踏まえて、NULL値を適切に使用することが重要です。

算術演算子

算術演算子は、MySQLで使用される演算子の一つで、数値データ型の列で計算を行うために使用されます。主な算術演算子には、加算、減算、乗算、除算が含まれます。

以下は、算術演算子を使用した例です。

加算演算子(+):

SELECT column1 + column2 AS sum FROM table_name;

上記の例では、table_nameテーブルのcolumn1とcolumn2の合計を返します。ASキーワードを使用して、新しい列名sumを指定します。

減算演算子(-):

SELECT column1 - column2 AS difference FROM table_name;

上記の例では、table_nameテーブルのcolumn1からcolumn2を減算した結果を返します。ASキーワードを使用して、新しい列名differenceを指定します。

乗算演算子(*):

SELECT column1 * column2 AS product FROM table_name;

上記の例では、table_nameテーブルのcolumn1とcolumn2を乗算した結果を返します。ASキーワードを使用して、新しい列名productを指定します。

除算演算子(/):

SELECT column1 / column2 AS quotient FROM table_name;

上記の例では、table_nameテーブルのcolumn1をcolumn2で除算した結果を返します。ASキーワードを使用して、新しい列名quotientを指定します。

算術演算子は、数値データ型の列でのみ使用できます。また、除算演算子で0で割ることはできないため、エラーが発生する可能性があります。

日付に関する関数

MySQLには、日付と時間を操作するための多数の関数が用意されています。以下にいくつかの例を示します。

NOW()関数:

SELECT NOW();

上記の例では、現在の日付と時間を返します。

CURDATE()関数:

SELECT CURDATE();

上記の例では、現在の日付を返します。

DATE_FORMAT(date, format)関数:

上記の例では、指定された日付を「年/月/日」の形式で返します。date引数には、日付データ型の列名、または日付文字列が指定されます。format引数には、日付と時間をフォーマットするための指定子が指定されます。

これらの関数を使用して、日付と時間を取得およびフォーマットすることができます。これらの関数を使用すると、日付と時間に関する多くのタスクを簡単に処理できます。

LENGTH CHAR_LENGRTH

MySQLには、文字列を操作するための多数の関数が用意されています。そのうちの2つの関数として、LENGTH()関数とCHAR_LENGTH()関数があります。

LENGTH()関数は、指定された文字列のバイト数を返します。文字列内にマルチバイト文字が含まれている場合、その文字は1つの文字として数えられます。

以下は、LENGTH()関数の例です。

SELECT LENGTH('Hello, World!');

上記の例では、文字列「Hello, World!」のバイト数(13バイト)を返します。

CHAR_LENGTH()関数

CHAR_LENGTH()関数は、指定された文字列の文字数を返します。文字列内にマルチバイト文字が含まれている場合、その文字も1つの文字として数えられます。

以下は、CHAR_LENGTH()関数の例です。

SELECT CHAR_LENGTH('Hello, World!');

上記の例では、文字列「Hello, World!」の文字数(13文字)を返します。

これらの関数を使用して、文字列のバイト数または文字数を取得することができます。

TRIM()関数、LTRIM()関数、RTRIM()関数

MySQLには、文字列を操作するための多数の関数が用意されています。そのうちの3つの関数として、TRIM()関数、LTRIM()関数、およびRTRIM()関数があります。

TRIM()関数は、指定された文字列から、先頭および末尾の空白文字(スペース、タブ、改行など)を削除します。

以下は、TRIM()関数の例です。

SELECT TRIM(' Hello, World! ');

上記の例では、文字列「 Hello, World! 」から、先頭および末尾の空白文字を削除した文字列「Hello, World!」を返します。

LTRIM()関数は、指定された文字列から、先頭の空白文字を削除します。

以下は、LTRIM()関数の例です。

SELECT LTRIM(' Hello, World! ');

上記の例では、文字列「 Hello, World! 」から、先頭の空白文字を削除した文字列「Hello, World! 」を返します。

RTRIM()関数は、指定された文字列から、末尾の空白文字を削除します。

以下は、RTRIM()関数の例です。

SELECT RTRIM(' Hello, World! ');

上記の例では、文字列「 Hello, World! 」から、末尾の空白文字を削除した文字列「 Hello, World!」を返します。

これらの関数を使用して、文字列の先頭および末尾の空白文字を削除することができます。

REPLACE

REPLACE()関数は、指定された文字列内の指定された部分文字列を、別の文字列で置き換えます。この関数は、文字列を修正する必要がある場合に特に役立ちます。

以下は、REPLACE()関数の例です。

SELECT REPLACE('Hello, World!', 'Hello', 'Hi');

上記の例では、文字列「Hello, World!」内の「Hello」を「Hi」に置き換えた文字列「Hi, World!」を返します。

また、複数の文字列を置き換える場合、REPLACE()関数を連結して使用することができます。例えば、以下のクエリは、「Hello」と「World」をそれぞれ「Hi」と「MySQL」に置き換えた文字列を返します。

SELECT REPLACE(REPLACE('Hello, World!', 'Hello', 'Hi'), 'World', 'MySQL');

上記の例では、最初に「Hello」を「Hi」に、次に「World」を「MySQL」に置き換えた文字列「Hi, MySQL!」を返します。

これらの例から、REPLACE()関数を使用して文字列内の指定された部分文字列を置き換えることができることがわかります。

UPPER LOWER

MySQLには、文字列を操作するための多数の関数が用意されています。そのうちの2つの関数として、UPPER()関数とLOWER()関数があります。

UPPER()関数は、指定された文字列を大文字に変換します。

以下は、UPPER()関数の例です。

SELECT UPPER('Hello, World!');

上記の例では、文字列「Hello, World!」を大文字に変換した文字列「HELLO, WORLD!」を返します。

LOWER()関数は、指定された文字列を小文字に変換します。

以下は、LOWER()関数の例です。

SELECT LOWER('Hello, World!');

上記の例では、文字列「Hello, World!」を小文字に変換した文字列「hello, world!」を返します。

これらの関数を使用して、文字列を大文字または小文字に変換することができます。これらの関数は、検索やソートのために文字列を正規化する場合などに便利です。

REVERSE

REVERSE()関数は、指定された文字列を逆順にします。

以下は、REVERSE()関数の例です。

SELECT REVERSE('Hello, World!');

上記の例では、文字列「Hello, World!」を逆順にした文字列「!dlroW ,olleH」を返します。

この関数を使用して、文字列を逆順にすることができます。文字列の反転は、多くの場合、特定のテキスト処理のために必要な前処理ステップとして使用されます。

数学関数

ROUND FLOOR CEILING

MySQLには、数値を操作するための多数の関数が用意されています。そのうちの3つの関数として、ROUND()関数、FLOOR()関数、およびCEILING()関数があります。

ROUND()関数は、指定された数値を指定された桁数に四捨五入します。

以下は、ROUND()関数の例です。

SELECT ROUND(3.14159265, 2);

上記の例では、数値3.14159265を小数点以下2桁に四捨五入した結果、3.14が返されます。

FLOOR()関数は、指定された数値を小数点以下を切り捨てて整数にします。

以下は、FLOOR()関数の例です。

SELECT FLOOR(3.999);

上記の例では、数値3.999を小数点以下を切り捨てて整数にした結果、3が返されます。

CEILING()関数は、指定された数値を小数点以下を切り上げて整数にします。

以下は、CEILING()関数の例です。

SELECT CEILING(3.001);

上記の例では、数値3.001を小数点以下を切り上げて整数にした結果、4が返されます。

これらの関数を使用して、数値を四捨五入、切り捨て、または切り上げることができます。これらの関数は、特にフォーマットや比較など、数値を扱う様々な場面で役立ちます。

RAND関数

RAND()関数は、ランダムな数値を返します。この関数は、引数を持たずに使用され、返される数値は0以上1未満の実数値です。

以下は、RAND()関数の例です。

SELECT RAND();

上記の例では、0以上1未満のランダムな実数値が返されます。

この関数は、ランダムな値が必要な場合に使用されます。たとえば、ランダムなIDやパスワードを生成するために使用されることがあります。RAND()関数を使用すると、ランダムな値を手軽に生成することができます。

POWER

POWER()関数は、指定された数値の指数乗を計算します。指数は、関数に渡される第二引数で指定されます。

以下は、POWER()関数の例です。

SELECT POWER(2, 3);

上記の例では、数値2の3乗を計算し、結果である8を返します。

指数には、負の値や小数値も使用することができます。たとえば、以下のクエリは、数値4の0.5乗(つまり、4の平方根)を計算します。

SELECT POWER(4, 0.5);

上記の例では、数値4の0.5乗を計算し、結果である2を返します。

この関数を使用して、数値の累乗を計算することができます。数値を操作する多くのタスクに使用されます。

COALESCE

COALESCE()関数は、指定された複数の式の中から、最初にNULL以外の値を返します。つまり、指定された式の値がNULLの場合、次の式の値が返されます。全ての式の値がNULLの場合、COALESCE()関数はNULLを返します。

以下は、COALESCE()関数の例です。

SELECT COALESCE(NULL, 'Hello', 'World');

上記の例では、最初の引数がNULLであるため、次の引数である「Hello」が返されます。

また、以下のクエリは、全ての引数がNULLであるため、COALESCE()関数はNULLを返します。

SELECT COALESCE(NULL, NULL, NULL);

COALESCE()関数は、複数の列から値を取得する場合や、NULLの値を扱う必要がある場合に便利です。また、CASE文を使用して同じ処理を行うこともできますが、COALESCE()関数は簡潔で読みやすいコードを実現できます。

SUBSTRING SUBSTR

MySQLには、文字列を操作するための多数の関数が用意されています。そのうちの2つの関数として、SUBSTRING()関数およびSUBSTR()関数があります。これらの関数は、指定された文字列の一部を取り出すために使用されます。

SUBSTRING()関数は、指定された文字列の一部を取り出します。引数には、元の文字列、取り出したい文字列の開始位置、および取り出す文字列の長さが指定されます。また、第2および第3引数を省略することもできます。省略された場合、SUBSTRING()関数は文字列の先頭から最後までを返します。

以下は、SUBSTRING()関数の例です。

SELECT SUBSTRING('Hello, World!', 1, 5);

上記の例では、文字列「Hello, World!」の1文字目から5文字目までを取り出した文字列「Hello」を返します。

また、以下のクエリは、SUBSTRING()関数で文字列の一部を取り出す別の方法を示しています。

SELECT SUBSTRING('Hello, World!', 8);

上記の例では、文字列「Hello, World!」の8文字目から最後までを取り出した文字列「World!」を返します。

SUBSTR()関数は、SUBSTRING()関数と同様に動作しますが、引数の順序が異なります。第1引数に元の文字列、第2引数に取り出したい文字列の開始位置、および必要に応じて第3引数に取り出す文字列の長さを指定します。

以下は、SUBSTR()関数の例です。

SELECT SUBSTR('Hello, World!', 1, 5);

上記の例では、文字列「Hello, World!」の1文字目から5文字目までを取り出した文字列「Hello」を返します。

これらの関数を使用して、指定された文字列の一部を取り出すことができます。このような操作は、特定のテキスト処理のために必要な前処理ステップとして使用されます。


というわけで、今回は以上です。大変大変お疲れ様でした。
引き続きで、徐々に発信していきます。

コメントや感想を受け付けています。ちょっとした感想でもいいので嬉しいです。

それでは、以上です。

最新情報をチェックしよう!