- выражение, которое может включать пользовательскую функцию;
- параметр FROM задается всегда. Определяет имена всех баз данных, которые принимают участие в запросе;
- <выражение> может быть полем, имя может быть составным т.е. из нескольких констант.
Необязательная фраза AS <колонка> специфицирует заголовок колонки в выводе результата запроса. Это полезно, когда имеются <выражения> или содержатся функции работы с полями и требуется присвоить колонке в результате соответствующее имя.
<колонка> может быть выражением.
Если в разных базах одни и те же имена и они одновременно выводятся на экран, то колонки получат одинаковое название и букву алфавита fam; fam a, fam b ...
Если не устраивают имена колонок данных по умолчанию, можно их обозначить по-своему, используя выражение:
[AS <Новое наименование колонки>]
Псевдоним БД, откуда берется нужное поле может, быть назначен в команде SELECT. Вне команды действия не имеет. Рассмотрим примеры. Будем использовать спроектированную учебную базу BOOK , структура которой приведена ниже.
База спроектирована для компании занимающейся выпуском книг и содержащей несколько издательств.
Руководство компанией интересует информация о книгах, выпускаемых в издательствах, об авторах книг и редакторах, а также о финансовом положении компании. При этом в базе данных должно было быть учтено, что:
- автор может написать несколько книг;
- книга может быть написана несколькими авторами;
- порядок следования авторов в заглавии книги влияет на гонорар;
- редактор может работать с несколькими книгами и несколько редакторов с одной;
- в заказе на покупку может быть перечислено несколько книг.
Исходя из вышесказанного, были выделены объекты и определены их характеристики.
Объект Autors – авторы, книги которых опубликованы компанией, имеют следующие атрибуты: имя автора, полный адрес, где он проживает, телефон.
Объект Titles – книги, имеют атрибуты: название книги, ее стоимость, дату выпуска.
Объект Editors - редакторы, работающие на компанию, имеют атрибуты аналогичные объекту авторы: имя, адрес, телефон.
Объект Publishers – имеет атрибуты: наименование издательства, которыми владеет компания, его адрес, и телефон. В результате проектирования получим совокупность таблиц приведенную выше.
Допустим, необходимо вывести значения всех столбцов. Оператор SELECT в этом случае запишется:
SELECT *
FROM PUBLISERS
Pub_id | Pub_name | Address | City | State | Zip |
Тот же самый результат можно получить, перечислив в списке выбора все поля таблицы.
SELECT PUB_ID, PUB_NAME, ADDRESS, СITY, STATE, ZIP
FROM PUBLISHERS
Если необходимо осуществить выбор отдельных столбцов, то в списке выбора перечисляют необходимые столбцы в порядке их отображения на экране.
SELECT PUB_ID, PUB_NAME
FROM PUBLISHERS
С помощью оператора возможно переименование столбцов и задание имен выражениям. При выводе результатов запроса каждый столбец по умолчанию получает заголовок, совпадающий с его именем в БД. Поскольку столбцы в БД обычно имеют сокращенные имена, желательно им присвоить полные. Выполняется это с помощью предложения AS. В списке выбора пишут:
имя столбца AS имя заголовка
SELECT PUB_NAME AS PUBLISHERS, PUB_ID
FROM PUBLISHERS
Таблица с поименованными столбцами приведена ниже.
Publishers | pub_id |
В большинстве систем ширина отображаемых столбцов устанавливается по максимальной длине заголовка (но не уже находящихся в них данных). Как правило, в заголовках столбцов нельзя использовать кавычки и пробелы, поэтому нет возможности применять русские названия столбцов. Если в списке выбора задано выражение, то для него тоже можно создать заголовок.
Например, если мы хотим посмотреть, как изменится стоимость книг, если мы увеличим их стоимость на 10% , то запрос может выглядеть так:
SELECT TITLE, PRICE AS OLD_PRICE, PRICE * 1.1 AS NEW_PRICE
FROM TITLE
TITLE | OLD_PRICE | NEW_PRICE |
Пояснения в строках
Например:
SELECT 'СТОИМОСТЬ КНИГИ', TITLES, 'СТАЛА', PRICE*1.1 AS NEW_PRICE
FROM TITLE
В списках с числовыми данными и константами можно выполнять следующие арифметические действия: +, -, *, /. (в некоторых системах введена операция остаток от деления - %)
Таблицам можно присвоить имена- псевдонимы, что бывает полезно для осуществления соединения таблицы с самой собой или для доступа из вложенного подзапроса к текущей записи внешнего запроса.
Например:
SELECT Р. PUB_ID, Р.PUB_NAME
FROM PUBLISHERS Р
р – здесь псевдоним, p.pub_id – полное наименование поля.
Выполнение запроса
SELECT * FROM AUTORS, TITLES
Соответствует декартову произведению таблиц AUTORS, TITLES.
5.1.1. Определение критерия отбора данных.
Отбор данных в выборке производится посредством ключевого слова WHERE:
WHERE <условие связи> [AND <условие связи>...]
[ARD/OR <условие отбора> [AND/OR < >...]]
<условие связи> применяется, если выборка делается более чем из одной базы, и указывает критерий, которому должны удовлетворять поля из разных баз. Здесь используются операции отношений =, #, >, <, >=, <=, допускается применение нескольких критериев, соединенных знаком AND.
Если включить в запрос две базы данных и не специфицировать условие связи, то каждая запись из первой базы данных будет соединяться с каждой записью из второй базы данных при выполнении условия фильтрации.
<условие отбора> специфицирует критерий, которому должны удовлетворять записи, чтобы попасть в результат действия запроса. Условия фильтрации можно соединять операторами AND и OR. Можно также использовать оператор NOT для реверса значения логического выражения.
Операторы условия =, >, <, >=, <=, !=, < > применяются к данным имеющим тип: числовой, символьный, дата.
Например, необходимо найти все книги стоимостью более 250 рублей.
SELECT TITLE, PRICE
FROM TITLE
WHERE PRICE > 250
Запрос, в котором необходимо найти книги, выпущенные издательством до 1999г., выглядит следующим образом:
SELECT TITLE, TITLE_ID, PRICE
FROM TITLE
WHERE PUB_DATE < {01. 01. 1999}
Допустим, необходимо найти авторов живущих не в Томске и их телефоны:
SELECT AU_ID, PHONE
FROM AUTORS
WHERE CITY != 'ТОМСК'
Возможно совместное использование условных и логических операторов
Пусть нужно найти книги по Windows стоимостью выше 250 руб. и затратами на выпуск ниже 2 000 000.
SELECT TITLE, TYPE, PRICE, ADVANCE
FROM TITLE
WHERE TYPE = 'WINDOWS' AND PRICE > 250 AND ADVANCE < 2000000
При составлении логических выражений нужно быть внимательным. Рассмотрим два примера. В первом примере в выборку попадут все книги по бизнесу независимо от затрат на их производство и книги по искусству, затраты на выпуск которых превысили сумму в 5 500 000 рублей.
SELECT TITLE_ID, TYPE, PRICE, ADVANCE
FROM TITLE
WHERE TYPE ‘БИЗНЕС’
OR TYPE = ‘ИСКУССТВО’
AND ADVANCE > 5 500 000
Во втором случае за счет расставленных скобок в выборку попадут все книги по искусству и бизнесу затраты на выпуск которых превысили 5500000.
SELECT TITLE_ID, TYPE, ADVANCE
FROM TITLE
WHERE (TYPE = 'БИЗНЕС ' OR TYPE = 'ИСКУССТВО')
AND ADVANCE > 5 500 000
Еще один пример. Необходимо найти книги, затраты на выпуск которых не окупились.
Доход от продажи определяется как ytd_sales * price, advance - сумма затрат. Книги выпущены два года назад.
SELECT TITLE_ID, TYRE, PRICE, ADVANCE, YTD_SALES
FROM TITLE
WHERE PRICE * YTD_SALES < ADVANCE
AND PUB_DATE < {10.1. 2003}
Определение диапазона реализации можно проводить с помощью знаков > < ,а также с помощью ключа BETWEEN (NOT BETWEEN), который проверяет, находится ли (или нет) выражение в заданном диапазоне.
<выражение> BETWEEN <нижнее значение> AND <верхнее значение>
Допустим, необходимо найти книги, количество проданных экземпляров у которых между 4095 и 12000 включительно.
SELECT TITLE_ID, YTD_SALES
FROM TITLE
WHERE YTD_SALES BETWEEN 4095 AND 12000
Запрос, в котором число проданных экземпляров меньше 4095 или больше чем 12000, запишется как
SELECT TITLE_ID, YTD_SALES
FROM TITLE
WHERE YTD_SALES NOT BETWEEN 4095 AND 1200
То же самое получается при следующем запросе:
SELECT TITLE_ID, YTD_SALES
FROM TITLE
WHERE YTD_SALES < 4095 OR YTD_SALES
Списки IN, not IN позволяют выбрать значения из заданного списка.
<выражение> IN (<выражение>, <выражение>,...)
Выбрать авторов, проживающих в г.г. Томск и Сургут.
SELECT A_LNAME, STSTE
FROM AUTORS
WHERE СYTI IN ('Томск', 'Сургут')
Найти имена авторов, которые получают меньше 50% от суммарного гонорара за книги, написанные в соавторстве. Здесь приведен пример запроса с подзапросом.
SELECT AU_LNAME, AU_FNAME
FROM AUTORS
WHERE AU_ID IN
(SELECT AU_ID FROM TITLEAUTORS
WHERE ROYALTY_PER < 0.5)
В предложении WHERE для поиска нужных подстрок удобно применять шаблоны.
<выражение> LIKE <шаблон>
В качестве части этого выражения можно использовать специальные символы % (процент) и _<(подчеркивание)>. Подчеркивание _ означает подстановку одного любого символа, а процент % - произвольную последовательность таких символов.
Например, выбрать книги, в названии которых есть слово "компьютер".
SELECT TITLE_ID, NAME, PRICE
FROM TITLE
WHERE NAME LIKE ‘%компьютер%’
5.1.2. Сортировка результатов запроса
Сортировка результатов запроса производится с использованием ключевого слова ORDER BY.
ORDER BY <колонка> [ASC/DESC][,<колонка>,...] - задает упорядочение по колонке, колонкам.
Фраза DESC вызывает упорядочение по убыванию значения соответствующей <колонки>. Фраза ASC специфицирует упорядочение по возрастанию и принимается по умолчанию.
Пример сортировки по цене (список цен идентификационных номеров издателей):
SELECT PRICE, TITLE_ID, PUB_ID
FROM TITLE
ORDER BY PRICE
Хорошо бы книги в каждой ценовой категории, выпущенные одним издательством, в списке были рядом. Для этого в список ORDER BY добавим столбец pub_id.
SELECT PRICE, TITLE_ID, PUB_ID
FROM TITLE
ORDER BY PRICE , PUB_ID
Количество уровней сортировки может быть любым. Порядок сортировки задается в предложении ОRDER BY. Порядок следования столбцов при выводе задается списком выбора. В операторе SELECT список выбора может не совпадать со списком сортировки.