Скачать презентацию Основы языка SQL SQL SQL DDL Скачать презентацию Основы языка SQL SQL SQL DDL

5_Основы языка SQL.ppt

  • Количество слайдов: 81

Основы языка SQL Основы языка SQL

SQL • SQL DDL - Data Definition Language • SQL DML - Data Manipulation SQL • SQL DDL - Data Definition Language • SQL DML - Data Manipulation Language

Data Manipulation Language • Основные операторы: • • • SELECT UNION INSERT UPDATE DELETE Data Manipulation Language • Основные операторы: • • • SELECT UNION INSERT UPDATE DELETE

SELECT • • SELECT [ ALL | DISTINCT ] { * | field-list } SELECT • • SELECT [ ALL | DISTINCT ] { * | field-list } [ INTO var-list ] FROM table-name [alt-name ] [, table-name [alt-name]] * [WHERE search-condition ] [GROUP BY field[ , field]* ] [HAVING search-condition ] [ORDER BY sort-criteria ] • ALL - результирующее множество строк не факторизуется (эта опция используется по умолчанию); DISTINCT - результирующее множество строк факторизуется. •

Демо-база • Демо-база •

Пример 1 • Фамилии всех студентов. • SELECT name_st FROM student Пример 1 • Фамилии всех студентов. • SELECT name_st FROM student

Пример 2 • Все сведения о студентах (все поля из таблицы student). • SELECT Пример 2 • Все сведения о студентах (все поля из таблицы student). • SELECT * FROM student

Пример 3 • Чем будут отличаться следующие запросы: • SELECT ALL sex FROM student Пример 3 • Чем будут отличаться следующие запросы: • SELECT ALL sex FROM student • и • SELECT DISTINCT sex FROM student

Агрегатные функции • Агрегатные функции •

Пример 4 • Количество записей в таблице student. • SELECT COUNT(*) FROM student Пример 4 • Количество записей в таблице student. • SELECT COUNT(*) FROM student

Пример 5 • Cредний возраст студентов (в днях). • SELECT round(avg(sysdate - bdate)) • Пример 5 • Cредний возраст студентов (в днях). • SELECT round(avg(sysdate - bdate)) • FROM student • Примечание: round, sysdate – функции не SQL, а окружения

Пример 6 • Дни рождений самого старшего и самого юного студентов. • SELECT MIN(bdate), Пример 6 • Дни рождений самого старшего и самого юного студентов. • SELECT MIN(bdate), MAX(bdate) FROM student.

Полезные функции и константы • DECODE(expression, temp 1, result 1[, temp 2, result 2[, Полезные функции и константы • DECODE(expression, temp 1, result 1[, temp 2, result 2[, …. ]], result) • NVL(expression, result) • EXTRACT([day|month|year] FROM bdate)) • NULL • TO_DATE(expression, format) • TO_CHAR(expression, format)

Пример 7 • Сумма отметок всех студентов. • SELECT SUM(NVL(mark, 0)) • FROM marks Пример 7 • Сумма отметок всех студентов. • SELECT SUM(NVL(mark, 0)) • FROM marks

Пример 8 • Про отметки – словами: • SELECT num_st, code, • DECODE(NVL(MARK, 0), Пример 8 • Про отметки – словами: • SELECT num_st, code, • DECODE(NVL(MARK, 0), • 1, ‘единица’, • 2, ‘двойка’, • 3, ‘тройка’, • 4, ‘четверка’, • 5, ‘пятерка’, • ‘отметка не определена’) • FROM marks •

Пример 9 • Студенты, у которых введен адрес. • SELECT * • FROM student Пример 9 • Студенты, у которых введен адрес. • SELECT * • FROM student • WHERE address IS NOT NULL

Упражнение 1 • Имена и телефоны всех студентов. • Select name_st, phone From students; Упражнение 1 • Имена и телефоны всех студентов. • Select name_st, phone From students; • Дубатовка 341

Упражнение 2 • Названия курсов и фамилии преподавателей. • SELECT name_c, name_t FROM course; Упражнение 2 • Названия курсов и фамилии преподавателей. • SELECT name_c, name_t FROM course; • Клочкова 341;

Упражнение 3 • Имена всех студентов с указанием тех, у кого сегодня день рождения. Упражнение 3 • Имена всех студентов с указанием тех, у кого сегодня день рождения. • SELECT name_st, • DECODE( – (extract(day From bdate) = extract(day from sysdate)) • AND – (extract(month from bdate) = extract(month from sysdate)), TRUE, ‘С днем рождения’, ‘’) congratulation • FROM student • Остроумов 341 • Примечание:

Упражнение 4 • Сколько есть групп одинаковых имен среди студентов? • Select Count(distinct name_st) Упражнение 4 • Сколько есть групп одинаковых имен среди студентов? • Select Count(distinct name_st) from student • Михайлов 341

Упражнение 5 • Какая разница в возрасте самого юного и самого старшего студента? • Упражнение 5 • Какая разница в возрасте самого юного и самого старшего студента? • Select (round((max(bdate)min(bdate))/365)) from student • Хаустова 341

Упражнение 6 • У кого день рождения ещё предстоит в этом году? • SELECT Упражнение 6 • У кого день рождения ещё предстоит в этом году? • SELECT name_st FROM student WHERE EXTRACT (month FROM bdate)*100+ EXTRACT (day FROM bdate)>= EXTRACT( month FROM sysdate)*100+ EXTRACT(day FROM sysdate) • Гордова 341

Упражнение 7 • Сколько дней осталось до дня рождения каждого студента? • SELECT DECODE(SIGN Упражнение 7 • Сколько дней осталось до дня рождения каждого студента? • SELECT DECODE(SIGN (To_DATE(EXTRACT(DAY FROM bdate) || “/” || EXTRACT (MONTH FROM BDATE) || “/” Extract(year from sysdate), “dd/mm/yyyy”) To_DATE(EXTRACT(DAY FROM sysdate) || “/” || EXTRACT (MONTH FROM sysdate) || “/” Extract(year from sysdate), “dd/mm/yyyy”)), -1, To_DATE(EXTRACT(DAY FROM bdate) || “/” || EXTRACT (MONTH FROM BDATE) || “/” Extract(year from sysdate), “dd/mm/yyyy”) To_DATE(EXTRACT(DAY FROM sysdate) || “/” || EXTRACT (MONTH FROM sysdate) || “/” Extract(year from sysdate), “dd/mm/yyyy”) + 365, To_DATE(EXTRACT(DAY FROM bdate) || “/” || EXTRACT (MONTH FROM BDATE) || “/” Extract(year

Конструкт search-condition 1. 2. 3. 4. 5. 6. 7. 8. log. expression [ NOT Конструкт search-condition 1. 2. 3. 4. 5. 6. 7. 8. log. expression [ NOT ] BETWEEN expression 1 AND expression 2 field-name IS [ NOT ] NULL field-name [ NOT ] LIKE "string" [ ESCAPE "character" ] expression [ NOT ] IN ({ value-list!SELECT-statement}) expression relation-operator ( SELECT-statement ) [NOT ] EXISTS ( SELECT-statment ) expression relation-operator { ANY | ALL | SOME } ( SELECTstatment )

Пример 10 • Вся информация о студентах, родившихся после 01. 95. • SELECT * Пример 10 • Вся информация о студентах, родившихся после 01. 95. • SELECT * FROM student • WHERE bdate > to_date(’ 01/01/1995’, ‘dd/mm/yyyy’)

Пример 11 • Фамилии студентов, родившихся в интервале от 01. 95 до 01. 98. Пример 11 • Фамилии студентов, родившихся в интервале от 01. 95 до 01. 98. • SELECT name_st • FROM student • WHERE bdate BETWEEN to_date(’ 01/01/1995’, ‘dd/mm/yyyy’) • AND to_date(’ 01/01/1998’, ’dd/mm/yyyy’)

Пример 12 • Студенты с неопределенным днем рождения (забыли ввести значение этого поля). • Пример 12 • Студенты с неопределенным днем рождения (забыли ввести значение этого поля). • SELECT name_st • FROM student WHERE bdate IS NULL

Пример 13 • Отличники (т. е. студенты, у которых любая отметка равна 5). • Пример 13 • Отличники (т. е. студенты, у которых любая отметка равна 5). • • • SELECT name_st FROM student WHERE 5 = ALL (SELECT mark FROM marks WHERE marks. num_st = student. num_st)

Упражнение 8 • • Все отметки студента с номером 55. SELECT mark FROM marks Упражнение 8 • • Все отметки студента с номером 55. SELECT mark FROM marks Where num_st = 55 Петров 341

Упражнение 9 • Фамилии и адреса студентов с номерами 23, 9996, 56, 89866, 7777. Упражнение 9 • Фамилии и адреса студентов с номерами 23, 9996, 56, 89866, 7777. • SELECT name_st, address FROM students • Where num_st IN (23, 9996, 56, 89866, 7777) • Петров 341

Упражнение 10 • Имена студентов, получивших 5. • SELECT name_st FROM students • WHERE Упражнение 10 • Имена студентов, получивших 5. • SELECT name_st FROM students • WHERE num_st IN(SELECT DISTINCT num_st FROM marks WHERE mark = 5) • Марганова 341

Упражнение 11 • Фамилии преподавателей, которые не ставили 2. • SELECT name_t FROM course Упражнение 11 • Фамилии преподавателей, которые не ставили 2. • SELECT name_t FROM course WHERE • Code NOT IN (SELECT DISTINCT code FROM marks WHERE mark = 2) • Khandygo 341

Конструкт GROUP BY • Синтаксис: • [GROUP BY field[ , field]* ] • [HAVING Конструкт GROUP BY • Синтаксис: • [GROUP BY field[ , field]* ] • [HAVING search-condition] • Семантика: факторизация по значению поля (полей)

Пример 14 • Количество студентов и студенток (или количество записей в каждой группе по Пример 14 • Количество студентов и студенток (или количество записей в каждой группе по полю sex). • SELECT sex, COUNT(*) • FROM student GROUP BY sex

Пример 15 • Номера зачеток студентов со средним баллом большим, чем 4. 5. • Пример 15 • Номера зачеток студентов со средним баллом большим, чем 4. 5. • SELECT num_st, AVG(mark) • FROM marks • GROUP BY num_st • HAVING AVG(mark) > 4. 5

Упражнение 12 • • • Сколько отметок у каждого студента? (номер студента, количество отметок) Упражнение 12 • • • Сколько отметок у каждого студента? (номер студента, количество отметок) Select num_st, count(*) From marks Group by num_st Дерипаска 545

Упражнение 13 • Имена отличников (с использованием group by). • SELECT name_st FROM student Упражнение 13 • Имена отличников (с использованием group by). • SELECT name_st FROM student • WHERE num_st in (SELECT num_st FROM marks GROUP BY num_st HAVING min(mark) = 5) • Кузенкова 545

Упражнение 14 • Для каждого кода курса выдать диапазон выставленных отметок. • SELECT name_c, Упражнение 14 • Для каждого кода курса выдать диапазон выставленных отметок. • SELECT name_c, (SELECT min(marks. mark) FROM marks WHERE course. code = marks. code), “-”, (SELECT max(marks. mark) FROM marks WHERE course. code = marks. code) FROM course Ерохин 545

Упражнение 15 • Выдать сведения об успеваемости студентов. • Например, 55 – отличник, • Упражнение 15 • Выдать сведения об успеваемости студентов. • Например, 55 – отличник, • 122 – хорошист и т. п. • SELECT num_st, DECODE(min(mark), 5, ‘отличник’, 4, ‘хорошист’, 3, ‘троечник’, 2, ‘двоечник’) • FROM marks • GROUP BY num_st

Упражнение 16 • Выдать сведения о диапазоне отметок для студентов, у которых количество отметок Упражнение 16 • Выдать сведения о диапазоне отметок для студентов, у которых количество отметок больше 10. Например, • 55 : 3 – 5 • 123: 1 – 4 SELECT num_st, “: ”, MIN(mark), “-”, MAX(mark) FROM marks GROUP BY num_st HAVING Count(*) > 10; Дубатовка 341

Конструкт FROM • Синтаксис: • FROM table-name [alt-name ] • [, table-name [alt-name]] * Конструкт FROM • Синтаксис: • FROM table-name [alt-name ] • [, table-name [alt-name]] * • Семантика: • table-name в общем случае не просто таблица, а табличное выражение.

Пример 16 • Фамилии студентов и оценки. • SELECT name_st, mark • FROM student, Пример 16 • Фамилии студентов и оценки. • SELECT name_st, mark • FROM student, marks • WHERE student. num_st = marks. num_st

Пример 17 • Фамилии студентов, оценки и названия курсов. • SELECT name_st, mark, name_c Пример 17 • Фамилии студентов, оценки и названия курсов. • SELECT name_st, mark, name_c • FROM student, marks, course • WHERE student. num_st = marks. num_st • AND marks. code = course. code

Пример 18 • Все пары: Имя студента + Название курса • SELECT student. name_st, Пример 18 • Все пары: Имя студента + Название курса • SELECT student. name_st, • course. name_c • FROM student, course • • • Иванов Алгебра Иванов Мат. Анализ Иванов История Сидоров Алгебра …

Пример 19 • Все пары - студент и студентка (вариант 1). • SELECT student_m. Пример 19 • Все пары - студент и студентка (вариант 1). • SELECT student_m. name_st, • student_f. name_st • FROM student_m, student_f • WHERE student_m. sex AND NOT student_f. sex

Пример 20 • Все пары - студент и студентка (вариант 2). • • • Пример 20 • Все пары - студент и студентка (вариант 2). • • • SELECT student_m. name_st, student_f. name_st FROM (select * from student where student. sex ) student_m, (select * from student where not student. sex ) student_f

Упражнение 17 • Названия курсов и отметки студента с номером 55. • SELECT name_c, Упражнение 17 • Названия курсов и отметки студента с номером 55. • SELECT name_c, mark • FROM courses, marks • WHERE (courses. code = marks. code AND marks. num_st = 55); • Дубатовка 341

Упражнение 18 • Названия курсов и количество 2 по соответствующим курсам. • • SELECT Упражнение 18 • Названия курсов и количество 2 по соответствующим курсам. • • SELECT name_c, SUM(DECODE(mark, 2, 1, 0)) FROM courses, marks WHERE (courses. code = marks. code) GROUP BY name_c • Клочкова 341

Упражнение 19 • Имена студентов и их средние баллы. • SELECT name_st, num_st, AVG(mark) Упражнение 19 • Имена студентов и их средние баллы. • SELECT name_st, num_st, AVG(mark) • FROM student, marks • WHERE student. num_st = marks. num_st • GROUP BY name_st, num_st; Китайгородская 341

Упражнение 20 • Краткая характеристика каждого студента. • Например, Иванов – отличник • Сидоров Упражнение 20 • Краткая характеристика каждого студента. • Например, Иванов – отличник • Сидоров – двоечник • …. • SELECT name_st, num_st, decode(min(mark), 5, “Отличник”, 4, “Хорошист”, 3, “Троечник”, “Двоечник”) • FROM student, marks • WHERE student. num_st = marks. num_st • GROUP BY name_st, num_st; • Хаустова 341

Упражнение 21 • Сколько в базе отличников, хорошистов и т. п. по Алгебре и Упражнение 21 • Сколько в базе отличников, хорошистов и т. п. по Алгебре и Геометрии? • • • SELECT status, count(*) FROM (SELECT name_st, num_st, decode(min(mark), 5, “Отличник”, 4, “Хорошист”, 3, “Троечник”, “Двоечник”) AS status FROM student, marks, courses WHERE student. num_st = marks. num_st AND (courses. name_c = “Алгебра” OR courses. name_c = “Геометрия”) AND marks. code = courses. code GROUP BY name_st, num_st) temp Group By status

Конструкт ORDER BY • Синтаксис: • ORDER BY { n | expression } { Конструкт ORDER BY • Синтаксис: • ORDER BY { n | expression } { ASC | DESC } • [, { n | expression } { ASC | DESC }] * • где n - порядковый номер поля в операторе SELECT.

Пример 21 • Фамилии студентов и оценки, упорядоченные по убыванию оценок. • SELECT name_st, Пример 21 • Фамилии студентов и оценки, упорядоченные по убыванию оценок. • SELECT name_st, mark • FROM student, marks • WHERE student. num_st = marks. num_st • ORDER BY mark DESC

Пример 22 • Фамилии студентов и оценки, упорядоченные по возрастанию имен и по убыванию Пример 22 • Фамилии студентов и оценки, упорядоченные по возрастанию имен и по убыванию оценок. • • SELECT name_st, mark FROM student, marks WHERE student. num_st = marks. num_st ORDER BY name_st ASC, mark DESC

Пример 23 • Фамилии студентов, упорядоченные по среднему баллу. • • SELECT temp. name_st, Пример 23 • Фамилии студентов, упорядоченные по среднему баллу. • • SELECT temp. name_st, avg(temp. mark) FROM (SELECT name_st, mark FROM student, marks WHERE student. num_st = marks. num_st) temp GROUP BY name_st ORDER BY 2 DESC

Полезный псевдостолбец ROWNUM • Первые три студента из лексикографически упорядоченного списка. • SELECT * Полезный псевдостолбец ROWNUM • Первые три студента из лексикографически упорядоченного списка. • SELECT * • FROM (SELECT name_st • FROM student • ORDER BY name_st) • WHERE rownum <= 3

Упражнение 23 • Фамилии студентов, упорядоченные по возрастанию даты рождения. • SELECT name_st • Упражнение 23 • Фамилии студентов, упорядоченные по возрастанию даты рождения. • SELECT name_st • FROM student • ORDER BY bdate ASC

Упражнение 24 • Названия курсов, упорядоченные по количеству полученных отметок. • SELECT name_c, COUNT(*) Упражнение 24 • Названия курсов, упорядоченные по количеству полученных отметок. • SELECT name_c, COUNT(*) • FROM courses, marks • WHERE course. code = marks. code • GROUP BY name_c • ORDER BY 2 DESC • Чернявский 341

Упражнение 25 • Первые 10 студентов (по успеваемости). • • • SELECT * FROM Упражнение 25 • Первые 10 студентов (по успеваемости). • • • SELECT * FROM (SELECT name_st, num_st, AVG(mark), SUM(mark) FROM student, marks WHERE student. num_st = marks. num_st GROUP BY name_st, num_st ORDER BY 3 DESC, 4 DESC ) • WHERE rownum <=10 • Петров 341

Упражнение 26 • Список студентов, упорядоченный по наступлению дня рождения. • SELECT name_st, 366 Упражнение 26 • Список студентов, упорядоченный по наступлению дня рождения. • SELECT name_st, 366 - (10000*(sysdate-bdate) MOD 3652425) FROM student • ORDER BY 2 • Гордова Карина 341

Оператор UNION • • • Синтаксис: SELECT-statement UNION [ ALL ] {SELECT-statement UNION-statement} [ Оператор UNION • • • Синтаксис: SELECT-statement UNION [ ALL ] {SELECT-statement UNION-statement} [ ORDER BY sort-criteria] • Семантика: • Операнды должны иметь идентичную структуру. • Результат по умолчанию факторизуется!

Пример 24 • Номера зачеток студентов, у которых есть двойки и пятерки. • SELECT Пример 24 • Номера зачеток студентов, у которых есть двойки и пятерки. • SELECT num_st FROM marks WHERE mark = 5 • UNION • SELECT num_st FROM marks WHERE mark = 2

Упражнение 27 • Сколько в базе студентов, рождения 1989, 1990 и 1991 года? • Упражнение 27 • Сколько в базе студентов, рождения 1989, 1990 и 1991 года? • select count(*) from students where • Extract(year from bdate) in (1989, 1990, 1991) • Зареченский 341

Оператор INSERT • Синтаксис: • INSERT INTO table-name [(field-list)] • {VALUES(value-list)|SELECT-statement} Оператор INSERT • Синтаксис: • INSERT INTO table-name [(field-list)] • {VALUES(value-list)|SELECT-statement}

Пример 25 • Добавление нового студента. • INSERT INTO student (num_st, name_st) • VALUES Пример 25 • Добавление нового студента. • INSERT INTO student (num_st, name_st) • VALUES (016, "Семенов")

Упражнение 27 • Добавьте в таблицу COURSE вторую часть для каждого курса (например, если Упражнение 27 • Добавьте в таблицу COURSE вторую часть для каждого курса (например, если была запись про Алгебру, добавить запись про Алгебру II). • INSERT INTO courses (code, name_c, name_t) SELECT code + (SELECT COUNT(*) FROM courses), NAME_C || ' II', NAME_T FROM courses • Остроумов 341

Оператор UPDATE • Синтаксис: • • UPDATE table-name SET field-name = { NULL | Оператор UPDATE • Синтаксис: • • UPDATE table-name SET field-name = { NULL | expression } [ , field-name = { NULL | expression }] * [WHERE search-condition ]

Пример 26 • Изменение номеров у всех студентов. • UPDATE student SET num_st = Пример 26 • Изменение номеров у всех студентов. • UPDATE student SET num_st = num_st + 100

Пример 27 • Изменение адреса у всех студентов с фамилией 'Иванов'. • UPDATE student Пример 27 • Изменение адреса у всех студентов с фамилией 'Иванов'. • UPDATE student • SET address = 'Красная пл. , дом 2' • WHERE name_st = 'Иванов'

Упражнение 28 • Добавьте к телефонам студентов префикс +7 812. • Update students set Упражнение 28 • Добавьте к телефонам студентов префикс +7 812. • Update students set phone = TO_CHAR (666666 + num_st, ‘ 9999999’) • update students set phone = '+ 7 912' || phone • Khandygo 341

Оператор DELETE • Синтаксис: • DELETE FROM table-name • [ WHERE search-condition ] Оператор DELETE • Синтаксис: • DELETE FROM table-name • [ WHERE search-condition ]

Пример 28 • Удаление записей с отметками единицами. • DELETE FROM marks WHERE mark Пример 28 • Удаление записей с отметками единицами. • DELETE FROM marks WHERE mark = 1

Пример 29 • Удаление всех записей из таблицы STUDENT. • DELETE FROM student. Пример 29 • Удаление всех записей из таблицы STUDENT. • DELETE FROM student.

Упражнение 29 • Удалите все записи о студентах-двоечниках. • DELETE FROM student WHERE num_st Упражнение 29 • Удалите все записи о студентах-двоечниках. • DELETE FROM student WHERE num_st in (SELECT num_st FROM marks WHERE mark <= 2) • DELETE FROM marks WHERE num_st in (SELECT num_st FROM marks WHERE mark <= 2) • Кузенкова 545

Data Definition Language (DDL) • Основные операторы: • • • CREATE TABLE ALTER TABLE Data Definition Language (DDL) • Основные операторы: • • • CREATE TABLE ALTER TABLE DROP TABLE CREATE VIEW DROP VIEW

Оператор CREATE TABLE • Синтаксис : • CREATE TABLE table-name • (field-name type [ Оператор CREATE TABLE • Синтаксис : • CREATE TABLE table-name • (field-name type [ options ] • [, field-name type [ options ] ] *)

Пример 30 • CREATE TABLE postgrad • ( • num_p INTEGER NOT NULL, • Пример 30 • CREATE TABLE postgrad • ( • num_p INTEGER NOT NULL, • name VARCHAR 2(32), • address VARCHAR 2(64), • bdate DATE • )

Оператор CREATE VIEW • Синтаксис: • CREATE VIEW view-name [(field-list)] • AS SELECT-statement [ Оператор CREATE VIEW • Синтаксис: • CREATE VIEW view-name [(field-list)] • AS SELECT-statement [ WITH CHECK OPTION ]

Упражнение 30 • Создайте представление <ОТЛИЧНИКИ>. Упражнение 30 • Создайте представление <ОТЛИЧНИКИ>.

Упражнение 31 • Создайте представление из фамилий студентов и среднего балла. Упражнение 31 • Создайте представление из фамилий студентов и среднего балла.

Ограничения для редактируемых VIEW • нельзя использовать конструкты DISTINCT, GROUP BY, HAVING или агрегатные Ограничения для редактируемых VIEW • нельзя использовать конструкты DISTINCT, GROUP BY, HAVING или агрегатные функции в соответствующем операторе SELECT • конструкт FROM в операторе SELECT может специфицировать только одну таблицу • нельзя использовать вложенные SELECT • если конструкт FROM специфицирует VIEW-таблицу, эта таблица должна быть, в свою очередь, редактируемой