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'))]