5. Select

advertisement
Вставка
INSERT INTO table
(column, column,...)
VALUES (expr, expr...)
LOAD DATA INFILE "C:\\tmp\\file.txt" INTO
TABLE table
Удаление
DELETE FROM table
WHERE (condition)
Модификация
UPDATE table
SET col_expr(s)
[WHERE condition]
SELECT
"I do not seek, I find" –
Pablo Picasso
Формат оператора SELECT
SELECT [ALL | DISTINCT ]
{*|[имя_столбца [AS новое_имя]]} [,...n]
[INTO new_table ]
FROM имя_таблицы [[AS] псевдоним] [,...n]
[WHERE <условие_поиска>]
[GROUP BY имя_столбца [,...n]]
[HAVING <критерии выбора групп>]
[ORDER BY имя_столбца [,...n]]
Обработка элементов оператора
SELECT :
• FROM – определяются имена используемых таблиц;
• WHERE – выполняется фильтрация строк объекта в
соответствии с заданными условиями;
• GROUP BY – образуются группы строк , имеющих
одно и то же значение в указанном столбце;
• HAVING – фильтруются группы строк объекта в
соответствии с указанным условием;
• SELECT – устанавливается, какие столбцы должны
присутствовать в выходных данных;
• ORDER BY – определяется упорядоченность
результатов выполнения операторов.
Пример простого запроса
SELECT
name, birth
FROM person
WHERE name=‘Анна’
SELECT *
FROM person
WHERE name=‘Анна’
Список атрибутов
SELECT
*
table.*
column1, column3
table.column1, table.column3
FROM table
Переименование атрибутов
SELECT Фирма, Фамилия+" "+
Left(Имя,1)+"."+Left(Отчество,1)+"."AS ФИО
FROM Клиент
Вычисляемые атрибуты
SELECT
name AS first_name,
getdate()-birth AS age,
zarplata*0.13 AS nalog,
‘works’ AS status
INTO new_table
FROM person
Список таблиц
SELECT
person.name, people.name
FROM
person, person AS people
WHERE
• Выражение вычисляется слева направо.
• Первыми вычисляются подвыражения в
скобках.
• Операторы NOT выполняются до
выполнения операторов AND и OR.
• Операторы AND выполняются до
выполнения операторов OR.
WHERE
• Сравнение: сравниваются результаты вычисления
одного выражения с результатами вычисления другого.
• Диапазон: проверяется, попадает ли результат
вычисления выражения в заданный диапазон
значений.
• Принадлежность множеству: проверяется,
принадлежит ли результат вычислений выражения
заданному множеству значений.
• Соответствие шаблону: проверяется, отвечает ли
некоторое строковое значение заданному шаблону.
• Значение NULL: проверяется, содержит ли данный
столбец определитель NULL (неизвестное значение).
Селекция
сравнение
SELECT Название, Цена
FROM Товар
WHERE Цена>=100 AND Цена<=150
диапазон
SELECT Название, Цена
FROM Товар
WHERE Цена BETWEEN 100 AND 150
Селекция
принадлежность множеству
SELECT Фамилия, Город
FROM Клиент
WHERE Город IN ("Москва", "Самара")
Селекция
поиск по образцу
• Символ % – вместо этого символа может быть
подставлено любое количество произвольных
символов.
• Символ _ заменяет один символ строки.
• [] – вместо символа строки будет подставлен
один из возможных символов, указанный в
этих ограничителях.
• [^] – вместо соответствующего символа строки
будут подставлены все символы, кроме
указанных в ограничителях.
Селекция
поиск по образцу
SELECT Клиент.Фамилия, Клиент.Телефон
FROM Клиент
WHERE Клиент.Телефон Like "_4%"
SELECT Клиент.Фамилия, Клиент.Телефон
FROM Клиент
WHERE Клиент.Телефон Like "_[24]%«
Селекция
пустое значение
SELECT Фамилия, Телефон
FROM Клиент
WHERE Телефон Is Null
SELECT Клиент.Фамилия, Клиент.Телефон
FROM Клиент
WHERE Клиент.Телефон Is Not Null
Реляционные операции в SQL:
проекция/селекция
SELECT L
FROM R
WHERE C
В реляционной алгебре:
 (c(R))
L
Агрегатные функции
• COUNT (Выражение) - определяет
количество записей в выходном наборе;
• MIN/MAX (Выражение) – наименьшее/
наибольшее из множества значений;
• AVG (Выражение) - среднее значение.
• SUM (Выражение) - сумма множества
значений.
Агрегирование
• aggregate_function ([ALL | DISTINCT]
выражение)
• Можно использовать только после SELECT и
HAVING
• В качестве выражения могут быть:
любая константа,
функция
комбинация из названий столбцов, констант и
функций, соединенных арифметическими или
битовыми операциями.
Агрегирование
без группировки
SELECT COUNT(*), SUM(salary), AVG(salary)
FROM emp
• COUNT(*) – подсчет всех строк, включая NULL
• Остальные функции перед вычислением
отбрасывают нулевые значения. Если DISTINCT
 отбрасываются дубликаты
Count()
T1
name
age
phone
Иванов
23
NULL
Петров
23
NULL
Сидоров
25
777-77-77
Иванов
24
NULL
NULL
NULL
NULL
SELECT COUNT(*), COUNT(name), COUNT (DISTINCT age),
COUNT(phone)
FROM T1
WHERE name’Сидоров’
4, 3, 2, 0
Агрегирование
с группировкой
SELECT name, AVG(age) AS avg_age
FROM T1
WHERE name’Сидоров’
GROUP BY name
name
avg_age
Иванов
23,5
Петров
23
Агрегирование
с группировкой
SELECT name, AVG(age) AS avg_age
FROM T1
WHERE name’Сидоров’
GROUP BY name
HAVING COUNT(*)>1
name
avg_age
Иванов
23,5
Агрегирование
с группировкой
T (курс, группа, фамилия, ср_балл)
SELECT курс, группа, AVG(ср_балл)
FROM T
GROUP BY курс, группа
HAVING MIN(ср_балл) >= 4
Вложенные запросы
• Если список в предложении SELECT
содержит итоговые функции, а в тексте
запроса отсутствует фраза GROUP BY,
обеспечивающая объединение данных в
группы, то ни один из элементов списка
предложения SELECT не может включать
каких-либо ссылок на поля, за
исключением ситуации, когда поля
выступают в качестве аргументов итоговых
функций.
Вложенные запросы
SELECT фамилия, Max(ср_балл)
FROM T
Вложенные запросы
SELECT фамилия, ср_балл
FROM T
WHERE ср_балл =(SELECT Max(ср_балл) FROM T)
Вложенные запросы
SELECT курс, группа, AVG(ср_балл)
FROM T
GROUP BY курс, группа
HAVING AVG(ср_балл)>(SELECT AVG(ср_балл)
FROM T)
Сортировка
SELECT
*
FROM emp
ORDER BY name [ASC | DESC]
Реляционные операции в
SQL:произведение
SELECT
*
FROM
person, dept
Операции соединения в SQL
SELECT
*
FROM emp, dept
WHERE emp.dno = dept.dno
SELECT
*
FROM
Emp JOIN dept
ON emp.dno=dept.dno
Внешнее соединение
SELECT
*
FROM имя_таблицы_1 {INNER | LEFT | RIGHT}
JOIN имя_таблицы_2
ON условие_соединения
Внешнее соединение
SELECT
*
FROM имя_таблицы_1 {INNER | LEFT | RIGHT|FULL}
JOIN имя_таблицы_2
ON условие_соединения
Различные типы операций соединения:
• тета-соединение R FS;
• соединение по эквивалентности R  =S;
• естественное соединение R  S;
• внешнее соединение R  S; R  S;
• полусоединение RFS.
Внешнее соединение
• JOIN: возвращает строки, когда есть хотя бы
одно совпадение в обоих таблицах
• LEFT JOIN: возвращает строки из левой таблицы,
даже если нет ни одного совпадения в правой
• RIGHT JOIN: возвращает строки из правой
таблицы, даже если нет ни одного совпадения в
левой
• FULL JOIN: возвращает строки из обеих таблиц
Группа Студент
Ин_язык
Аудитория
Ин_язык
101
Сидоров
Английский
5
Английский
101
Петров
Немецкий
33
Немецкий
102
Иванов
Английский
24
Французский
103
Николаев
Испанский
R
S
INNER JOIN
SELECT
Группа, студент, ин_язык, аудитория
FROM S
JOIN R
ON S. Ин_язык = R. Ин_язык
Группа Студент
Ин_язык
Аудитория
101
Сидоров
Английский
5
101
Петров
Немецкий
33
102
Иванов
Английский
5
LEFT JOIN
SELECT
Группа, студент, ин_язык, аудитория
FROM S
LEFT JOIN R
ON S. Ин_язык = R. Ин_язык
Группа Студент
Ин_язык
Аудитория
101
Сидоров
Английский
5
101
Петров
Немецкий
33
102
Иванов
Английский
5
103
Николаев
Испанский
NULL
RIGHT JOIN
SELECT
Группа, студент, ин_язык, аудитория
FROM S
RIGHT JOIN R
ON S. Ин_язык = R. Ин_язык
Группа Студент
Ин_язык
Аудитория
101
Сидоров
Английский
5
101
Петров
Немецкий
33
102
Иванов
Английский
5
NULL
NULL
Французский 24
FULL JOIN
SELECT
Группа, студент, ин_язык, аудитория
FROM S
FULL JOIN R
ON S. Ин_язык = R. Ин_язык
Группа
Студент
Ин_язык
Аудитория
101
Сидоров
Английский
5
101
Петров
Немецкий
33
102
Иванов
Английский
5
103
Николаев
Испанский
NULL
NULL
NULL
Французский
24
Вложенные подзапросы в
предикатах
IN, NOT IN, EXISTS, NOT EXISTS, = ANY, = ALL
Полусоединение:
SELECT *
FROM R
WHERE ин_язык IN (
SELECT ин_язык FROM S)
SELECT *
FROM R
WHERE EXISTS(
SELECT ин_язык FROM S WHERE ин_язык =R. ин_язык)
EXISTS
T (курс, группа, фамилия, ср_балл)
SELECT курс, группа
FROM T
WHERE NOT EXISTS
(SELECT курс, группа
FROM T AS T1
WHERE T1.курс= T.курс AND T1.группа= T.группа AND
ср_балл = 5 );
Результат – группы, в которых нет ни одного отличника
Теоретико-множественные
операции
•
•
•
•
UNION
INTERSECT
MINUS/EXCEPT
При этом отношения должны быть
совместимы, т.е. иметь одинаковое
количество полей с совпадающими типами
данных.
Теоретико-множественные
операции
SELECT
*
FROM emp
WHERE birthdate< ‘1990’
UNION
SELECT * from emp
WHERE dno=112
Встроенные функции
•Арифметические, тригонометрические
•Функции над строками
•Явное преобразование типов данных
•Календарная арифметика
•Обработка неопределенных значений
•Получение системной информации (дата,
время, идентификатор строки таблицы,…)
Операторы обновления данных
Операции DML:
–INSERT
–UPDATE
–DELETE
Операции DDL не являются операциями
обновления:
–CREATE
–DROP
–ALTER
Добавление данных
•По одной строке:
INSERT INTO t_person(список колонок)
VALUES(список скалярных значений)
•Множественное добавление:
INSERT into t_person(список колонок)
SELECT …
FROM …
WHERE …
Создание представлений
CREATE VIEW view1 AS
SELECT КодКлиента, Фамилия, ГородКлиента
FROM Клиент
WHERE ГородКлиента='Москва‘
SELECT * FROM view1
INSERT INTO view1 VALUES (12,'Петров', 'Самара')
Деление отношений
S (name, course) C (course)
CREATE VIEW S1 AS
SELECT name
FROM S
CREATE VIEW S2 AS
SELECT name, course
FROM S, C
Деление отношений
S (name, course)
C (course)
CREATE VIEW S3 AS
SELECT * FROM S2
EXEPT SELECT * FROM S
CREATE VIEW S4 AS
SELECT name FROM S
EXEPT SELECT name FROM S3
Download