SQL入門 模擬試験問題集 タイプ3解答&解説

データベースとは

問題1
次の説明の中で誤っているものをすべて選びなさい。
  1. Oracleは、リレーショナルデータベース管理システムである。
  2. リレーショナルデータベースには、ただ1つだけ表を格納することができる。
    1つ以上の表を格納できるので、間違い
  3. リレーショナルデータベースでは、情報を格納するために2次元の表を使用する。
  4. 外部キーとは、同一の表または別の表内の主キーへの物理アドレスである。
    リレーショナルデータベースにおいて、物理アドレスを必要する場面は存在しないので、間違い
  5. リレーショナルデータベースの中で、SQL言語を使えるのはOracleだけである。
    SQLはANSIなどで標準規格化されている言語で、ほとんどのリレーショナルデータベースで利用できるので、間違い
  6. PL/SQLはSQLを拡張し、プログラム言語の設計機能を含むOracle独自の言語である。
  7. リレーショナルデータベースは、階層型やネットワーク型のデータベースと同様に、データへのアクセスルートを指定する必要があるため、ユーザーは物理的なデータの配置を知る必要がある。
    リレーショナルデータベースはSQLを用いて物理アドレスなどを意識することなくデータの検索ができるので、間違い
問題2
リレーショナルデータベースの用語として正しくないものを選びなさい。
  1. 列と行
  2. 主キー
  3. 外部キー
  4. 階層型
    階層型データベースで必要になる用語であり、リレーショナルデータベースの用語ではないため、間違い
  5. SQL言語
問題3
リレーショナルデータベースの標準言語で、ANSIなどでも標準規格化されている言語を選びなさい。
  1. C言語
  2. SQL
    リレーショナルデータベースの標準言語はこれ
  3. PL/SQL
    「PL/SQL」はSQLをOracleが独自に拡張した言語であり、標準規格化されているわけではない
  4. JAVA
  5. COBOL
問題4
次の中からDMLではないものを2つ選びなさい。
  1. DELETE
  2. INSERT
  3. DROP
    DDLなので、間違い
  4. COMMIT
    DCLなので、間違い
  5. UPDATE
問題5
次の説明の中で正しいものを選びなさい。
  1. SQL言語は用途により、データ検索、データ操作文(DML)、データ定義文(DDL)、データ制御文(DCL)といった分類がある。
  2. PL/SQLはSQL言語を拡張したものであり、ANSIやISOなどで標準規格化されている。
    Oracleが独自に拡張した言語なので、間違い
  3. データモデルには、「階層型」「ネットワーク型」「リレーショナル型」があり、Oracleは「階層型」のデータベースである。
    Oracleはリレーショナルデータベースなので、間違い
  4. SQL言語は、データの物理的な位置やアクセスルートを指定することにより、データを検索する。
    SQLは、データの物理的な位置などを一切意識することなくデータを検索できるので、間違い
問題6
次のリレーショナルデータベースの説明の中で誤っているものを選びなさい。
  1. 表は行と列から構成される。
    表同士は列の値によって関連付けるため、間違い
  2. 表と表は物理アドレスによって関連付けることができる。
  3. 列と行が交差する場所をフィールドと呼び、ここに値が入る。
  4. 1つのフィールドには複数の値が入ってもかまわない。
    リレーショナルデータベースは1つのフィールドには原則ととして1つの値しか入らないため、間違い
問題7
次の説明の中で正しいものを選びなさい。
  1. 主キーでは値の重複は許される。
    主キーや一意キーは値の重複を許さないため、間違い
  2. 1つの表に主キーを複数設定できる。
    複数の列を指定して1つの主キーを設定することはできるが、1つの表には1つの主キーしか設定で着たいため、間違い。なお、一意キーは複数設定できる
  3. 外部キーはデータ値に基づくものである。
    外部キーは元となる表の主キーの値に基づくものなので、間違い
  4. 外部キーでは値の重複は許されない。
    外部キーは、元となる表の主キーの値以外の値を持つことはできないが、値の重複は許されるので、間違い

データの検索

問題1
SELECT 列名1, 列名2 FROM 表名;を実行した際のSELECT文の機能を選びなさい。
  1. 選択
    選択は、表から一部分の行を(横方向に)取り出す操作であり、すべての列を表示するため、間違い
  2. 射影
    射影は、表から一部分の列を(縦方向に)取り出す操作であるため、これが正解
  3. 結合
    結合は、2つ以上の表から関連のあるものをつないで新しい表を作り出す操作であるため、間違い
  4. 取り出し
    リレーショナルデータベースの操作を表す用語に「取り出し」は存在しないため、間違い
問題2
SQL*PlusでSQL文を作成するときの規則の中で、誤っているものを選びなさい。
  1. SQL文では大文字小文字を区別する。
    命令や列名、表名などは大文字・小文字を区別しないため、間違い。ただし、フィールドに格納されている「値」は大文字・小文字を区別する
  2. 1行でも複数行でもかまわない。
    SQLは最後に;をつけるまで、複数行にわたって記述できるため、正解。ただし、命令を区切ることはできない
  3. キーワードは短縮できない。
    SQL*Plusのコマンドには短縮できる命令があるが、SQLには存在しないため、正解
  4. 最後に;をつける。
    SQLは複数行にわたって記述できるため、どこまでがSQL文なのかを示す;を最後につける必要があるため、正解
問題3
部門表(dept)には、deptno、dname、locの3列があります。すべての列を選択する正しいSQL文を2つ選びなさい。
  1. select dname, loc, deptno from dept;
  2. select * from dept;
  3. desc dept
    descは、表の列構造を表示するSQL*Plusのコマンドであり、SQLではないため、間違い
  4. select dept(*) from dept;
    このような書き方はできないため、間違い
問題4
SQL*PlusでのSELECT文の列見出しのデフォルトはどれですか。誤っているものを選びなさい。
  1. 日付および文字の位置は左側。
  2. 数値の位置は右側。
  3. 表示のデフォルトは大文字。
  4. デフォルト設定はなく、個別にSQL*Plusコマンドで指定する必要がある。
    デフォルトの設定は存在するため、間違い。SQL*Plusコマンドで、デフォルトの値を好きなように変更することができる
問題5
SQL文の中で算術演算子を使用して計算することができます。使用できる句として誤っているものを選択しなさい。
  1. SELECT句
  2. FROM句
    FROM句は表明を指定するところであるため、算術演算子は指定できないため、間違い。ただし、副問い合わせを利用すれば可能
  3. WHERE句
  4. ORDER BY句
問題6
年間所得を、給与(sal)に100加えた合計を12倍したものとして計算するときの正しいSQL文を選びなさい。
  1. select ename, sal, 12 * sal + 100 from emp;
    「12 * sql」が先に計算されてしまうため、間違い
  2. select ename, sal, 12 * (sal + 100) from emp;
  3. select sal + 100 * 12 from emp;
    「100 * 12」が先に計算されてしまうため、間違い
  4. select (12 * sal) + 100 from emp;
    「12 * sql」が先に計算されてしまうため、間違い
問題7
NULLの扱いについて、正しいものを選びなさい。
  1. NULLは0や空白と同じものとして扱われる。
    NULLは0や空白とは別物であるため、間違い
  2. 算術式の中にNULLがある場合は0として計算される。
    算術式の中にNULLがある場合、演算結果はすべてNULLになるため、間違い
  3. 数値をNULLで除算すると、0のときと同じエラーになる。
    演算なので、結果はNULLにはなるが、エラーにはならないため、間違い
  4. NULL値を含む算術式はNULLになる。
問題8
NULL + 50の正しい結果を選びなさい。
  1. NULL
    算術式の中にNULLがある場合、演算結果はすべてNULLになるため、これが正解
  2. 0
  3. エラー
  4. 50
問題9
次のSELECT文を実行したときの正しい列見出しを選びなさい。
select ename "Name", job, sal as salary, sal * 12 "Annual Salary" from emp;
  1. ename "Name", job, sal as salary, sal * 12 "Annual Salary"
    別名と一緒に列名も表示されているため、間違い
  2. NAME JOB SAL sal * 12 Annual Salary
    AS句は、列名と別名の間に指定する区であり、ASの後ろが別名になるため、間違い。なお、AS句は省略できる
  3. ename job sal sal * 12
    別名がまったく表示されていないため、間違い
  4. Name JOB SALARY Annual Salary
    ダブルクォーテーション付きで指定した別名は、大文字小文字がその通りに表示される。また、ダブルクォーテーションを付けずに指定した別名は、大文字で表示されるため、これが正解
問題10
次のSELECT文を実行したときの列見出しはいくつになりますか。正しいものを選びなさい。
select ename || ' : ' || job || ' and ' || sal as "Job And Sal", deptno from emp;
  1. 4つ
  2. 3つ
  3. 2つ
    ||は、列の値を連結する機能を持つ。列と列の間は「,」で区切るが、selectとfromの間には1つの「,」があるため、表示される列は2つであることがわかる
  4. 1つ
問題11
従業員表(emp)から重複なく職種(job)を検索する正しい文を選びなさい。
  1. select only job from emp;
  2. select kind(job) from emp;
  3. select job from emp where job != job;
  4. select distinct job from emp;
    distinct句をつけると、重複行を1行しか表示しなくなるため、これが正解。なお、group by句を使って同じ結果を出すことができる

データの制限およびソート

問題1
職種(job)がSALESMANのデータが入力された従業員表(emp)で次のSQL文を実行したところ、データが1件も検索されませんでした。考えられる原因を選びなさい。
select ename,job,deptno from emp where job = 'salesman';
  1. 実行したSQL文が間違っている。
  2. 'が入っているため。
  3. 文字列では大文字小文字の区別があるため。
    SQLコマンドや表名、列名は大文字・小文字を区別しないが、値は区別するため、これが原因
  4. 条件を設定するのはSQL*Plusコマンドで行う。
問題2
WHERE句を使用する目的として正しいものを複数選びなさい。
  1. 使用する表を指定する。
    表を指定するのはFROM句であるため、間違い
  2. 対象となる行データを絞り込むため。
    正解
  3. 2つ以上の表を結合するための条件を指定する。
    OracleのSQLでは、結合条件もWHERE句に書くため、これも正解。なお、SQL:1999構文ではUSING句やON句に結合条件を書く
  4. グループに制限を付ける。
    グループ化した値に対しての制限はHAVING句にしか記述できないため、間違い
  5. 重複データの排除。
    重複データの排除はSELECT句のすぐ後ろにDISTINCTをつけるため、間違い
問題3
給与(sal)が1000以上1500以下の従業員の名前(ename)と給与(sal)を検索する正しいSELECT文を2つ選びなさい。
  1. select ename, sal from emp where sal between 1500 and 1000;
    1500と1000が逆じゃないと駄目
  2. select ename, sal from emp where sal >= 1500 or sal <= 1000;
    orは「または」という意味になるため、間違い
  3. select ename, sal from emp where sal >= 1000 and sal <= 1500;
    正解
  4. select ename, sal from emp where sal between 1000 and 1500;
    正解
問題4
comm列にはNULLデータが何件か入っています。次のSQL文を実行したときにはレコードは1件も検索されませんでした。原因として正しいものを選びなさい。
select ename, sal, comm. from emp where comm = null;
  1. NULLを検索する演算子はIS NULLを使用する必要がある。
    正解
  2. 'NULL'と指定していないため。
    ''で囲むと文字列になってしまうため、間違い
  3. NULLは"で囲む必要があるため。
    "で囲むのは、列の別名のみ。""で囲むデータは存在しないため、間違い
  4. NULL値を検索することはできない。
    そんなはずはないですね、間違い
問題5
次のSQL文を実行した場合の検索結果はどうなりますか。正しいものを選びなさい。
select name, title, sal from employee
where title = 'MANAGER' or title = 'PRESIDENT' and sal >= 10000;
  1. titleがMANAGERまたはPRESIDENTのいずれかで、かつsalが10000以上の従業員。
  2. titleがMANAGERでかつsalが10000以上か、titleがPRESIDENTでsalが10000以上の従業員。
  3. titleがMANAGERであるか、titleがPRESIDENTでsalが10000以上の従業員。
    andが先に評価されるため、これが正解
  4. titleがMANAGERまたはPRESIDENTのいずれか、もしくはsalが10000以上の従業員。
問題6
ORDER BY句の説明として正しいものを選びなさい。
  1. 数値データは小さい順だが、NULLがある場合はNULLが最初に表示される。
    NULLは最後に表示されるため、間違い
  2. 日付データは、DESCキーワードを使用したときは最新日付から表示される。
    DESCは降順なので、日付で考えると最新の日付が一番大きな値となる。これが正解
  3. 文字データの場合は英字順だが、大文字小文字の時は小文字から表示される。
    文字コードでは小文字よりも大文字のほうが小さいコードになるため、間違い
  4. 並べ替えの基準列を複数指定した場合、個別に昇順が降順の指定はできない。
    列ごとに昇順降順の指定ができますね、間違い
問題7
次のSELECT文を実行したときの出力結果を選びなさい。
select ename, job, sal from emp order by 3 desc;
  1. salの降順で表示される。
    order by句に数字を指定した場合、select句に指定した列の何番目という意味になるため、これが正解
  2. SELECTの列リストとORDER BY句が同じではないのでエラーになる。
  3. 3という列はないのでエラーになる。
  4. name, job, salの3列をセットにして降順で表示される。
問題8
従業員表(emp)を部門番号(deptno)で並べ替え、同じ部門内は職種(job)で、さらに同じ場合は給与(sal)の降順で並べ替えを行うSQL文を選びなさい。
  1. select ename,job,sal,deptno from emp order by sal,job,deptno desc;
  2. select ename,job,sal,deptno from emp order by 4,2,3 desc;
    これが正解
  3. select ename,job,sal,deptno from emp order by deptno,order by job,order by sal desc;
  4. select ename,job,sal,deptno from emp order by ename,job,sal desc,deptno;
問題9
従業員表(emp)から職種(job)がPRESIDENT以外で、かつ給与(sal)が10000以上の従業員を部門番号(deptno)の昇順、職種(job)の昇順、給与(sal)の降順で表示する正しいSQL文を選びなさい。
  1. select ename, job, sal salary, deptno from emp
    where job != 'PRESIDENT' and sal >= 10000
    order by deptno, job, salary desc;
    これが正解
  2. select ename, job, sal, deptno from emp
    order by deptno, job, sal desc
    where job != 'PRESIDENT' and sal >= 10000;
    where句の前にorder by句は書けませんね、間違い
  3. select ename, job, sal, deptno from emp
    where job != 'PRESIDENT', where sal >= 10000
    order by deptno, order by job, order by sal desc;
    where条件の書き方が間違ってます、間違い
  4. select ename, job, sal, deptno
    where job != 'PRESIDENT' and sal >= 10000 from emp
    order by ename, job, sal desc, deptno;
    from句の位置がおかしいですね、間違い
問題10
emp表のename列のデータは日本語です。この列から2文字のデータ(例:佐藤)を検索したい場合、どのような条件になりますか。正しいものを選びなさい。
  1. select empno, ename from emp where ename like '__';
    ワイルドカードを使うにはlike演算子を使わなければならず、文字数を指定するなら_を使う。Oracleでは2バイト文字も1バイト文字も同じ1文字として扱う。これが正解
  2. select empno, ename from emp where ename like '____';
  3. select empno, ename from emp where ename = '__';
  4. select empno, ename from emp where ename = '____';
  5. select empno, ename from emp where ename = '%%';
  6. select empno, ename from emp where ename like '%%';

単一行関数

問題1
「わたしはオラクルマスターです」という文字列を検索するとき、以下のように表示される条件は何ですか。正しいものを選びなさい。
文字列
----------------
クルマスターです
  1. select substr('わたしはオラクルマスターです',7,8) from dual;
    7文字目から8文字分取り出すという意味。これが正解
  2. select substr('わたしはオラクルマスターです',1,7) from dual;
  3. select substr('わたしはオラクルマスターです',13,16) from dual;
  4. select substr('わたしはオラクルマスターです',7,0) from dual;
問題2
次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select instr('あいうえお','う') from dual;

  1. 'う'という文字は何文字目にあるかを調べる。これが正解
問題3
次の結果はどうなりますか。正しいものを選びなさい。
select instr('oracleマスター','ス') from dual;
  1. 10

  2. 2バイト文字も1バイト文字も同じ1文字として数える。これが正解
問題4
大文字小文字の区別なしにename列の条件を入力し、「SMITH」というつづりの人のデータをすべて出力したい。適切なSQL文を選びなさい。
  1. select * from emp where ename = upper(&ename);
    大文字同士を比較できないため、間違い
  2. select * from emp where ename = &ename;
    大文字同士を比較できないため、間違い
  3. select * from emp where upper(ename) = '&ename';
    SMITHと入力したときしか一致しないため、間違い
  4. select * from emp where upper(ename) = upper('&ename');
    これが正解
問題5
現在、2000年5月26日PM3:00です。次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select round(sysdate) from dual;
  1. 2000-05-26
  2. 2000-05-25
  3. 2000-05-27
    日付型データの四捨五入は、AMなら切捨て、PMなら切り上げられるため、これが正解
  4. 2000-05-28
問題6
次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select round(123.923,-1) from dual;
  1. 100
  2. 120
    2つ目の引数は四捨五入する位を示すが、マイナスの値は小数点の左に上がっていくため、これが正解
  3. 124
  4. 123.9
問題7
西暦2000年は閏年です。次のSQL文の結果はどうなりますか。正しい組み合わせを選びなさい。
select add_months('2000-02-28',5), add_months('2000-02-29',5) from dual;
  1. 2000-07-28, 2000-07-29
  2. 2000-07-30, 2000-07-31
  3. 2000-07-28, 2000-07-31
    ADD_MONTHS関数は、月を足した結果を表示するが、1つ目の引数が末日の場合、計算結果の月の末尾を表示するという機能を持つ。2000年はうるう年のため、2月29日が末尾であるため、引数が2月28日なら7月28日が、引数が2月29日であれば7月の末尾である7月31日が表示される。これが正解
  4. 表示されない。
問題8
今日は2000年5月26日金曜日です。次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select next_day(sysdate, '金曜日') from dual;
  1. 2000-05-26
  2. 2000-05-26(金曜日)
  3. 2000-06-02
    次の金曜日は?という意味なので、5月26日の次の金曜日は6月2日になる。これが正解
  4. 2000-06-02(金曜日)
問題9
現在、2000年5月26日午後4時30分です。次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select to_char(last_day(sysdate), 'YYYY-MM-DD HH:MI:SS') from dual;
  1. 2000-05-31 12:00:00
  2. 2000-05-31 00:00:00
  3. 2000-05-31 04:30:00
  4. 2000-05-31 16:30:00
    HHは24時間表記の時間を表す。これが正解
問題10
現在の日時は、2000年5月26日です。次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select round(sysdate, 'MM') from dual;
  1. 2000-05-01
  2. 2000-06-01
    月で四捨五入の場合、15日以前ならその月、16日以降なら次の月になる。これが正解
  3. 2000-05-26
  4. 2000-05-27
問題11
現在の日時は、2000年5月26日です。次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select round(sysdate, 'YYYY') from dual;
  1. 2000-01-01
    年で四捨五入の場合、6月以前ならその年、6月以降なら次の年になる。これが正解
  2. 2001-01-01
  3. 2000-05-01
  4. 2000-05-26
問題12
現在の日時は、2000年5月26日です。次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select to_char(to_date('19302000', 'HH24MIYYYY'),'YYYY-MM-DD HH24:MI:SS') from dual;
  1. 2000-05-26 00:00:00
  2. 2000-05-26 12:00:00
  3. 2000-05-26 19:30:00
  4. 2000-05-01 19:30:00
    月は省略すると実行時の月が入るが、日は1日が入る。これが正解
問題13
次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select to_char(0.035, '0.0000') from dual;
  1. .035
  2. 0.035
  3. 0.0350
    0は空いてるところに0を埋めるという書式なので、これが正解
  4. .0350
問題14
次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select to_char(1234, '099999') from dual;
  1. 001234
    099999は、先頭の空白には0を埋め、全体で6桁という書式になる。これが正解
  2. 1234
  3. 01234
  4. #####
問題15
次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select to_char(1234567, '9,999') from dual;
  1. 1234567
  2. 1,234,567
  3. 1234,567
  4. ######
    書式に指定した桁数を超えてしまうため、桁あふれになる。これが正解

グループ関数

問題1
emp表から重複なしで、jobの種類を出力したい。正しいものを選びなさい。
  1. select job from emp group by job;
    jobをグループ化することにより、結果的に重複を消すことができる。これが正解
  2. select distinct(job) from emp;
    distinctでも重複を消すことができるが、使い方が間違っている
  3. select job from emp;
  4. select job from emp where job is not null;
問題2
emp表からjobのデータが何種類あるか出力したい。正しいものを選びなさい。
  1. select count(job) from emp group by job;
    jobの種類別に何件あるかを表示する。間違い
  2. select count(job) from emp;
    job列にデータが入っている件数を数えてしまう。間違い
  3. select count(distinct job) from emp;
    distinctで重複をなくした結果からcountするため、これが正解(distinctの特殊な使い方)
  4. select distinct count(job) from emp;
    countした結果(1件)をdistinctしても意味がない。間違い
問題3
emp表から、部門番号(deptno)と、部門ごとの給与(sal)の平均を、給与の平均値が大きい順に表示したい。正しいSQL文を選びなさい。
  1. select deptno, avg(sal) from emp group by job;
  2. select deptno, avg(sal) from emp order by avg(sal) desc;
  3. select deptno, avg(sal) from emp group by deptno order by avg(sal) desc;
    集合関数の結果で並べ替えなければならないため、これが正解
  4. select deptno, avg(sal) salavg from emp group by salavg;
問題4
次のSQL文の結果は何を表していますか。誤っているものを選びなさい。
select count(*), count(comm) from emp;
COUNT(*)     COUNT(COMM)
------------------------
     14               3
  1. emp表の中で、歩合給(comm)をもらっている人は3名である。
  2. emp表の行数は14行である。
  3. emp表の中で、歩合給(comm)のデータがある人は3名で、あとは全部0である。
    集合関数はNULL値を無視して計算を行う。0ではないのでこれが誤り
  4. emp表の中で、歩合給(comm)のデータがある人は3名で、あとは全部NULL値である。
問題5
emp表の歩合給(comm)の平均値を出したい。社員の中には、comm列にNULL値が入っている人もいるが、表内のすべての行を使用して平均値を出したい。正しいSQL文を選びなさい。
  1. select avg(nvl(comm,0)) from emp;
    NVL関数でNULLを0に置き換えた結果を元に集合関数が計算を行う。これが正解
  2. select nvl(avg(comm),0) from emp;
  3. select avg(comm) from emp;
  4. 不可能
問題6
表の中の行をグループに分割するSELECT文のキーワードは何ですか。正しいものを選びなさい。
  1. DISTINCT
  2. ORDER BY
  3. WHERE
  4. GROUP BY
    これが正解
問題7
emp表内の部門別にグループ化した各職種の合計給与を出したい。正しいSQL文を選びなさい。
  1. select deptno, job, sum(sal) from emp group by deptno, job;
  2. select deptno, job, sum(sal) from emp group by deptno, group by job;
  3. select detpno, job, sum(sal) from emp group by deptno order by job;
  4. select deptno, job, sum(sal) from emp group by job, deptno;
    グループ化する列が複数ある場合は、列名をカンマで区切る。これが正解
問題8
グループ関数が記述できる場所はどこですか。正しいものを3つ選びなさい。
  1. SELECT句以降の列選択リスト
    ここ
  2. FROM句
  3. WHERE句
  4. GROUP BY句
  5. HAVING句
    集計結果を元に条件を記述するので、ここ
  6. ORDER BY句
    集計結果を並び替えるときに記述するので、ここ
問題9
次はemp表のcomm列のデータです。
     COMM
---------
        1
        1
        1
        3

このデータで、次のSQL文の結果はどうなりますか。正しいものを選びなさい。
select avg(comm), avg(distinct comm) from emp;
  1. 1.5, 1.5
  2. 1.5, 2
    1つ目は6÷4なので1.5、2つ目は4÷2なので2。これが正解
  3. 1.5, 1
  4. 2, 2
問題10
次のSQL文の中で誤っているものを2つ選びなさい。
  1. select deptno, avg(sal) from emp where avg(sal) > 1500 group by deptno;
    集計結果を元に条件を記述するにはHAVING句を使わなければならない。これが誤り
  2. select deptno, avg(sal) from emp;
    集計に使わない列(deptno)を表示するには、group by句に指定しなければならない。これが誤り
  3. select deptno, avg(sal) from emp group by deptno having deptno = 20;
    deptno = 20はwhere句に書くべきだが、having句に書いてもエラーにはならない。これは正しい
  4. select deptno, avg(sal) from emp group by deptno order by avg(sal) desc;
問題11
SELECT文の構成として誤っているものを全て選びなさい。
  1. select ・・・ from ・・・ where ・・・ having ・・・ group by ・・・ order by ・・・
  2. select ・・・ from ・・・ having ・・・ group by ・・・ where ・・・
    WHERE句は必ずFROM句の後ろになければならない。これは誤り
  3. select ・・・ from ・・・ group by ・・・ having ・・・ where ・・・ order by ・・・
    WHERE句は必ずFROM句の後ろになければならない。これは誤り
  4. select ・・・ from ・・・ order by ・・・ where ・・・ group by ・・・ having ・・・
    ORDER BY句は必ず一番最後に記述しなければならない。これは誤り
問題12
グループ関数は何レベルまでネストできますか。正しいものを選びなさい。
  1. 制限なし
  2. 1レベル
  3. 2レベル
    グループ関数は2レベルまでしかネストできない(単一行関数は無制限)。これが正解
  4. 3レベル

複数の表からのデータの表示

問題1
次のSQL文を実行したときに結果はどうなりますか。正しいものを選びなさい。
select empno, ename, deptno, dname from emp, dept
where deptno = deptno;
  1. 問題なく実行される。
  2. 複数の表で同じ列名が使用されているのに、そのまま列名だけで使用しているのでエラーになる。
    deptnoが2つの表に存在するため、エラーになる。これが正解
  3. 列名を解析するのに非常に時間がかかるが、両方の列データが表示されてくる。
  4. 結合列の指定が無視されて直積演算で表示される。
問題2
次のSQL文を実行したときに結果はどうなりますか。正しいものを選びなさい。
select empno, dname from emp, dept;
  1. 両方にあるデータが自動的に結合されて表示される。
  2. 結合列の指定がないのでエラーになる。
  3. 直積演算が発生して、すべての組み合わせが表示される。
    結合条件を記述しない場合には直積演算になる。これが正解
  4. SELECT句に結合列のdeptnoがないためエラーになる。
問題4
結合の説明の中で正しいものを選びなさい。
  1. 結合する条件は=以外にも、BETWEEN演算子を使用して指定することができる。
    非等価結合では結合条件をBETWEEN演算子で記述する。これが正解
  2. WHERE句が必須。
    WHERE句を指定しないと直積演算になるが、必須ではないため、間違い
  3. 3表以上は結合できない。
    いくつでも結合できる。間違い
  4. 別々の表でないと結合できない。
    同じ表を別名をつけて、別の表のように結合することができる(自己結合)。間違い
問題5
次のSQL文を実行したらエラーになりました。誤っている部分を選びなさい。
select e.empno, e.ename, e.job, d.dname from emp e, dept d
where emp.deptno = dept.deptno order by e.ename;
  1. select e.empno, e.ename, e.job, d.dname
  2. from emp e, dept d
  3. where emp.deptno = dept.deptno
    表に別名をつけた場合、必ず別名で就職しなければならない。ここがエラーになる
  4. order by e.ename
問題6
5つ以上の表を結合するのに必要な結合条件は最低いくつですか。正しいものを選びなさい。
  1. 5つ
  2. 4つ
    これが正解
  3. 3つ
  4. 2つ
  5. 1つだけでよい
問題7
顧客表(customer)、注文表(ord)、注文明細表(item)の3つの表を結合する正しいSQL文を選びなさい。
  1. select c.name, o.ordid, i.itemid from customer c, ord o, item i
    where c.custid = o.custid = i.ordid;
  2. select c.name, o.ordid, i.itemid from customer c, ord o, item i
    where c.custid = o.custid and o.itemid = i.ordid;
    複数の結合条件がある場合、条件同士をANDで結合する。これが正解
  3. select c.name, o.ordid, i.itemid from customer c, ord o, item i
    where c.custid = o.custid or o.itemid = i.ordid;
  4. 2つの表しか結合できない。
問題8
次のSQL文を実行したときの正しい結果を選びなさい。従業員(emp)と給与のランク表(salaryrank)に明示的な結合列はありません。
select e.name, e.salary, s.rank from emp e, salaryrank s
where e.salary between s.minsal and a.maxsal;
  1. 結合条件の記述がないのでエラーになる。
  2. 結合条件の記述がないので直積され、すべての組み合わせのデータが表示される。
  3. WHEREで記述された条件に従って非等価結合が行われ、salaryの額でrankが表示される。
    これが正解。非等価結合文も書けるようになろう
  4. WHEREで記述された条件に従って、salaryの最小最大額が表示される。
問題9
外部結合を指定する記号を選びなさい。
  1. OUTER JOIN
  2. +
  3. *
  4. (+)
    Oracleの外部結合ではこの記号を使う。これが正解
  5. &
問題10
従業員表(emp)と部門表(dept)を結合します。ただし、従業員のまだいない新設部門の情報も一緒に出力するようにします。正しいSQL文を選びなさい。
  1. select ename, sal, job, dname from emp, dept
    where emp.deptno = dept.deptno;
  2. select ename, sal, job, dname from emp, dept
    where emp.deptno(+) = dept.deptno;
    (+)記号は、NULLを表示するほうにつける。これが正解
  3. select ename, sal, job, dname from emp, dept
    where emp.deptno = dept.deptno(+);
  4. select ename, sal, job, dname from emp, dept
    where emp.deptno(+) = dept.deptno(+);
問題11
次のSQL文を実行したときに実際に検索される表はいくつですか。正しいものを選びなさい。
select worker.ename, worker.job, worker.sal, manager.ename
from emp worker, emp manager
where worker.mgrno = manager.empno;
  1. 1つ
    同じ表を別名をつけて扱っている。これが正解
  2. 2つ
  3. 3つ
  4. 4つ
  5. 不明
問題12
従業員と上司の名前を一緒に表示するSQL文を作成します。ただし、上司のいない社長の情報も一緒に出力されるようにします。正しいSQL文を選びなさい。
  1. select worker.ename, worker.job, worker.sal, manager.ename
    from emp worker, emp manager
    where worker.mgrno(+) = manager.empno;
  2. select worker.ename, worker.job, worker.sal, manager.ename
    from emp worker, emp manager
    where worker.mgrno = manager.empno(+);
    上司のいない情報とは、mgrnoがNULLであるデータのことである。(+)記号は、NULLを表示するほうにつける。これが正解
  3. select worker.ename, worker.job, worker.sal, manager.ename
    from emp worker, emp manager
    where worker.mgrno(+) = manager.empno(+);
  4. select worker.ename, worker.job, worker.sal, manager.ename
    from emp worker, emp manager
    where worker.mgrno = manager.empno;

副問い合わせ

問題1
SALLYよりも高い給与をもらっている人を示すためのSQL文を選びなさい。
  1. select ename, sal from emp > select ename, sal from emp where ename = 'SALLY';
  2. select ename, sal from emp where sal > (select sal from emp where ename = 'SALLY');
    副問い合わせは式をカッコで囲まなければならない。これが正解
  3. 1つのSQL文では実行できない。
  4. select ename, sal from emp where sal > ename = 'SALLY';
問題2
副問い合わせが記述できる場所を選びなさい。
  1. SELECT句
  2. HAVING句
  3. FROM句
  4. ORDER BY句
上記すべての場所で記述できます。問題としては不適切でした<m(__)m>
問題3
次のSQL文を実行したときの正しい結果を選びなさい。
select ename, job, deptno from emp
where deptno = (select deptno from dept where dname = 'TOKYO')
and sal > (select sal from emp where job = 'SALESMAN');
  1. WHERE句には1つしか副問い合わせは書けないのでエラーになる。
  2. 副問い合わせは同一表に対してのみ検索できるので、エラーになる。
  3. 副問い合わせで単一行が戻ってきた場合のみ、条件に合致するデータが表示される。
    これが正解。複数行を戻す場合はINなどを使わないとエラーになる
  4. 問題なく実行される。
問題4
従業員表(emp)から給与(sal)の平均が最も高い職種(job)を求めるSQL文を選びなさい。
  1. select job, max(avg(sal)) from emp group by job;
  2. select job, sal from emp where sal > max(avg(sal)) group by job;
  3. select job, avg(sal) from emp group by job having avg(sal) = (select max(avg(sal)) from emp group by job);
    集計結果を条件にするにはHAVING句に記述しなければならない。これが正解
  4. select job,avg(sal) from emp where avg(sal) = (select max(avg(sal)) from emp group by job);
問題5
複数行副問い合わせで使用する比較演算子を選びなさい。
  1. IN
    これ
  2. <
  3. ALL <
  4. <>
  5. != ANY
    これ
問題6
副問い合わせが何件戻すかわからない場合、どの比較演算子を使用すればよいか選びなさい。
  1. IN
    これ
  2. <
  3. <=
  4. <>
  5. !=
問題7
INと同じ意味になるものを選びなさい。
  1. =ANY
    これ
  2. <>
  3. *
  4. ALL<>
  5. !=ALL
問題8
職種が(job)がSALESMANのどの人よりも高い給与をもらっている人を求めるSQL文を選びなさい。
  1. select ename, job from emp
    where sal > any (select sal from emp where job = 'SALESMAN');
  2. select ename, job from emp
    where sal > all (select sal from emp where job = 'SALESMAN');
    値リストの中の最大の値と比べるのはALLなので、これが正解
  3. select ename, job from emp
    where sal > (select sal from emp where job = 'SALESMAN');
  4. select ename, job from emp
    where sal > in (select sal from emp where job = 'SALESMAN');
問題9
次のSQL文を実行したときに条件に該当するレコードがありませんでした。emp表を確認すると該当データはあります。原因として考えられるものを選びなさい。
select e.ename from emp e
where e.empno not in (select m.mgr from emp m);
  1. SQLの文法が間違っている。
  2. NOT INだと、1つでもNULL値が戻ってくると問い合わせ全体で行が戻されないため。
    これが正解。値リストにはNULLを含めないように注意しよう
  3. 表別名ではなく、そのまま表名を記述しないとNULLが戻される。
  4. 複数行副問い合わせではNOTは使用できない。
問題10
上司別にグループを作り、その中で平均給与以上の給与を得ている人の名前(ename)、給与(sal)、上司(mgr)を求めるSQL文を選びなさい。
  1. select ename, sal, mgr from emp where sal >= avg(sal) group by mgr;
  2. select ename, sal, emp.mgr
    from emp, (select avg(sal) avgsal from emp group by mgr) b
    where sal >= b.avgsal;
  3. select ename, sal, emp.mgr
    from emp, (select mgr,avg(sal) avgsal from emp group by mgr) b
    where emp.mgr = b.mgr and sal >= b.avgsal;
    これが正解
  4. select ename, sal, emp.mgr from emp
    where sal >= (select avg(sal) from emp group by mgr);

データの操作

問題1
deptno, dname, locの3列から構成されるdept表に、新しいデータを追加します。そのとき、loc列のデータは省略しようと思います。正しいものを選びなさい。
  1. insert into dept(deptno, dname) values(60, 'EDUCATION');
    これが正解
  2. insert into dept values(60, 'EDUCATION', '');
  3. insert into dept values(60, 'EDUCATION', 'NULL');
  4. insert into dept(deptno, dname, loc) values(60, 'EDUCATION', 0);
問題2
現在の日時が2000年6月1日である場合、次のINSERT文でtest列(DATE型)に挿入される日付データは何ですか。正しいものを選びなさい。
insert into test values('01-01-01');
  1. 2001年1月1日 00:00:00
    これが正解
  2. 1901年1月1日 12:00:00
  3. 0001年1月1日 00:00:00
  4. 1901年1月1日 00:00:00
問題3
UPDATE文に関して、正しい記述を選びなさい。
  1. UPDATE文でWHERE句を省略すると、1件も更新されない。
    すべての行が更新されてしまう。間違い
  2. 1つのUPDATE文で、必ず1行が更新される。
    複数の行を更新できる。間違い
  3. UPDATE文のSET句では、副問い合わせが使用できる。
    これが正解
  4. UPDATE文のSET句では、AND演算子を使うことで同時に複数列の更新ができる。
    複数の列を更新する場合、AND演算子ではなくカンマで区切る。間違い
問題4
以下のSQLを実行した場合の説明で正しい記述を選びなさい。
insert into dept(deptno, dname, loc) values(50, 'EDUCATION');
  1. LOC列はゼロになる。
  2. LOC列はNULL値になる。
  3. エラーになる。
    列名を指定した場合、列の個数分VALUES句にデータがないとエラーになる。これが正解
  4. LOC列に値を代入するためのプロンプトが表示される。
問題5
MARTINの給与(sal)を1300に、歩合給(comm)を1400に変更します。正しいSQL文を選びなさい。
  1. update emp set sal = 1300, set comm = 1400 where ename = 'MARTIN';
  2. update emp set sal = 1300, comm = 1400 where ename = 'MARTIN';
    これが正解
  3. update emp set sal = 1300 and comm = 1400 where ename = 'MARTIN';
  4. update emp set (sal = 1300 , comm = 1400) where ename = 'MARTIN';
問題6
歩合給がNULLまたは0の人を削除します。正しいSQL文を選びなさい。
  1. delete from emp where comm is null or 0;
  2. delete from emp where comm = null or comm = 0;
  3. delete * from emp where comm = null or comm = 0;
  4. delete * from emp where comm is null or comm = 0;
    これが正解
  5. delete from emp where comm is null or comm = 0;
問題7
deptno、dname、locの3列から構成されるdept表にデータを挿入します。正しいSQL文を選びなさい。
  1. insert into dept(*) values(50, 'EDUCATION', 'JAPAN');
  2. insert into dept values(50, &'EDUCATION', &'JAPAN');
  3. insert into dept(50, '&EDUCATION', '&JAPAN');
    置き換え変数を利用してデータを入力できる。これが正解
  4. insert into dept values(50, 'EDUCATION', 'JAPAN');
    普通に追加するならこちら。これが正解
  5. insert into dept(deptno, dname) values(50, 'EDUCATION', 'JAPAN');
問題8
次のSQL文の説明の中で正しいものを選びなさい。
update emp set comm = null;
  1. commに値がある行のみ、commがNULLになる。
  2. すべての行のcommがNULLになる。
    これが正解
  3. すべての行のcommが0になる。
  4. UPDATE文でNULLは使用できない。
問題9
次の順序で実行したあとの状態について、正しいものを選びなさい。
insert ・・・
savepoint a;
delete ・・・
savepoint b;
update ・・・
rollback;
  1. INSERTは残るが、DELETE、UPDATEはロールバックされる。
  2. INSERT、DELETE、UPDATEはすべてコミットされる。
  3. INSERT、DELETEは残るが、UPDATEはロールバックされる。
  4. INSERT、DELETE、UPDATEすべてロールバックされる。
    これが正解
問題10
トランザクションの説明の中で正しいものを選びなさい。
  1. データベース管理者がOracleを起動してから、停止するまでの一連の処理のこと。
  2. 1つのSQLに対し、Oracleが内部的に行う一連の処理のこと。
  3. Oracleに接続、あるいは前回のコミットまたはロールバックをしてから、次にコミットまたはロールバックするまでの一連の処理のこと。
    これが正解
  4. 前回コミットしてから、次にコミットするまでの一連の処理のこと。
    ロールバックについて触れていないので、間違い
  5. Oracleに接続してから、Oracleとの接続を切断するまでの一覧の処理のこと。
    これはセッションの説明
問題11
トランザクションを取り消すコマンドを選びなさい。
  1. ROLLBACK
    これが正解
  2. CANCEL
  3. STOP
  4. REVOKE
問題12
orddate列(DATE型)に、2000-06-01を挿入します。正しいSQL文を選びなさい。
  1. insert into order(ordid, orddate)
    values(101, to_date('JUN 1,00', 'MON DD,YYYY'));
  2. insert into order(ordid, orddate)
    values(101, to_char('JUN 1,00', 'MON DD,YYYY'));
  3. insert into order(ordid, orddate)
    values(101, to_date('JUN 1,2000', 'MON DD,YYYY));
    これが正解
  4. insert into order(ordid, orddate)
    values(101, to_char('JUN 1,2000', 'MON DD,YYYY));
問題13
次のSQL文の説明の中で正しいものを選びなさい。
update emp set sal = sal * 1.05 where job not in('PRESIDENT', 'ANALYST');
  1. 職種がPRESIDENTまたはANALYSTの従業員の給与が増加する。
  2. 職種がPRESIDENTまたはANALYST以外の従業員の給与が増加する。
    これが正解
  3. 職種に関係なく、すべての従業員の給与が増加する。
  4. 職種がPRESIDENTまたはANALYSTの従業員がいないとき、すべての従業員の給与が増加する。

読みやすい出力の作成

問題1
SET PAUSE ONの説明で正しいものを選びなさい。
  1. 列見出しを表示する。
  2. 画面をスクロールさせる際に、各ページの冒頭で一時停止する。
    これが正解
  3. 問い合わせ結果を表示する。
  4. 各ページにヘッダーを表示する。
問題2
SQL*Plusの書式を設定するコマンドを選びなさい。
  1. COL
    これが正解
  2. COLUMNS
    COLはCOLUMNの略だが、COLUMNSではないので間違い
  3. PRINT
  4. FORMAT
問題3
SQL*Plusの起動時に実行されるファイルを選びなさい。
  1. LOGIN
  2. INIT.ORA
  3. LOGIN.ORA
  4. LOGIN.SQL
    これが正解
問題4
SQL*Plusにおいて、3件以下のレコードしか検索されなかった場合は、メッセージを非表示にしたい。正しい設定を選びなさい。
  1. SET TERMOUT OFF
  2. SET FEEDBACK OFF
  3. SET FEEDBACK 3
  4. SET FEEDBACK 4
    4行以上なら表示するという意味になるため、これが正解
  5. SET ECHO OFF
問題5
置換変数の使い方で、正しいものを選びなさい。
  1. select * from emp where ename = &'NAME';
  2. select * from emp where ename = "&NAME";
  3. select * from emp where ename = '&NAME';
    これが正解
  4. select * from emp where ename = '&'NAME;
問題6
置換変数を値に置き換えるときに、新旧のデータを非表示にするコマンドを選びなさい。
  1. SET VERIFY OFF
    これが正解
  2. SET NO VERIFY
  3. SET PRINT ON
  4. SET HIDE
問題7
次のコマンド実行後、入力されたデータを確認する方法を選びなさい。
accept data
prompt 'データを入力してください:'
  1. DEFINE COLUMNS DATA
  2. DEFINE DATA
    これが正解
  3. SHOW DATA
  4. SET SHOW DATA
問題8
emp表のsal列を問い合わせたら、####が表示されました。原因を選びなさい。
  1. データが壊れている。
  2. sal列が削除された。
  3. column sal format ####が設定されている。
  4. データの桁数が表示桁数を超えている。
    これが正解
問題9
emp表のjob列から重複値を取り除いて表示します。正しいコマンドを選びなさい。
  1. SET BREAK ON JOB IN EMP
  2. BREAK ON JOB IN EMP
  3. BREAK ON JOB
    これが正解
  4. SET BREAK ON JOB
問題10
sal列の値に千単位でカンマをつけ、\も表示します。正しいコマンドを選びなさい。
  1. FORMAT SAL \99,999
  2. COLUMN SAL FORMAT \99,999
  3. FORMAT SAL L99,999
  4. COLUMN SAL FORMAT L99,999
    これが正解
問題11
次の順序で実行した後の状態について、正しいものを選びなさい。
spool report
select * from emp;
select * from dept;
spool off
  1. dept表の問い合わせ結果のみファイルに出力される。
  2. emp表とdept表の問い合わせ結果がファイルに出力される。
    これが正解
  3. エラーになる。
  4. dept表の問い合わせ結果のみプリンタに出力される。
  5. emp表とdept表の問い合わせ結果がプリントに出力される。
問題12
次のSQL文を修正してdept表を問い合わせます。正しいコマンドを選びなさい。
select * from emp;
  1. CHANGE(EMP,DEPT)
  2. CHANGE EMP TO DEPT
  3. CHANGE /DEPT/EMP
  4. CHANGE /EMP/DEPT
    これが正解

[ TOP ]