(*) все, (атрибут) ненулевые значения, COUNT(DISTINCT(атрибут))
DISTINCTиспользуется для исключения повторяющихся записей в результирующей таблице . ALL указывает, что в результат необходимо включать все строки.
SELECT COUNT (DISTINCT snum) FROM Orders;
WHERE: (<,>,<=,>=,<>), (AND, OR, NOT); BETWEEN (AND), IN,
LIKE(образец) Образец заключается в кавычки и содержит шаблон для поиска. Используются символы % (процент) - заменяет любое количество символов,
_ (подчеркивание) - заменяет одиночный символ. Если ищем значение, которое содержит символ шаблона, то используют ESCAPE <ключевой_символ>. Символ, следующий в шаблоне после ключевого символа, рассматривается как обычный символ.
SELECT * FROMSalespeopleWHERE sname LIKE '%@_%' ESCAPE '@';
GROUP BY, HAVING <…>
ORDER BY [ASC|DESC])
SELECT snum, odate, MAX((amt)) FROM Orders GROUP BYsnum, odate;
SELECT DISTINCT ЗарплатаFROM Работник
SELECT COUNT(ФИО) AS 'Число_работников', SUM(Зарплата)
AS 'Зарпл_всех_работн', AVG(Зарплата) AS 'Сред_зарпл_работн' FROM Работник
SELECT Место_Рождения, SUM(Зарплата) AS 'Суммарная_зарплата', AVG(Зарплата)
AS 'Средняя_зарплата' FROMРаботник GROUP BY Место_Рождения
SELECT Место_Рождения, AVG (Зарплата)AS 'Средняя_зарплата' FROM Работник
GROUP BYМесто_Рождения HAVING AVG(Зарплата) <= 2200
SELECT ФИО, Зарплата FROMРаботник ORDER BY ФИО
SELECTФИО, Зарплата FROM Работник ORDER BY Зарплата DESC, ФИО
Использование таблиц других пользователей (схем)
SELECT … FROMсхема.таблица
*НЕСКОЛЬКО ТАБЛИЦ В ЗАПРОСЕ
* ОБЪЕДИНЕНИЕ (СОЕДЕНЕНИЯ) ДВУХ ТАБЛИЦ (JOIN, ON)
Внутреннее объединение [INNER] JOIN. Во внутреннем объединениивозвращаются только те строки, которые соответствуют условию, указанному после ключевого слова ON.
SELECT d_name, … FROM emp1 INNER JOINdept ONemp1.deptno= emp.deptno
или в ORACLE:
SELECT d_name, … FROM emp1 INNER JOINdept USING (deptno)
Внешнее объединение отличаются от внутренних тем, что могут возвращать строки, не соответствующие условию («висячие» строки). Существует три внешних объединений: левое, правое и полное.
Левое внешнее объединение
В левом внешнем объединениирезультатом являются все строки левой таблицы, вне зависимости от того, соответсвует ли им строка в правой таблице.
SELECT d_name, … FROM emp1 LEFT JOINdept ONemp1.deptno= emp.deptno
в ORACLE можно также таким образом:
SELECTd.dept_no, d.d_name, e.e_name FROMdept d, emp e WHEREd.dept_no (+) = e.dept_no; d, e – псевдонимы для имен таблиц
Правое внешнее объединение
В правом внешнем объединениирезультатом являются все строки правой таблицы, вне зависимости от того, соответсвует ли им строка в левой таблице.
SELECT d_name, … FROM emp1 RIGTH JOINdept ONemp1.deptno= emp.deptno
Рекурсивное связывание предполагает связывание таблицы с ней же самой, как будто бы это 2 таблицы, применяя временные переименования таблицы в операторе SQL.
SELECT A.name, B.name FROM employee A JOIN employee B, ONA.name = B.name
SELECT ФИО, Сумма, Налог, Дата_Выплаты FROM Работник JOIN Выплаты ON
Работник.Код_работника = Выплаты.Код_работника ORDER BY ФИО
SELECT ФИО,Сумма, Налог, Дата_Выплаты FROM Работник LEFT OUTER JOIN
Выплаты ON Работник.Код_работника = Выплаты.Код_работника ORDER BY ФИО
SELECT Работник1.ФИО, Работник2.ФИО FROM Работник Работник1,
Работник Работник2 WHERE Работник1.ФИО < Работник2.ФИО AND
(SELECT snum FROMSalespeople WHERE city = "LONDON");
SELECT ФИО, Сумма FROMРаботник
WHERE Сумма < (SELECT AVG(Сумма) FROMРаботник)
SELECTФИО, Сумма FROMРаботник
WHERE Сумма+600 >(SELECT MAX(Сумма) FROMРаботник)
SELECTФИО, Код_Работникa FROMРаботник WHERE Код_Работникa NOT IN
(SELECTКод_Работникa FROMВыплаты )
Или
SELECTценаFROM Товары WHERE EXISTS
(SELECTценаFROM Товары WHERE цена>5000)
SELECTФИО, Код_Работникa FROM Работник WHERE
NOT EXISTS (SELECT Код_Работникa FROMВыплаты WHERE Выплаты. Код_Работника = Работник. Код_Работника )
SELECT * FROM Работник WHERE Сумма > ALL (SELECT Сумма FROM Работник
WHERE Место_Рождения LIKE "Ужго%" OR Место_Рождения LIKE"Мук%")
SELECT * FROM Работник WHERE Сумма > ANY (SELECT Сумма FROM Работник
WHERE Место_Рождения LIKE "Ужго%") AND Место_Рождения LIKE"Мук%"
SELECT MAX(Сумма) FROM Работник WHERE NOT EXISTS
(SELECT Сумма FROM Работник WHERE Сумма > 1800)
СРАВНЕНИЕ ТАБЛИЦЫ С СОБОЙ. Найти все заказы со значениями сумм покупок выше среднего для их заказчиков
SELECT * FROM Orders outer WHEREamt > (SELECT AVG( amt) FROM Orders inter WHERE inner.cnum = outer.cnum);
*Использование значения NULL.
Возможны два варианта: IS NULL, IS NOT NULL
*ВЕРХНИЙ-N АНАЛИЗ.
Использование ROWNUM
ROWNUM– псевдостолбец, содержит порядковый номер строки таблицы. Создается командой CREATEавтоматически.
SELECT ...FROM [список табл.,] подзапрос WHERE ROWNUM<=n;
Найти первые 3 работника по алфавиту.
SELECT ROWNUM ASномер, enameAS имя
FROMemp WHERE ROWNUM<=3;
1 KING
2 BLAKE
3 CLARK
Ошибка!
SELECT ROWNUM AS номер, ename AS имя
FROM (SELECT enameFROM empORDER BY ename)
WHERE ROWNUM<=3;
1 ADAMS
2 ALLEN
3 BLAKE
Правильно!
Или в других обозначениях.
SELECT ROWNUM, ФИО FROM Работник WHERE ROWNUM < = 3
SELECT ROWNUM, ФИО FROM
(SELECT ФИО FROM Работник ORDER BY ФИО )
WHERE ROWNUM < = 3
При помощи скрипта (в ORACLE) можно решить более общую задачу.
ACCEPT kPROMPT’Сколько вывести работников?’
CREATE OR REPLACE VIEW Список_работников (номер, ФИО, Сумма)
AS SELECT ROWNUM, tab.*
FROM (SELECTФИО, Сумма FROM Работник ORDER BY ФИО ) tab
WHERE ROWNUM < =&k;
SELECT * FROMСписок_работников;
DROP VIEWСписок_работников;
UNDEFINE k
Сколько вывести работников: 2
1 ADAMS 1100
2 ALLEN 1600
*Использование ROWID.
Псевдостобец из 18 символов, содержит уникальный логический адрес строки. Создается автоматически для каждой новой строки. Командой SELECT можно прочитать значение ROWID.
Транзакция – последовательность операторов языка SQL, которая рассматривается как неделимое действие над БД, осмысленное с точки зрения пользователя (например, перевод денег с одного счета на другой в банковской системе). Каждый оператор в транзакции выполняет свою часть работы, но для успешного завершения всей работы в целом требуется завершение всех их операторов. СУБД должна автоматически выполнить транзакцию как единое целое.
Основные свойств транзакций:
· Атомарность –транзакция должна быть выполнена полностью или не выполнена вовсе.
· Согласованность –по мере выполнения транзакций данные переходят из одного согласованного состояния в другое, не разрушая согласованность данных.
· Изолированность – конкурирующие за доступ к базе данных транзакции физически обрабатываются последовательно, изолированно друг от друга, но для пользователей это выглядит так, как будто они выполняются параллельно.
· Долговечность –при успешном завершении транзакции, изменения в данных не могут быть потеряны.
Есливсе операторы транзакции выполнены успешно и в процессе ее выполнения не было сбоев программного или аппаратного обеспечения, транзакция фиксируется –обеспечивается запись на диск изменений в базе данных, которые были сделаны в процессе выполнения транзакции. Результаты станут видимыми другим транзакциям после того, как текущая транзакция будет зафиксирована. До этого момента данные, затрагиваемые транзакцией, будут "видны" пользователю в состоянии на начало текущей транзакции.
Откаттранзакции - действие, обеспечивающее аннулирование всех изменений данных, которые были сделаны в незавершенной транзакции. Пока транзакция не зафиксирована изменения можно аннулировать, восстановить БД в то состояние, в котором она была в начале транзакции. Если транзакцию невозможно нормально завершить, БД возвращается в исходное состояние.
Операторы COMMIT и ROLLBACK.Транзакция начинается с первого SQL-оператора. Все последующие SQL-операторы составляют тело транзакции. Способы завер