loading..
Русский    English
02:51
листать

Упражнение 5

Найдите номер модели, скорость и размер жесткого диска ПК, имеющих 12х или 24х CD и цену менее 600 долларов.

При решении этой задачи обычно совершают две типичные ошибки.

Первая ошибка связана с интуитивным предположением, что скорость CD-устройства является целочисленным значением. В результате запрос

Консоль
Выполнить
  1. SELECT PC.model, PC.speed, PC.hd
  2. FROM PC
  3. WHERE PC.cd IN (12, 24) AND
  4. price < 600;

выдаст ошибку приведения несовместимых типов данных:

Conversion failed when converting the varchar value '12x' to data type int.

(«Ошибка при преобразовании значения '12x' типа varchar к типу данных int»)

Внимательное чтение схемы данных скажет, что столбец cd имеет тип varchar. Поэтому, чтобы получить правильное решение достаточно переписать запрос в виде:

Консоль
Выполнить
  1. SELECT PC.model, PC.speed, PC.hd
  2. FROM PC
  3. WHERE PC.cd IN ('12x', '24x') AND
  4. price < 600;

Вторая ошибка логическая и заключается в неправомерном использовании предиката BETWEEN. Вот это решение:

Консоль
Выполнить
  1. SELECT model, speed, hd
  2. FROM PC
  3. WHERE price < 600 AND
  4. cd BETWEEN '12x' AND '24x';

Даже если предположить, что между моделями 12х и 24х-скоростных CD-приводов нет других моделей (скажем, 20х), решение не будет верным в силу правила сравнения строковых значений. Это правило гласит, что строки сравниваются посимвольно до первого отличающегося символа. Далее вывод о сравнении строк целиком делается на основании результата сравнения отличающихся символов. Например, справедливо 'abcz' < 'abd', так как первый отличающийся символ в первой строке ('c') меньше соответствующего символа второй строки ('d'). Если одна строка является префиксом второй (например, 'упражнения' и 'упражнениями'), то истинным будет сравнение 'упражнения' < 'упражнениями'.

Здесь уместно заметить, что сравнение (и соответственно порядок сортировки) зависит от параметра COLLATION [3]. Повсюду, если не оговорено противное, мы будем предполагать, что все текстовые поля имеют одинаковую установку этого параметра, обеспечивающего сравнение, независящее от регистра.

Предикат BETWEEN эквивалентен одновременному выполнению двух простых операторов сравнения:

cd >= ‘12x' AND cd <= '24x'

Исходя из вышесказанного, этому предикату будут удовлетворять, помимо требуемых задачей, например, следующие значения:

‘130x’, 145’, ‘150000000000y’ и т. д.

Еще одним вариантом решения этой несложной задачи будет использование двух предикатов простого сравнения:

Консоль
Выполнить
  1. SELECT PC.model, PC.speed, PC.hd
  2. FROM PC
  3. WHERE (PC.cd = '12x' OR
  4. PC.cd = '24x') AND
  5. price < 600;

Если вы не нашли здесь объяснения своей ошибки, загляните сюда.

Решить задачу на SQL-EX.RU

Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.