Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bazy_dannykh.docx
Скачиваний:
3
Добавлен:
27.09.2019
Размер:
156.01 Кб
Скачать

Язык запросов sql

Сначала язык назывался SEQUEL (structured English query language)

SQL-92 – американский и европейский стандарт. Язык придуман для работы с реляционными базами данных.

Основой этого языка является оператор

SELECT [distinct] элементы FROM таблица (ы)

[WHERE предикат]

[GROUP BY поле [HAVING предикат]]

[ORDER BY поле];

В квадратных скобках необязательные поля.

Элементы – список столбцов, которые выводятся в результат.

distinct - означает что в результате не будет дублирования строк

FROM – имя таблицы, откуда извлекается информация

WHERE – задается условие выбора информации

GROUP BY – из исходной таблицы создаются группы, в которых указанное поле имеет одно и тоже значение

HAVING – позволяет выводить информацию только о некоторых группах.

ORDER BY – результат будет отсортирован по заданному полю.

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

SELECT название, капитал FROM поставщики WHERE город = Казань

Пример 2: выбор номера всех поставок

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

Пример 3: второй пример, но без повторений

SELECT DISTINCT номер изделия FROM поставки

Пример 4: выдать номера и расход материалов

SELECT номер изделия, «расход материала = ; Расход» FROM изделия;

в скобках можно указать, как будут названы столбцы в результате

Пример 5: выдать всю информацию обо всех изделиях

SELECT * FROM изделия

Пример 6: выдать номера и наименования поставщиков, которые находятся в Москве и имеют некоторый капитал.

SELECT номер_поставщика, название FROM поставщики

WHERE город= «Москва» and капитал > 0

Можно использовать операторы or, and и not

Пример 7: Вывести номера и капитал поставщиков из Казани и упорядочить по возрастанию

SELECT Nn, капитал FROM поставщики WHERE город=”Казань” ORDER BY капитал

замечание 1: при сортировке, вместо имени поля можно указывать его порядковый номер

SELECT N_из, расход FROM I ORDER BY 2 DESC

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

Замечание 2: упорядочение может производиться по нескольким полям, в этом случае они перечисляются через запятую по старшинству.

Пример 8: выдать сведения об изделиях, расход материалов для которых от 400 до 500 квадратных дециметров

SELECT N_из, название, расход FROM изделия WHERE расход BETWEEN 400 AND 500

В данном случае границы включаются

так же можно использовать NOT BETWEEN, но в этом случае границы уже не входят

Пример 9: выдать сведения об изделиях расход материалов на которые 200, 400 или 500 дециметров

SELECT N_из, название, расход FROM изделия WHERE расход IN (200, 400, 500);

Замечание: можно пользоваться NOT IN. В таком случае выдаются все результаты, не попадающие под значения.

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

Пример 10:

SELECT N_из, название, материал FROM изделия WHERE название LIKE “П*”

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

Предикат LIKE имеет следующий вид:

название_столбца LIKE литерная строковая константа

столбец обязательно должен типа char

“ “ или “?” – один произвольный символ

“%” или “*” – любое количество любых символов

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

SELECT P.*, I.* FROM поставщики, изделия WHERE поставщики.город = изделие.город

Замечание: поля в предикате соединения должны быть обязательно одного типа, но не обязательно с одинаковым названием.

Таким образом можно соединить 3,4 и более таблиц

Пример 12: выдать всю информацию о поставщиках и изделиях, расположенных в одном и том же городе, при этом капитал должен быть более 50 миллионов.

SELECT * FROM поставщики, изделия WHEN поставищики.город = изделия.город AND поставищики.капитал > 50

Пример 13: использование подзапросов

подзапрос – конструкция (select…from…where) вложенная в другую такую конструкцию

Назовите поставщиков поставляющих изделие N7

SELECT поставищики.название FROM поставщики WHERE поставщики.N_п IN

(SELECT поставки.N_п FROM поставки WHERE поставки.название = «N7»)

Если есть подзапрос, то сначала работает он, далее – основной запрос.

Аналогично можно написать сложный запрос:

SELECT поставищки.название FROM поставщики, поставки WHERE поставки.название = «N7»

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

SELECT поставщики.название FROM поставщики WHERE поставщики.N_п IN

(SELECT поставки.N_п FROM поставки WHERE поставки.название IN

(SELECT изделия.название FROM изделия WHERE изделия.название= «шуба»))

Сложный запрос:

SELECT поставщики.название FROM поставщики, изделия, поставки

WHERE изделие.название= «шуба» AND

изделие.N_из=поставки.N_из AND

поставки.N_п=поставщики=N_п

Пример 15: коррелированный подзапрос (рассмотрим на примере 13).

SELECT поставщики.название FROM поставщики WHERE “N7” IN

(SELECT поставки.N_из FROM поставки WHERE поставки.N_п=поставщики.N_п)

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

Пример 16: использование одной и той же таблицы в подзапросе и внешнем запросе.

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

Пример 17: использование одной и той же таблицы в коррелированном подзапросе и внешнем запросе.

Выдать номер всех изделий, поставляемых более чем одним поставщиком.

SELECT DISTICT IPX.название FROM IP IPX WHERE IPX.N_п IN

(SELECT IPY.N_п FROM IP IPY WHERE IPY.N_п<>IPX.N_п)

Пример 18: запрос использующий квантор существования EXISTS (SELECT…FROM…WHERE)

Выдать название всех поставщиков поставляющих изделие N3

SELECT поставщики.название FROM поставщики WHERE EXISTS

(SELECT * FROM поставки WHERE поставки.название= «N3» AND поставки.N_п=поставщики.N_п)

Помимо EXISTS может быть использован так же NOT EXISTS

Использование стандартных функций

Они следующие:

  1. COUNT – количество значений в столбце

  2. SUM – сумма значений в столбце

  3. AVG – среднее значение в столбце

  4. MAX

  5. MIN

2 и 3 только для числовых полей.

Примеры:

  1. SELECT COUNT(*) FROM поставщики

выдать количество строк в таблице поставщики

  1. SELECT COUNT(DISTINCT N_п) FROM поставки

Пример 19. Функция в подзапросе: выдать капитал, чей капитал ниже среднего

SELECT Nn

FROM P

WHERE капитал <

(SELECT AVG(капитал)

FROM P);

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

SELECT Nn, капитал, город

FROM P PX

WHERE капитал >=

(SELECT AVG(капитал)

FROM P PY

WHERE PY.город=PX.город);

PX.город – название столбца, поэтому запрос коррелированный

Пример 21: использования фразы GROUP BY.

Перекомпонует указанную таблицу, образуя группы, в которых указанные поля имеют одно и то же значение.

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

SELECT Nиз, SUM(кол), AVG(цена)

FROM IP

GROUP BY Nиз

SELECT Nиз, SUM(кол), AVG(цена)

FROM IP

WHERE Nn <> “П2”

GROUP BY Nиз

В данном случае сначала работает оператор WHERE, а только потом группировка.

Пример использования слова HAVING. Позволяет исключать из результата некоторые группы. HAVING работает только с группировкой и не работает как WHERE.

SELECT Nиз, SUM(кол), AVG(цена)

FROM IP

GROUP BY Nиз

HAVING COUNT(*) >=2

Отобрать группы, количество элементов в которых больше 2-ух.

Пример 22 с помощью слова UNION. При объединении двух таблиц обязательно выполнение следующих условий:

  1. Таблицы должны иметь одинаковое количество столбцов.

  2. Для каждого i (I – номер столбца) типы столбцов должны совпадать.

Выдать номер изделий расход материалов на которые составляет более 410 кв дециметров, либо цена более 5000 рублей.

SELECT Nиз

FROM I

WHERE расход > 410

UNION

SELECT Nиз

FROM IP

WHERE цена > 5000

Первая таблица выдается без изменений, а второй запрос добавляет только то, чего нет. С помощью UNION можно объединять любое количество запросов.

Запросы по нескольким таблицам, объединяемым с помощью оператора JOIN. Объединение таблиц по условию (внутреннее объединение).

FROM T1 INNER JOIN T2

ON (T1.П1 <оператор> T2.П1)

[AND/OR (T1.П2 <опер> T2.П2)]

[AND/OR (T1.П3 <опер> T2.П3)]

SELECT P.Nn, P.назв, P.Тип

FROM P INNER JOIN IP

ON (P.Nn=IP.Nn)

from p, ip where p.Nn=IP.Nn

Левое внешнее объединение

Включаются все записи из первой левой таблицы, даже если нет совпадающих из второй таблицы.

Правое внешнее объединение

Включаются все записи из второй правой таблицы, даже если нет совпадающих в левой.

Операторы языка SQL для работы с таблицами

  1. Создание таблицы – CREATE TABLE <name> (имя_столбца тип_данных [not null],…, имя_столбца тип_данных [not null])

NOT NULL – для полей, которые не могут быть пустыми, допустим для первичного ключа.

  1. Удаление таблицы - DROP TABLE <name>

  2. Изменение таблицы – ALTER TABLE <name> (ADD/MODIFY/DROP <имя_столбца>[<тип_данных>][not null],…, ADD/MODIFY/DROP <имя_столбца>[<тип_данных>][not null])

  3. Создание индекса – CREATE INDEX <имя_индексного_файла>

ON <имя_таблицы>

(<имя_столбца>[ASC/DESC],…,

<имя_столбца>[ASC/DESC]);

  1. Удаление индекса – DROP INDEX <имя_индексного_файла>

  2. Представления – CREATE VIEW <имя_представления>

[(<имя_столбца>[,<имя_столбца>]..)]

AS <оператор SELECT>

Обновление записи в таблице:

UPDATE <имя_таблицы>

SET поле = выражение [, поле = выражение …] [where предикат]

Пример:

UPDATE

SET Адрес = “Волкова 15”, город = “Щелково”

WHERE название = «Биржа»

Удаление записей – DELETE

На след неделе контрольная – первый пункт оператор SELECT второй - одна из последних тем.

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