Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru)


Информационный Канал Subscribe.Ru

Новости сайта "Упражнения по SQL" Выпуск 8 (7 ноября 2004 г.)

http://www.sql-ex.ru

Новым посетителям сайта

Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.

Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается после решения 62-х задач первого этапа. При подсчете рейтинга каждого участника отбрасывается один самый худший показатель среди всех решенных им упражнений.


С праздником Великой Октябрьской Социалистической Революции, дорогие товарищи!
С днем Согласия и Примирения, уважаемые господа!

 

Новости сайта

§ Появились первые специалисты, сертифицированные на сайте, с чем я их и нас поздравляю.

Число участников рейтинга - 2176

Число участников второго этапа - 202

Лучшие результаты (ТОР 20)

No Surname Number of
Sel_ex
Number of
DML_ex
Scores Days Days_2 Last_Solved Last_Visit
1 Зверев Д.Л. (dimzv) 136 17 274 252.92 2.219 14 Jul 2004 14 Jul 2004
2 Иткин И.Л. (joseph_itkin) 136 17 274 245.84 2.792 29 Oct 2004 29 Oct 2004
3 Якутин Н.В. (ZrenBy) 136 6 274 428.80 3.993 24 Jun 2004 24 Jun 2004
4 Леденев С.А. (Shurgenz) 136 17 274 60.94 8.315 18 Oct 2004 18 Oct 2004
5 Михайлов В.Г. (mslava) 136 17 274 498.01 9.734 26 Oct 2004 26 Oct 2004
6 Spirin (spirin) 136 17 274 44.06 13.429 29 Sep 2004 29 Sep 2004
7 Валуев Д.И. (Fiolent) 136 17 274 293.15 19.314 23 Jun 2004 05 Nov 2004
8 Мельникова И.А. (Iris_m) 136 17 274 141.12 65.651 30 Sep 2004 30 Sep 2004
9 Карабанов А. (gipa) 133 0 268 138.58 5.022 10 Jul 2004 10 Jul 2004
10 Новиков Д.А. (DimaN) 130 0 264 68.17 2.104 01 Mar 2004 01 Mar 2004
11 Драконов Ф.А. (f_d) 130 0 264 36.32 7.243 03 Jun 2004 03 Jun 2004
12 Пятница О.А. (Robin) 128 17 259 589.55 70.834 06 Oct 2004 06 Oct 2004
13 Губарь Д.К. (DEathkNIghtS) 124 17 251 22.67 1.048 03 Nov 2004 03 Nov 2004
14 Смирнов А. (Leshich) 124 17 251 147.15 84.180 03 Aug 2004 03 Aug 2004
15 Ганя А.Д. (Sandman25) 123 1 248 154.83 3.130 16 Jun 2004 16 Jun 2004
16 Шулакова Н. (nshu) 121 0 244 81.03 5.468 28 Feb 2004 28 Feb 2004
17 Митронин А.А. (mitronin) 120 9 241 405.96 2.150 09 Aug 2004 09 Aug 2004
18 Муравейко О.Ю. (Aaz) 120 4 241 134.65 5.720 07 Mar 2004 07 Mar 2004
19 сафрошкин В.Ю. (safervas) 120 14 241 81.82 65.873 06 Nov 2004 06 Nov 2004
20 Gershovich (VIG) 119 9 238 486.32 4.006 10 Jul 2004 06 Nov 2004


 

Лучшие результаты за неделю

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Красников В.В. (WW) 64 64 115 26 141 144 05 Nov 2004
2 Харанфиль А.Е. (kharanfil) 60 60 105 0 105 215
3 Смирнов А.Ю. (anton) 41 41 71 17 88 349
4 Zhelnovsky L. (Lёva) 42 42 69 9 78 360 06 Nov 2004
5 Люшин Д.Ю. (Пророк) 41 41 67 5 72 371
6 Лукьянов А.Н. (Spider) 30 55 58 10 68 246 06 Nov 2004
7 Yun G.A. (JayS) 20 97 41 17 58 41 05 Nov 2004
8 Федотов С.Ю. (SFedotov) 38 38 56 0 56 458 06 Nov 2004
9 Соболев Д.В. (SDV) 27 27 46 3 49 541
10 k (efim) 25 25 40 0 40 600
11 Дегтярь С.Б. (degtyar) 9 77 21 17 38 78 05 Nov 2004
12 Савченкова А.Е. (annas) 16 60 35 3 38 219 06 Nov 2004
13 Khusnutdinov (renat) 24 24 37 0 37 628
14 Сныткин В.Л. (vlad_snt) 16 113 36 0 36 25 05 Nov 2004
15 Abliyev R. (reuvenab) 23 23 34 2 36 691
16 Копысова С.В. (kosv) 20 56 34 0 34 232 05 Nov 2004
17 П (dvp1971) 23 23 34 0 34 693
18 Придумин К. (Soldat) 23 23 34 0 34 709 06 Nov 2004
19 Petrova Y. (Yulia) 22 22 32 1 33 742
20 Трегубов А.В. (art) 14 64 31 0 31 163 06 Nov 2004
21 Isachenko I.I. (Caesar) 22 22 31 0 31 789 05 Nov 2004
22 Мостайкина М.Ю. (Lady) 16 23 27 3 30 724 05 Nov 2004
23 Moiseenko O. (oleg_m) 18 18 27 3 30 853


Характерные ошибки при решении упражнений

SELECT

Задача 23
Найдите производителей, которые производили бы как ПК со скоростью не менее 750 МГц, так и ПК-блокноты со скоростью не менее 750 МГц. Вывести: Maker

Эта задача поясняется в FAQ на сайте. Повторюсь для тех, кто далеко живет :-).

SELECT DISTINCT maker FROM product
  WHERE model IN (SELECT model FROM pc WHERE speed>=750)
   OR
   model IN (SELECT model FROM laptop WHERE speed>=750)

В приведенном решении в результирующий набор попадет также и производитель, выпускающий что-нибудь одно: либо ПК, либо ПК-блокноты, т.к. для попадания в результирующий набор достаточно выполнения одного из условий, соединяемых оператором OR. Что не удовлетворяет условиям задачи и совершенно справедливо отвергается системой.

Перефразируя Толстого, скажу: "Все правильные решения правильны одинаково, а неправильные - неправильны по-своему". Вот еще одна попытка "изменить" ситуацию в лучшую сторону:

SELECT DISTINCT maker FROM product a, pc b, laptop c
   WHERE b.speed >= 750 AND c.speed >= 750
   AND
   (a.model = b.model OR a.model = c.model)

Используя равенство предикатов,

x AND (y OR z) = (x AND y) OR (x AND z)

выполним синтаксические преобразования рассматриваемого запроса:

SELECT DISTINCT maker FROM product a, pc b, laptop c
   WHERE ((b.speed >= 750 AND c.speed >= 750)
   AND a.model = b.model)
      OR
   ((b.speed >= 750 AND c.speed >= 750)
   AND a.model = c.model)

В результирующий набор попадут строки, отвечающие хотя бы одному из предикатов, соединяемых оператором OR. Рассмотрим, например, запрос с первым предикатом:

SELECT DISTINCT maker FROM product a, pc b, laptop c
   WHERE ((b.speed >= 750 AND c.speed >= 750)
   AND a.model = b.model)

Перепишем его в синтаксически более удобной форме:

SELECT DISTINCT maker
   FROM product a JOIN pc b ON a.model = b.model,
      laptop c
   WHERE (b.speed >= 750 AND c.speed >= 750)

и далее

SELECT DISTINCT maker FROM
(
   SELECT maker FROM product a JOIN pc b ON a.model = b.model
       WHERE b.speed >= 750
) x,
(
   SELECT * FROM laptop c WHERE (c.speed >= 750)
) y

Теперь, пожалуй, уже можно проанализировать. Первый подзапрос, который мы обозначили "х" соединяет по внешнему ключу таблицу PC с таблицей Product, отбирая производителей ПК со скоростью >=750. Второй ("y") отбирает модели ПК-блокнотов со скоростью >=750.

То, как соединяются "x" и "y", называется декартовым произведением. Т.е. производитель требуемых ПК будет в результирующем наборе сочетаться с КАЖДОЙ моделью ПК-блокнота, даже если она произведена ДРУГИМ производителем.

Не знаю, как Толстой, а я, кажется, ошибся. Грабли те же, только в других кустах, а именно, мы опять получим производителей, которые могут производить только что-то одно. А "кусты" другие потому, что если НИКТО не производит ПК-блокноты с требуемой скоростью, то мы получим пустой набор записей. Этот частично правильный результат не дает запрос из FAQ.

Совпадение результатов на основной базе является совершенно случайным. Так уж оказалось, что те производители, которые выпускают нужные по условию задачи ПК, выпускаю также и нужные ПК-блокноты.

Таким образом, несмотря на совпадение результатов на "видимой" базе, запрос не является правильным при любом совместимом со схемой состоянием БД.

В заключение, чтобы не быть голословным, покажу результаты оригинального запроса с расширением списка выводимых столбцов. Вот запрос:

SELECT maker, a.model a_m, b.model b_m, c.model c_m
   FROM product a, pc b, laptop c
   WHERE ((b.speed >= 750 AND c.speed >= 750)
      AND a.model = b.model)
      OR
      ((b.speed >= 750 AND c.speed >= 750)
      AND a.model = c.model)

А вот пара строк из результата:

Maker a_m b_m c_m
B 1121 1121 1752
A 1752 1121 1752

Как видно, модель 1121 (ПК) принадлежит производителю В, а модель 1752 (ПК-блокнот) - производителю А. Так что у нас нет никаких оснований считать, что оба эти производителя удовлетворяют условиям задачи.

§ Приведенные здесь примеры можно выполнить непосредственно на сайте, установив флажок "Без проверки" на странице с упражнениями на SELECT.


Полезная информация

§ Как оказалось, не только формулировки задач требуют пояснений :-). Были просьбы пояснить, о каких тестах идет речь в опросе на сайте. Поясняю. Имеются в виду тесты в виде вопросов и нескольких вариантов ответов. Тестируемый должен выбрать правильные ответы на заданный вопрос. Что касается упражнений по T-SQL, то такие намерения мы также имеем, но пока еще не готовы эти намерения реализовать.
Поделитесь с нами, если у вас есть интересные вопросы по T-SQL.


 

Контакты

По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.

 

Подписка Subscribe.Ru
Новости сайта "Упражнения по SQL"

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.db.sqlex
Отписаться

В избранное