БАЗЫ ДАННЫХ ЛЕКЦИЯ 12

advertisement
БАЗЫ ДАННЫХ
ЛЕКЦИЯ 12
тема: ОСНОВЫ ЯЗЫКА SQL
Общие сведения
SQL ─ структурированный язык запросов
(Structured Query Language)
Стандарты SQL

SQL-1

SQL-89

SQL-2

SQL-92
Диалекты SQL
• Диалект – некоторое подмножество стандарта
SQL
• Каждый диалект включает некоторое
расширение стандартного SQL
Определение данных
СОЗДАНИЕ ТАБЛИЦ
CREATE TABLE имяТаблицы
(описаниеСтолбца,… [ограничение
целостности,…])
описаниеСтолбца :: = имяСтолбца
типСтолбца [(размер)] [ограничение
целостности]
Определение данных
ОГРАНИЧЕНИЯ ЦЕЛОСТНОСТИ
1) Ограничение первичного ключа
PRIMARY KEY (Столбец,…)
CONSTRAINT PK_s_no PRIMARY KEY (s_no)
2) Ограничение ключа-кандидата
UNIQUE (Столбец)
Определение данных
ОГРАНИЧЕНИЯ ЦЕЛОСТНОСТИ
3) Ограничение внешнего ключа
FOREIGN KEY (Столбец,…) REFERENCES
имяРодительскойТаблицы [(столбцы
потенциального ключа)]
Задание правил ссылочной целостности
ON DELETE (RESTRICT, CASCADE, NO ACTION)
ON UPDATE (RESTRICT, CASCADE, NO ACTION)
Определение данных
ОГРАНИЧЕНИЕ ОБЯЗАТЕЛЬНОСТИ
NULL / NOT NULL
ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ
DEFAULT (Значение)
ПРОВЕРКА ЗНАЧЕНИЯ
CHECK (Условие)
Определение данных
s
p
sp
s_no
sname
city
state
p_no
pname
color
weight
city
s_no
p_no
qty
Определение данных
CREATE TABLE s (
s_no INT IDENTITY(1,1) PRIMARY KEY,
sname CHAR(10) NOT NULL, city CHAR(15) NOT NULL,
status INT )
CREATE TABLE p (
p_no INT IDENTITY(1,1) PRIMARY KEY,
pname CHAR(10) NOT NULL, city CHAR(15) NOT NULL,
color CHAR(10), weight INT )
CREATE TABLE sp (
s_no INT, p_no INT, qty INT,
PRIMARY KEY(s_no, p_no),
FOREIGN KEY(s_no) REFERENCES s(s_no) ON UPDATE CASCADE,
FOREIGN KEY(p_no) REFERENCES p(p_no) ON UPDATE CASCADE
)
Определение данных
УДАЛЕНИЕ ТАБЛИЦ
DROP TABLE имяТаблицы
УДАЛЕНИЕ СТОЛБЦОВ
DROP имяСтолбца RESTRICT/CASCADE
УДАЛЕНИЕ ОГРАНИЧЕНИЙ
DROP CONSTRAINT имяСтолбца RESTRICT/CASCADE
Выборка данных
SELECT список_столбцов_результата
FROM базовая_таблица
WHERE условие_отбора_строк
GROUP BY критерий_группирования_строк
HAVING условие_отбора_групп
ORDER BY
критерий_сортировки_результата
Выборка данных
Извлечь все сведения о товарах
SELECT *
FROM p
SELECT p_no, pname, weight, city, color
FROM p
SELECT p.p_no, p.pname, p.weight, p.city,
p.color
FROM p
Выборка данных
Извлечь сведения о поставщиках из Парижа или Лондона со
статусом от 20 до 30 с упорядочиванием результата по именам
поставщиков
SELECT *
FROM s
WHERE (city=’London’ OR city = ‘Paris’) AND status BETWEEN 20
and 30
ORDER BY sname ASC
DESC
SELECT *
FROM s
WHERE city IN (’London’, ‘Paris’) AND status BETWEEN 20 and 30
ORDER BY sname ASC
DESC
Выборка данных
Извлечь сведения о поставщиках из Парижа или Лондона со
статусом от 20 до 30 с упорядочиванием результата по городам, а
внутри города по статусам, а для одинаковых значений статуса –
по номерам поставщиков
SELECT *
FROM s
WHERE city IN (’London’, ‘Paris’) AND status BETWEEN 20 and 30
ORDER BY city, status, s_no
Выборка данных
Извлечь номера всех поставщиков, поставляющих товары
SELECT s_no
FROM sp
Без дубликатов
SELECT DISTINCT s_no
FROM sp
Выборка данных с
вычислением результата
Перечень товаров с указанием номера, названия и веса в
килограммах
SELECT p_no, pname, weight*0.001 as kg
СТАТИСТИЧЕСКИЕ
ФУНКЦИИ
SUM (числПоле)
MIN (числПоле)
MAX(числПоле)
AVG(числПоле)
COUNT(числПоле) – без учета дубликатов
COUNT(*) – подсчет числа строк группы (с учетом дубликатов).
Выборка данных из
нескольких таблиц
Задача: извлечь сведения о поставщиках, поставляющих товары с
указанием номера, имени поставщика, номера товара, количества
поставляемых товаров этого номера
SELECT s.s_no, s.sname, sp.p_no, sp.qty
FROM s,sp (декартово произведение этих таблиц)
Выборка данных из
нескольких таблиц
Задача: извлечь сведения о поставщиках, поставляющих товары с
указанием номера, имени поставщика, номера товара, количества
поставляемых товаров этого номера
SELECT s.s_no, s.sname, sp.p_no, sp.qty
FROM s,sp
WHERE s.s_no=sp.s_no
(эквисоединение)
Способы соединения
таблиц
• Список таблиц в FROM, условие соединения – во
фразе WHERE
• Запись во фразе FROM с использованием
операции JOIN (SQL92) (s JOIN sp ON
s.s_no=sp.s_no)
Внешнее соединение
таблиц

RIGHT Outer Join

LEFT Outer Join

FULL Outer Join
Сравнение множеств
Задача:
извлечь
сведения
о
поставщиках,
поставляющих все товары, содержащиеся в таблице s.
SELECT *
FROM s
WHERE NOT EXISTS (
SELECT *
FROM p
WHERE p_no NOT IN(
SELECT p_no
FROM sp
WHERE sp.s_no=s.s_no
)
)
Сравнение множеств
Задача: извлечь список поставщиков, поставляющих по
крайней мере все те товары, которые поставляет поставщик s2.
SELECT *
FROM s
WHERE NOT EXISTS(
SELECT *
FROM sp
WHERE sp.s_no=’s2’
AND
p_no NOT IN (
SELECT p_no
FROM sp
WHERE s_no=s.s_no
)
)
Ведение баз данных
1. Вставка записи в таблицу
INSERT INTO ИмяТаблицы [(список столбцов)] – по умолчанию –
все столбцы таблицы в естественном порядке
VALUES (список значений) – в соответствии со списком столбцов.
2. Удаление строк из таблицы
DELETE FROM имяТаблицы
WHERE условие – определяет те записи, которые удаляются.
Если нет WHERE, то удаляются все строки из таблицы
3. Изменение строк таблицы
UPDATE имяТаблицы
SET имяСтолбца = Значение, …
WHERE условие – задает строки, которые будут изменены.
Виртуальные таблицы
CREATE VIEW имяПросмотра AS
SELECT…
–
формирует
содержимое
виртуальной таблицы на основе реальной
таблицы или дргуих просмотров.
Хранимые процедуры
CREATE PROCEDURE Get_s_info
@s_no CHAR(5) INPUT,
@sname CHAR(15) OUTPUT,
@city CHAR(15) OUTPUT,
@status INT OUTPUT
AS
/тело процедуры/
SELECT @Sname=sname,
@city=city, @status=status
FROM s
WHERE s_no=@s_no
Триггер
CREATE TRIGGER Check_sp_ins
ON sp
FOR INSERT
AS
DECLARE
@s_no CHAR(5), @status INT, @sp_count INT
BEGIN TRANSACTION
SELECT @s_no=s_no
FROM INSERTED,
SELECT @status = status FROM s WHERE s_no=@s_no,
SELECT @sp_count = count(*) FROM sp WHERE s_no=@s_no
IF(@status > @sp_count)
BEGIN COMMIT TRANSACTION END
ELSE BEGIN
RAISERROR(‘Too many parts’,16,1) ROLLBACK TRANSACTION
END
Download