Uploaded by Искандер Хабибуллин

66-67

advertisement
-Петербург 2021г.
6.6 Проект
Select
Элементы синтаксиса:
• SELECT — список из одного или нескольких столбцов
• * используется для выбора всех столбцов.
• DISTINCT исключает повторы.
• column|expression выбирает столбец с именем или выражение.
• alias задает различные заголовки выбранным столбцам.
• FROM table указывает таблицу, содержащую данные столбцы.
2
Раздел 6, урок 6, упражнение 1. Извлечение данных с помощью
SELECT
В этом упражнении необходимо извлечь данные, хранящиеся в системе
баз данных, с помощью инструкции SELECT
Часть 1. Извлечение всех столбцов из таблицы.
Использование инструкции SELECT * дает возможность просмотреть
все данные, хранящиеся в следующих таблицах:
1. customers
2. teams
3. items
SELECT * FROM customers;
SELECT * FROM teams;
3
SELECT * FROM items;
Часть 2. Выбор определенных столбцов
1. Отобразите данные из столбцов customer number, first name, last name,
email и phone number таблицы клиентов.
2. Отобразите данные из столбцов name и number of players для каждой
команды (team).
3. Отобразите данные из столбцов name, description и category для
каждого товара (item) в таблице.
1. SELECT ctr_number, first_name, last_name, email, phone_number FROM
customers;
4
2. SELECT name, number_of_players FROM teams;
3. SELECT name, description, category FROM items;
5
Раздел 6, урок 6, упражнение 2. Извлечение данных с помощью
SELECT
В этом упражнении необходимо извлечь данные, хранящиеся в системе
баз данных, с помощью инструкции SELECT.
Часть 1. Использование арифметических операторов
1. Каждому клиенту сообщили, что он может погасить свой текущий
баланс в течение 12-месячного периода. Отобразите для клиента имя,
фамилию, текущий баланс и ежемесячный платеж (данные из столбцов first
name, last name, current balance и monthly payment).
2. OBL рассматривает возможность предоставить подарочные карты
всем клиентам на сумму 5,00, которые можно использовать для сокращения
текущего
баланса.
Напишите
запрос
для
отображения
следующей
информации о клиентах: имя, фамилия, номер клиента, текущий баланс и
значение баланса, уменьшенное на сумму подарочной карты.
3. В чем проблема с реализацией этой схемы?
1. SELECT first_name, last_name, current_balance, current_balance/12 AS
"Monthly Payment" FROM customers;
2. SELECT first_name, last_name, current_balance, current_balance -5 AS
"Without Gift Card" FROM customers;
6
3. Проблема с реализацией схемы, представленной в пункте 2 части 1
состоит в том, что клиенты, имеющие на балансе меньше 5 кредитов,
уйдут в минус.
Часть 2. Использование псевдонимов столбцов
1. Ранее был создан запрос, который отображает имя, фамилию, текущий
баланс и ежемесячный платеж для клиента. Перепишите этот запрос, чтобы
использовать First Name, Last Name, Balance и Monthly Repayments, как
псевдонимы столбцов. Псевдонимы должны отображаться именно так, как
указано (с учетом регистра).
SELECT first_name AS "First Name", last_name AS "Last Name",
current_balance AS "Balance", current_balance/12 AS "Monthly Payment" FROM
customers;
7
Часть 3. Использование строк литеральных символов
1. Напишите запрос, чтобы отобразить информацию о команде в
следующем формате:
 The Rockets team has 25 players and receives a discount of 10
percent.
 Используйте Team Information в качестве псевдонима столбца.
2. Почему не показана скидка для последней команды?
1.SELECT 'The' ||name|| 'team has' ||number_of_players|| 'players and receives
a discount of ' ||discount|| 'percent.' AS "Team Information" FROM teams;
8
2. Скидка для команды «Rovers» не показана, потому что она
отсутствует.
9
6.6 Упражнение
Упражнение 1. Управление транзакциями
Обзор
Цель этого упражнения — выполнить ряд действий с таблицами,
созданными для академической базы данных: • Выбрать все столбцы в таблице
• Выбрать определенные столбцы в таблице
Задачи
1. Создайте простой запрос для просмотра данных, вставленных в
таблицы, которые созданы для академической базы zданных.
Запрос для просмотра данных в таблице имеет вид:
SELECT * FROM .
* - означает, что необходимо вывести все столбцы. Вместо нее можно вписать
интересующие нас названия столбцов.
SELECT * FROM AD_EXAMS;
2. Создайте запрос для извлечения экзаменационных баллов, полученных
каждым учащимся за каждую попытку сдачи экзамена.
SELECT
GRADE,
COURSE_ID,
EXAM_GRADE
FROM
AD_EXAM_RESULTS;
10
3. Создайте запрос, чтобы проверить, допущен ли учащийся к экзаменам
по критерию посещаемости.
SELECT
STUDENT_ID,
SESSION_ID,
EXAM_ELIGIBILITY
FROM
AD_STUDENT_ATTENDANCE;
4. Выведите LOGIN_DATE_TIME для каждого преподавателя.
SELECT FACULTY_ID, LOG_DATE_TIME FROM
AD_FACULTY_LOGIN_DETAILS1
11
5. Выведите имя начальника подразделения для каждого подразделения.
SELECT HEAD, NAME FROM AD_DEPARTMENTS;
6. Получите идентификатор и имя каждого учащегося, соединенное с
текстом литерала. Пример: 720: FIRST NAME IS JACK
SELECT ID, 'First Name is ' || first_name AS "Name" FROM AD_STUDENTS;
12
7. Выведите все уникальные типы экзаменов из таблицы AD_EXAMS.
SELECT EXAM_TYPE FROM AD_EXAMS;
13
6.7 Проект
Элементы синтаксиса:
• WHERE ограничивает запрос строками, отвечающими условию.
• Выражение logical expression состоит из имен столбцов, числовых констант
и операторов сравнения. Оно указывает сочетание из одного или нескольких
выражений и операторов Boolean и возвращает значение TRUE, FALSE или
UNKNOWN.
Фраза
WHERE
может
сравнивать значения
в
столбцах,
литералы,
арифметические выражения или функции. Она состоит из трех элементов:
• имени столбца;
• условия сравнения;
• имени столбца, числовой константы или списка значений.
Используйте оператор Between для отображения строк на основе диапазона
значений
Используйте оператор IN для тестирования значений в списке
Используйте оператор NOT IN для тестирования значений в списке
Используйте оператор LIKE для поиска с подстановочными знаками
допустимых значений строки поиска
14
NOT изменение значения на противоположенное
Раздел 6, урок 7, упражнение 1. Ограничение данных с помощью
WHERE
В этом упражнении необходимо уточнить данные, возвращаемые при
выполнении запроса, добавив фразу WHERE в инструкцию SELECT
Часть 1. Использование фразы WHERE.
1. Использование уникального номера клиента во фразе where для
отображения всех столбцов для Maria Galant.
SELECT * FROM CUSTOMERS WHERE FIRST_NAME = 'Maria' AND
LAST_NAME = 'Galant'
15
2. Отобразите имя, фамилию и номер клиента для всех клиентов,
имеющих текущий баланс, который превышает 100. Используйте
соответствующие псевдонимы для заголовков столбцов.
SELECT
FIRST_NAME,
LAST_NAME,
CTR_NUMBER
FROM
CUSTOMERS WHERE CURRENT_BALANCE > 100;
3. Отобразите идентификатор заказа, дату и время (данные из столбцов
order id, date и time) для всех заказов, размещенных до 28 мая 2019 г.
Используйте соответствующие псевдонимы для заголовков столбцов.
SELECT ID "ORDER ID", ODR_DATE "DATE", ODR_TIME "TIME" FROM
ORDERS WHERE ODR_DATE < '28-May-2019';
16
Часть 2. Условия для диапазона: Оператор BETWEEN
1. Отобразите Inventory id, Cost и Number of units, используя соответствующие
псевдонимы, для всех товаров со стоимостью от 3,00 до 15,00.
SELECT ID "INVENTORY ID", COST, UNITS "NUMBER OF UNITS" FROM
INVENTORY_LIST WHERE COST BETWEEN 3.00 AND 15.00;
Часть 3. Условия участия: Оператор IN
Отобразите inventory id, cost и number of units, используя соответствующие
псевдонимы, для всех товаров в количестве 50, 100, 150 или 200 штук.
SELECT ID "INVENTORY ID", COST, UNITS "NUMBER OF UNITS" FROM
INVENTORY_LIST WHERE COST IN (50, 100, 150, 200);
17
Часть 4. Условия участия: Оператор NOT IN
Отобразите inventory id, cost и number of units, используя соответствующие
псевдонимы, для всех товаров, количество которых не равно 50, 100, 150 или
200.
SELECT ID "INVENTORY ID", COST, UNITS "NUMBER OF UNITS" FROM
INVENTORY_LIST WHERE COST NOT IN (50, 100, 150, 200);
Часть 5. Соответствие шаблону: Оператор LIKE
Отобразите item number и name для всех товаров, название которых
начинается с буквы g. Используйте соответствующие псевдонимы для
заголовков столбцов.
18
SELECT ITM_NUMBER "ITEM NUMBER", NAME FROM ITEMS WHERE
NAME LIKE 'g%';
Часть 6. Соответствие шаблону: Применение подстановочных знаков с
оператором LIKE
1. Отобразите item number и name для всех товаров, в названии которых
имеется строчная буква о. Используйте соответствующие псевдонимы для
заголовков столбцов.
SELECT ITM_NUMBER "ITEM NUMBER", NAME FROM ITEMS WHERE
NAME LIKE '%o%';
19
Раздел 6, урок 7, упражнение 2. Ограничение данных с помощью
WHERE
В этом упражнении необходимо уточнить данные, возвращаемые при
выполнении запроса, добавив фразу WHERE в инструкцию SELECT.
Часть 1. Использование условий NULL
1. Напишите запрос, отображающий информацию о командах, не
получающих скидку, в следующем формате: The Rovers team has 25 players and
does not receive a discount. Используйте Team Information в качестве
псевдонима столбца.
SELECT 'The ' ||NAME|| 'team has ' ||NUMBER_OF_PLAYERS|| ' players
and does not receive a discount.' AS "Team Information " FROM TEAMS
WHERE DISCOUNT IS NULL;
2. Напишите запрос, отображающий информацию только о командах,
получающих скидку, в следующем формате: The Rockets team has 25 players
and receives a discount of 10 percent. Используйте Team Information в качестве
псевдонима столбца.
SELECT 'The ' ||NAME|| 'team has ' ||NUMBER_OF_PLAYERS|| ' players
and does not receive a discount of ' || discount || 'percent.' AS "Team Information "
FROM TEAMS
WHERE DISCOUNT IS NOT NULL;
20
Часть 2. Логические операторы: AND
Напишите запрос, отображающий номер клиента, строку адреса 1 и
почтовый индекс для клиентов, проживающих в районе Старфорда (Starford)
города Ливерпуль (Liverpool). Используйте Customer Number, Street Address и
Postal Code, как псевдонимы столбцов.
SELECT CTR_NUMBER "CUSTOMER NUMBER ", ADDRESS_LINE_1
"CUSTOMER
ADDRESS",
ZIP_CODE
"
POSTAL
CODE
"
FROM
CUSTOMERS_ADDRESSES WHERE CITY = 'Liverpool';
Часть 3. Логические операторы: OR
1. Напишите запрос, отображающий номер клиента, строку адреса 1 и
почтовый индекс для клиентов, проживающих либо в Старфорде (Starford),
21
либо в Ливерпуле (Liverpool). Используйте Customer Number, Street Address и
Postal Code, как псевдонимы столбцов.
SELECT CTR_NUMBER "CUSTOMER NUMBER ", ADDRESS_LINE_1
"CUSTOMER
ADDRESS",
ZIP_CODE
"
POSTAL
CODE
"
FROM
CUSTOMERS_ADDRESSES WHERE CITY = 'Liverpool' OR CITY = 'Star';
Часть 4. Логические операторы: NOT Equal To
1. Напишите запрос, отображающий номер клиента, строку адреса 1 и
почтовый индекс для клиентов, которые не живут в Ливерпуле (Liverpool).
Используйте Customer Number, Street Address и Postal Code, как псевдонимы
столбцов.
SELECT CTR_NUMBER "CUSTOMER NUMBER ", ADDRESS_LINE_1
"CUSTOMER
ADDRESS",
ZIP_CODE
"
POSTAL
CODE
"
FROM
CUSTOMERS_ADDRESSES WHERE CITY != 'Liverpool';
22
6.7 Упражнение
Ограничение данных с помощью SELECT
Обзор Цель этого упражнения — ограничить отображаемые строки с
помощью следующих элементов:
• Фраза WHERE
• Операторы сравнения
• Логические условия с операторами AND, OR и NOT
Задачи
1. Выведите сведения о курсах для весеннего периода.
SELECT * FROM AD_COURSES WHERE SESSION_ID = 100;
2. Выведите сведения об учащихся, набравших более 95 баллов.
SELECT GRADE, EXAM_GRADE FROM AD_EXAM_RESULTS WHERE
EXAM_GRADE > 95;
23
3. Выведите сведения об учащихся, набравших от 65 до 70 баллов.
SELECT GRADE, EXAM_GRADE FROM AD_EXAM_RESULTS WHERE
EXAM_GRADE BETWEEN 65 AND 70;
4. Выведите сведения об учащихся, зарегистрированных после 01 июня 2012
года.
SELECT * FROM AD_STUDENTS WHERE REGISTRATION_YEAR > '01Jun-2012';
5. Выведите сведения о курсах для подразделений 10 и 30.
SELECT * FROM AD_COURSES WHERE DEPT_ID = 10 OR DEPT_ID = 30;
24
6. Выведите сведения об учащихся, чье имя начинается с буквы J.
SELECT * FROM AD_STUDENTS WHERE FIRST_NAME LIKE 'J%';
7. Выведите сведения об учащихся, зарегистрировавшихся на курсы 190 или
193.
SELECT STUDENT_ID, COURSE_ID FROM
AD_STUDENT_COURSE_DETAILS WHERE COURSE_ID = 190 OR
COURSE_ID = 193;
25
8. Выведите сведения о курсах, предлагаемых подразделением 30 в осеннем
периоде (Session ID 200). Изменил dept_id на 20, т.к. 30 нет в базе
SELECT * FROM AD_COURSES WHERE DEPT_ID = 20 AND SESSION_ID
= 200;
9. Выведите сведения о курсах, не предлагаемых в летний и осенний период
(Session ID 200 и 300).
26
SELECT * FROM AD_COURSES WHERE NOT SESSION_ID = 200 AND
NOT SESSION_ID = 300;
10. Выведите сведения о курсах для подразделения 20.
SELECT * FROM AD_COURSES WHERE DEPT_ID =20;
27
Openedu 12 неделя SQL Server
Возможность
отбрасывать
повторения
в
агрегатных
функциях
(например, count(distinct …)) и подзапросы.
1. Список без повторения компьютеров с двумя процессорами.
2. Список без повторения компьютеров, на которых установлены две и
более различные операционные системы
3. Список компьютеров, таких, что на компьютере ОС Windows 7 и
суммарный объем жестких дисков компьютера не превышает 500 Гб (у
компьютера может быть более 1 диска).
4. Список компьютеров и пользователей, работающих за ними.
28
5. Список без повторения пользователей, работающих только за одним
компьютером.
6. Список без повторения пользователей, работающих за всеми
компьютерами организации.
7. Список без повторения сетевых устройств (идентификатор и
название), к которым непосредственно не подключен компьютер с названием
Comp1 .
29
8. Список компьютеров, в именах которых встречается символ
подчеркивания «_».
Вывести студентов которые не сдавали курс
Выбрать курс, который не сдавали студенты
30
Openedu 12 неделя Oracle
2. Сформируйте запрос для определения номеров, фамилий,
идентификаторов должности и окладов сотрудников, руководитель которых
носит фамилию 'Mourgos' (изменил фамилию, так как не было в скрипте
фамилии «Cambrault»)
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE manager_id IN (SELECT employee_id FROM employees WHERE
last_name = 'Mourgos');
4. Используя многостолбцовый подзапрос, сформируйте запрос,
возвращающий номера, фамилии, идентификаторы должности и оклад для тех
сотрудников, чей оклад совпадает с максимальным по их должности.
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE (job_id, salary) IN (SELECT job_id, max_salary FROM jobs);
Отсутствует столбец с макс. Зарплатой в таблице employees
31
5. Создайте подзапрос для получения номеров и фамилий сотрудников,
не являющихся руководителями других сотрудников. Используйте оператор
ALL для сравнения с результатами подзапроса
7. Используйте раздел WITH при формировании запроса для
определения наименования и фондов заработной платы (суммы окладов всех
сотрудников) таких отделов, размер фондов которых больше 1/8 от общего
фонда заработной платы всей компании.
WITH
deptsal AS
(SELECT department_name, SUM(salary) sumsal
FROM employees JOIN departments USING(department_id)
32
--проводим группировку также по номеру отдела, т.к. имена отделов
потенциально
--могут быть неуникальными (на столбец department_name не
наложено ограничение UNIQUE)
GROUP BY department_id, department_name),
--общий фонд зар. платы считаем отдельно, т.к. в нём должны быть
--учтены оклады сотрудников, не приписанных к отделам
compsal AS
(SELECT SUM(salary) sumsal FROM employees)
SELECT department_name, sumsal
FROM deptsal
WHERE sumsal*8 > (SELECT sumsal FROM compsal);
8. Используя SET-оператор, создайте запрос для определения номеров и
идентификаторов должностей сотрудников, чья текущая должность совпадает
с когда-либо занимаемой им ранее. Отсортируйте результат по убыванию
номера сотрудника.
SELECT employee_id, job_id
FROM employees
INTERSECT
SELECT employee_id, job_id
33
FROM job_history
ORDER BY employee_id DESC;
9. (*немного повышенная сложность) Используя SET-оператор и
коррелированный подзапрос в разделе SELECT, создайте запрос для вывода 5
фамилий и имён всех сотрудников. Если сотрудник является руководителем
какого-либо отдела, в третьем столбце для него необходимо вывести название
этого отдела, если нет – строку «не является руководителем отдела». В
последней строке результата выведите общее количество сотрудников,
являющихся руководителями отделов.
SELECT last_name, first_name
--используем функцию NVL для преобразования неизвестного значения
(NULL),
--которое будет получено если для сотрудника не было найдено отдела,
чьим руководителем он является
--в требуемую строку
,NVL((SELECT department_name FROM departments d WHERE
e.employee_id = d.manager_id), 'не является руководителем отдела') deptname
FROM employees e
UNION ALL
34
--типы
данных
столбцов
объединяемых
запросов
должны
соответствовать
--последний столбец первого запроса содержит символьные данные,
--требуется явное преобразование типа для числовых данных,
содержащихся в последнем столбце второго запроса
SELECT
'Общее
число
',
'руководителей
отделов:',
TO_CHAR(COUNT(*))
FROM employees e JOIN departments d ON (e.employee_id =
d.manager_id);
Создайте таблицу EMP_DEPT на основе содержимого таблиц
EMPLOYEES и DEPARTMENTS. Таблица должна содержать 5 столбцов:
номер сотрудника, фамилия, номер отдела, к которому он приписан,
наименование отдела, квартал и год, в котором сотрудник был принят на
работу. Столбцы с номерами сотрудника и отдела должны иметь названия
empno и deptno соответственно, последний столбец - hire_quarter
35
36
Download