SQL②

①が長くなったのでこちらに記述

IS NULL演算子

特定のカラムのデータがNULLであるレコードを指定するときに指定する演算子。
SELECT文をはじめとした、レコードを検索する時の条件指定時に利用する。

SELECT <カラム名A> FROM <テーブル名> WHERE <カラム名B> IS NULL

表データ「<テーブル名>」のうち、
列「<カラム名B>」の値がNULLのレコードの、
列「<カラム名A>」を読み出す。


SELECT * FROM `従業員リスト` WHERE `住所` IS NULL
 #出力 
('名前', '部署', '年齢', '住所')
[('八木沢晃', '開発一課', 37, None)]



IS NOT NULL演算子

特定のカラムのデータがNULLではないレコードを指定。レコードを検索する時の条件指定時に使う。

SELECT <カラム名A> FROM <テーブル名> WHERE <カラム名B> IS NOT NULL

表データ「<テーブル名>」のうち、
列「<カラム名B>」の値がNULLではないレコードの、
列「<カラム名A>」を読み出す。
SELECT * FROM `従業員リスト` WHERE `住所` IS NOT NULL



AS句

AS句は、取得したレコードのカラムに名前を付け直すときに使用。
AS <カラム名B>としてデータを取得した時、データベースが持つカラムの名前(<カラム名A>)は変更されない。
あくまで、読み出した結果の中で名前が<カラム名B>に変わる。


SELECT <カラム名A> AS <カラム名B> FROM <テーブル名>

表データ「<テーブル名>」のうち、列「<カラム名A>」を「<カラム名B>」として読み出す。
  SELECT `名前` AS `従業員名` FROM `従業員リスト`

   #出力 
   ('従業員名',) [('鈴木太郎',), ('山田太郎',), ('愛出美二郎',), ('八木沢晃',), ('千駄木千代',)]


BETWEEN句

カラムの値の範囲を指定するときに使用

SELECT <カラム名A> FROM <テーブル名> WHERE <カラム名B> BETWEEN <値A> AND <値B>

表データ「<テーブル名>」の、列「<カラム名B>」のデータが
<値A>から<値B>までのレコードから、
列「<カラム名A>」を読み出す。

例えば、BETWEEN 10 and 25だとすると、指定したカラムの値が10以上・25以下のレコードだけが読み出し対象として指定される。
値には、数値だけでなくテキストや日付けといったデータ形式も扱える。

SELECT * FROM `従業員リスト` WHERE `年齢` BETWEEN 18 AND 35



LIKE句

文字列を検索してレコードを指定できる。

SELECT <カラム名A> FROM <テーブル名> WHERE <カラム名B> LIKE '検索する文字列'

表データ「<テーブル名>」の、列「<カラム名B>」が
「検索する文字列」のレコードから、
列「<カラム名A>」を読み出す。

LIKE句を使って検索する文字列には、ワイルドカードと呼ばれる特別な記号が使える。ワイルドカードを使うことで、文字列のパターンを指定した検索ができ、LIKE句で使えるワイルドカードは以下の2種。

  • %:任意の0文字以上

  • _:任意の1文字

例えばLIKE  '中島%' と表現すると、「中島」から始まるデータを持つレコードを選択できる。

SELECT * FROM テーブル WHERE `氏名` LIKE '中島%'

LIKE  '_島%' と表現すると、1文字目が任意の文字列が該当。
例えば「田島」、「高島」、「三島」などから文字列が始まるレコードが全て取得できる。_は任意の1文字なので、「川中島」から文字列が始まるレコードは選ばれない。

SELECT * FROM テーブル WHERE `氏名` LIKE '_島%'


 DISTINCT句

DISTINCT句は、重複したレコードを除外しつつ指定したカラムを読み出します。

SELECT DISTINCT <カラム名> FROM <テーブル名>

SELECT DISTINCT `部署` FROM `従業員リスト`  #出力 
('部署',)
[('営業一課',), ('営業二課',), ('開発一課',), ('開発二課',)]
サンプル



UNION句、UNION ALL句


UNION句
は、複数の検索結果を統合するときに使います。UNIONの前後でそれぞれ指定したデータを、一つのテーブルデータのように統合して出力します。

SELECT <カラム名A> FROM <テーブル名A> WHERE <条件式A> 
UNION
SELECT <カラム名B> FROM <テーブル名B> WHERE <条件式B>
 #表データ 「<テーブル名A>」のうち条件式Aに一致するレコードの列「<カラム名A>」と
 表データ「<テーブル名B>」のうち条件式Bに一致するレコードの列「<カラム名B>」を
 結合して読み出す。

UNION句は、複数の指定したレコードを統合できます。

統合するデータは、同じ形式でなければいけません。例示したレコードで言えば、<カラム名A>と<カラム名B>で指定するカラムが同じ数であり、同系統のデータ形式である必要があります。
UNION句で統合したデータは、重複するレコードを除外した上で取得されます。重複を除外せずに取得する場合は、UNIONをUNION ALLに代えて使います。

SELECT `名前` FROM `A大学志望者`
UNION
SELECT `名前` FROM `B大学志望者` #出力 
('名前',)
[('鈴木太郎',), ('愛出美二郎',), ('八木沢晃',), ('山田太郎',), ('千駄木千代',)]



四則演算

SQLは四則演算など簡単な数値計算ができます。また、カラムを指定して計算することもできます。
例えば、ある成績テーブルがあったとします。ある3教科それぞれのテストの点数を記録しているテーブルです。
成績テーブルは3教科の合計点を記録するカラムを持っていませんが、次のようなクエリーを実行することで合計点数を算出して読み出せます。

SELECT `国語` + `数学` + `英語` FROM `成績`


国語の点数を3教科の平均点との差を計算して出力。3教科平均より国語の点数が高ければプラス値、低ければマイナス値とし、名前を「差分」に変えて読み出し。

SELECT `名前` , `国語` - (`国語`+`数学`+`英語`)/ 3 AS `差分` FROM `成績` #出力 
('名前', '差分')
[('太郎', Decimal('14.6667')), ('二郎', Decimal('10.0000')), ('三郎', Decimal('-29.3333'))]



MOD関数

MOD関数は、割り算をした余り(剰余)を計算する関数

SELECT <カラム名> % <値> FROM <テーブル名>



成績テーブル、数学点数を3で割った余りを、「剰余」という名前に変えて読み出し

SELECT `名前`, `数学` % 3 AS `剰余` FROM `成績` #出力 
('名前', '剰余')
[('太郎', 0), ('二郎', 1), ('三郎', 2)]



ROUND関数

ROUND関数は、指定した列の値を小数点以下の任意の桁で四捨五入する関数

SELECT ROUND(<カラム名>, <桁数>) FROM <テーブル名>

カラムだけではなく、数値にもROUND関数は使える。例えば、ROUND(1.123456, 2)と記述すれば、小数点以下2桁までを残して四捨五入した値1.12として扱われます。


成績テーブルから、3教科平均点の小数点以下3桁まで保持する四捨五入した値を「平均」という名前として読み出し

SELECT `名前` , ROUND((`国語`+`数学`+`英語`) / 3, 3)  AS `平均` FROM `成績` #出力 
('名前', '平均')
[('太郎', Decimal('77.333')), ('二郎', Decimal('69.000')), ('三郎', Decimal('73.333'))]


この記事が気に入ったらサポートをしてみませんか?