次の中から、RDBMS(リレーショナルデータベース管理システム)でないものとして、最も適切なものを選べ。
A. MySQL
B. PostgreSQL
C. SQLite
D. HeidiSQL
RDBMS(Relational DataBase Management System:リレーショナルデータベース管理システム)は、RDB(第3章を参照)の管理システムです。
MySQLは、オープンソースのRDBMSの1つです (A)。さまざまなOSに対応しており、小規模なシステムから大規模なものまで対応できるという長所があります。開発がしやすく処理が速いことから、Webサービスやエンタープライズ市場を含めたクラウドサービスでの利用が活発に行われています。
PostgreSQLは、オープンソースのRDBMSの1つです (B)。POSTGRESプロジェクトとして、カリフォルニア大学バークレー校のコンピュータ・サイエンス学部で開発が開始されました。POSTGRESプロジェクトは、開始から10年後の1996年末にPostgreSQLと改名され、それがソフトウェアの名称にもなりました。
SQLiteは、サーバとして利用するのではなく、アプリケーションに組み込んで利用するRDBMSです (C)。SQLiteを用いると、簡易的な(ライトな)データベースを構築することができます。
HeidiSQLは、MySQL、PostgreSQL、SQLiteなどのデータベースシステムを実行しているコンピュータに接続し、データと構造を表示および編集できるクライアントツールです。GUIを利用してテーブルの種類や容量を確認したり、SQLクエリを発行するなどの操作を効率よく実施できます。
以上より、選択肢Dが正解です。
参考
企業活動を中断することなく継続していくためには、重要なデータを消失してしまった際に備えて、データのバックアップが重要です。RDBMSではバックアップを作成する仕組みが整っています。
>)、および末尾のコメントID(<!-- 11_103_1 -->)を維持しました。次のSQLは、「customer」というテーブルから「name」というカラムを呼び出すためのものである。
SELECT name ( ア ) customer ;
空欄アに当てはまる句として、最も適切なものを選べ。
A. FROM
B. JOIN
C. ORDER BY
D. GROUP BY
SQLにおいて、データを取得するテーブルを指定する際に使用する句は、FROMです(A)。以下の形式で使用します。
構文 データを取得するテーブルを指定する
FROM テーブル名
JOINは、2つのテーブルを結合して1つのテーブルとして扱う際に使用する句です(B)(解答6 参照)。
ORDER BYは、SELECT句で取得したカラムに対して、昇順や降順といったルールでデータの並べ替えを実施する句です(C)(解答4参照)。
GROUP BYは、指定したテーブルをグループに分割する際に利用する句です(D)。HAVING句と併用して、分割したグループに対して集合関数を適用することができます。HAVING句は、いったん集計されたデータをもとに、さらにデータを条件抽出したい場合に用います。
参考
PostgreSQLやMySQLなどのデータベースから取り出したデータは、CSV形式でエクスポートすることができます。使用するデータベースによってさまざまなエクスポート形式がありますので、一度調べておくとよいでしょう。
次のSQLは、「customer」というテーブルからすべてのカラムを呼び出すためのものである。
SELECT ( ア ) FROM customer ;
空欄アに当てはまる記号として、最も適切なものを選べ。
A. \$(ドルマーク)
B. *(アスタリスク)
C. !(エクスクラメーションマーク)
D. #(シャープ)
SELECT句で「*」を利用した場合、「*」はすべてのカラムを意味します。
構文 テーブルに含まれる全カラムを取得
SELECT * FROM テーブル名
したがって、選択肢Bが正解です。
その他の選択肢については、SELECT句において使用することができない記号です。
「price」というカラムを基準に昇順に並べ替えを行いたい。
SELECT *
FROM purchases
( ア ) BY price ( イ ) ;
空欄ア、イに当てはまる句の組み合わせとして、最も適切なものを選べ。
A. (ア) GROUP (イ) DESC
B. (ア) GROUP (イ) ASC
C. (ア) ORDER (イ) DESC
D. (ア) ORDER (イ) ASC
**)で強調しました。SQLには、データを操作するためのさまざまな句があります。
以下に代表的な句を示します。
● DISTINCT
重複行を削除する場合に使用します。
構文 重複行を削除する
sql DISTINCT カラム名
例えば、以下では、name というカラム内で apple というフィールドが重複しています。
【フィールドが重複するテーブルの例】
<図12_103_2-1--->
図12_103_2-1 フィールドが重複するテーブルの例
<--->
| name |
|---|
| apple |
| orange |
| grape |
| apple |
この場合は、SELECT 文の後に「DISTINCT name」と指定することで、次のように重複を削除した出力を行うことができます。
【項目の重複を解除したテーブルの例】
<図12_103_2-2--->
図12_103_2-2 項目の重複を解除したテーブルの例
<--->
| name |
|---|
| apple |
| orange |
| grape |
apple という項目の重複がなくなり、1つだけになりました。
このように、DISTINCT句は、データを取得したそのカラム内のフィールド値を把握したいときに有効です。
13_104_1
取得したデータに対し、並べ替えを行う句です。
構文 取得したデータの並べ替えを行う
sql ORDER BY カラム名
以下のテーブルでは price カラムに価格が表示されていますが、この price カラムを基準にレコードの並べ替えを行ってみましょう。
【ソート前のテーブルの例】
| name | price |
|---|---|
| apple | 100 |
| orange | 80 |
| grape | 210 |
今回は、price カラムを基準に、昇順に並べ替えを行います。
昇順の場合は ASC、降順の場合は DESC を用います。
したがって、「ORDER BY price ASC」を適用すると、以下のような結果を取得することができます。
【ソート後のテーブルの例】
| name | price |
|---|---|
| orange | 80 |
| apple | 100 |
| grape | 210 |
このように、ORDER BY句は、取得したデータの並べ替えを行いたい場合に有効です。
取得したデータに対し、最終的に取得するレコードの数を指定する句です。
SQLスクリプトに、LIMIT + 取得したい行数 という句を追加して使用します。ORDER BY句と併用して「上位○人」などの結果を取得したい場合に有効です。
以上より、組み合わせの正しい選択肢Dが正解です。
<図PAGE_ID-n--->)に置換しました。amountの総和が10以上のstuff_idのみを問合せの対象にし、かつcustomer_id列を昇順に並べ替えたい。(なお、RDBMSは「MySQL」の使用を仮定している。)
SELECT *
FROM purchases
WHERE
stuff_id = 1
( ア )
stuff_id
( イ ) SUM (amount) >= 10
( ウ )
customer_id
LIMIT 10
;
空欄ア~ウに当てはまる句の組み合わせとして、最も適切なものを選べ。
A. (ア) GROUP BY (イ) HAVING (ウ) ORDER BY
B. (ア) GROUP BY (イ) ORDER BY (ウ) HAVING
C. (ア) ORDER BY (イ) HAVING (ウ) GROUP BY
D. (ア) ORDER BY (イ) GROUP BY (ウ) HAVING
<!-- 03_000_1 -->)を維持しました。SQLの記述の順番は以下のとおりです。
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
以上より、設問の例の場合、空欄アにはGROUP BY、空欄イにはHAVING、空欄ウにはORDER BYが入ります。したがって、組み合わせが適切な選択肢Aが正解です。
次のSQLを用いて複数のテーブルを結合することを考える。
SELECT
table1.id,
table2.price
FROM
table1
( ア )JOIN
table2
ON
table1.id = table2.id
;
ここで、table1とtable2間のキーの値が一致するものだけを結合して取得したい場合、空欄アに当てはまる字句として、最も適切なものを選べ。
A. FULL
B. RIGHT
C. INNER
D. LEFT
SQLでは、複数のテーブルを結合することが可能です。結合方法には次のようなものがあります。
● LEFT OUTER JOIN(左外部結合)
“左側テーブル”すべてと、指定した結合軸(actor_id)の値が一致する“右側テーブル”を結合します。結合元となるテーブルの値は失わずに、新たに結合するテーブルの重複した値だけを取得したい場合に有効な手段です。LEFT OUTER JOIN句は、「LEFT JOIN」というように省略した記述でも使用することが可能です(D)。
次の図では、右側テーブルの「actor_id」は左側テーブルに存在しないフィールドを含んでいます。LEFT OUTER JOINでは、そのような存在しないフィールドをもつレコードは結合後には残りません。
値の結合に関する概念図(ベン図)と合わせると、結合の結果をイメージしやすいでしょう。なお、ベン図のグレーの部分が結合後のidを表しています。
左側テーブル
| actor_id | first_name |
|---|---|
| 1 | Penelope |
| 2 | Nick |
| 3 | Ed |
| 4 | Jennifer |
右側テーブル
| actor_id | film_id |
|---|---|
| 1 | 1 |
| 1 | 23 |
| 2 | 3 |
| 3 | 17 |
| 5 | 19 |
| actor_id | first_name | film_id |
|---|---|---|
| 1 | Penelope | 1 |
| 1 | Penelope | 23 |
| 2 | Nick | 3 |
| 3 | Ed | 17 |
| 4 | Jennifer | NULL |
結合軸が一致しなかったレコードは、NULLと表示されます。
結合軸の値を元に、"左側テーブル"と"右側テーブル"のすべての値を結合します。元のテーブルに新たなテーブルの全レコードを追加したい場合に有効です。FULL OUTER JOIN句は、「FULL JOIN」というように省略した記述でも使用することが可能です(A)。
左側テーブル
| actor_id | first_name |
|---|---|
| 1 | Penelope |
| 2 | Nick |
| 3 | Ed |
| 4 | Jennifer |
右側テーブル
| actor_id | film_id |
|---|---|
| 1 | 1 |
| 1 | 23 |
| 2 | 3 |
| 3 | 17 |
| 5 | 19 |
FULL OUTER JOINを使って、左側テーブルと右側テーブルをactor_idで結合した結果は次のとおりです。
【FULL OUTER JOIN実行後】
| actor_id | first_name | film_id |
|---|---|---|
| 1 | Penelope | 1 |
| 1 | Penelope | 23 |
| 2 | Nick | 3 |
| 3 | Ed | 17 |
| 4 | Jennifer | NULL |
| 5 | NULL | 19 |
“左側テーブル” と “右側テーブル” で結合軸(actor_id)の値が一致するものを結合します。どちらのテーブルにも存在するレコードのみを抽出したい場合に有効な手段です。
【INNER JOIN】
【INNER JOIN実行後】
| actor_id | first_name | film_id |
|---|---|---|
| 1 | Penelope | 1 |
| 1 | Penelope | 23 |
| 2 | Nick | 3 |
| 3 | Ed | 17 |
以上より、選択肢Cが正解です。
“右側テーブル” すべてと、指定した結合軸(actor_id)の値が一致する “左側テーブル” を結合します。LEFT OUTER JOIN句において表名の配置を変更することで、RIGHT OUTER JOINと同じ結合結果を表示することができます(B)。
試験対策
データのNULL値が含まれる場合、SQLを用いて他の値で置換することが可能です。例えば、MySQLにおいてNULL値の置き換えをする際には、IFNULL関数やCOALESCE関数を使用できます。このように、使用するRDBMSによって関数名が異なる場合があるので注意しましょう。試験対策
テーブル結合を応用すればデータの突き合わせを行うことができるということを覚えておきましょう。
[図:PAGE_ID-n:内容] 形式を <図PAGE_ID-n---> マーカー形式に置換しました。actor\_id のバックスラッシュを、Markdown上の表示を優先し、また重要語として **actor_id** と整形しました。>)やテーブル構造を維持し、数式の閉じ等の過不足がないことを確認しました。次のSQLを用いて、「paymentテーブル」の中から「amountカラム」と「payment_dataカラム」を取得したい。ただし、「amount」はinteger型、「payment_data」はtext型でそれぞれ取得しなければならないものとする。
(RDBMSは「PostgreSQL」の使用を仮定している。)
SELECT
( ア )(amount AS int) AS amount,
payment_data ( イ )text
FROM
payment
;
空欄アに当てはまる句、また空欄イに当てはまる記号の組み合わせとして、最も適切なものを選べ。
A. (ア)CAST (イ)::(コロン2つ)
B. (ア)CAST (イ);;(セミコロン2つ)
C. (ア)text (イ)::(コロン2つ)
D. (ア)text (イ);;(セミコロン2つ)
## 7. およびコメントタグ <!-- 04_XXX_1 --> を維持し、断片としての完結性を確保しました。<!-- 04_XXX_1 --> は図のプレースホルダー規定の形式ではありませんでしたが、内部識別子と判断し、一貫性維持のためそのまま残しています。SQLでは、指定したカラムのデータ型を変換することができます。
構文 カラムのデータ型を変換
CAST(カラム名 AS データ型)
このCAST構文は、標準SQLで用いられます。
PostgreSQLでは、::(コロン2つ)を付けることでもCASTを使用でき、以下のような形式で使用します。
構文 PostgreSQLにおけるCAST構文
カラム名 :: データ型
コロンを用いる構文は、PostgreSQLで伝統的に使用されている形式です。
以上より、選択肢Aが正解です。
()を、プログラムとして一般的な半角括弧(()に修正しました。次のSQLを用いて、「customer」というテーブルから「id」というカラムを取得することを考える。なお、取得したデータのうち10件をランダムサンプリングしている。
SELECT id
FROM customer
( ア ) BY random()
( イ ) 10
;
空欄ア、イに当てはまる字句の組み合わせとして、最も適切なものを選べ。
A. (ア)GROUP (イ)LIMIT
B. (ア)GROUP (イ)COUNT
C. (ア)ORDER (イ)LIMIT
D. (ア)ORDER (イ)COUNT
## 8. および末尾のコメント行を正確に維持しました。SQLにおけるレコードの無作為抽出は、ORDER BYとRANDOM関数を組み合わせることで実現できます。取得件数制限には、LIMIT句を使用します(解答4参照)。ORDER BY random() でテーブルのレコードをランダムに並べ替え、その後 LIMIT によって指定した数だけレコードを取得します。
ただし、何十万ものレコードをもつテーブルの場合、ORDER BYによる並べ替え処理はCPUに大きな負荷をかけることがあるため、注意が必要です。
以上より、組み合わせが適切な選択肢Cが正解です。
18_106_2
ORDER BY, LIMIT, random())をバッククォートによるコードスパン形式に整え、地の文と区別しました。次のSQLを用いて、「$customer$」というテーブルから「$score$」というカラムを取得することを考える。ただし、取得した「$score$」カラムの値が80以上のとき、「OK」という表示になるように値を変換している。
SELECT
( ア )
WHEN score >= 80 ( イ ) 'OK'
ELSE 'NG'
END
FROM customer
;
空欄ア、イに当てはまる語句の組み合わせとして、最も適切なものを選べ。
A. (ア)CASE (イ)THEN
B. (ア)CASE (イ)WHERE
C. (ア)IF (イ)THEN
D. (ア)IF (イ)WHERE
$customer$ や $score$ などの変数表記を LaTeX 形式で維持しました。SQLでは、条件分岐を行うためにCASE式というものが用意されています。CASE式の記法は、単純CASE式と検索CASE式の2つに大別されます。以下の例では、$status$カラムの値(松、竹、梅)と、そのときに返す値(1、2、3)を指定しています。
単純CASE式では、先にカラム名を指定し、後から条件を記載することで条件分岐を行います。
例 単純CASE式
sql CASE status WHEN '松' THEN 1 WHEN '竹' THEN 2 WHEN '梅' THEN 3 ELSE 0 END
検索CASE式では、等号($=$)以外の演算も行って値を評価できるため、単純CASE式よりも柔軟性があります。設問では、この検索CASE式を使用して条件分岐を行っています。
例 検索CASE式
sql CASE WHEN status = '松' THEN 1 WHEN status = '竹' THEN 2 WHEN status = '梅' THEN 3 ELSE 0 END
WHERE句の後に条件式を記載することで、データ抽出の際の条件指定を行うことができますが、CASE式の中では使用できません。また、SQLにおいてIF文の処理を行う際に使用するのがCASE文であり、SQL Server(2012以降)以外でSQLに直接IF関数を記述することはできません。
以上より、組み合わせが適切な選択肢Aが正解です。
$status$ および 演算子 $=$ のLaTeX表記を維持・整理しました。## 9. A および引用ブロック、コードブロックの構造を維持しました。次のSQLを用いて、「$data\_a$」「$data\_b$」という2つのテーブルから「$id$」「$name$」というカラムを取得することを考える。ただし、SELECT文で取得したそれぞれのテーブルは重複を削除した上で結合するものとする。
SELECT id,name
FROM data_a
( ア )
SELECT id,name
FROM data_b
;
このとき、空欄アに当てはまる語句として、最も適切なものを選べ。
A. JOIN
B. FULL OUTER JOIN
C. UNION
D. INNER JOIN
06_100_2
\_)を確認・維持しました。複数の SELECT文 で取得したデータを結合する句は UNION句 です(C)。
結合するテーブル間に 重複 がある場合、その部分は無視されますが、「 UNION ALL 」を指定することで、 重複も含めた結合 を行うことができます。
重複のないテーブル同士を UNION句 を用いて結合する際のイメージは以下のとおりです。
【UNION句を用いた結合】
<図PAGE_ID-n--->)に置換・整形しました。次のSQLを用いて、「employee」というテーブルを作成し、さらに「code」「name」というカラムを定義し、各レコードに値を代入することを考える。
( ア ) TABLE employee (
code SERIAL NOT NULL,
name VARCHAR(255)
);
( イ ) INTO employee (
code, name
)
VALUES
(0, 'Taro'),
(1, 'Ken'),
(2, 'Hanako'),
(3, 'Yui'),
(4, 'Yuki')
;
空欄ア、イに当てはまる語句の組み合わせとして適切なものを選べ。
A. (ア) CREATE (イ) INSERT
B. (ア) MAKE (イ) INSERT
C. (ア) CREATE (イ) JOIN
D. (ア) MAKE (イ) JOIN
**)で強調しました。SQLで新しくテーブルを作成する際の基本構文は以下のとおりです。
構文 テーブルの作成
sql CREATE TABLE テーブル名 ( 列名 データ型 オプション, 列名 データ型 オプション, ... );
SQLで使用することのできるデータ型には以下のようなものがあります。
20_107_2
【SQLで使用できるデータ型】
| 区分 | 分類名 | 型の例 |
|---|---|---|
| 数値型 | 整数型 | int、bigintなど |
| 浮動小数点型 | floatなど | |
| 通貨型 | money | |
| 日付型 | date、datetimeなど | |
| 文字列型 | Unicode文字列 | nchar、ntextなど |
| 非Unicode文字列 | char、textなど |
また、テーブル作成時に指定できるオプションの一例としては以下のようなものがあります。
【テーブル作成時に指定できるオプション例】
| オプション名 | 機能 |
|---|---|
| IF NOT EXISTS | 同名のテーブルが存在しなければ、テーブルを作成する |
| NOT NULL | nullの保存を禁止する |
| AUTO_INCREMENT | 新しい行が設定されるごとに自動的にカラム番号を付与 |
| DEFAULT | カラムのデフォルト値を設定する |
作成したテーブルにデータを挿入する際の構文は以下のとおりです。
構文 データの挿入
INSERT INTO テーブル名(
列名,
列名,
...
)
VALUES
(データ),
(データ),
...
;
したがって、組み合わせが適切な選択肢Aが正解です。
なお、SQLにはMAKEという句は存在しません。
参考
VALUESで指定する1レコードの要素数は、INSERTで指定したカラムの数と一致する必要があります。
[図:...])ではなかったため、そのまま維持しています。これらが図を指す場合は、必要に応じて正規の形式に修正してください。次のSQLを用いて、「employeeテーブル」からデータを取得することを考える。ただし、「product_orderテーブル」と「employeeテーブル」の「code」が一致した場合のみ、SELECTを実行し、「code」と「name」カラムを取得するようにしたい。
SELECT code, name
FROM employee AS e
WHERE
( ア )
(
SELECT * FROM product_order
WHERE
product_order.code = e.code
);
このとき、空欄アに当てはまる字句として適切なものを選べ。
A. CREATE
B. MAKE
C. IF
D. EXISTS
employeeテーブル」「product_orderテーブル」「SELECT」「code」「name」などのデータベース用語・重要語句を太字(およびコードスパン)化し、視認性を向上させました。EXISTS句では、指定した条件に合致するレコードが存在するかどうかを判定することができます(D)。
設問のSQLでは、「それぞれのテーブル間でcodeという結合軸が一致するか」を判断し、一致する場合のみSELECT文を実行するようにしています。
以下に、設問のSQLを実行した際のレコードの取得イメージを示します。
【product_orderテーブルとemployeeテーブルのイメージ】
<図21_201_1-1--->
図21_201_1-1 product_orderテーブルとemployeeテーブルのイメージ
<--->
product_order(注文)テーブル
| order_id | product | code |
|---|---|---|
| 0001 | aaa | 0 |
| 0002 | bbb | 0 |
| 0003 | ccc | 2 |
| 0004 | ddd | 3 |
| 0005 | eee | 4 |
employee(社員)テーブル
| code | name |
|---|---|
| 0 | Taro |
| 1 | Ken |
| 2 | Hanako |
| 3 | Yui |
| 4 | Yuki |
以上2つのテーブルに対し、設問のSQLを実行すると以下のような結果を得ます。
| code | name |
|---|---|
| 0 | Taro |
| 2 | Hanako |
| 3 | Yui |
| 4 | Yuki |
CREATEは新しくテーブルを作成する際に使用します(A)。
[図:PAGE_ID-n:内容] 形式のプレースホルダーを <図PAGE_ID-n---> マーカー形式に置換しました。<pb: ...>)を正確に維持しました。次の中から、SQLで用いる「数値型(数値データ型)」の名称でないものを選べ。
A. numeric
B. integer
C. smallint
D. boolean
boolean は、真偽値を表す論理値データ型です(D)。
その他の選択肢はすべて数値型(数値データ型)に属します。以下に数値データ型の一覧を示します。
【数値型(数値データ型)】
| 名称 | 説明 | 例 |
|---|---|---|
| bigint | 8バイト符号付き整数 | $-9\,223\,372\,036\,854\,775\,808$ ~ $+9\,223\,372\,036\,854\,775\,807$ |
| integer | 4バイト符号付き整数 | $-2\,147\,483\,648$ ~ $+2\,147\,483\,647$ |
| smallint | 2バイト符号付き整数 | $-32\,768$ ~ $+32\,767$ |
| numeric | 任意精度の小数 | 小数点より上は $131\,072$ 桁まで、小数点より下は $16\,383$ 桁まで |
| double precision | 15桁精度の浮動小数 | およそ $-1 \times 10^{308}$ ~ $+1 \times 10^{308}$ の範囲 |
参考
PostgreSQL における文字列型としては、char や varchar、text などが存在します。文字コードは、コンピュータ上で文字を処理したり通信したりするために、文字に番号を割り振る規則です。文字の形そのものではなく、例えば Unicode の場合、Aは $41$、Bは $42$ といったように、その文字に対応する番号によって文字の種類を表現します。
現在では、情報通信技術の発達や各国語への対応の過程でさまざまな文字コードの規格が考案され、並立しています。例えば、Windowsでは日本語に対応する文字コードとして Shift-JIS が採用されていますが、Macでは UTF-8(Unicode という文字コード規格の中の一方式)が採用されています。
このような事情から、文字列型のデータを扱う際には、用途や使用環境に合わせて適切に文字コードを設定する必要があります。テキストファイルの文字コードを変換するための方法として、nkf (Network Kanji Filter) コマンドの利用などが挙げられます。
\,)を挿入しました。$-$)を適用しました。\,)を挿入するのが一般的ですが、情報工学(データベース等)の文脈で「そのままの数値列」として見せたい場合は、スペースを除去する検討が必要です。double precision の範囲:元の表記 $1\text{E}+308$ を、一般的な物理・工学書の慣例に従い $10^{308}$ 形式へ変更しました。PostgreSQLにおいて、RANDOM関数を使用する際に値の生成範囲を指定しない場合を考える。この場合、生成される乱数 $x$ の範囲として適切なものを選べ。
A. 0以上1未満の浮動小数点値
B. 0以上1以下の整数値
C. -1以上1未満の浮動小数点値
D. -1以上1以下の整数値
PostgreSQLでは、乱数を生成する関数(RANDOM関数)を利用できます。
RANDOM関数では、特に生成範囲を指定しない場合、0以上1未満の浮動小数点値が生成されます(A)。
RANDOM関数は次のように記述されます。
構文 RANDOM関数
random()
上の例では引数を指定していませんが、引数を指定すると、乱数のもととなるシード(種)を固定することができます。シードを固定することで、複数回乱数を生成する場合に、同じ引数に対しては毎回同じ乱数が生成されるようになります。
試験対策
RANDOM関数を応用すると、テーブルからレコードをランダムに取得できます。
次のSQLを用いて、「film」テーブルから「title」というカラムを取得することを考える。ただし、テーブルの「description」というカラムに「funny」という単語を含むものだけを取得するようにしたい。
SELECT title
FROM film
WHERE description ( ア ) '%funny%'
;
このとき、空欄アに当てはまる語句として適切なものを選べ。
A. LIKE
B. IN
C. =
D. ==
LIKE演算子は、指定した条件が検索文字列に合致した場合にTRUEを返す演算子です。
この機能を用いて文字列検索を行うことができます。カラム内の各フィールド値に対してパターンマッチを行い、TRUEを返すもの(パターンに合致するもの)だけ取得する際に、WHERE句の中でLIKE演算子を用います(A)。
なお、LIKE演算子によるパターンマッチは常に文字列全体に対して行われます。
パターンマッチに指定する文字列には、2種類の特殊記号を用いることができます。
これにより、文字列の検索時にワイルドカード指定を行うことができます。
【パターンマッチに指定する特殊記号】
| 記号 | 説明 | 例 |
|---|---|---|
%(パーセント) |
0文字以上の任意の文字列 | %funny%(This is a funny movieがマッチ) |
_(アンダーバー) |
任意の1文字 | app_e(appleがマッチ) |
<24_109_2> を指定のマーカー形式に変換しました。<24_109_2> という形式であったため、IDを 24_109_2 とし、内容(キャプション名)も暫定的に同IDとしてマーカーを作成しました。ある都道府県における会社員の年収を調査し、調査結果を「income」テーブルに格納した。この「income」テーブルからデータを取得することを考える。「towns」は「町名」、「annual_income」は「年収」、「age」は「年齢」を表すものとするとき、以下のSQLを実行して表示される結果の説明文として、最も適切なものを選べ。
SELECT towns, AVG(annual_income)
FROM income
WHERE 20 <= age AND age < 30
GROUP BY towns
ORDER BY AVG(annual_income) DESC
;
A. 町名ごとに20代の会社員の最高年収を計算し、町名とともに最高年収を降順で取得する
B. 町名ごとに20代の会社員の平均年収を計算し、町名とともに平均年収を降順で取得する
C. 町名ごとに20代の会社員の平均年収を計算し、町名とともに平均年収を昇順で取得する
D. 町名ごとに20代の会社員の最低年収を計算し、町名とともに最低年収を昇順で取得する
** で囲み、視認性を向上させました。## 16. および # 第4章 データエンジニアリングーSQL は一字一句変えずに維持しました。SQLでは、SELECT文で取得したデータに対して集合関数を用いて最大値や最小値を集計することができます。以下に主な集合関数の一覧を示します。
【主な集合関数】
| 関数 | 実行内容 |
|---|---|
| SUM | 総和を求める |
| MAX | 最大値を求める |
| MIN | 最小値を求める |
| AVG | 平均値を求める |
| COUNT | 行数を求める |
設問のSQLのSELECT文で用いられている集合関数はAVGのため、平均値が計算されます。また、ORDER BY カラム名 DESC は指定したカラム内のデータを降順に並べ替えます。
以上より、選択肢Bが正解です。
参考
平均値・中央値・最頻値など、主な代表値の意味と算出方法を把握しておきましょう。
PostgreSQLなどのRDBMSでは、中央値はPERCENTILE_CONT関数の引数を0.5とすることで、最頻値はMODE関数を使うことで、それぞれ求めることができます。
**)で強調しました。