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

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


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

Выпуск 315 от 09 октября 2010 г.

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

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

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

Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов, которые пригодятся на третьем рейтинговом этапе, который начинается после 138 задачи.

Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.


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

§ Самые популярные темы недели на форуме

Топик  Сообщений
777   29
121 (SELECT) 11
779   10
163 (SELECT) 9
141 (SELECT) 8

 

§ Авторы недели на форуме

Автор  Число сообщений
qwrqwr   9
Baser    8
$erges   7
vitek_panasyuk 6
Fuddy-Duddy 6

 

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
Смена лидера!
1. vlksm ()
5. MadVet (163, 165)
9. Gavrila (158)
16. qwrqwr (141)
17. pvv (140, 162)
25. Baser (151)

§ Одна задача до третьего этапа осталась:
72. IrinkaR (137, 22.622)

§ Продвинулись в рейтинге:
83. count (125, 12.815)
88. _ORA_ (120, 213.884)
91. tolikas (118, 21.503)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
110. Fuddy-Duddy (124, 107.575)
114. Gendalf (110, 202.061)
121. _irina_ (109, 34.042)
129. Sergey79 (109, 849.551)
140. GeBy (108, 11.458)
146. Faust (106, 54.520)

§ Число подписчиков - 3815

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

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

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

На обучающем этапе - 19450

Сертифицировано на сайте - 461

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Карасёва Н.В. (vlksm)1 172 168 23 411 1611 140.501 95.247 89 2010-10-03 2010-10-08
2 Креславский О.М. (Arcan)1 172 34 23 411 1334 144.301 103.037 89 2010-09-25 2010-10-08
3 Дубинский А.В. (_yizraor)3 170 34 23 405 849 226.024 338.593 83 2010-09-25 2010-10-06
4 Сальников С.А. ($erges)1 168 26 23 401 942 8.513 7.876 81 2010-09-25 2010-10-08
5 Зотов П.Г. (Ozzy)1 165 26 22 391 931 214.147 190.281 74 2010-09-27 2010-10-08
6 Держальцев В.А. (MadVet)6 162 34 22 377 1999 129.475 89.353 73 2010-10-06 2010-10-08
7 Дроздков А.Н. (anddros)5 165 34 23 391 854 9.959 9.278 69 2010-09-28 2010-10-08
8 Яцук А.А. (Faust_zp)1 151 65 22 365 1093 121.912 89.835 69 2010-02-01 2010-05-22
9 >Тарасов Д.Б. (Gavrila)9 159 158 23 374 1869 95.537 54.348 57 2010-10-08 2010-10-08
10 Умрихина Е.В. (Umrikhina)1 138 18 22 334 853 41.244 43.454 56 2010-08-25 2010-09-06
11 Бойко Д.М. (Angellore)8 160 34 23 374 1145 924.497 212.056 55 2010-09-25 2010-10-08
12 Орлов М.В. (Eagleoff)11 158 34 23 370 894 76.708 42.990 48 2010-09-28 2010-10-08
13 Шиндин А.В. (AlShin)10 136 160 21 319 693 216.424 608.803 46 2010-09-11 2010-09-15
14 Сенкевич С.В. (GreyC)1 120 2 21 297 612 57.718 23.321 38 2009-10-07 2010-01-01
15 Селезнёв А.С. (Артём С.)1 117 106 21 289 444 47.221 30.368 38 2009-01-25 2010-09-08
16 Курочкин П.А. (qwrqwr)16 152 141 23 350 330 83.435 40.169 37 2010-10-06 2010-10-08
17 >Печатнов В.В. (pvv)1 151 140 21 345 1085 40.651 15.513 33 2010-10-08 2010-10-08
18 Никотин В.М. (@Nikotin)1 121 2 21 294 471 8.335 3.541 32 2009-12-11 2010-09-11
19 Мурашкин И.В. (lepton)1 113 4 21 274 1139 69.439 58.709 32 2009-05-05 2010-09-30
20 Dvoryaninov V. (Валдай)18 152 34 23 347 466 157.925 162.280 28 2010-09-25 2010-10-07

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Vyshnevskyy O.K. (icefish) 11 11 21 37 58 1625 08 Oct 2010
2 PIO (pio7) 19 23 35 7 42 1492 07 Oct 2010
3 >Красовский Е.А. (Pegoopik) 14 85 31 0 31 279 08 Oct 2010
4 Ждыняк С. (Coderenko) 24 64 31 0 31 455 08 Oct 2010
5 Куликов А.А. (Alexey K.) 3 3 3 22 25 3330 04 Oct 2010
6 >Zero N. (Ravenwing) 8 8 16 9 25 3340 08 Oct 2010
7 >Wrobel (mawwro[PL]) 15 48 21 3 24 616 08 Oct 2010
8 Ноговицын А.А. (NoGo) 10 86 20 0 20 277 08 Oct 2010
9 mgn Y. (yaroslavmgn_) 14 47 20 0 20 650 07 Oct 2010
10 >bsh L. (O.o) 7 95 16 3 19 229 08 Oct 2010
11 >Нестеренко (HerrMannelig)) 12 69 19 0 19 398 08 Oct 2010
12 Balobanov D. (HerrDmitry) 14 32 19 0 19 962 06 Oct 2010
13 >Толстихин К.В. (magi) 5 48 6 12 18 611 08 Oct 2010
14 >Максимов В.В. (VMassimo) 7 7 18 0 18 4282 08 Oct 2010
15 >Бармашёв (AlAzif) 12 47 17 0 17 1209 08 Oct 2010
16 Евдокимов (Paradox) 8 33 16 0 16 1708 07 Oct 2010
17 Сивов В.Н. (dimas2008) 5 6 14 0 14 5061 08 Oct 2010
18 Федяков Е.В. (fedyakov) 7 7 11 0 11 6004 06 Oct 2010
19 >Джгаркава М.З. (medgar) 7 7 11 0 11 6029 08 Oct 2010
20 Мединцев (Romaticus) 0 0 11 11 6094 06 Oct 2010

Изучаем SQL

Полное внешнее соединение и MySQL

Моисеенко С.И.

Полное внешнее соединение (FULL JOIN) не поддерживается в MySQL. Можно считать, что это - "избыточная" операция, т.к. она представляется через объединение левого и правого внешних соединений. Например, запрос

(1)
SELECT * FROM Income_o I FULL JOIN Outcome_o O
     ON I.point = O.point AND I.date = O.date
который на каждый рабочий день по каждому пункту выводит в одну строку приход и расход (схема "Вторсырье"), можно переписать в виде:
(2)
SELECT * FROM Income_o I LEFT JOIN Outcome_o O
      ON I.point = O.point AND I.date = O.date
UNION
SELECT * FROM Income_o I RIGHT JOIN Outcome_o O
      ON I.point = O.point AND I.date = O.date
С логической точки зрения эти запросы эквивалентны; оба они выводят как дни, когда был и приход, и расход, так и дни, когда отсутствовала одна из операций (отсутствующие значения заменяются NULL). Однако с точки зрения производительности второй запрос проигрывает первому вдвое по оценке стоимости плана. Это связано с тем, что операция UNION приводит к выполнению сортировки, которая отсутствует в плане первого запроса. Сортировка же необходима для процедуры исключения дубликатов, т.к. левое и правое соединения оба содержат строки, соответствующие внутреннему соединению, т.е. случаю, когда есть как приход, так и расход. Поэтому, если вместо UNION написать UNION ALL, то такие строки будут присутствовать в результирующем наборе в двух экземплярах. Тем не менее, чтобы получить план, близкий по стоимости FULL JOIN, нужно избавиться от сортировки. Например, использовать UNION ALL, но в одном из объединяемых запросов исключить строки, соответствующие внутреннему соединению:
(3)
SELECT * FROM Income_o I LEFT JOIN Outcome_o O
      ON I.point = O.point AND I.date = O.date
UNION ALL
SELECT NULL, NULL, NULL,* FROM Outcome_o O
WHERE NOT EXISTS (SELECT 1 FROM Income_o I
                  WHERE I.point = O.point AND I.date = O.date)
Обратите внимание, что заведомо отсутствующие значения, которые появлялись в правом соединении решения (2), здесь формируются явным заданием NULL-значений. Если по каким-то причинам, явное задание NULL вместо соединения вам не подходит, можно оставить соединение, но это даст более дорогой план, хотя и он будет дешевле плана с сортировкой (2):
SELECT * FROM Income_o I LEFT JOIN Outcome_o O
      ON I.point = O.point AND I.date = O.date
UNION ALL
SELECT * FROM Income_o I RIGHT JOIN Outcome_o O
      ON I.point = O.point AND I.date = O.date
WHERE NOT EXISTS (SELECT 1 FROM Income_o I
                  WHERE I.point = O.point AND I.date = O.date)

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

§ Приглашаем вас посетить Интерактивный учебник по SQL.
   Ресурс позиционируется как "справочное обеспечение" для сайта SQL-EX.RU, но может использоваться и независимо от него.

§ Онлайновый выпуск рассылки можно почитать на сайте.

§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL.

§ Хотите поддержать проект? Вот инструкция по применению.

Контакты

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

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

В избранное