Язык запросов SQL. Работа с несколькими таблицами:
С одной таблицей мы научились работать. Теперь пора научиться связывать несколько таблиц, как мы это уже делали на уроках программирования Delphi и базы данных. Помимо этого, нас ждёт несколько приёмов, украшающих вывод.
Ещё на первом занятии я нарисовал схему из трёх баз данных. Если ты забыл, то взгляни на рисунок 1, чтобы освежить ту схему в своей оперативной памяти.
Рис 1. Связь между таблицами.
До сегодняшнего дня, мы обращались только к одной таблице. Сейчас мы выведем сразу две, причём с учётом связи. Сначала я покажу пример, а потом мы рассмотрим всё построчно.
SELECT *
FROM Prog, User
WHERE Prog.Key1=User.Key2
Первая строка, как всегда говорит, что надо вывести все поля (SELECT *). Вторая строка говорит, из каких баз данных надо это сделать (FROM Prog, User). На этот раз у нас здесь указано сразу две базы. Третья строка показывает связь (Prog.Key1=User.Key2). Для того, чтобы указать к какой базе относиться ключ Key1, я записываю полное имя поля как ИмяБазы.ИмяПоля. Если имя поля уникально для обеих таблиц (как Key1, которое есть только в таблице User), то можно имя таблицы опускать. Например, запрос мог выглядеть так:
SELECT *
FROM Prog, User
WHERE Prog.Key1= Key2
А вот Key1 записать без имени таблицы нельзя, потому что такое имя поля есть в обеих таблицах. Поэтому необходимо явно указать, Key1 какой именно таблицы интересует нас.
Представим, что у нас есть две таблицы:
Prog.db
Key1 ProgName Cost
------------------------------------
1 Windows 95 100
2 Windows 98 120
User.db
Key1 Key2 LastName
---------------------------------
1 1 Иванов
2 1 Петров
3 2 Сидоров
Тогда результатом такого запроса может быть:
Prog.db User.db
Key1 ProgName Cost Key1 Key2 LastName
------------------------------------------------------
1 Windows 95 100 1 1 Иванов
1 Windows 95 100 2 1 Петров
2 Windows 98 120 3 2 Сидоров
Рассмотрим ещё пример:
SELECT *
FROM Prog, User
WHERE Prog.Key1= Key2
AND ProgName LIKE 'Windows 95'
Результатом этого запроса, при тех же таблицах будет:
Prog.db User.db
Key1 ProgName Cost Key1 Key2 LastName
----------------------------------------------------------------------------
1 Windows 95 100 1 1 Иванов
1 Windows 95 100 2 1 Петров
Как видишь, всё очень просто. Ты можешь использовать с такими запросами всё, что мы уже изучали и практически всё, что ещё изучим. Давай теперь приукрасим наши запросы. Например, представим, что цена указана в долларах :), а мы хотим перевости в рубли. Корректируем немного запрос:
SELECT Prog.Key1, Prog.ProgName, Prog.Cost*2,
Cost.Key1, Cost.Key2, Cost.LastName
FROM Prog, User
WHERE Prog.Key1= Key2
Под цифрой 2 внутри запроса (Prog.Cost*2) я подразумеваю курс доллара (размечтался я). Результат запроса будет:
Prog.db User.db
Key1 ProgName Cost Key1 Key2 LastName
----------------------------------------------------------------------------
1 Windows 95 200 1 1 Иванов
1 Windows 95 200 2 1 Петров
Давай ещё немного украсим:
SELECT Prog.Key1, Prog.ProgName, Prog.Cost*2 'руб',
Cost.Key1, Cost.Key2, Cost.LastName
FROM Prog, User
WHERE Prog.Key1= Key2
Prog.Cost*2 'руб' - эта запись говорит, что к каждому значению полю надо прибавить строку 'руб'. Результат этого запроса:
Prog.db User.db
Key1 ProgName Cost Key1 Key2 LastName
-------------------------------------------------------
1 Windows 95 200 руб 1 1 Иванов
1 Windows 95 200 руб 2 1 Петров
Здесь есть маленький недостаток, приходиться перечислять поля, которые нужно вывести и * уже не работает. Так что если понадобиться вывести все поля, то придётся их все писать после команды SELECT.
Вот стало и ещё красивее. Теперь остаётся мне выполнить обещание, и показать, как сортируется вывод. Для сортировки используется команда ORDER BY . После этого пишутся поля, по которым надо отсортировать. В самом конце нужно поставить АSC (сортировать в порядке возрастания) или DESC (в порядке убывания). Если ты не ставишь АSC или DESC , то таблица сортируется по возрастанию и подразумевается параметр АSC . Например:
SELECT *
FROM Prog
ORDER BY ProgName
Результатом будет таблица Prog, отсортированная по полю ProgNamе в порядке возрастания . Если ты хочешь отсортировать в обратном порядке, то нужно обязательно поставить DESC :
SELECT *
FROM Prog
ORDER BY ProgName DESC
Связанные таблицы сортируются также:
SELECT *
FROM Prog, User
WHERE Prog.Key1= Key2
ORDER BY ProgName, Country ASK
Вот и всё. Теперь попробуй поиграть с новыми командами на практике. Удачи!!!