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

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


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

Выпуск 288 от 03 апреля 2010 г.

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

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

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

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

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


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

§ Написал подсказку для задачи 34 обучающего этапа.

§ Автор задачи 159 добавил для нее проверочные данные.

§ Выставил две новые задачи на обучающий этап - 67 (сложность 2 балла) и 68 (3).

§ Начинаю предупреждать. :-)
В конце месяца планирую выставить несколько новых рейтинговых задач.

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
5. $erges (159)
10. Angellore (165)
33. B o r i s (158)

§ Продвинулись в рейтинге:
72. alex.i (135, 169.650)
75. qwrqwr (130, 39.220)
76. Vasilko (129, 10.500)

§ Новые лица в ТОР 100 и вернувшиеся туда:
97. Eka (125, 21.505)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
125. Vladius (116, 23.473)
132. Serg71 (115, 279.973)
135. Inuyasha (108, 2.476)

§ На этой неделе сертифицированы:
IrinaZV (A10062311) [BK] - г. Харьков, Украина

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

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

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

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

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

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

Лучшие результаты (ТОР 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 166 165 22 408 1412 127.448 94.252 77 18 Mar 2010 02 Apr 2010
2 Креславский О.М. (Arcan)1 166 165 22 408 1147 122.467 99.220 77 22 Mar 2010 02 Apr 2010
3 Зотов П.Г. (Ozzy)1 164 164 22 403 725 199.850 211.373 75 05 Mar 2010 02 Apr 2010
4 Яцук А.А. (Faust_zp)1 164 251 22 405 1093 121.912 95.355 74 01 Feb 2010 20 Mar 2010
5 Сальников С.А. ($erges)1 163 164 22 400 763 6.893 6.742 69 30 Mar 2010 02 Apr 2010
6 Дроздков А.Н. (anddros)5 163 164 22 400 667 8.311 8.492 69 25 Mar 2010 02 Apr 2010
7 Умрихина Е.В. (Umrikhina)1 150 251 22 372 488 41.244 47.651 61 25 Aug 2009 29 Sep 2009
8 Дубинский А.В. (_yizraor)8 159 164 22 389 671 67.232 31.956 58 31 Mar 2010 02 Apr 2010
9 Тарасов Д.Б. (Gavrila)9 154 162 22 373 1669 70.897 36.480 42 22 Mar 2010 02 Apr 2010
10 Бойко Д.М. (Angellore)10 155 132 22 372 964 845.686 153.495 41 28 Mar 2010 02 Apr 2010
11 Сенкевич С.В. (GreyC)1 133 251 21 337 612 57.718 26.238 41 07 Oct 2009 01 Jan 2010
12 Селезнёв А.С. (Артём С.)1 130 251 21 329 444 47.221 34.492 41 25 Jan 2009 03 Mar 2009
13 Никотин В.М. (@Nikotin)1 134 251 21 334 471 8.335 3.704 35 11 Dec 2009 02 Apr 2010
14 Печатнов В.В. (pvv)1 142 18 21 345 845 36.963 19.888 33 10 Feb 2010 27 Mar 2010
15 Мурашкин И.В. (lepton)1 126 251 21 314 1139 69.439 58.709 32 05 May 2009 14 Dec 2009
16 Орлов М.В. (Eagleoff)15 150 162 22 361 687 47.274 20.549 30 05 Mar 2010 02 Apr 2010
17 Шиндин А.В. (AlShin)10 142 152 21 343 498 26.251 418.630 30 28 Feb 2010 09 Mar 2010
18 Муллаханов Р.Х. (rem)9 136 251 22 334 649 14.598 20.041 29 20 Jun 2009 02 Feb 2010
19 Анисимов Д. (danilko)13 139 160 22 332 32 12.700 9.542 28 12 Aug 2009 17 Aug 2009
20 Любченко В.А. (IAS56)6 136 15 22 328 1285 655.251 138.580 23 12 Mar 2010 14 Mar 2010

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Шумилин А.В. (Shumilin) 36 40 74 25 99 1191 02 Apr 2010
2 >Рыбкина Т.В. (Rybka) 31 31 62 34 96 1393 02 Apr 2010
3 Гурьяновская О.А. (Пантерка) 40 40 79 0 79 1853 27 Mar 2010
4 Дутчак П.Я. (Pavel_Dutchak) 31 46 64 0 64 1585 01 Apr 2010
5 Казанин О.В. (Locomotiv) 12 42 22 34 56 938 02 Apr 2010
6 Фролов В.В. (invest) 23 37 53 0 53 1996 01 Apr 2010
7 Шинкаренко Д. (Denysss) 18 41 43 0 43 1771 02 Apr 2010
8 >Malyshkina O. (Golda) 14 38 34 0 34 1978 02 Apr 2010
9 >Пантелеев Ю.Б. (ypant) 4 4 7 25 32 5702 02 Apr 2010
10 >Борисов А.В. (Князь) 14 14 25 2 27 6571 02 Apr 2010
11 Mano (antimatter) 2 2 4 22 26 6643 31 Mar 2010
12 >Завалий И.В. (IrinaZV) 12 68 23 0 23 466 02 Apr 2010
13 Chernicin A. (Chernicin1) 14 14 22 0 22 2932 28 Mar 2010
14 подпалкина (aep) 7 8 18 3 21 6961 01 Apr 2010
15 >Коваленко В.А. (Sebastiano Pereira) 3 3 4 15 19 4842 02 Apr 2010
16 Kac (AlexKac) 0 1 0 19 19 7152 02 Apr 2010
17 Филиппов (Kri0-Gen) 0 0 19 19 7496 30 Mar 2010
18 >Okhrimenko A.V. (OkhrimenkoAV) 12 12 18 0 18 7517 02 Apr 2010
19 Любимов Д. (Lidis) 0 0 17 17 7668 31 Mar 2010
20 Чеботарев (EvgeneyV) 5 42 10 5 15 1565 31 Mar 2010
21 >Barvinsky R. (barik) 10 15 15 0 15 7047 02 Apr 2010
22 >Черемисин А.В. (til) 9 9 15 0 15 7766 02 Apr 2010
23 Alex A.A. (0077alex) 0 0 15 15 7806 30 Mar 2010
24 Алексейчик К. (Ichikara) 0 0 15 15 7807 30 Mar 2010

Изучаем SQL

Общие табличные выражения (CTE)

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

Чтобы выяснить назначение общих табличных выражений, давайте начнем с примера.

Найти максимальную сумму прихода/расхода среди всех 4-х таблиц базы данных "Вторсырье", а также тип операции, дату и пункт приема, когда и где она была зафиксирована.

Задачу можно решить, например, следующим способом.

SELECT inc as max_sum, type, date, point
FROM (
SELECT inc, 'inc' type, date, point FROM Income
UNION ALL
SELECT inc, 'inc' type, date, point FROM Income_o
UNION ALL
SELECT out, 'out' type, date, point FROM Outcome_o
UNION ALL
SELECT out, 'out' type, date, point FROM Outcome
) X
WHERE inc >= ALL(
SELECT inc FROM Income
UNION ALL
SELECT inc FROM Income_o
UNION ALL
SELECT out FROM Outcome_o
UNION ALL
SELECT out FROM Outcome
)

Здесь мы сначала объединяем всю имеющуюся информацию, а затем выбираем только те строки, у которых сумма не меньше, чем каждая из сумм той же выборки из 4-х таблиц.

Фактически, мы дважды написали код объединений четырех таблиц. Как избежать этого? Можно создать представление, а затем адресовать запрос уже к нему:

CREATE VIEW Inc_Out
AS
SELECT inc, 'inc' type, date, point FROM Income
UNION ALL
SELECT inc, 'inc' type, date, point FROM Income_o
UNION ALL
SELECT out, 'out' type, date, point FROM Outcome_o
UNION ALL
SELECT out, 'out' type,date, point FROM Outcome
GO
SELECT inc as max_sum, type, date, point
FROM  Inc_Out
WHERE inc >= ALL(
SELECT inc
FROM Inc_Out)

Так вот, CTE играет роль представления, которое создается в рамках одного запроса и, не сохраняется как объект схемы. Предыдущий вариант решения можно переписать с помощью CTE следующим образом:

WITH Inc_Out
AS (
SELECT inc, 'inc' type, date, point FROM Income
UNION ALL
SELECT inc, 'inc' type, date, point FROM Income_o
UNION ALL
SELECT out, 'out' type, date, point FROM Outcome_o
UNION ALL
SELECT out, 'out' type,date, point FROM Outcome
)
SELECT inc as max_sum, type, date, point
FROM  Inc_Out
WHERE inc >= ALL(
SELECT inc
FROM Inc_Out)

Как видите, все аналогично использованию представления за исключением обязательных скобок, ограничивающих запрос; формально, достаточно лишь заменить CREATE VIEW на WITH. Как и для представления, в скобках после имени CTE может быть указан список столбцов, если нам потребуется включить их не все из подлежащего запроса и/или переименовать. Например, (я добавил дополнительно определение минимальной суммы в предыдущий запрос),

WITH Inc_Out(m_sum, type, date, point)
AS (
SELECT inc, 'inc' type, date, point FROM Income
UNION ALL
SELECT inc, 'inc' type, date, point FROM Income_o
UNION ALL
SELECT out, out' type, date, point FROM Outcome_o
UNION ALL
SELECT out, 'out' type,date, point FROM Outcome
)
SELECT 'max' min_max,* FROM  Inc_Out
WHERE m_sum >= ALL(
SELECT m_sum FROM Inc_Out)
UNION ALL
SELECT 'min', * FROM  Inc_Out
WHERE m_sum <= ALL(
SELECT m_sum FROM Inc_Out)

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

Окончание следует...

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

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

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

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

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

Контакты

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

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

В избранное