Выбор данных из таблицы по условию
Подзапросы
Расположение подзапросов в командах DML
Примеры использования подзапросов в части WHERE
Представления: пример
Представления: примеры
Обновляемые представления
Презентация "Язык запросов SQL. Введение"
Подписи к слайдам:
- Язык запросов SQL. Введение
- SQL – это структурированный язык запросов к реляционным базам данных (БД).
- SQL – декларативный язык, основанный на операциях реляционной алгебры.
- Стандарты SQL, определённые Американским национальным институтом стандартов (ANSI):
- SQL-1 (SQL/89) – первый вариант стандарта.
- SQL-2 (SQL/92) – основной расширенный стандарт.
- SQL-3 (SQL/1999, SQL/2003) – относится к объектно-реляционной модели данных.
- Подмножества языка SQL:
- DDL (Data Definition Language) – команды создания/изменения/удаления объектов базы данных (create/alter/drop);
- DML (Data Manipulation Language) – команды добавления/модификации/удаления данных (insert/update/delete), а также команда извлечения данных select;
- DCL (Data Control Language) – команды управления данными (установка/снятие ограничений целостности). Входит в подмножество DDL.
- CREATE – создание объекта.
- ALTER – изменения структуры объекта.
- DROP – удаление объекта.
- Общий вид синтаксиса команд DDL:
- create
- alter тип_объекта имя_объекта [параметры];
- drop
- CREATE TABLE [имя_схемы.]имя_таблицы
- ( имя_поля тип_данных [(размер)] [NOT NULL]
- [DEFAULT выражение]
- [ограничения_целостности_поля…]
- .,..
- [, ограничения_целостности_таблицы .,..]
- )
- [ параметры ];
- ограничения_целостности (ОЦ):
- [CONSTRAINT имя_ОЦ ] название_ОЦ [параметры]
- Символьные типы:
- CHAR [(длина)] – строка фиксированной длины.
- Длина по умолчанию – 1, максимальная длина 2000 б.
- Строка дописывается до указанной длины пробелами.
- VARCHAR2 (длина) – строка переменной длины.
- Максимальная длина 4000 б. Хранятся только значащие символы.
- Числовой тип:
- NUMBER [(точность[, масштаб])] – используется для представления
- чисел с заданной точностью.
- Точность по умолчанию 38, масштаб по умолчанию – 0.
- number(4) – числа от -999 до 9999
- number(8,2) – числа от -99999.99 до 999999.99
- DATE – дата и время с точностью до секунды. Занимает 7 байт.
- sysdate – функция получения текущих даты и времени.
- Тип date поддерживает арифметику дат:
- sysdate+1 – завтра
- (дата1 – дата2) – количество дней, прошедших между двумя датами
- (sysdate – 0.5) – 12 часов назад
- Departs – отделы, Project – проекты,
- Emp – сотрудники, Job – участие в проектах.
- Emp – сотрудники:
- tabno – табельный номер сотрудника, первичный ключ;
- name – ФИО сотрудника, обязательное поле;
- born – дата рождения сотрудника, обязательное поле;
- gender – пол сотрудника, обязательное поле;
- depno – номер отдела, обязательное поле, внешний ключ;
- post – должность сотрудника;
- salary – оклад, больше МРОТ;
- passport – серия и номер паспорта, уникальный обязательный атрибут;
- pass_date – дата выдачи паспорта, обязательное поле;
- pass_get – кем выдан паспорт, обязательное поле;
- born_seat – место рождения сотрудника;
- edu – образование сотрудника;
- special – специальность по образованию;
- diplom – номер диплома;
- phone – телефоны сотрудника;
- adr – адрес сотрудника;
- edate – дата вступления в должность, обязательное поле.
- Departs – отделы:
- did – номер отдела, первичный ключ;
- name – название отдела, обязательное поле.
- Project – проекты:
- No – номер проекта, первичный ключ;
- title – название проекта, обязательное поле;
- pro – краткое название проекта, обязательное уникальное поле;
- client – заказчик, обязательное поле;
- dbegin – дата начала выполнения проекта, обязательное поле;
- dend – дата завершения проекта, обязательное поле;
- cost – стоимость проекта, обязательное поле.
- Job – участие в проектах:
- pro – краткое название проекта, внешний ключ;
- tabNo – номер сотрудника, участвующего в проекте, внешний ключ;
- rel – роль сотрудника в проекте; может принимать одно из трех значений: 'исполнитель', 'руководитель', 'консультант'.
- Первичный ключ – комбинация полей pro и tabNo.
- Таблица «Отделы» (Depart):
- create table depart (did number(4) constraint pk_depart PRIMARY KEY,
- name varchar2(100) not null
- );
- Таблица «Сотрудники» (Emp):
- create table emp ( tabno number(6) constraint pk_emp PRIMARY KEY,
- name varchar2(100) not null,
- born date not null,
- gender char not null,
- depno number(4) not null constraint fk_depart REFERENCES depart,
- post varchar(50) not null,
- salary number(8,2) not null constraint check_sal check (salary > 4630),
- passport char(10) not null constraint passp_uniq UNIQUE,
- pass_date date not null, pass_get varchar2(100) not null,
- born_seat varchar2(100), edu varchar2(30),
- special varchar2(100), diplom varchar2(40),
- phone varchar2(30), adr varchar2(80),
- edate date not null default trunc(sysdate),
- chief number(6) constraint fk_emp REFERENCES emp
- );
- Таблица «Проекты» (Project):
- create table project (No number(5) constraint pk_project primary key,
- title varchar2(200) not null,
- pro varchar(15) not null constraint pro_uniq unique,
- client varchar(100) not null,
- dbegin date not null,
- dend date not null,
- cost number(9)
- );
- Таблица «Участие в проектах» (Job):
- create table job ( pro varchar(15) not null references project (abbr),
- tabNo number(6) not null references emp,
- rel varchar(20) default 'исполнитель',
- primary key (tabno, pro),
- check ( rel IN ('исполнитель', 'руководитель', 'консультант') )
- );
- INSERT – добавление строк в таблицу.
- Добавляет одну или несколько строк в указанную таблицу.
- UPDATE – изменение данных.
- Изменяет значения одного или нескольких полей в записях указанной таблицы.
- Можно указать условие, по которому выбираются обновляемые строки.
- Если условие не указано, обновляются все строки таблицы.
- Если ни одна строка не удовлетворяет условию, ни одна строка не будет обновлена.
- DELETE – удаление строк из таблицы.
- Удаляет одну или несколько строк из таблицы.
- Можно указать условие, по которому выбираются удаляемые строки.
- Если условие не указано, удаляются все строки таблицы.
- Если ни одна строка не удовлетворяет условию, ни одна строка не будет удалена.
- INSERT – добавление строк в таблицу:
- INSERT INTO имя_таблицы [(список_полей_таблицы)]
- { VALUES (список_выражений) | запрос };
- Примеры:
- -- Добавить в таблицу "Отделы" новую запись (все поля):
- insert into depart
- values(7, 'Договорной отдел');
- -- Добавить в таблицу "Сотрудники" новую запись (не все поля):
- insert into emp (tabno, name, born, gender, depno, passport, pass_date_pass_get,
- post, salary, phone)
- values( 301, 'САВИН АНДРЕЙ ПАВЛОВИЧ', to_date('11.07.1969', 'dd.mm.yyyy'),
- 'М', 5, '4405092876', to_date('15.02.1999', 'dd.mm.yyyy'),
- 'ОВД "Митино" г.Москвы', 'программист', 38050, '121-34-11');
- Замечание: значение по умолчанию используется только тогда, когда значение поля не вводится в явном виде.
- UPDATE – изменение данных:
- UPDATE имя_таблицы
- SET имя_поля1 = выражение1 [, имя_поля2 = выражение2,…]
- [WHERE условие];
- Примеры:
- -- Изменить статус сотрудника Бобкова Л.П., табельный номер 74, по отношению к проекту 30."Система автоматизированного управления предприятием":
- update job
- set rel = 'консультант'
- where tabno = 74 and pro = 30;
- -- Перевести сотрудника Жаринова А.В., табельный номер 68, на должность ведущего программиста и повысить оклад на три тысячи рублей:
- update emp
- set post = 'ведущий программист', salary = salary+3000
- where tabno = 68;
- DELETE – удаление строк из таблицы:
- DELETE FROM имя_таблицы
- [ WHERE условие ];
- Примеры.
- -- Удалить сведения о том, что сотрудник Афонасьев В.Н., табельный номер 147, участвует в проектах:
- delete from job
- where tabno=147;
- -- Удалить сведения о сотруднике Афонасьеве В.Н., табельный номер 147:
- delete from emp
- where tabno = 147;
- Замечание: отменить удаление данных можно командой
- ROLLBACK;
- Язык запросов SQL. Команда SELECT
- Общий синтаксис:
- SELECT [{ ALL | DISTINCT }] { список_вывода | * }
- FROM имя_таблицы1 [ алиас1 ] [, имя_таблицы2 [ алиас2 ].,..]
- [ WHERE условие_отбора_записей ]
- [ GROUP BY { имя_поля | выражение }.,.. ]
- [ HAVING условие_отбора_групп ]
- [ UNION [ALL] SELECT …]
- [ ORDER BY имя_поля1 | целое [ ASC | DESC ]
- [, имя_поля2 | целое [ ASC | DESC ].,..]];
- Примеры:
- select * from departs;
- select name, post from emp;
- Общий синтаксис списка вывода:
- [{all | distinct}] { * | выражение1 [алиас1] [, выражение2 [алиас2] .,..]}
- Список ввода находится между ключевыми словами SELECT и FROM.
- Вывести все поля всех записей из таблицы Проекты (Project):
- select * from project;
- Вывести список сотрудников с указанием их должности и № отдела:
- select depno, name, post
- from emp;
- Вывести список сотрудников с указанием их должности и зарплаты:
- select name 'ФИО', post 'Должность', salary*0.87 'Зарплата'
- from emp;
- 1. select post, salary
- from emp;
- 2. select DISTINCT post, salary
- from emp;
- 3. select DISTINCT depno, post
- from emp;
- select name 'ФИО', born 'Дата рождения', adr 'Адрес'
- from emp;
- 1. select *
- from Project
- order by dbegin;
- 2. select depno, name, post
- from emp
- order by depno, name; -- order by 1,2;
- select name 'ФИО', post 'Должность', salary 'Зарплата'
- from emp
- order by 3 DESC;
- select depno 'Номер отдела', post 'Должность', salary 'Зарплата'
- from emp
- order by 1, 3 DESC, 2;
- WHERE – содержит условия выбора отдельных записей. Условие является логическим выражением и может принимать одно из 3-х значений:
- TRUE – истина,
- FALSE – ложь,
- NULL – неизвестное, неопределённое значение (интерпретируется как ложь).
- Условие формируется путём применения различных операторов и предикатов. Операторы сравнения:
- = равно, <>, != не равно, > больше,
- >= больше или равно, <= меньше или равно, < меньше.
- Вывести список сотрудников 2-го отдела:
- select * from emp
- where depno = 2;
- Для формирования условий используются следующие логические операторы:
- AND – логическое произведение (И),
- OR – логическая сумма (ИЛИ),
- NOT – отрицание (НЕ).
- Операция И: Операция ИЛИ:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Операция НЕ:
|
|
|
|
|
|
- 1. select * from emp
- where depno = 2 AND salary > 3000 ;
- 2. select * from emp
- where born > '31/12/1979' AND sex = 'м';
- select * from emp
- where depno=2 OR depno = 5;
- select * from emp
- where (depno=2 OR depno = 5) AND salary >= 3000 ;
- select * from emp
- where NOT (depno=2 OR depno = 5);
- select *
- from project
- where dend > sysdate AND cost > 2000000;
- select *
- from emp
- where post = 'инженер' OR post = 'ведущий инженер' ;
- Задание 3:
- select *
- from emp
- where post = 'охранник' AND salary > 2000;
- Задание 1
- Задание 2
- Предикат вхождения в список значений:
- имя_поля IN ( значение1 [, значение2,... ] )
- выражение IN ( значение1 [, значение2,... ] )
- Примеры:
- select *
- from emp
- where depno IN ( 5, 8, 9 ) ;
- select *
- from emp
- where post IN ( 'инженер', 'ведущий инженер' );
- Предикат вхождения в диапазон:
- имя_поля BETWEEN минимальное_значение AND максимальное_значение
- выражение BETWEEN минимальное_значение AND максимальное_значение
- Минимальное значение должно быть меньше либо равно максимальному.
- Примеры:
- select *
- from emp
- where depno BETWEEN 2 AND 5 ;
- select *
- from emp
- where salary*0.87 BETWEEN 2000 AND 3000;
- Предикат поиска подстроки: имя_поля LIKE 'шаблон'
- Этот предикат применяется только к полям типа CHAR и VARCHAR. Возможно использование шаблонов:
- '_' – один любой символ,
- '%' – произвольное количество любых символов (в т.ч., ни одного).
- Примеры:
- 1. select * from emp
- where post LIKE '%экономист%' ;
- 2. select * from emp
- where post LIKE 'инженер_%' ;
- Предикат поиска неопределенного значения:
- значение IS [NOT] NULL
- Если значения является неопределенным (NULL), то предикат IS NULL выдаст истину, а предикат IS NOT NULL – ложь.
- Примеры:
- select *
- from emp
- where phone IS NULL ;
- select *
- from project
- where cost IS NOT NULL ;
- Задание 1:
- select *
- from emp
- where name LIKE '%ЮРИЙ%';
- Задание 3:
- select *
- from emp
- where post LIKE 'нач%отдел%';
- Задание 2:
- select *
- from project
- where cost BETWEEN 1000000 AND 2000000;
- Язык запросов SQL.
- Команда SELECT (продолжение)
- COUNT – подсчёт количества строк (значений). Применяется к записям и полям любого типа. Имеет 3 формата вызова:
- count (*) – количество строк результата;
- count (имя_поля) – количество значений указанного поля, не являющихся NULL-значениями.
- count (distinct имя_поля) – количество разных не-NULL значений
- указанного поля.
- MAX, MIN
- SUM
- AVG
- 1. select count(*)
- from emp;
- 2. select count( phone )
- from emp;
- select count (DISTINCT post)
- from emp;
- Задание: вывести количество сотрудников 6-го отдела.
- select count(*)
- from emp
- where depno = 6;
- 1. select max(cost) "Максимальная цена", min(cost) "Минимальная цена"
- from project;
- 2. select sum(salary)
- from emp
- where depno = 8;
- select avg(salary)
- from emp
- where sex = 'Ж';
- select min(dbegin), max(dend)
- from project;
- Агрегирующие функции обычно используются совместно с предложением GROUP BY.
- Например, следующая команда считает количество сотрудников по отделам:
- select depno, count(*)
- from emp
- group by depno;
- select depno, MIN(salary) minsal, MAX(salary) maxsal
- from emp
- group by depno;
- select depno, COUNT(distinct post) cnt
- from emp
- group by depno;
- select depno, SUM(salary) allsal
- from emp
- group by depno;
- select post, AVG(salary) avgsal
- from emp
- group by post;
- Правило использования GROUP BY :
- В списке вывода при использовании GROUP BY могут быть указаны только функции агрегирования, константы и поля, перечисленные в GROUP BY.
- Например, нельзя получить сведения о том, у каких сотрудников самая высокая зарплата в своём отделе с помощью такого запроса:
- select depno, name, max(salary) as max_sal
- from emp
- group by depno;
- Этот запрос синтаксически неверен!
- select depno, post, count(*), sum(salary)
- from emp
- group by depno, post;
- 2. select depno, sex, count(*)
- from emp
- group by depno, sex;
- Задание: вывести информацию о зарплате и количестве сотрудников, которые получают такую зарплату.
- select salary, count(*)
- from emp
- group by salary;
- Если необходимо вывести не все записи, полученные в результате группировки (GROUP BY), то условие на группы можно указать во фразе HAVING.
- Пример:
- select depno, count(*), 'человек(а)'
- from emp
- group by depno
- having count(*)>5;
- Правило: нельзя указывать агрегирующие функции в части WHERE –
- это синтаксическая ошибка!
- Задание: вывести список отделов, в которых средняя зарплата больше 3000
- грн.
- select depno, avg(salary)
- from emp
- group by depno
- having avg(salary) > 3000;
- Унарные операции:
- селекция
- Например:
- select *
- from emp
- where depno = 5;
- проекция
- Например:
- select distinct name, post, salary
- from emp;
- Выбор записей из указанной таблицы (from).
- Проверка для каждой записи условия отбора (where).
- Группировка полученных в результате отбора записей (group by) и вычисление для этих групп значений агрегирующих функций.
- Выбор тех групп, которые удовлетворяют условию отбора групп (having).
- Сортировка полученных записей в указанном порядке (order by).
- Извлечение из полученных записей тех полей, которые заданы в списке вывода, и формирование результирующего отношения.
- Если в части FROM указывается 2 и более таблицы, то приведенный алгоритм выполняется для декартова произведения этих таблиц.
- Язык запросов SQL.
- Команда SELECT.
- Дополнительные возможности
- В команде SELECT можно обратиться к одной и той же таблице несколько раз. А для того чтобы исключить соединение записи таблицы с самой собой в запросе на самосоединение необходимо также указывать условие типа "не равно" (<>, >, <).
- Пример использования самосоединения:
- Вывести список детей сотрудников, у которых есть младшие братья или сёстры:
- SELECT e.name, c1.name AS child1, c1.born AS born1,
- c2.name AS child2, c2.born AS born2
- FROM children c1, children c2, emp e
- WHERE c1.tabno=e.tabno -- первое условие соединения
- AND c1.tabno=c2.tabno -- второе условие соединения
- AND c1.born<c2.born -- условие исключения
- ORDER BY 1, 3;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Подзапрос – это запрос SELECT, расположенный внутри другой команды.
- Подзапросы можно разделить на следующие группы в зависимости от возвращаемых результатов:
- скалярные
- векторные
- табличные
- Подзапросы бывают:
- некоррелированные – не содержат ссылки на запрос верхнего уровня; вычисляются один раз для запроса верхнего уровня;
- коррелированные – содержат условия, зависящие от значений полей в основном запросе; вычисляются для каждой строки запроса верхнего уровня.
- Departs – отделы, Project – проекты,
- Emp – сотрудники, Job – участие в проектах.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- В команде INSERT:
- Вместо VALUES, например, добавление данных из одной таблицы в другую:
- insert into emp select * from new_emp;
- В команде UPDATE:
- в части WHERE для вычисления условий, например, повышение зарплаты на 10% всем участникам проектов:
- update emp set salary = salary*1.1
- where tabNo IN (select tabNo from job);
- в части SET для вычисления значений полей, например, повышение зарплаты на 10% за каждое участие сотрудника в проекте:
- update emp e set salary = salary*(1+(select count(*)/10 from job j
- where j.tabNo = e.tabNo) );
- В команде DELETE:
- в части WHERE для вычисления условий, например, удаление сведений об участии в закончившихся проектах:
- delete from job
- where pro IN (select pro from project where dend < sysdate);
- Чаще всего подзапрос располагается в части WHERE.
- Пример 1:
- select * from emp
- where salary > (select avg(salary) from emp);
- Пример 2. :
- select * from emp
- where salary > ALL (select avg(salary) from emp group by depno);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Выдать список сотрудников, имеющих детей:
- а) с помощью операции соединения таблиц:
- SELECT e.*
- FROM emp e, children c
- WHERE e.tabno=c.tabno;
- б) с помощью некоррелированного векторного подзапроса:
- SELECT *
- FROM emp
- WHERE tabno IN (SELECT tabno FROM children);
- в) с помощью коррелированного табличного подзапроса:
- SELECT *
- FROM emp e
- WHERE EXISTS (SELECT * FROM children c
- WHERE e.tabno=c.tabno);
- Подзапрос в части FROM.
- Например,
- select * from emp e
- where salary > (select avg(salary) from emp m
- where m.depno = e.depno);
- Это работает долго, т.к. коррелированный подзапрос вычисляется для каждой
- строки основного запроса. Можно ускорить выполнение данного запроса:
- select *
- from emp e,
- (select depno, avg(salary) sal
- from emp
- group by depno) m -- подзапрос вычисляется 1 раз
- where m.depno = e.depno
- and salary > sal;
- Подзапрос в части HAVING.
- Например,
- select depno, avg(salary) sal
- from emp
- group by depno
- having avg(salary) < (select avg(salary) from emp);
- Подзапрос в части SELECT.
- Например,
- select depno, name,
- (select count(*) from job j where j.tabno = e.tabno) cnt
- from emp e;
- Этот запрос выведет даже тех сотрудников, которые не участвуют в проектах
- (для них cnt будет равен 0).
- Назначение представлений:
- Хранение сложных запросов.
- Представление данных в виде, удобном пользователю.
- Сокрытие конфиденциальной информации.
- Предоставление дифференцированного доступа к данным.
- Создание представления выполняется командой CREATE VIEW:
- CREATE [ OR REPLACE ] VIEW <имя представления>
- [ (<список имён столбцов>) ]
- AS <запрос> [ WITH CHECK OPTION ];
- Запрос (команда SELECT), на основании которого создаётся представление, называется определяющим запросом.
- Представление (view, обзор) – это хранимый запрос, создаваемый на основе команды SELECT.
- CREATE VIEW emp_child(depno, name, child, sex, born)
- AS SELECT e.depno, e.name, c.name, c.sex, c.born
- FROM emp e, children c
- WHERE e.tabno = c.tabno;
- SELECT * FROM emp_child;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- CREATE VIEW emp2
- AS SELECT *
- FROM emp
- WHERE depno = 2;
- SELECT * FROM emp2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 1. CREATE VIEW employees
- AS SELECT tabno, depno, name, post, born, phone
- FROM emp;
- 2. CREATE VIEW pro_stat
- AS SELECT title, e.name,
- (select count(*) from job j where j.pro=p.pro and rel='исполнитель') jobs,
- (select count(*) from job j where j.pro=p.pro and rel='консультант') consult
- FROM emp e, project p, job j
- where e.tabno=j.tabno and j.pro=p.pro
- and j.rel='руководитель';
- Пример обновления базовой таблицы emp через представление emp2:
- UPDATE emp2
- SET salary = 4800.00
- WHERE tabno = '100';
- Изменения будут произведены в базовой таблице и отразятся в представлении.
- SELECT * FROM emp2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Вносимые изменения могут выйти за рамки определяющего запроса и поэтому не будут видны через представление. Необходимо указать ключевые слова WITH CHECK OPTION: тогда система отвергнет изменения, выходящие за рамки определяющего запроса.
- По стандарту SQL-2 представление не является обновляемым, если определяющий запрос:
- содержит ключевое слово DISTINCT;
- содержит множественные операции (UNION и др.);
- содержит предложение GROUP BY;
- ссылается на другое необновляемое представление;
- содержит вычисляемые выражения в списке выбора;
- выбирает данные более чем из одной таблицы.
- Оператор CASE может быть использован в одной из двух синтаксических форм записи:
- 1-я форма:
- CASE <проверяемое выражение>
- WHEN <сравниваемое выражение 1> THEN <возвращаемое значение 1>
- …
- WHEN <сравниваемое выражение N> THEN <возвращаемое значение N>
- [ELSE <возвращаемое значение>]
- END
- 2-я форма:
- CASE
- WHEN <предикат 1> THEN <возвращаемое значение 1>
- …
- WHEN <предикат N> THEN <возвращаемое значение N>
- [ELSE <возвращаемое значение>]
- END
- 1) Посчитать количество студентов дневной и вечерней формы обучения:
- create view students_number (DEPARTMENT,YEAR,DAY_FORM,EVENING_FORM) as
- select gr.department, gr.year,
- count(case when gr.study='ДНЕВНАЯ' then 1 else null end) form1,
- count(case when gr.study='ВЕЧЕРНЯЯ' then 1 else null end) form2
- from groups gr, students st
- where gr.group_code = st.group_code
- group by gr.department, gr.year, gr.study
- order by gr.department, gr.year asc;
- 2) Вывести все имеющиеся модели ПК с указанием цены. Отметить самые дорогие и самые дешевые модели.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- SELECT DISTINCT model, price,
- CASE price
- WHEN (SELECT MAX(price) FROM PC)
- THEN 'Самый дорогой'
- WHEN (SELECT MIN(price) FROM PC)
- THEN 'Самый дешевый'
- ELSE 'Средняя цена'
- END comment
- FROM PC
- ORDER BY price;
Информатика - еще материалы к урокам:
- Презентация "Базы данных. Операции реляционной алгебры"
- Презентация "Проектирование баз данных и работа с ними Веб-приложений. LINQ, ADO.NET Entities, DDD"
- Презентация "Предметная область базы данных и ее модели"
- Презентация "Основы баз даних"
- Презентация "Основы языка SQL"
- Презентация "Концепция хранилищ данных"