- •Информационные системы
- •Пользователи информационных систем
- •Преимущество и проблемы интеграции информации
- •Проектирование баз данных
- •Выбор субд
- •Дата логическое проектирование
- •4 Нормальная форма
- •Операции над рбк
- •Обработка отношений
- •Размещение данных в памяти эвм
- •Язык запросов sql
- •Субд Microsoft Access
- •Субд FoXPro
- •Команды управления
- •Структура системных команд foxpro
- •Индексирование баз данных
- •Index on fio to kadrsex // sex – половая принадлежность
- •If found() // а если найду?
- •Язык vba (Visual Basic Application)
Язык запросов 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
Использование стандартных функций
Они следующие:
COUNT – количество значений в столбце
SUM – сумма значений в столбце
AVG – среднее значение в столбце
MAX
MIN
2 и 3 только для числовых полей.
Примеры:
SELECT COUNT(*) FROM поставщики
выдать количество строк в таблице поставщики
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. При объединении двух таблиц обязательно выполнение следующих условий:
Таблицы должны иметь одинаковое количество столбцов.
Для каждого 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 для работы с таблицами
Создание таблицы – CREATE TABLE <name> (имя_столбца тип_данных [not null],…, имя_столбца тип_данных [not null])
NOT NULL – для полей, которые не могут быть пустыми, допустим для первичного ключа.
Удаление таблицы - DROP TABLE <name>
Изменение таблицы – ALTER TABLE <name> (ADD/MODIFY/DROP <имя_столбца>[<тип_данных>][not null],…, ADD/MODIFY/DROP <имя_столбца>[<тип_данных>][not null])
Создание индекса – CREATE INDEX <имя_индексного_файла>
ON <имя_таблицы>
(<имя_столбца>[ASC/DESC],…,
<имя_столбца>[ASC/DESC]);
Удаление индекса – DROP INDEX <имя_индексного_файла>
Представления – CREATE VIEW <имя_представления>
[(<имя_столбца>[,<имя_столбца>]..)]
AS <оператор SELECT>
Обновление записи в таблице:
UPDATE <имя_таблицы>
SET поле = выражение [, поле = выражение …] [where предикат]
Пример:
UPDATE
SET Адрес = “Волкова 15”, город = “Щелково”
WHERE название = «Биржа»
Удаление записей – DELETE
На след неделе контрольная – первый пункт оператор SELECT второй - одна из последних тем.