Вставка 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 Цена
Селекция принадлежность множеству 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 В реляционной алгебре: L ( c (R))
Агрегатные функции COUNT (Выражение) - определяет количество записей в выходном наборе; MIN/MAX (Выражение) – наименьшее/ наибольшее из множества значений; AVG (Выражение) - среднее значение. SUM (Выражение) - сумма множества значений.
Агрегирование aggregate_function ([ALL | DISTINCT] выражение) Можно использовать только после SELECT и HAVING В качестве выражения могут быть: любая константа, функция комбинация из названий столбцов, констант и функций, соединенных арифметическими или битовыми операциями.
Агрегирование без группировки SELECT COUNT(*), SUM(salary), AVG(salary) FROM emp COUNT(*) – подсчет всех строк, включая NULL Остальные функции перед вычислением отбрасывают нулевые значения. Если DISTINCT отбрасываются дубликаты
Count() nameagephone Иванов23NULL Петров23NULL Сидоров Иванов24NULL SELECT COUNT(*), COUNT(name), COUNT (DISTINCT age), COUNT(phone) FROM T1 WHERE nameСидоров 4, 3, 2, 0 T1
Агрегирование с группировкой SELECT name, AVG(age) AS avg_age FROM T1 WHERE nameСидоров GROUP BY name nameavg_age Иванов23,5 Петров23
Агрегирование с группировкой SELECT name, AVG(age) AS avg_age FROM T1 WHERE nameСидоров GROUP BY name HAVING COUNT(*)>1 nameavg_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 F S; соединение по эквивалентности R =S; естественное соединение R S; внешнее соединение R S; R S; полусоединение RFS.
Внешнее соединение JOIN: возвращает строки, когда есть хотя бы одно совпадение в обоих таблицах LEFT JOIN: возвращает строки из левой таблицы, даже если нет ни одного совпадения в правой RIGHT JOIN: возвращает строки из правой таблицы, даже если нет ни одного совпадения в левой FULL JOIN: возвращает строки из обеих таблиц
ГруппаСтудентИн_язык 101СидоровАнглийский 101ПетровНемецкий 102ИвановАнглийский 103НиколаевИспанский АудиторияИн_язык 5Английский 33Немецкий 24Французский S R
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 Французский24
FULL JOIN SELECT Группа, студент, ин_язык, аудитория FROM S FULL JOIN R ON S. Ин_язык = R. Ин_язык ГруппаСтудентИн_языкАудитория 101СидоровАнглийский5 101ПетровНемецкий33 102ИвановАнглийский5 103НиколаевИспанский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