Ключевые слова

Тесты

Заключение

 

При чтении лекций, посвященных оператору SELECT языка SQL, автору этого курса неоднократно случалось слышать жалобы студентов на сухость начального материала и отсутствие иллюстрирующих примеров. Однако автору не удалось встретить ни одного учебного пособия по языку SQL, основанного на примерах (среди многочисленных изданий типа “SQL за 24 часа”, “SQL для чайников” и даже “SQL для идиотов”), который действительно давал бы представление об SQL как языке, а не служил инструкцией армейского типа.

 

Сложность организации оператора выборки не позволяет сразу начинать с полноценных примеров, а для демонстрации примеров промежуточных конструкций требуется создание неприемлемо громоздкого контекста. Поэтому могу лишь принести извинения за скучность этой лекции. Поверьте мне, что я с большим удовольствием оживил бы этот материал, если бы представлял, как это можно сделать.

 

С другой стороны, теперь мы уже вплотную подошли к тому этапу, на котором возможны и полезны иллюстрации, и в следующих лекциях вы найдете изрядное их число, хотя проиллюстрировать все интересные разновидности оператора SELECT все равно не представляется возможным, поскольку число вариантов близко к астрономическому.

 

 

1 (1) Пусть A и B являются столбцами таблицы T типа CHARACTER (5), и пусть в при вставке в строку s этой таблицы в столбец A было занесено значение ‘ONE’, а в столбец B – ‘TIME’. Каким будет значение выражения A || B при его вычислении для значений строки s? (Здесь “V” обозначает символ пробела.)

 

(a) -

“ONEVTIME”

(б) -

“ONEVVTIME”

(в) +

“ONEVVTIMEV”

 

1 (2) Пусть A является столбцом таблицы T типа CHARACTER (5), а B – столбцом таблицы T типа CHARACTER VARYING (8). Пусть в при вставке в строку s этой таблицы в столбец A было занесено значение ‘LET’, а в столбец B – ‘IT’. В столбце какого из перечисленных ниже типов могло бы быть сохранено значение выражения A || B || ‘BE’, вычисленное для значений строки s? (Здесь “V” обозначает символ пробела.)

 

(а) -

CHARACTER (4)

(б) +

CHARACTER (9)

(в) +

CHARACTER (15)

 

1 (3) Можно ли выразить булевскую функцию SQL IS через функцию “стрелка Пирса”? Каков из представленных ниже ответов является правильным?

 

(а) -

Да. x IS y º pi (pi (pi (pi (A, A), pi (B, B)), pi (A, B)), pi (pi (pi (A, A), pi (B, B)), pi (A, B)))

 

(б) -

Да. x IS y º pi (pi (pi (pi (A, A), pi (B, B)), pi (A, B)))

 

(в) +

Булевская функция SQL IS не выражается через функцию “стрелка Пирса”, потому что в трехзначной логике SQL NOT UNKNOWN = UNKNOWN

 

2 (1) Пусть A является столбцом таблицы T типа INTEGER, B – столбцом таблицы T типа CHARACTER (5), а C – столбцом таблицы T типа CHARACTER VARYING (8). Какого типа будет результат выражения следующего выражения с переключателем?

 

CASE WHEN A = 5 THEN B
WHEN A > 6 THEN C
ELSE B || C
END

 

(а) -

CHARACTER VARYING (8)

(б) -

CHARACTER (13)

(в) +

CHARACTER VARYING (13)

 

2 (2) Какое из приведенных ниже выражений с переключателем эквивалентно выражению COALESCE (NULLIF (V1, V2), NULLIF (V3, V4))? (“<>” обозначает сравнение на неравеенство.)

 

(а) +

CASE WHEN V1 <> V2 THEN V1
WHEN V1 = V2 AND V3 = V4 THEN NULL
ELSE V3
END

 

(б) -

CASE WHEN V1 = V2 AND V1 NOT NULL THEN V1
WHEN V1 <> V2 AND V3 <> V4 THEN V3
ELSE NULL
END

 

(в) -

CASE WHEN V1 NOT NULL THEN V2
WHEN V1 = V2 AND V3 <> V4 THEN V4
ELSE V3
END

 

2 (3) Какое из приведенных ниже выражений с переключателем эквивалентно выражению NULLIF (COALESCE (V1, V2), COALESCE (V3, V4))? (“<>” обозначает сравнение на неравенство.)

 

(а) +

CASE WHEN V1 = V3
OR (V1 IS NULL AND V3 NOT NULL AND V2 = V3)
OR (V1 NOT NULL AND V3 IS NULL AND V1 = V4)
OR (V1 IS NULL AND V3 IS NULL AND V2 = V4) THEN NULL
WHEN V1 NOT NULL
AND (V1 <> V3 OR V3 IS NULL)
AND (V3 IS NULL OR V2 IS NULL OR V2 <> V3)
AND (V3 NOT NULL OR V4 IS NULL OR V1 <> V4)
AND (V3 NOT NULL OR V2 IS NULL OR V4 IS NULL OR V2 <> V4) THEN V1
ELSE V2
END

 

(б) -

CASE WHEN V1 = V3
OR (V1 NOT NULL AND V3 NOT NULL AND V2 = V3)
OR (V1 IS NULL AND V3 IS NULL AND V1 = V4)
OR (V1 IS NULL AND V3 NOT NULL AND V2 = V4) THEN NULL
WHEN V1 NOT NULL
AND V1 <> V3
AND (V3 NOT NULL OR V2 <> V3)
AND (V3 IS NULL OR V1 <> V4)
AND (V3 NOT NULL OR V2 <> V4) THEN V1
ELSE V2
END

 

(в) -

CASE WHEN V1 = V3
OR (V1 NOT NULL AND V3 NOT NULL OR V2 = V3)
OR (V1 IS NULL OR V3 IS NULL AND V1 = V4)
OR (V1 IS NULL AND V3 NOT NULL OR V2 = V4) THEN NULL
WHEN V1 NOT NULL
AND V1 <> V3
AND V3 NOT NULL
AND V2 <> V3
AND (V3 IS NULL OR V1 <> V4)
AND (V3 NOT NULL
AND V2 <> V4 THEN V1
ELSE V2
END

 

3 (1) Пусть имеются три мультимножества M1, M2 и M3, содержащие общий элемента a, причем в мультимножестве M1 содержится n дубликатов a, в мультимножестве M2 m дубликатов a, а в мультимножестве M3 k дубликатов. Сколько дубликатов элемента a будет содержаться в результате операции (M1 UNIOIN M2) INTERSECT M2?

 

(а) -

n + m - k

(б) +

min ((m+n), k)

(в) -

min (n, (m+k))

 

3 (2) Пусть имеются три мультимножества M1, M2 и M3, содержащие общий элемента a, причем в мультимножестве M1 содержится n дубликатов a, в мультимножестве M2 m дубликатов a, а в мультимножестве M3 k дубликатов. Сколько дубликатов элемента a будет содержаться в результате операции (M1 MINUS M2) INTERSECT M2?

 

(а) -

n - m - k

(б) +

min (max ((m-n),0), k)

(в) -

max (n, min (m, k))

 

3 (3) Пусть имеются четыре мультимножества M1, M2, M3 и M4, содержащие общий элемента a, причем в мультимножестве M1 содержится n дубликатов a, в мультимножестве M2 m дубликатов a, в мультимножестве M3 k дубликатов, а в мультимножестве M4p дубликатов Сколько дубликатов элемента a будет содержаться в результате операции (M1 INTERSECT M2) MINUS (M3 UNION M4)?

 

(а) -

n - m - k – p

 

(б) +

max (min ((m-n), (k+p)), 0)

 

(в) -

min (max((n-m), 0), (k+p))

 

4 (1) Пусть имеется таблица T со столбцами A, B и C. Какие из приведенных ниже конструторов строки являются синтаксическими неверными?

 

(а) -

SELECT A FROM T WHERE B = const

 

(б) -

ROW (5, NULL, SELECT * FROM T WHERE B = const)

 

(в) +

SELECT * FROM T WHERE B = const

 

4 (2) Пусть имеется таблица T со столбцами A, B и C. Какие из приведенных ниже конструторов таблицы являются синтаксическими неверными?

 

(а) -

VALUES SELECT * FROM T WHERE B = const,
ROW (5, NULL, SELECT A FROM T WHERE B = const),
(DEFAULT, NULL, NULL)

 

(б) +

VALUES ROW (SELECT * FROM T WHERE B = const, NULL),
(15, 25, NULL)

 

(в) -

VALUES ROW (SELECT A FROM T WHERE B = const,
SELECT B FROM T WHERE C = const,
SELECT A FROM T WHERE B = const),
ROW (15, 25, NULL)

 

4 (3) Пусть имеется таблица T со столбцами A, B и C. При каких условиях можно гарантировать, что в результате запроса SELECT * FROM T WHERE B = const будет содержаться не более чем одна строка?

 

(а) +

при определении таблицы T столбец B был специфицирован как первичный ключ

(б) +

при определении таблицы T столбец B был специфицирован как возможный ключ

(с) -

таблица T содержит всего одну строку

Лекция 14. Язык баз данных SQL: предикаты раздела WHERE оператора SELECT

 

В этой лекции продолжается обсуждение механизма выборки данных языка SQL – оператора SELECT. Лекция целиком посвящена видам условных выражений, которые могут содержаться в разделе WHERE оператора выборки. Определяются и иллюстрируются на примерах запросов все виды предикатов, специфицированных в стандарте SQL:1999.

 

 

Раздел WHERE оператора выборки, логическое выражение раздела WHERE, предикат, предикат сравнения, сравнение символьных строк, сравнение битовых строк, сравнение значений типа дата-время, сравнение значений анонимного строкового типа, спецификация DISTINCT, корреляционные подзапросы, полусоединение (semijoin), уточненная семантика оператора выборки, предикат between, предикат null, семантика предиката null, предикат in, предикат like, раздел ESCAPE, предикат similar, регулярные выражения предиката similar, набор символов (regular character set), идентификатор набора символов (regular charset id), функция SUBSTRING ... SIMILAR ... ESCAPE, предикат exists, предикат unique, предикат overlaps, предикат сравнения с квантором, предикат сравнения с квантором всеобщности, предикат сравнения с квантором существования, предикат match, тип сопоставления SIMPLE, тип сопоставления PARTIAL, тип сопоставления FULL, предикат distinct.