Вставка 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