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

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


Новости сайта "Упражнения по SQL"

Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 186 (19 апреля 2008 г.)

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

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

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

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

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


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

§ Подлатал проверку задачи 10 SELECT (сообщение от IvanN).
Добавил проверочные данные для задачи 11 SELECT (yuriy.rozhok).
Fiolent подготовил обновление проверочных данных для задачи 95, которое учитывает вариант, опубликованный на форуме задачи Мурад'ом.

§ Исправил ошибку, связанную с оценкой эффективности решений, на которую обратил внимание $erges. По причине ошибки неверные решения не исключались из рейтинга.

§ PandNsk завершил второй этап (задач 138, время 2.565), показав лучшее время на 138 задаче (естественно, не учитывая время автора).

§ Смена лидера. $erges решил все задачи, улучшив рекорд почти вдвое (задач 146, время 3.359).
Другие изменения среди лидеров (решенные за неделю задачи третьего этапа):
24. iglbeat (139, 142)

§ Новые лица в ТОР 100 и вернувшиеся туда:
94. Cergej L (126, 44.950)

§ Продвинулись в рейтинге:
35. yuriy.rozhok (137, 22.487)
57. AKudrakov (134, 25.192)
67. Ocean (133, 46.354)
87. Eka (127, 10.410)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
101. 007 (125, 34.586)
117. Plastilin (123, 379.936)
122. shock (121, 9.000)
127. Demonius (120, 98.920)
130. DeadLock5 (120, 86.035)
135. Eugeniе (119, 70.328)
136. TomGolab (119, 30.719)
167. Sergey79 (111, 178.692)
171. LexusSaD (110, 1.928)

§ На этой неделе сертифицированы:
Cергей L (B08022576) [AR] - г. Москва, Россия
AKudrakov (A08026814 [BK], B08026814 [AR]) - г.Екатеринбург, Россия

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

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

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

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

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

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

NoPersonNumber of
Sel_ex
Last_SelNumber of
DML_ex
ScoresDaysDays_2Days_3S_3LastSolvedLastVisit
1Сальников С.А. ($erges)14614621357502.7543.3592816 Apr 2008 18 Apr 2008
2Печатнов В.В. (pvv)1461462135712719.1656.3262823 Feb 2008 18 Apr 2008
3Креславский О.М. (Arcan)1461462135738922.43612.5532823 Feb 2008 18 Apr 2008
4Карасёва Н.В. (vlksm)1461462135766764.76438.2882803 Mar 2008 15 Apr 2008
5Любченко В.А. (IAS56)14614621357552403.414373.6172809 Mar 2008 17 Apr 2008
6Держальцев В.А. (MadVet)14514521354106457.44125.1292515 Mar 2008 16 Apr 2008
7Голубин Р.С. (Roman S. Golubin)1451452135491992.54158.8222523 Feb 2008 17 Apr 2008
8Мурашкин И.В. (lepton)1441462135073437.12926.8152126 Mar 2008 27 Mar 2008
9Белогурова К. (Katy_Ekb)1431432134728710.7334.6731807 Mar 2008 19 Mar 2008
10Войнов П.Е. (pаparome)143146213469163.013.2131726 Feb 2008 18 Apr 2008
11Северюхин Ю.А. (Venser)140142213393354.930.6551401 Feb 2008 04 Feb 2008
12Тарасов Д.Б. (Gavrila)1411422134091423.3902.5011426 Feb 2008 18 Apr 2008
13Солдатенков Ю.С. (SolYUtor)1391422133849017.8522.6951420 Sep 2007 16 Apr 2008
14Кувалкин К.С. (Cyrilus)14114221340120713.0422.7821415 Mar 2008 18 Apr 2008
15Шептунов П.П. (Dzen)139142213382798.1303.4991402 Oct 2007 15 Nov 2007
16Селезнёв А.С. (Артём С.)1421422134312715.5974.2791414 Mar 2008 31 Mar 2008
17Мальцев А.В. (Палкин)1391422133842248.7887.6901413 Oct 2007 20 Jan 2008
18Васьков Е.В. (Johan)1411422134061114.32312.7671421 Mar 2008 22 Mar 2008
19Бураков С.Г. (burakov58)1391422133897451.70119.8141430 Sep 2007 09 Nov 2007
20Валуев Д.И. (Fiolent)142142213431638188.425131.5451428 Feb 2008 18 Apr 2008

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

Nosurnamen_selsel_allsel_scoresdml_scoresscoresratinglast_visit
1Кузнецов С.М. (Tenorio)494994094182317 Apr 2008
2Кресов А.А. (Never)306757349156716 Apr 2008
3>Таранов А.В. (agrusha)395183083176118 Apr 2008
4>Кисляков С. (GreenTea)454582082222818 Apr 2008
5>Кравец А.В. (Alexey1515)2939641175153118 Apr 2008
6>Князев Н.С. (работник)253859968223018 Apr 2008
7>Авдеев А.И. (Авдеев)2435521466226618 Apr 2008
8>Лихунов А.А. (Likhunoff)304166066236418 Apr 2008
9Anikin N. (Nick Anikin)343463063314617 Apr 2008
10Панарин А.А. (BiZ)227145176245918 Apr 2008
11Мазовецкий Е. (otzy)156728346255415 Apr 2008
12>Sahankov A.V. (Andrew aka Dreamer)333361061329018 Apr 2008
13Попов В.В. (babay)107725345939418 Apr 2008
14Барсуков Д.С. (Araks)233955358216418 Apr 2008
15>Лахижа Р.Н. (Roman_La)313158058348318 Apr 2008
16Пасько О.П. (Oleg66)242458058349515 Apr 2008
17Билык А. (ABilyk)303053356366917 Apr 2008
18>Хилькевич И.В. (Vinyl)1929421052310418 Apr 2008
19Лекомцев (PavlikMorozov)272749049431713 Apr 2008
20>Тедиков О.В. (SashOK:))213248048336818 Apr 2008
21Медведев Д.М. (artmaniac)2121311546467517 Apr 2008
22>Астафьев А.С. (GrGr)232336945483218 Apr 2008
23>Кучеров А.В. (alex09)2121341145484118 Apr 2008
24Епифанов А.А. (andrey_nick)172841344368418 Apr 2008
25Тюлькин М.В. (Dekart)204743043177913 Apr 2008
26Лалала (nastenaV)173042042367917 Apr 2008
27>Сахаров Д. (ti-rex)133333841265918 Apr 2008
28>Супрун В.В. (vamp_v)155329114092518 Apr 2008
29>Самохин (Alexander S.)142831940377318 Apr 2008

Изучаем SQL

Типы данных SQL 2008

Don Schlichting (оригинал: SQL 2008 Data Types )
Перевод Моисеенко С.И.

Введение

Эта статья посвящается новым типам данных даты и времени, которые появились в Microsoft SQL Server 2008, а именно, DATETIME2, TIME и DATE. Также рассматриваются традиционные типы данных, заимствованные из предыдущих версий. Кроме того, тестируются команды манипуляции типами данных CAST и CONVERT.

CAST и CONVERT

Сначала рассмотрим CAST и CONVERT, поскольку эти функции TSQL позволят нам более четко увидеть различия между типами данных. CAST и CONVERT используются для изменения типа данных значений или стиля. Эти две функции подобны по смыслу, но CONVERT обладает дополнительной способностью менять стиль. Стиль может использоваться для изменения числа 4431.334 к общепринятому денежному стилю 4, 431.33 (запятая отделяет каждые три цифры и две цифры после десятичного разделителя) или изменения четырехзначного представления года 2007 к двузначному - 07.

CAST имеет следующий синтаксис: CAST(значение AS новый_тип_данных). Ниже мы объявим переменную типа DATETIME, а затем изменим ее тип на строковый:

DECLARE @myTime AS DATETIME;
SET @myTime = '1/1/2007';
SELECT @myTime;

 

Результат:  2007-01-01 00:00:00.000

SELECT CAST(@myTime as varchar(50));

 

Результат:  Jan  1 2007 12:00AM

Мы можем также пойти обратным путем и преобразовать строку к дате:

SELECT CAST('Jan  1 2007 12:00AM' as DATETIME)

 

Результат:  2007-01-01 00:00:00.000

CONVERT имеет следующий синтаксис: CONVERT(новый_тип, значение, стиль). Стиль является необязательным параметром. Предыдущий пример для CAST при использовании CONVERT может быть переписан следующим образом:

SELECT CONVERT(DATETIME, 'Jan  1 2007 12:00AM')

 

Результат: 2007-01-01 00:00:00.000

Параметр Стиль очень полезен для форматирования вывода. Чтобы представить дату в общепринятом стиле mm/dd/yy, просто добавьте значение Стиль в функцию CONVERT:

DECLARE @myDate AS DATETIME;
SET @myDate = '1/1/2007';

SELECT CONVERT(varchar(50), @myDate, 1)

 

Результат: 01/01/07

Чтобы записать месяц тремя буквами, просто замените значение параметра Стиль 1 на 7:

SELECT CONVERT(varchar(50), @myDate, 7)

 

Результат: Jan 01, 07

Полный список стилей можно найти в Books On Line в разделе CAST and CONVERT (Transact-SQL).

DATETIME

Стандартный тип данных DATETIME был сохранен в SQL Server 2008. Этот единичный тип, который содержит вместе составляющие даты и времени. DATETIME имеет размер восемь байтов, где первые четыре байта держат дату, а последние четыре - время. Компонента даты фактически представляет собой число дней, отсчитываемых от внутренней системной "базовой даты" 1 января 1990. Это можно увидеть, если передать пустую строку в значение типа datetime и посмотреть результат. Ниже в только что созданную таблицу Types в столбец с именем standardDateTime и типом DATETIME вставляется пустая строка. Затем это значение выводится:

INSERT INTO Types (standardDateTime) VALUES  ('');
SELECT standardDateTime FROM Types;

 

Результат:  1900-01-01 00:00:00.000

Столбец типа DATETIME может содержать значение года в интервале между 1753 и 9999. Составляющая времени имеет точность 3.33 миллисекунды. Если вам не нужны секунды и диапазон дат ограничен интервалом 1900 - 2079, то существует тип SMALLDATETIME. Размер этого типа вполовину меньше, чем DATETIME, и секунды округляются к ближайшей минуте, как показано ниже:

DECLARE @myDate DATETIME;
SET @myDate = '2007-10-13 12:35:29.998';
SELECT @myDate;

 

Результат:  2007-10-13 12:35:29.997

SELECT CAST(@myDate AS SMALLDATETIME);

 

Результат:  2007-10-13 12:35:00

Первый результат - обычный тип DATETIME. Второй использует функцию CAST для представления @myDate как SMALLDATETIME.

Распространенная проблема, связанная с DATETIME, относится к ошибкам, когда выбирается только дата. Например, если мы наполним тестовую таблицу следующими тремя значениями:

INSERT INTO Types
(standardDateTime)
VALUES
('2007-10-12 12:35:29.998'),
('2007-10-11'),
(GETDATE())

 

Напишем оператор select, ищущий двенадцатое число;

SELECT standardDateTime
FROM Types
WHERE standardDateTime = '2007-10-12';

 

Не будет возвращено ни одной строки, поскольку в значениях присутствует время. Тот же результат будет получен при вставке данных при помощи функции GETDATE(). Нам нужно учитывать время наряду с датой. Если при вставке не включать время, например, '2007-10-11', то select будет работать:

SELECT *
FROM Types
WHERE standardDateTime = '2007-10-11'

 

Результат:  2007-10-11 00:00:00.000

Кстати, обратите внимание на использованный выше оператор INSERT. SQL 2008 теперь позволяет вставлять несколько строк при помощи одного оператора.

DATETIME2

В SQL 2008 появился новый тип данных DATETIME2. Этот новый тип подобен стандартному типу DATETIME, однако допускает более высокую точность. Диапазон годов простирается от 1 января 1 года нашей эры до 12/31/9999. Время может содержать семь десятичных знаков доли секунды. Кроме того, время имеет 24-часовой цикл. Так, 8 после полудня может сохраняться как военное время 20:00. Синтаксис объявления нового типа данных либо просто DATETIME2, либо DATETIME2(n). Здесь (n) - значение между 0 и 7 определяет дробную часть секунды, как показано ниже:

SELECT CAST('2007-10-20 20:30:05.1234567' as DATETIME2)

 

Результат:  2007-10-20 20:30:05.1234567

SELECT CAST('2007-10-20 20:30:05.1234567' as DATETIME2(4))

 

Результат:  2007-10-20 20:30:05.1235

Дата и время по отдельности

Теперь в SQL 2008 даты и время могут сохраняться порознь, а не вместе. Для этого имеются типы данных DATE и TIME. Тип TIME может задавать дробную часть секунды подобно типу DATETIME2. Например:

SELECT CAST('2007-10-20 20:30:05.1234567' as DATE)

 

Результат:  2007-10-20

SELECT CAST('2007-10-20 20:30:05.1234567' as TIME)

 

Результат: 20:30:05.1234567

DATETIMEOFFSET

Значения, которые должны учитывать часовой пояс, могут теперь быть обработаны естественным образом в 2008 SQL с помощью нового типа данных DATETIMEOFFEST. Этот новый тип комбинирует DATETIME2 с составляющей сдвига, как показано ниже:

SELECT CAST('2007-10-20 20:30:05.1234567 +5:0' as DATETIMEOFFSET)

 

Результат:  2007-10-20 20:30:05.1234567 +05:00

Подобно типу DATETIME2, DATETIMEOFFSET имеет необязательный параметр (n), который может задавать дробную часть секунды:

SELECT CAST('2007-10-20 20:30:05.1234567 +5:0' as DATETIMEOFFSET(3))

 

2007-10-20 20:30:05.123 +05:00

Заключение

SQL 2008 содержит некоторые новые и весьма полезные типы данных даты и времени. Ниже они демонстрируются на примерах:

CAST('2007-10-20 20:30:05.1234567 +5:0' as DATE) = 2007-10-20
CAST('2007-10-20 20:30:05.1234567 +5:0' as TIME(7)) = 20:30:05.1234567
CAST('2007-10-20 20:30:05.123' as SMALLDATETIME) = 2007-10-20 20:30:00
CAST('2007-10-20 20:30:05.123' as DATETIME) = 2007-10-20 20:30:05.123
CAST('2007-10-20 20:30:05.1234567 +5:0' as DATETIME2(7)) = 2007-10-20 20:30:05.1234567
CAST('2007-10-20 20:30:05.1234567 +5:0' as DATETIMEOFFSET(7)) = 2007-10-20 20:30:05.1234567 +05:00

 

01-11-2007

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

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

§ Желающих поспособствовать популяризации сайта прошу проголосовать/поставить закладку в социальных сетях:
del.icio.us
dzone.com
Digg.com
stumbleupon.com

Контакты

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

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

В избранное