- •Введение в sql
- •1. Введение в реляционную базу данных
- •2.Sql: Обзор
- •3. Использования sql для извлечения информации из таблиц
- •4. Использование реляционный и булевых операторов для создания более изощренных предикатов
- •5. Использование специальных операторов в условиях
- •6. Обобщение данных с помощью агрегатных функций
- •7. Формирование выводов запросов
- •8. Запрашивание многочисленных таблиц также как одной
- •9. Объединение таблицы с собой
- •10. Вставка одного запроса внутрь другого
- •11. Соотнесенные подзапросы
- •12. Использование оператора exists
- •13. Использование операторов any, all, и some
- •14. Использование предложения union
- •15. Ввод, удаление и изменение значений полей
- •16. Использование подзапросов с коммандами модификации
- •17. Создание таблиц
- •19. Поддержка целостности ваших данных
- •20. Введение: Представления
- •21. Изменение значей с помощью представлений
- •22. Кто что может делать в базе данных
- •Глава 23 продолжит обсуждение о выводах в sql, таких как сохранение
- •23. Глобальные аспекты sql
- •24. Как данные sql содержатся в упорядоченом виде
- •25. Использование sql с другим языком (вложенный sql)
- •Глава 1
- •Глава 2
- •Глава 3
- •Глава 4
- •Глава 5
- •Глава 6
- •Глава 7
- •Глава 8
- •Глава 9
- •Глава 10
- •Глава 11
- •Глава 12
- •Глава 13
- •Глава 14
- •Глава 15
- •Глава 16
- •Глава 17
- •Глава 18
- •Глава 19
- •Глава 20
- •Глава 21
- •Глава 22
- •Глава 23
- •Глава 24
- •Глава 25
- •Приложение b Тиры данных в sql
- •Приложение c Некоторые общие нестандартные средства sql
- •Intersect и minus
- •Приложение d Синтаксис и команда ссылки
Глава 16
1. INSERT INTO Multicust
SELECT *
FROM Salespeople
WHERE 1 <
(SELECT COUNT (*)
FROM Customers
WHERE Customers.snum = Salespeople.snum);
2. DELETE FROM Customers
WHERE NOT EXISTS
(SELECT *
FROM Orders
WHERE cnum = Customers.cnum);
3. UPDATE Salespeople
SET comm = comm + (comm * .2)
WHERE 3000 <
(SELECT SUM (amt)
FROM Orders
WHERE snum = Salespeople.snum);
В более сложный вариант этой команды можно было бы вставить проверку
чтобы убедиться, что значения комиссионных не превышают 1.0 ( 100 % ):
UPDATE Salespeople
SET comm = comm + (comm * .2)
WHERE 3000 <
(SELECT SUM (amt)
FROM Orders
WHERE snum = Salespeople.snum)
AND comm + (comm * .2) < 1.0;
Эти проблемы могут иметь другие, такие же хорошие решения.
Глава 17
1. CREATE TABLE Customers
(cnum integer,
cname char(10),
city char(10),
rating integer,
snum integer);
2. CREATE INDEX Datesearch ON Orders(odate);
( Все индексные имена используемые в этих ответах - произвольные. )
3. CREATE UNIQUE INDEX Onumkey ON Orders(onum);
4. CREATE INDEX Mydate ON Orders(snum, odate);
5. CREATE UNIQUE INDEX Combination ON
Customers(snum, rating);
Глава 18
1. CREATE TABLE Orders
(onum integer NOT NULL PRIMARY KEY,
amt decimal,
odate date NOT NULL,
cnum integer NOT NULL,
snum integer NOT NULL,
UNIOUE (snum, cnum));
или
CREATE TABLE Orders
(onum integer NOT NULL UNIQUE,
amt decimal,
odate date NOT NULL,
cnum integer NOT NULL,
snum integer NOT NULL,
UNIQUE (snum, cnum));
Первое решение предпочтительнее.
2. CREATE TABLE Salespeople
(snum integer NOT NULL PRIMARY KEY,
sname char(15) CHECK (sname BETWEEN 'AA' AND 'MZ'),
city char(15),
comm decimal NOT NULL DEFAULT = .10);
3. CREATE TABLE Orders
(onum integer NOT NULL,
amt decimal,
odate date,
cnum integer NOT NULL,
snum integer NOT NULL,
CHECK ((cnum > snum) AND (onum > cnum)));
Глава 19
1. CREATE TABLE Cityorders
(onum integer NOT NULL PRIMARY KEY,
amt decimal,
cnum integer,
snum integer,
city char (15),
FOREIGN KEY (onum, amt, snum)
REFERENCES Orders (onum, amt, snum),
FOREIGN KEY (cnum, city)
REFERENCES Customers (cnum, city) );
2. CREATE TABLE Orders
(onum integer NOT NULL,
amt decimal,
odate date,
cnum integer NOT NULL,
snum integer,
prev integer,
UNIQUE (cnum, onum),
FOREIGN KEY (cnum, prev) REFERENCES Orders (cnum,onum) );9
Глава 20
1. CREATE VIEW Highratings
AS SELECT *
FROM Customers
WHERE rating =
(SELECT MAX (rating)
FROM Customers);
2. CREATE VIEW Citynumber
AS SELECT city, COUNT (DISTINCT snum)
FROM Salespeople
GROUP BY city;
3. CREATE VIEW Nameorders
AS SELECT sname, AVG (amt), SUM (amt)
FROM Salespeople, Orders
WHERE Salespeople.snum = Orders.snum
GROUP BY sname;
4. CREATE VIEW Multcustomers
AS SELECT *
FROM Salespeople a
WHERE 1 <
(SELECT COUNT (*)
FROM Customers b
WHERE a.snum = b.snum);