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

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


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

Выпуск 458 от 06 июля 2013 г.

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

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

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

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

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


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

§ Изменил формулировку задачи 6 (SELECT, обуч. этап) на предложенную $erges.
Автор отредактировал формулировку задачи 196 в ответ на замечания Baser и _dimon_.

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

Топик		Сообщений
301 (SELECT)	21
303 (SELECT)	21
135 (SELECT)	5
6 (Learn)	4
182 (SELECT)	4

 

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

Автор		Число сообщений
$erges  		13
qwrqwr  		12
anddros  		7
smog  			3
Дмитрий Гринкевич  	3

 

§ Объявленные конкурсы по оптимизации запросов

Задача	Дата		Автор
159	2012-07-25	anddros
170	2011-07-15	qwrqwr
182	2012-02-16	Baser
192	2012-03-03	Baser
259	2012-07-23	anddros

 

Дополнительные неоптимизационные конкурсы

Задача	Дата		Автор/Организатор конкурса
71	2010-12-26	anddros (завершен).
88	2012-07-12	crescent/Pegoopik
91	2012-05-31	smog/$erges
121	2012-07-06	ZrenBy/anddros
153	2010-09-21	Ozzy

 

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
6. Angellore (155)
7. _dimon_ (160, 196)
18. smog (182)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
120. al29 (128, 97.438)
225. Витёк39 (100, 68.059)
246. YuriPetrov (93, 15.586)
261. Merdoc (91, 5.781)
278. crafty_figure (107, 22.597)

§ На этой неделе сертифицированы:
Timur13 (A13051163) [BK] - г. Уфа, Россия

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

Число упражнений:
   на обучающем этапе - 108;
   на рейтинговых этапах - 196;
   DML - 24
   головоломки - 9 (отрицательные номера) + 9 (3 этап).

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1Курочкин П.А. (qwrqwr)1216303245131326218.586146.8981582013-06-282013-07-05
2Креславский О.М. (Arcan)1216303245132341214.966160.7051582013-06-302013-07-05
3Карасёва Н.В. (vlksm)1215197245132584212.472167.6091582013-06-102013-07-05
4Бежаев А.Ю. (Baser)12099245021155151.160132.6511542013-06-302013-07-05
5Сальников С.А. ($erges)121313524506195214.82211.9891512013-07-012013-07-05
6Boiko D. (Angellore)62111552449721512890.1901428.2711422013-07-012013-07-02
7Филиппкин Д.В. (_dimon_)7209160244911626159.97696.1621362013-07-042013-07-05
8Яцук А.А. (Faust_zp)1200255244811985144.272108.8401352012-07-122012-07-30
9Кузнецов В.С. (herrRo)1185104234421170481.38873.3351222012-02-082013-06-18
10Дубинский А.В. (_yizraor)1185122244381088718.8041122.9071022012-11-052012-11-25
11Дроздков А.Н. (anddros)519330324446186012.28310.8981002013-07-022013-07-05
12Шиндин А.В. (AlShin)116125223396928408.897777.457992011-05-052011-05-21
13Тарасов Д.Б. (Gavrila)917832234182428151.46299.710952012-04-232012-05-25
14Орлов М.В. (Eagleoff)9165-323396952138.545106.466922011-11-102013-07-05
15Зотов П.Г. (Ozzy)116313233891412213.968187.364812012-02-052013-07-01
16Держальцев В.А. (MadVet)3151100223682073143.64299.698812010-12-292011-09-26
17Агапов В. (KERBEROS)117525324408240935.65327.703692013-04-022013-04-05
18>Кукушкин С.А. (smog)1818018224399817238.941418.932652013-07-052013-07-05
19Гринкевич Д.Л. (Дмитрий Гринкевич)1817830324393631116.084247.980642013-07-032013-07-05
20Калинин К.А. (kalinin_k)161681692338439927.21536.659602012-06-302013-07-05

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1>Movlyanov A.P. (Oct)314446046138005 Jul 2013
2Сератила Д.П. (dmseratila)41673744149205 Jul 2013
3ifritov (ifrit_)25614204259704 Jul 2013
4Petrov Y. (YuriPetrov)0930414124603 Jul 2013
5Хурдуев С. (yohus)1113132264104 Jul 2013
6Лихачев А.Е. (crast)14512502567704 Jul 2013
7Ivanov (parserSQL)0
02222331730 Jun 2013
8>Setrin S.A. (LuckyHawk)12382102187205 Jul 2013
9Козлов А. (-avk-)0
02121338504 Jul 2013
10Jersovas V. (Vitality77)0
01919360205 Jul 2013
11Trofimov (sun_bird)0
01717379305 Jul 2013
12>Wasilevsky V.G. (Vtin)2641115329305 Jul 2013
13Карпенко С.И. (Mr. Sem)0
01515394501 Jul 2013
14Odilzoda M. (Bazooka)0
01515394604 Jul 2013
15ToXa (toxa742)0101414370804 Jul 2013
16Stepanisheva M.V. (Slativ)5431101179905 Jul 2013
17vova (overlord_pepe)0
01111446930 Jun 2013
18Титов С.С. (Serg84)82610010259605 Jul 2013

Изучаем SQL

Сортировка и NULL-значения

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

Если столбец, по которому выполняется сортировка, допускает NULL-значения, то при использовании SQL Server следует иметь в виду, что при сортировке по возрастанию NULL-значения будут идти в начале списка, а при сортировке по убыванию - в конце.

Поскольку в доступных в учебнике базах NULL-значения отсутствуют в представленных данных (поскольку они согласованы с данными в открытых базах, используемых на сайте sql-ex.ru), я создал таблицу копию таблицы PC с именем PC_, в которую добавил строку, содержащую NULL в столбце price:

    INSERT INTO PC_ VALUES(13,2112,600,64,8,'24x',NULL);

Следует отметить, что это не противоречит схеме данных.

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

    SELECT * FROM PC_ ORDER BY price;
    SELECT * FROM PC_ ORDER BY price DESC;

Почему это важно? Дело в том, что при поиске экстремальных значений часто используют метод, основанный на сортировке. Рассмотрим, например, такую задачу.

Найти модели ПК, имеющих минимальную цену.

Иногда эту задачу решают следующим образом:

    SELECT top 1 WITH ties model FROM PC_ ORDER BY price;

Конструкция WITH TIES используется для того, чтобы вывести все модели с наименьшей ценой, если их окажется несколько. Однако в результате мы получим модель 2112, цена которой неизвестна, в то время как должны получить модели 1232 и 1260, имеющих действительно минимальные цены. Мы их и получим, если исключим из рассмотрения модели с неизвестными ценами:

    SELECT top 1 WITH ties model FROM PC_ WHERE price IS NOT NULL ORDER BY price;

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

    SELECT DISTINCT top 1 WITH ties model FROM PC_ WHERE price IS NOT NULL ORDER BY price

(ORDER BY items must appear in the select list if SELECT DISTINCT is specified.)

Чтобы получить решение в требуемом виде, мы можем добавить price в список выводимых столбцов, а потом использовать полученный запрос в качестве подзапроса. Итак,

    SELECT model FROM (
    SELECT DISTINCT top 1 WITH ties model, price FROM PC_ WHERE price IS NOT NULL ORDER BY price
    ) X;

Примечание.
При использовании агрегатных функций проблемы с NULL-значениями не возникает, т.к. они автоматически исключаются из рассмотрения. Хотя при этом тоже придется использовать подзапрос:

    SELECT DISTINCT model FROM PC_
    WHERE price = (SELECT MIN(price) FROM PC_);

Заметим также, что это стандартное решение будет работать под любыми СУБД, т.к. не использует специфических особенностей диалекта.

А как, кстати, обстоят дела с использованием метода на основе сортировки в других СУБД?

Читать далее...

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

§ В настоящее время для решения упражнений на сайте используются следующие СУБД: SQL Server 2012 Express, Oracle 11g Express Edition, MySQL 5, PostgreSQL 9.

§ Группа SQL Exercises на LinkedIn.com. Присоединяйтесь!

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

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

§ Книги и статьи по SQL.

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

Контакты

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

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

В избранное