Опубликован: 25.11.2008 | Уровень: для всех | Доступ: платный
Лекция 5:

Язык SQL. Формирование запросов к базе данных

Приведем несколько примеров использования оператора SELECT.

  • Вывести список всех групп (без повторений), где должны пройти экзамены.
    SELECT DISTINCT Группы FROM R3

    Результат:

    Группа
    4906
    4807
  • Вывести список студентов, которые сдали экзамен по дисциплине "Базы данных" на "отлично".
    SELECT ФИО
    FROM R1
    WHERE Дисциплина = "Базы данных" AND Оценка = 5

    Результат:

    ФИО
    Петров Ф. И.
    Крылова Т. С.
    Владимирова В. А.
  • Вывести список всех студентов, которым надо сдавать экзамены с указанием названий дисциплин, по которым должны проводиться эти экзамены.
    SELECT ФИО,Дисциплина
    FROM R2,R3
    WHERE R2.Группа = R3.Группа;

    Здесь часть WHERE задает условия соединения отношений R2 и R3, при отсутствии условий соединения в части WHERE результат будет эквивалентен расширенному декартову произведению, и в этом случае каждому студенту были бы приписаны все дисциплины из отношения R3, а не те, которые должна сдавать его группа.

    Результат:

    ФИО Дисциплина
    Петров Ф. И. Базы данных
    Сидоров К. А. Базы данных
    Миронов А. В. Базы данных
    Степанова К. Е. Базы данных
    Крылова Т. С. Базы данных
    Владимиров В. А. Базы данных
    Петров Ф. И. Теория информации
    Сидоров К. А. Теория информации
    Миронов А. В. Теория информации
    Степанова К. Е. Теория информации
    Крылова Т. С. Теория информации
    Владимиров В. А. Теория информации
    Петров Ф. И. Английский язык
    Сидоров К. А. Английский язык
    Миронов А. В. Английский язык
    Степанова К. Е. Английский язык
    Крылова Т. С. Английский язык
    Владимиров В. А. Английский язык
    Трофимов П. А. Сети и телекоммуникации
    Иванова Е. А. Сети и телекоммуникации
    Уткина Н. В. Сети и телекоммуникации
    Трофимов П. А. Английский язык
    Иванова Е. А. Английский язык
    Уткина Н. В. Английский язык
  • Вывести список лентяев, имеющих несколько двоек.
    SELECT DISTINCT R1.ФИО
    FROM R1 a, R1 b
    WHERE a.ФИО = b.ФИО AND
    a.Дисциплина <> b.Дисциплина AND
    a.Оценка <= 2 AND b.Оценка <= 2;

    Здесь мы использовали псевдонимы для именования отношения R1 a и b, так как для записи условий поиска нам необходимо работать сразу с двумя экземплярами данного отношения.

    Результат:

    ФИО
    Степанова К. Е.

Из этих примеров хорошо видно, что логика работы оператора выбора (декартово произведение—селекция—проекция) не совпадает с порядком описания в нем данных (сначала список полей для проекции, потом список таблиц для декартова произведения, потом условие соединения). Дело в том, что SQL изначально разрабатывался для применения конечными пользователями, и его стремились сделать возможно ближе к языку естественному, а не к языку алгоритмическому. По этой причине SQL на первых порах вызывает путаницу и раздражение у начинающих его изучать профессиональных программистов, которые привыкли разговаривать с машиной именно на алгоритмических языках.

Наличие неопределенных ( Null ) значений повышает гибкость обработки информации, хранящейся в БД. В наших примерах мы можем предположить ситуацию, когда студент пришел на экзамен, но не сдавал его по некоторой причине, в этом случае оценка по некоторой дисциплине для данного студента имеет неопределенное значение. В данной ситуации можно поставить вопрос: "Найти студентов, пришедших на экзамен, но не сдававших его с указанием названия дисциплины". Оператор SELECT будет выглядеть следующим образом:

SELECT ФИО, Дисциплина
FROM R1
WHERE Оценка IS NULL

Результат:

ФИО Дисциплина
Миронов А. В. Теория информации
Александр Егай
Александр Егай
Александра Каева
Александра Каева