質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2805閲覧

エラーにならないsqlについて

yamaguti

総合スコア185

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/01/14 04:36

編集2020/01/14 04:42

https://amg-solution.jp/blog/6212

上記ページに載っている問題で、

SELECT文についての問題

次のSELECT文の中からエラーにならないものを選びなさい

A. select sname, min(hiredate) from stu; B. select deptno dept, avg(sal) avgsal from stu groupe by dept having avg(sal); C. select deptno, job, max(sal) from stu group by deptno having max(sal); D. select avg(sal) from stu having avg(sal);

Dが正解になる理由がいまいち分かりません。

FROMまでであれば、エラーにならないと思いますが、HAVINGを入れるとエラーになりませんでしょうか?(HAVINGに比較の演算がないですし)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

全部エラーになりますね。
問題がおかしいと思います。
または、「回答なし」が正答でしょうか。
質問者さんの言うとおり、演算子が無いためエラーになります。
選択肢Bに至ってはGROUP が GROUPEになっていますが、
GROUPに修正しても実行できませんね。

SQL>CREATE TABLE STU (
2 SNAME VARCHAR2(10)
3 , HIREDATE DATE
4 , DEPTNO CHAR(5)
5 , SAL NUMBER(3)
6 , JOB VARCHAR2(10)
7 );

表が作成されました。

SQL>select sname, min(hiredate) from stu;
select sname, min(hiredate) from stu
*
行1でエラーが発生しました。:
ORA-00937: 単一グループのグループ関数ではありません。

SQL>select deptno dept, avg(sal) avgsal from stu group by dept having avg(sal);
select deptno dept, avg(sal) avgsal from stu group by dept having avg(sal)
*
行1でエラーが発生しました。:
ORA-00920: 関係演算子が無効です。

SQL>select deptno, job, max(sal) from stu group by deptno having max(sal);
select deptno, job, max(sal) from stu group by deptno having max(sal)
*
行1でエラーが発生しました。:
ORA-00920: 関係演算子が無効です。

SQL>select avg(sal) from stu having avg(sal);
select avg(sal) from stu having avg(sal)
*
行1でエラーが発生しました。:
ORA-00920: 関係演算子が無効です。

投稿2020/01/20 04:01

編集2020/01/20 04:10
toyotaku

総合スコア103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

HAVING句の力

2006年の古い記事ですけどエラーにはならないらしいですよー

SQL

1SELECT '歯抜けあり' AS gap 2 FROM SeqTbl 3HAVING COUNT(*) <> MAX(seq);

ところで、このSQL文にはGROUP BY句が存在しません。こういう場合、テーブル全体が1行に集約されます。その場合でも、HAVING句は問題なく使えます。昔のSQLでは、HAVING句はGROUP BY句と併用しなければならなかったので、今でも時々そう勘違いされていることがありますが、現在の標準SQLではHAVING句を単独で使えます。ただしその場合、SELECT句で元テーブルの列を参照できなくなるので、サンプルのように定数を指定するか、または「SELECT COUNT(*)」のように集約関数を使う必要があります。

投稿2020/01/14 04:40

azuapricot

総合スコア2341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/14 04:48

これ知らなくてもこの設問なら消去法でなんとかなりそうな気がします。
azuapricot

2020/01/14 04:56

(結局きちんと理解できているか・・・)
yamaguti

2020/01/14 04:59

ご回答ありがとうございます。 問題文のsqlのHAVING AVG(sal); だとエラーになりませんでしょうか? 演算子がないので
guest

0

HAVINGを入れるとエラーになりませんでしょうか?(HAVINGに比較の演算がないですし)

where にしろhavingにしろ後に続くのはTrueかどうかの判定です。
演算子の有無は関係ありません。

where (1=1)とするのも where Trueとするのも同じと考えて下さい。

投稿2020/01/14 10:16

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問