データの抽出
ここまで、テーブルを作成し、レコードを挿入して、すべてのレコードを「 SELECT * FROM テーブル名」で表示してきました。
しかし、実際には全レコードではなく、一部の列のデータだけが必要であったり、ある条件に一致するレコードが必要であったりと、全レコードの表示機能だけでは事足りません。
レコードの抽出をする「SELECT」文には、様々な指定の仕方があり、指定を工夫することによって、必要な情報を効率よく取り出すことができるようになっています。
指定の仕方を学習して、「SELECT」文を自由自在に使いこなせるようにしましょう。
列表示の工夫
【書式】指定した列を表示する
SELECT 列名 1 , 列名 2 ・・・ FROM テーブル名
まず基本的なレコードの抽出(表示)を見ておきましょう。
SELECTの後ろには、表示したい列名を指定します。
複数の列を指定する場合は、列名と列名をカンマで区切ります。
次の例は、[syohin_master]テーブルから各列名をカンマで区切って指定をして、データを抽出しています。
列名を指定した順番で表示されるので、例えば 、[syohin_name]列を先頭にもってきて表示したい場合には、次のように[syohin_name]列を 列名の指定の最初に指定します。
SELECTの後ろの列名は、テーブルに含まれる列名を自由に指定できるので、列名の順番を入れ替えて、表示する位置を変えたり、必要な列だけを表示したりできます。
次の例は、[syohin_master]テーブルから[syohin_name]と[unit_price]のみを表示しています。
このように列名の指定を工夫すると、必要な列のみを表示したり、表示したい列名を入れ替えたりできます。
【書式】すべての列を表示する
SELECT * FROM テーブル名;
列名を指定する方法では、すべての列を無条件に表示したい場合、つねに列名を全部指定しなくてはならないので、とても面倒です。
そこで、列名を指定する部分に「*」を指定します。「*」は、ワイルドカードといって「何をあてはめてもよい」という意味です。
ここで「*」を指定すると、「全部の列」という意味になります。
次の例は、[syohin_master]テーブルから、すべての列を「*」で指定をしています。
【書式】エイリアスを使う
SELECT 列名 AS エイリアス FROM テーブル名;
エイリアスとは、「偽名」「別名」という意味で、コンピュータの世界では「本物を参照するために、ユーザが自由につけた名前」です。
例えば、[order_day]と言われるより「注文日」と言われた方がぴんとくるでしょう。
テーブル内ではあくまで列名は[order_day]ですが、表示する時だけわかりやすく別名を付けることができます。
次の例は、[hanbai_list]テーブルの[order_no]列を「注文番号」、[order_date]列を「注文日」とエイリアスを付けて表示しています。
【書式】列の値を計算したり、文字列を処理して表示する
SELECT 計算式 AS エイリアス FROM テーブル名;
列の値を使って、四則演算を行うことができます。
SQL内に記述できる四則演算の記号は、次の通りです。
演算記号 | 演算子 |
---|---|
+(足し算) | + |
-(引き算) | - |
×(掛け算) | * |
÷(割り算) | / |
次の例は、[syohin_master]テーブルから[unit_price]に 0.9 をかけた値を、「一割引価格」というエイリアス名で表示しています。
【書式】表示するレコード数を限定する
SELECT 列名 FROM テーブル名 LIMIT 表示するレコード数;
次の例は、[syohin_master]テーブルから 3 件だけを表示しています。
【ヒント】テーブルにどんな値が登録されているかを知る
データベースの処理速度は様々な要素が絡み合っており、処理に必要な時間は、多くの場合経験値で判断するしかありません。
そこで、「テーブルにどんな値が登録されているかを知りたい」といった場合、処理に時間がかかりそうであれば、とりあえずLIMITで制限をかけて、数行だけ表示して確認するとよいでしょう。
関数の使用
関数とは、「ある値を与えると、決められた処理を行い、その結果を返すもの」です。
例えばExcelの関数に、平均を取り出すAverage関数がありますね。
ExcelでAverage関数を指定する時は、Averageに続けて( )内に、平均を出したいセル範囲を指定しますね。
( )の中には、処理を行うために必要な材料を指定します。
この( )内に指定するものを、引数(ひきすう)と言います。
【書式】関数
関数名 ( 引数 1 , 引数 2 ・・・)
引数には、数値や文字列を指定できます。また列名を指定すると、その列の値に対して関数の処理を行うことができます。
引数が複数ある場合は、カンマで区切って指定をします。
関数の種類
データベースで利用する関数には、大きく分けて「単一関数」と「集約関数」とがあります。
単一関数
テーブルの行の1行ごとに結果を戻します。
結果の行数は、処理の対象となった行数と等しくなります。
上の図では、文字を大文字に変換するupper関数を使いますが、upper( 列名 )と指定をすることで、1レコードごと結果を出します。
集約関数
テーブル内の行をまとめ、集約の結果となる行を戻します。
結果の行数はまとめられた行数になります。
SELECT文を使った集計に使います。
まずは、単一関数からみていきましょう。
単一関数には次のようなものがあります。
種類 | 主な関数 |
---|---|
数学関数 | MOD、ROUND、TRUNCATE |
文字列関数 | CONCAT、CHAR_LENGTH |
日付関数 | DAY、MONTH、TO_DAYS |
変換関数 | IFNULL |
その他の関数 | NOW、DATABASE |
【ヒント】
データベースで使用する関数は、DBMSによって名称や形式が若干異なります。
ここでは、MySQLの関数を扱います。
数学関数
数学関数には、さまざまな種類がありますが、ここでは代表的なものをいくつか紹介します。
すべての数学関数は、エラーの場合NULLを結果として返します。
mod (m, n)
mをnで割った余りを結果として返します。
【ヒント】計算に使用する 仮想テーブル
この例は、これまでのようにSELECT文のFROM句の指定をしていません。
MySQLでは、表を使わずに計算の結果や関数の結果のみを確認するような場合には、これを省略することができます。
(MySQL以外のDBMSでは、DUAL表という仮の表に対してSELECT文を使う場合があります。)
コンピュータの世界では、0で除算を行うことはできないため、この関数はエラーになります。
次の例は、エラーでは結果としてNULL値が表示されています。
round ( m )
引数mを整数に四捨五入して丸めます。
round ( m, n )
引数mをn桁の小数に丸めます。
上の図は、2つ目の引数で指定した引数の位置を表しています。
2つ目の引数の1つ下の桁を四捨五入して、2つ目で指定した桁までを表示します。
例えば、round(123.45,0)と指定をすると、「0」は一の位を表示する、と言う意味なので、その下の桁「4」を四捨五入して、「123」という結果が返されます。
round(123.45,1)は、小数点第一位までを表示するため、その下の桁「5」を四捨五入して、「123.5」という結果を返します。
round(123.45,2)は、小数点第二位までを表示するため、その下の桁を「0」とみなして、四捨五入して、「123.45」という結果を返します。
round(123.45,-1)は、十の位を表示するため、その下の桁の「3」を四捨五入して、「120」という結果を返します。
round(123.45,-2)は、百の位を表示するため、その下の桁の「2」を四捨五入して、「100」という結果を返します。
truncate ( m , n )
mをn桁の少数に切り捨てます。
2つ目の引数の考え方は、round関数と同じです。
文字列関数
文字列関数とは、文字を引数として指定し、結果として文字または数値を返します。
concat (str1 , str2 ...)
文字列str1と文字列str2の文字列を結合した文字列を、結果として返します。
2個以上の引数を必要とします。
次の例は、引数に「My」と「SQL」という2つの文字列を指定することで、「MySQL」という文字列を返します。
char_length(str)
文字列strの文字数を結果として返します。
全角も半角も1文字と数えます。
文字列の間のスペースも1文字とします。
left(str, m)
文字列strの左からm個の文字を返します。
次の例は、「データベース」という文字列の左から3文字分「データ」を取り出して返します。
right(str, m)
文字列strの最後からm個の文字を返します。
次の例は、「データベース」と言う文字列に最後から3文字分「ベース」を取り出して返します。
mid(str, m [, n])
文字列strのm位置からn個の文字列を結果として返します。
nを省略すると、m以降、文字列の最後までを結果として返します。
(同様の関数にsubstring関数があります。)
次の例は、「データベース」と言う文字列の3文字目の文字から2文字分「タベ」を取り出して返します。
最後の引数を省略すると、「タベース」の最後までを取り出して返します。
trim([str2 FROM] str1)
文字列str1の両端にある文字列str2を削除した文字列を、結果として返します。
str2とFROMを省略すると、文字列str1の両端にある半角の空白が削除されます。
(全角の空白や文字列の間の空白は削除されないため、注意が必要です。)
次の例は、「日曜日」と言う文字列から「日」の文字を削除した結果「曜」を取り出して返しています。
次の例は、文字列の両端の半角空白を削除して取り出し返しています。
upper(str)
文字列strを大文字に変換します。
次の例は、「database」「DataBase」と言う文字列をすべて大文字にして返します。
lower(str)
文字列strを小文字に変換します。
次の例は、「DATABASE」「DataBase」と言う文字列をすべて小文字にして返します。
日付関数
日付に関する関数は、主として指定された日付型の値から、曜日、日にちなどの数値を得るために使用されます。
day(Date)
日付型Dateで指定された日付から、日にちを結果として戻します。(1 - 31)
次の例は、「2016年7月28日」という日付から、日の「28」を取り出して返します。
dayofweek(Date)
日付型Dateで指定された日付から、曜日を得ます。(1 = 日曜日 , 2 = 月曜日 , 3 = 火曜日 ...)
次の例は、「2016年7月28日」の曜日「木曜日」を数字で返します。
month(Date)
日付型Dateで指定された日付から、月を結果として戻します。(1 - 12)
次の例は、「2016年7月28日」の日付から、月「7」を取り出して返します。
year(Date)
日付型Dateで指定された日付から、年を結果として戻します。(1000 - 9999)
次の例は、「2016年7月28日」の日付から、年「2016」を取り出して返します。
to_days(Date)
日付型Dateをdaynumber(0年からの日数)に変換します。
次の例は、「2016年7月28日」を0から日数に変換して返します。
from_days(daynumber)
daynumberで指定された日数を、日付型Dateに変換します。
次の例は、「736538」という日付の通算日を指定して、日付に変換して返します。
変換関数
列のデータ型が文字列型のデータを、数値として計算するような場合など、データ型を変換する必要があります。
MySQLでは、必要に応じて自動的にデータ型の変換が行われるため、関数を使用する必要はありません。
ただし、NULLについては注意が必要です。
NULL値を他の値に変換する場合には、次の関数を使います。
ifnull(value1, value2)
value1がNULLでない場合はvalue1を、そうでなければvalue2を結果として戻します。
次の例では、「234/1」の計算結果はNullでないので、計算結果を返します。
次の例では、「234/0」は0による除算なので、計算結果はNullになります。
Nullの場合は2つ目の引数に指定した値「0」を返しています。
【ヒント】0による除算
0による除算のような、演算できない計算は、結果がNULL値になります。 NULL値に対しては、どのような演算も結果がNULLになってしまうため、ifnull関数で特定の値に変換することで、計算できる値として扱うことができるようになります。
その他
その他には、DBMSからの情報を得るための関数などがあります。
指定する引数はありませんが、( )は省略できませんので気を付けましょう。
now()
現在の日付と時刻を結果として返します。
curdate()
現在の日付を結果として返します。
curtime()
現在の時刻を結果として返します。
database()
現在接続しているデータベース名を結果として返します。
user()
現在接続しているユーザ名と、どのコンピュータから接続しているのかを結果として返します。
【ヒント】localhost
localhostとは、データベースのサービスが稼動しているコンピュータを指します。 別のコンピュータからデータベースに接続している場合には、「localhost」の部分がそのコンピュータ名になります。
参考図書
LINE公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】