Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab4.doc
Скачиваний:
2
Добавлен:
19.08.2019
Размер:
200.7 Кб
Скачать

2. Преобразование типов данных

В реализациях языка SQL может быть выполнено неявное преобразование типов. Так, например, в T-SQL при сравнении или комбинировании значений типов smallint и int, данные типа smallint неявно преобразуются к типу int.

Пример. Вывести среднюю цену ПК-блокнотов с предваряющим текстом "средняя цена = ".

Попытка выполнить запрос

SELECT 'Средняя цена= ' + AVG(price) FROM laptop;

приведет к сообщению об ошибке

Implicit conversion from data type varchar to money is not allowed. Use the CONVERT function to run this query.

Это сообщение означает, что система не может выполнить неявное преобразование типа varchar к типу money. В подобных ситуациях может помочь явное преобразование типов. При этом, как указано в сообщении об ошибке, можно воспользоваться функцией CONVERT. Однако эта функция не стандартизована, поэтому в целях переносимости рекомендуется использовать стандартное выражение CAST.

Если переписать запрос в виде

SELECT 'Средняя цена= ' + CAST(AVG(price) AS CHAR(15)) FROM laptop;

то в результате получим то , что требовалось: Средняя цена = 1410.44

Здесь использовалось выражение явного преобразования типов CAST для приведения среднего значения цены к строковому представлению. Синтаксис выражения CAST очень простой:

CAST(<выражение> AS <тип данных>)

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

Функция CONVERT имеет следующий синтаксис:

CONVERT (<тип данных>[(<длина>)], <выражение> [, <стиль>])

Основное отличие функции CONVERT от функции CAST состоит в том, что первая позволяет форматировать данные (например, datetime) при преобразовании их к символьному типу и указывать формат при обратном преобразовании. Разные целочисленные значения необязательного аргумента <стиль> соответствуют определенным форматам.

Рассмотрим следующий пример:

SELECT CONVERT(char(25),CONVERT(datetime,'20030722'));

Здесь сначала строковое представление даты приводится к типу datetime, после чего выполняем обратное преобразование, чтобы продемонстрировать результат форматирования. Поскольку значение аргумента <стиль> не задано, используется значение по умолчанию (0 или 100). В результате получим

Jul 22 2003 12:00AM

Ниже приведены некоторые другие значения аргумента <стиль> и результат, полученный на приведенном выше примере. Заметим, что значения <стиль> большие 100 приводят к четырехзначному отображению года.

Стиль

Формат

1

07/22/03

11

03/07/22

3

22/07/03

121

2003-07-22 00:00:00.000

Перечень всех возможных значений аргумента <стиль> можно посмотреть в msdn.

3. Оператор case

Требуется вывести список всех моделей ПК с указанием их цены. При этом если модель отсутствует в продаже (нет в таблице РС), то вместо цены вывести текст: "Нет в наличии".

Список всех моделей ПК с ценами можно получить с помощью запроса:

SELECT DISTINCT product.model, price

FROM product LEFT JOIN pc c ON product.model=c.model

WHERE product.type='pc';

В результате запроса получим список, где отсутствующая цена будет заменена NULL-значением:

model price

1121 850

1232 350

1232 400

1232 600

1233 600

1233 950

1233 980

1260 350

2111 NULL

2112 NULL

Чтобы заменить NULL-значения нужным текстом, можно воспользоваться оператором CASE:

SELECT DISTINCT product.model,

CASE WHEN price IS NULL THEN 'Нет в наличии'

ELSE CAST(price AS CHAR(20)) END price

FROM product LEFT JOIN pc c ON product.model=c.model

WHERE product.type='pc'

Оператор CASE в зависимости от указанных условий возвращает одно из множества возможных значений. В нашем примере условием является проверка на NULL. Если это условие выполняется, то возвращается текст "Нет в наличии", в противном случае (ELSE) возвращается значение цены. Здесь есть один принципиальный момент. Поскольку результатом оператора SELECT всегда является таблица, то все значения любого столбца должны иметь один и тот же тип данных (с учетом неявного приведения типов). Поэтому мы не можем наряду с ценой (числовой тип) выводить символьную константу. Вот почему к полю price применяется преобразование типов, чтобы привести его значения к символьному представлению. В результате получим

model price

1121 850

1232 350

1232 400

1232 600

1233 600

1233 950

1233 980

1260 350

2111 Нет в наличии

2112 Нет в наличии

Оператор CASE может быть использован в одной из двух синтаксических форм записи:

1-я форма

CASE <проверяемое выражение>

WHEN <сравниваемое выражение 1> THEN <возвращаемое значение 1>

WHEN <сравниваемое выражение N> THEN <возвращаемое значение N>

[ELSE <возвращаемое значение>]

END

2-я форма

CASE

WHEN <предикат 1> THEN <возвращаемое значение 1>

WHEN <предикат N> THEN <возвращаемое значение N>

[ELSE <возвращаемое значение>]

END

Все предложения WHEN должны иметь одинаковую синтаксическую форму, т.е. нельзя смешивать первую и вторую формы. При использовании первой синтаксической формы условие WHEN удовлетворяется, как только значение проверяемого выражения станет равным значению выражения, указанного в предложении WHEN. При использовании второй синтаксической формы условие WHEN удовлетворяется, как только предикат принимает значение TRUE. При удовлетворении условия оператор CASE возвращает значение, указанное в соответствующем предложении THEN. Если ни одно из условий WHEN не выполнилось, то будет использовано значение, указанное в предложении ELSE. При отсутствии ELSE, будет возвращено NULL-значение. Если удовлетворены несколько условий, то будет возвращено значение предложения THEN первого из них.

В приведенном выше примере была использована вторая форма оператора CASE.

Заметим, что для проверки на NULL стандарт предлагает более короткую форму оператора - COALESCE. Этот оператор имеет произвольное число параметров и возвращает значение первого, отличного от NULL. Для двух параметров оператор COALESCE(A, B) эквивалентен следующему оператору CASE:

CASE WHEN A IS NOT NULL THEN A ELSE B END

Решение рассмотренного выше примера при использовании оператора COALESCE можно переписать следующим образом:

SELECT DISTINCT product.model,

COALESCE(CAST(price as CHAR(20)), 'Нет в наличии') AS price

FROM product LEFT JOIN pc c ON product.model=c.model

WHERE product.type='pc';

Использование первой синтаксической формы оператора CASE можно продемонстрировать на следующем примере: Вывести все имеющиеся модели ПК с указанием цены. Отметить самые дорогие и самые дешевые модели.

SELECT DISTINCT model, price,

CASE price

WHEN (SELECT MAX(price) FROM pc) THEN 'Самый дорогой'

WHEN (SELECT MIN(price) FROM pc) THEN 'Самый дешевый'

ELSE 'Средняя цена' END comment

FROM pc ORDER BY price;

В результате выполнения запроса получим

model price comment

1232 350 Самый дешевый

1260 350 Самый дешевый

1232 400 Средняя цена

1233 400 Средняя цена

1233 600 Средняя цена

1121 850 Средняя цена

1233 950 Средняя цена

1233 980 Самый дорогой

Задание на лабораторную работу

  • Подготовить данные для заполнения таблиц, созданных при выполнении лабораторной работы №3. Объем подготовленных данных должен составлять не менее 10 записей.

  • Подготовить SQL-скрипты для внесения данных в базу данных.

  • Составить SQL-скрипты для выполнения выборок, согласно вариантам индивидуального задания.

  • Сформулировать 3-4 запроса на изменение и удаление из базы данных. Запросы должны быть сформулированы в терминах предметной области. Среди запросов обязательно должны быть такие, которые будут вызывать срабатывание ограничений целостности. Составить SQL-скрипты для выполнения этих запросов.

Варианты заданий.

Вариант №1

  1. Выбрать книгу, для которой наибольшее количество экземпляров находится "на полках" (не выданы читателям).

  2. Выбрать читателей, которые имеют задолженность более 4 месяцев.

  3. Определить книгу, которая была наиболее популярной весной 2000 года.

  4. Определить читателей, у которых на руках находятся книги на общую сумму более 100 грн.

Вариант №2

  1. Выбрать преподавателя, который был "без работы" весной 2001г.

  2. Определить возможные "накладки" аудиторий в расписании.

  3. Вывести расписание занятий группы 'АП-17а' на март 2001г.

  4. Определить для каждой группы долю дисциплин каждого цикла в процентах.

Вариант №3

  1. Выбрать поставщиков, которые поставляют самые дорогие товары.

  2. Определить поставщика, который поставляет товар 'яблоки' по самой низкой в среднем цене.

  3. Определить дату, когда была самая большая поставка товара.

  4. Вывести названия товаров, цены на которые никогда не повышались.

Вариант №4

  1. Определить изделие, в которое входит больше всего материалов типа 'цветной металл'.

  2. Вывести список изделий, которые не производились в 2000 г.

  3. Вывести среднемесячный расход материала 'бетон' в 2000 г.

  4. Вывести список изделий, для которых затраты на материалы в 2000 г. снизились по сравнению с предыдущим годом.

Вариант №5

  1. Определить самого молодого предпринимателя, владеющего собственностью в районе 'Киевский'.

  2. Определить случаи, когда регистрировалось владение лицами, не достигшими 18 лет.

  3. Вывести список профилей магазинов, которыми владеет предприниматель 'Старусев' в порядке убывания вложенного в них капитала.

  4. Определить случаи, когда больше 50% уставного капитала магазина внесено предпринимателем, проживающим в другом районе.

Вариант №6

  1. Выбрать фамилию того механика, который работал с довоенными автомобилями.

  2. Выбрать случаи, когда ремонт автомобилей марки 'Мерседес-600' задерживался относительно планового срока.

  3. Для каждой категории работ определить случаи когда на работу был назначен механик низшего разряда, чем требуется.

  4. Определить тех владельцев автомобилей, которых всегда обслуживает один и тот же механик. Вывести фамилии механика и его постоянного клиента.

Вариант №7

  1. Вывести список экзаменов и фамилии преподавателей для группы ИТП-01-1 в летнюю сессию.

  2. Для каждой группы определить дату первого экзамена.

  3. Определить преподавателя, который в сессию принимает экзамены (не зачеты) у наибольшего числа студентов.

  4. Определить, какой процент от общего объема дисциплин, изучаемых группой ' ИТП-01-2', составляют дисциплины каждой категории.

Вариант №8

  1. Определить те работы в 2000 г., по которым плановые сроки выполнения превышают заданную дату завершения.

  2. Определить общее количество работ, находившихся на выполнении у сотрудника 'Палько' весной 1999 г.

  3. Определить должностной состав сотрудников, выполняющих работу 'проект Гелиограф'.

  4. Определить те работы, которые к дате завершения были выполнены не более, чем на 50%.

Вариант №9

  1. Определить те случаи, когда заболевание 'язва желудка' лечилось врачом специализации невропатолог'.

  2. Вывести имена тех врачей, которые работают исключительно с пенсионерами.

  3. Определить процент смертности от заболевания 'пневмония'.

  4. Вывести пациентов, которые болеют двумя и более болезнями.

Вариант №10

  1. Выбрать пары сблокированных телефонов.

  2. Определить АТС, районы действия которых перекрываются.

  3. Выбрать список абонентов АТС '47', имеющих задолженность больше 100 грн.

  4. Определить АТС обслуживающую наибольшее количество абонентов.

Вариант №11

  1. Вывести таблицу распределения мест в соревновании 'открытый чемпионат' в городе 'Васюки' по 'шахматам' в 2000 г.

  2. Определить спортсменов, которые выступают более, чем в 3 видах спорта.

  3. Вывести список спортсменов поставившие мировые рекорды.

  4. Определить наилучший показатель спортсмена 'Караваев' в виде спорта 'прыжки в длину'

Вариант №12

  1. Вывести предприятия, являющиеся нерентабельными в текущем году.

  2. Определить объем дохода на одного работника в предприятии 'Серединное и неизменное'.

  3. Вывести список продуктов, для которых закупочная цена ниже себестоимости производителя.

  4. Определить, предприятия какого вида собственности является ведущим в поставке продукта 'пшеница'.

Вариант №13

  1. Определить оптимальный по времени маршрут между пунктами 'Холодная Гора' и 'парк им.Горького'.

  2. Определить среднее время ожидания на остановке троллейбуса №7.

  3. Вывести маршруты трамваев в порядке убывания их протяженности.

  4. Вывести список ежедневных денежных поступлений для всех видов транспорта.

Вариант №14

  1. Выбрать численность населения по всем странам.

  2. Определить столицу той страны, где проживает более всего представителей национальности 'китаец'.

  3. Выбрать список национальностей, проживающих в регионе 'Западная Европа'.

  4. Считая, что государственным является язык, на котором разговаривает не менее 20% населения страны, выбрать список государственных языков страны 'Швейцария'.

Вариант №15

  1. Определить сумму месячной оплаты для всех квартир дома №5.

  2. Определить задолженность по оплате 'теплоснабжения' квартиры №512 дома №5.

  3. Определить общее число жильцов дома №5.

  4. Выбрать список квартир, которые не имеют задолженностей на начало текущего года.

Вариант №16

  1. Определить среднее расчетное время полета для самолета 'ТУ-154' по маршруту 'Киев' - 'Львов'.

  2. Выбрать маршрут/маршруты, по которым чаще всего летают рейсы, заполненные менее, чем на 70%.

  3. Определить наличие свободных мест на рейс №870 21 декабря 2012г.

  4. Выбрать марку самолета, которая чаще всего летает по тому же маршруту.

Вариант №17

  1. Определить фирму, которая представляет самую новую модель на базе процессора 'Core i7'.

  2. Выбрать модель с наибольшей тактовой частотой, которая выпускается в Малайзии на сегодняшний день.

  3. Выбрать страны, в которых выпускаются ноутбуки на базе процессора 'Core i3'.

  4. Определить фирму, которая представляет на рынки товары на наибольшую сумму.

Вариант №18

  1. Выбрать количество студентов на каждом курсе

  2. Выбрать суммарную стипендию группы '109' факультета 'ФМПКТ'.

  3. Выбрать список групп факультета 'МФ' с указанием численности студентов в каждой группе.

  4. Выбрать список студентов, не достигших к моменту зачисления 18 лет.

Вариант №19

  1. Определить суточное потребление корма обитателями комплекса 'приматы'.

  2. Выбрать случаи размещения животного вида 'карликовый гиппопотам' в помещении без водоема.

  3. Определить общую численность представителей семейства 'псовые' в зоопарке.

  4. Вывести все пары видов, которые содержатся в одном помещении.

Вариант №20

  1. Выбрать турнир с самым высоким рейтингом участников.

  2. Выбрать те турниры, где 1 место заняли представители страны-хозяина турнира.

  3. Выбрать тех шахматистов, которые заняли не менее трех призовых мест в течение 2000 г.

  4. Определить турниры, в которых участник с самым высоким рейтингом занял не призовое место.

11

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]