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

6.3.4.2 Примеры работы с использованием оператора select

Отбор данных из одной таблицы

Пример. Выбрать все данные из таблицы поставщиков:

SELECT *

FROM A

Замечание. В результате получим новую таблицу (представление), содержащую полную копию данных из исходной таблицы P.

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

SELECT *

FROM A

WHERE A.ID_SOTR > 2;

Замечание. В качестве условия в разделе WHERE можно использовать сложные логические выражения, использующие поля таблиц, константы, сравнения (>, <, = и т.д.), скобки, союзы AND и OR, отрицание NOT.

Пример. Выбрать некоторые колонки из исходной таблицы (указание списка отбираемых колонок):

SELECT A.ZAP

FROM A

Замечание.

1) В результате получим таблицу с одной колонкой, содержащую все наименования поставщиков. По сути, это вертикальный срез таблицы.

2) Если в исходной таблице присутствовало несколько поставщиков с разными номерами, но одинаковыми наименованиями, то в результатирующей таблице будут строки с повторениями - дубликаты строк автоматически не отбрасываются.

Пример. Выбрать некоторые колонки из исходной таблицы (указание списка отбираемых колонок) и условия:

select b.ZAP, B.FAM from b where B.FAM='Путин'

Пример. Выбрать некоторые колонки из исходной таблицы, удалив из результата повторяющиеся строки (ключевое слово DISTINCT):

select distinct b.FAM, b.ZAP from b where b.fam='Путин'

Замечание. Использование слова DISTINCT приводит к тому, что в результатирующей таблице будут удалены повторяющиеся строки.

Пример. Использование скалярных выражений и переименований колонок в запросах (ключевое слово AS…).

Создадим 2 таблицы «Сотрудники» и «Должности»

CREATE TABLE SOTRUDNIK

(

ID_SOTR INTEGER NOT NULL,

FAM CHAR(30) NOT NULL,

YEARS DECIMAL(2) default 0,

PRIMARY KEY (ID_SOTR)

);

CREATE TABLE DOLGNOST

(

ID_D INTEGER NOT NULL PRIMARY KEY,

DOLG CHAR(10) NOT NULL,

MONEY DECIMAL(5) default 0

);

Наполним их данными для примера только для таблицы «Должность»:

insert into dolgnost(id_d, dolg, money)

values(6, 'Доцент', 1500);

insert into dolgnost(id_d, dolg)/*зарплата в этой записи будет по умолчанию 0*/

values(1, 'Ассистент'); /*точки с запятой здесь обязательны*/

insert into dolgnost(id_d, money, dolg) /*порядок указания столбцов другой*/

values(4, 2000, 'Профессор');

commit /*фиксируем изменения*/

И некоторыми данными таблицу «Сотрудники»

insert into sotrudnik(id_sotr, fam, years)

values(1, 'Иванов', 3);

insert into sotrudnik (id_sotr, fam, years)

values(2, 'Путин', 1);

insert into sotrudnik (id_sotr, fam, years)

values(3, 'Сидоров', 4);

commit

А теперь возвращаемся к основной задаче:

select

sotrudnik.fam,

'=' as equ,

sotrudnik.years*sotrudnik.id_sotr as abstract_value

from sotrudnik

В результате получим таблицу с колонками, которых не было в исходной таблице:

fam

equ

abstract_value

Иванов

=

3

Путин

=

2

Сидоров

=

12

Пример.Упорядочение результатов запроса (ключевое слово ORDER BY…):

SELECT

dolgnost.id_d,

dolgnost.dolg,

dolgnost.money

FROM dolgnost ORDER BY money

В результате получим таблицу, упорядоченную по полю money.

Пример. Упорядочение результатов запроса по нескольким полям с возрастанием или убыванием (ключевые слова ASC, DESC):

SELECT

dolgnost.id_d,

dolgnost.dolg,

dolgnost.money

FROM dolgnost

ORDER BY

money DESC,

id_d ASC

SELECT

dolgnost.id_d,

dolgnost.dolg,

dolgnost.money

FROM dolgnost

ORDER BY

money DESC,

id_d

получаем представление, в котором есть 3 столбца. Они упорядочены по убыванию столбца money, и по возрастанию id_d

тоже самое.

Замечание. Если явно не указаны ключевые слова ASC или DESC, то по умолчанию принимается упорядочение по возрастанию (ASC).

Отбор данных из нескольких таблиц

Пример. Естественное соединение таблиц (способ 1 - явное указание условий соединения):

SELECT

a.id_sotr,

b.fam

FROM a, b

WHERE a.id_sotr=b.id_sotr

Замечание. Соединяемые таблицы перечислены в разделе FROM оператора, условие соединения приведено в разделе WHERE. Раздел WHERE, помимо условия соединения таблиц, может также содержать и условия отбора строк.

Пример. Естественное соединение таблиц (способ 2 - ключевые слова JOIN… USING…):

SELECT

a.id_sotr,

b.fam

FROM a JOIN b USING id_sotr

Замечание. Ключевое слово USING позволяет явно указать, по каким из общих колонок

Аналогичным образом можно выполнить естественное соединение трех и более таблиц:

Пример. Прямое произведение таблиц:

SELECT *

FROM a, b

В результате получим следующую таблицу –произведение таблиц A и B, содержащую все столбцы исходных.

Замечание.

1) Т.к. не указано условие соединения таблиц, то каждая строка первой таблицы соединится с каждой строкой второй таблицы.

2) Т.к. указаны все столбцы (*), то в результирующей таблицы будут все столбцы исходных таблиц.

3) Столбцы, которые имеют одинаковое наименование в результирующей таблице (проеции) будут переименованы. В нашем примере переименован будет столбец id_sotr и fam таблицы B. Новыми именами будут id_sotr1 и fam1.

Пример. Соединение таблиц по произвольному условию

SELECT

sotrudnik.fam,

sotrudnik.years,

dolgnost.dolg,

dolgnost.money

FROM sotrudnik, dolgnost

WHERE sotrudnik.fam='Костров' AND dolgnost.money>=1500

В результате получим новую таблицу (декартово произведение), в которой строки: Фамилия, Стаж, Должность, Зарплата, но при условии, что фамилия - «Костров» и у человека зарплата от 1500 рублей.

Пример. Ответ на вопрос "какие дисциплины читают какими лекторами?" дает следующее экви-соединение или запрос:

SELECT

p.id_sotr,

p.fam,

pd.id_sotr,

pd.id_disp,

pd.volume,

FROM p, pd

WHERE p.id_sotr= pd.id_sotr;

Использование имен корреляции (алиасов, псевдонимов)

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

Пример. Отобрать все пары поставщиков таким образом, чтобы первый поставщик в паре имел статус, больший статуса второго поставщика:

SELECT

aa.fam AS fam_a,

aa.zap AS zap_a,

bb.fam AS fam_b,

bb.zap AS zap_b

FROM

a aa, b bb

WHERE aa.zap > bb.zap

SELECT

aa.fam AS fam_a,

aa.zap AS zap_a,

another_aa.fam AS fam_another_a,

another_aa.zap AS zap_another_a

FROM

a aa, a another_aa

WHERE aa.zap > another_aa.zap

В результате получим таблицу с заголовком:

fam_a

zap_a

fam_b

zap_b

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