Самоучитель. Курс SQL. Базы данных. ORACLE

Введение
Здравствуй, уважаемый читатель!
Вероятно, ты уже немного знаешь, что такое SQL и для чего он нужен. Или, по крайней мере, немного про него слышал. Скорее всего, это сейчас как раз тот навык, который тебе нужно улучшить в связи с должностью, которую ты сейчас занимаешь или которую собираешься получить. Возможно, также, что ты решил поменять что-то в своей жизни и решил попробовать себя в айти, и SQL нужен тебе как раз для этого.
В любом случае, в рамках этой книги я постараюсь максимально передать правильное понимание языка SQL и свой опыт. А начнём с тобой вообще с нуля. С самого начала. Полностью изучив книгу и проделав практические задачи, которые я подготовил для тебя, ты должен получить примерно три года мощной практики работы с базами данных при решении не только типичных, но самых изощрённых задач! Как если бы ты сам через все это прошёл, набил шишки и всему бы, в конечном итоге, научился. Понимаю, что звучит немного неправдоподобно, как книга может загрузить в тебя три года опыта? И я бы на твоём месте, вероятно, имел тень сомнения и это нормально! Но все, что я собрал здесь и в каком виде я собираюсь тебе это преподнести – это мощная программа знаний, навыки передачи которой я совершенствую уже примерно пятнадцать лет! Я научился объяснять SQL! Мои ученики, некоторые из которых только начали свой путь в айти и изначально не имели собственного опыта работы с базами данных, пройдя мой курс обучения, успешно проходили собеседования в айти компаниях по знаниям языка SQL и показывали лучшую компетентность чем даже те, кто в действительности непосредственно до собеседования уже имел опыт работы с базами данных и писал запросы. Все это так, но в действительности, дело было, конечно, в самих учениках! И я в конце говорю им об этом! И тебе говорю! Когда ты действительно готов освоить новый навык или его улучшить, то ты сделаешь это. И не важно через какой источник.
Когда человек готов – учитель найдётся!
(Поговорка)
Совсем коротко про язык SQL: что это такое, и для чего он нужен. Сейчас везде базы данных: сайты, мобильные приложения, различные CRM и ERP системы или другие системы учета, или автоматизации чего-либо, а также популярные программы вроде 1С тоже работают с базами данных. Базы данных во всех сферах нашей жизни. Вообще во всех: вся информация обрабатывается и хранится в базах данных. А SQL – это единственный (!) язык работы с базами данных! Теперь понял, что ты сейчас на пороге изучения единственного ключа, без которого невозможно войти в мир айти? Если ты уже в нем, то, вероятно, дошёл до двери, где без SQL дальше никак.
Вот я и объяснил очень кратко: SQL – это команды, с помощью которых из базы данных извлекается любая информация или кладётся туда. С помощью этих команд базы данных и создаются, и создаются объекты внутри баз данных, например, таблицы. Это было совсем общее объяснение!
Как будет проходить наш курс: вначале я более подробно расскажу, что такое SQL. Объясню, что такое база данных и что такое система управления базами данных (СУБД). Затем мы установим СУБД ORACLE на твой компьютер (или ноутбук), создадим в ней первую базу данных и загрузим в нее таблицы с тестовыми данными. Они будут необходимы для отработки практических навыков. Всего в книге 15 блоков с практическими задачами. Для некоторых задач я указал каким именно способом я предлагаю их решить, для некоторых – нет. Это значит, что жду от тебя, что ты сам выберешь оптимальный способ решения этой задачи. Звездочками отмечены задачи повышенной сложности. Их решение не обязательно. Но если ты смог решить такую задачу каким-нибудь способом, то это, разумеется, превосходно! Постарайся, пожалуйста, сначала решать практические задачи максимально самостоятельно. Так будет больше пользы! Если не будет получаться справиться с какой-либо задачей, то на следующей странице ты найдешь решение. Часто я буду не только показывать тебе ответ для самоконтроля или для понимания, как нужно было решить задачу, но буду и подробно объяснять путь решения. В любом случае, сначала максимально решай каждую задачу сам! Дай своему мозгу проложить дорогу к решению. Лучше еще раз перечитай урок или отложи решение на завтра, но по возможности, старайся решать сам. И так, урок за уроком, мы пройдем курс!
Об авторе
В каждой книге принято немного писать об авторе, чтобы было представление о том, кто её написал, об образовании и опыте автора. Поэтому ниже немного напишу о себе.
Меня зовут Илья Хохлов. Я эксперт в области информационных технологий и баз данных, предприниматель. Являюсь ведущим разработчиком программного обеспечения в собственной компании «Прайм Софт». Мы автоматизируем бизнес российских и зарубежных компаний.
Я являюсь автором курса «SQL. Базы данных. ORACLE», которому обучаю уже 15 лет.
Имею два высших образования, большой опыт работы в айти компаниях, как российских, так и зарубежных. Начал карьеру айти еще в 2005 году. Я работал программистом на последнем курсе в ВУЗе, в котором и учился, а также параллельно пробовал свои навыки преподавания айти технологий в небольшом проф. колледже, в качестве подработки. С 2006 по 2008 года работал штатным программистом в энергосбытовой сфере в Тверской области. С 2008 года по 2017 года – в двух айти-компаниях: Integrator IT и DiaSoft, и потом пять лет ведущим разработчиком в одном из лидирующих московских банков. С 2018 по 2022 года участвовал в проектах с компаниями Status Pro GmbH, Orga-Soft GmbH и MPS-Solutions в Германии.
Буду рад, если найдешь меня, также и в социальных сетях или подпишешься на мой канал в Телеграме, Youtube или Яндекс.Дзене.
Telegram, где мы решаем SQL задачи https://t.me/sql_oracle_databases
Youtube https://youtube.com/c/PrimeSoft
Яндекс.Дзен https://zen.yandex.ru/iliahohlov
1. Реляционные базы данных
Вначале, давай разберем что такое вообще база данных (сокращенно – БД). База данных – это, попросту говоря, файл, находящийся на компьютере, на сервере (на главном компьютере) или набор взаимосвязанных файлов. Пока, для простоты, будем понимать, что база данных – это некоторый файл.
Что внутри файла базы данных? В основном – таблицы с данными! Но не только. Объектами баз данных могут быть также и представления, пользователи, роли, хранимые программные объекты (триггеры, процедуры, функции), сиквенсы (счетчики) и еще много всего. Обо всем по порядку!
Итак, база данных – это файл, содержащий в себе таблицы с данными и другие объекты, необходимые для работы информационной системы (ИС). Баз данных (файлов) на одном компьютере (сервере) может быть несколько. Всеми файлами (базами данных) управляет система.
Именно с помощью системы производится чтение данных из баз данных (выбираются данные из одной или нескольких таблиц), производится изменение, добавление или удаление данных. Эта система называется Системой Управления Базами Данных (СУБД).
Никакой пользователь не может напрямую работать с файлом базы данных. Только с помощью системы он заходит в нужную базу данных, получает доступ к расположенным в ней таблицам, видит доступные ему объекты базы данных и выбирает сведения из какой–либо таблицы.
Ниже список популярных производителей Систем Управления Базами Данных:
В базах данных вся информация хранится в таблицах. Давай рассмотрим пример некоторой простой таблицы – таблицы Сотрудники:
С первого взгляда все понятно, верно? В этой таблице три столбца – ID, NAME и BIRTHDATE.
В столбце ID хранится уникальный идентификатор каждого сотрудника. Он же может являться табельным номером. У каждого сотрудника этот номер свой.
В столбце NAME хранится Фамилия Имя Отчество (ФИО) сотрудников. В компании, которую мы уже начали рассматривать в рамках наших уроков, полные однофамильцы допустимы. И чтобы различать сотрудников в кадровом, бухгалтерском и других учетах, каждому сотруднику и присваивают уникальный идентификатор (табельный номер) – столбец ID.
В столбце BIRTHDATE – дата рождения каждого сотрудника.
Столбцы таблицы в терминологии баз данных называются полями. В приведенном выше примере у таблицы Сотрудники три поля.
Строки таблицы называются ее записями. Когда мы будем писать запросы, те строки данных, которые будет возвращать запрос SELECT, тоже будут называться записями. Ты, наверняка, слышал, как общаются между собой разработчики или аналитики, пишущие запросы: «сколько записей вернул твой запрос»? Это и имелось ввиду: сколько строк данных удалось получить запросом (командой выборки данных из базы данных). У таблиц и запросов строки данных имеют еще одно название – кортежи. Этот термин был введен одним из разработчиков языка SQL, но на практике термин кортеж не прижился.
Столбец или набор столбцов, с помощью которых можно явно определить только одну строчку (запись) в таблице, называется первичным ключом (Primary Key, или сокращенно PK). В нашем примере, это специально созданный (для идентификации) столбец ID.
При проектировании системы эквайринга (приеме денежных оплат) через терминалы (которые мы можем встречать в супермаркетах или на улице) или через банк, в таблице приема платежей у каждой операции должен быть свой уникальный идентификатор (он печатается на чеке). Чтобы, в случае не зачисления средств, можно было обратиться в службу поддержки и назвать номер платежа. Хотя, современные информационные системы умеют и без того быстро находить проводившиеся оплаты с помощью номера телефона, в счет которого совершался платеж, или с помощью номера лицевого счета, который итак всегда известен плательщику.
В каждой таблице, где требуется иметь возможность сослаться на конкретную строчку таблицы (например, в таблице платежей – на конкретный платеж, в таблице клиентов – на конкретного клиента), должен быть первичный ключ.
Надеюсь, теперь стало ясно что такое первичный ключ и для чего он нужен. В большинстве случаев – это отдельный (один) столбец. Но также первичным ключом может быть два столбца (два поля)! И более. Тогда сочетание значений в этих столбцах должно быть всегда уникально в пределах целой таблицы. И сочетание значений одной строки не может повторяться для другой строки. Чтобы лучше понять для чего же такое может понадобиться, рассмотрим следующий пример.
Некоторая фирма, имеющая несколько филиалов, в конце каждого месяца собирает аналитику по деятельности компании: среднесписочная численность сотрудников в каждом филиале, общая сумма денежных поступлений и сумма денежных расходов по филиалу.
В графе ID_FILIAL указывается идентификатор филиала, по которому файл. сохраняются итоги, а в графе PERIOD указывается месяц и год, за который сохраняются итоги. Далее в столбцах AVG_PERS_COUNT, SUM_IN и SUM_OUT указывается среднее количество сотрудников, сумма поступлений и расходов, соответственно.
В нашем примере, за январь 2018 года, была внесена информация по трем филиалам. Проходит месяц и теперь вносится информация за февраль 2018.
Если смотреть значение только в графе ID_FILIAL, то мы обнаружим, что оно повторяется. Конечно, ведь данные по одному филиалу вносились каждый месяц. Значение идентификатора филиала повторяется, но в сочетании со значением столбца PERIOD – оно уникально! Со значением ID_FILIAL = 1 и PERIOD = Январь 2018 есть только одна строчка. Также как и со значением ID_FILIAL = 3 и PERIOD = Февраль 2018.
Так как при проектировании таблицы, так и задумали, что по каждому филиалу за один месяц информация будет только в одной строке, программисты установили сочетание столбцов ID_FILIAL и PERIOD первичным ключом. Это очень просто можно настроить на любой таблице и в одной из следующих глав мы рассмотрим, как это делается. Первичный ключ, если его устанавливать на таблице, помимо логики, дает еще массу преимуществ: теперь ORACLE (или другая СУБД, если ты работаешь не в ORACLE) будет контролировать, чтобы никто не смог добавить строку в таблицу с повторяющейся комбинацией ID_FILIAL и PERIOD. Кроме того, первичный ключ – это еще и самый быстрый способ получения из таблицы информации: если кто–то захочет получить сведения из таблицы по ID_FILIAL = 1 и за Апрель 2019 (например), то вне зависимости столько бы много строчек в таблице не было, СУБД сразу даст результат. Сразу – это значит за мгновение, даже если в таблице будут миллионы строк. Об оптимизации запросов, ключах и индексах у нас будет отдельная тема и мы подробно рассмотрим, как писать запросы так, чтобы они всегда быстро работали!
Теперь рассмотрим еще один термин, который нам нужно понять – внешний ключ (Foreign Key, или сокращенно FK).
В компании, базу данных которой мы рассматриваем, помимо таблицы «Сотрудники», есть еще таблица «Автомобили сотрудников».
В таблице «Автомобили сотрудников» есть 4 столбца: столбец ID – сквозной идентификатор каждого учетного автомобиля, столбец ID_PERS – идентификатор сотрудника, владельца автомобиля, столбец NOMER – государственный регистрационный номер автомобиля и столбец MARKA – марка автомобиля.
В таблице «Автомобили сотрудников» столбец ID будет являться собственным первичным ключом. А в столбце ID_PERS указаны только такие значения, которые есть в таблице «Сотрудники» в графе ID. Столбец (или набор столбцов), значения которого ссылаются на первичный ключ другой таблицы, называется внешним ключом (или foreign key, сокращенно FK). Чтобы было еще понятнее, Foreign key лучше перевести не как «внешний ключ», а как «чужой ключ», то есть ключ не своей таблицы, а другой. Стало понятнее?
Из рисунка выше видно, что Audi A4 принадлежит сотруднику с идентификатором 1, то есть Иванову Ивану. Два автомобиля BMW X3 и Ford Mondeo у сотрудника Петрова Надежда Анатольевна. Fiat Panda принадлежит Афанасию Константиновичу и т.д. Сотрудник Первый Николай Николаевич не имеет ни одного автомобиля, так как в таблице «Автомобили сотрудников» нет ни одной записи (ни одной строки), где бы в столбце ID_PERS было значение 4.
Разработчики создали в таблице «Автомобили сотрудников» столбец ID_PERS и сознательно настроили так, чтобы он был внешним ключом, то есть значения в нем могли бы быть только такими, которые есть в таблице «Сотрудники» в столбце ID. Теперь СУБД будет сама контролировать, запись с каким значением для графы ID_PERS добавляется в таблицу «Автомобили сотрудников». Чтобы нельзя было добавить строчку в таблицу, указав идентификатор владельца такого, которого нет. Это и есть главное назначение внешнего ключа.
В таблице «Автомобили сотрудников» значение графы ID_PERS ссылается на идентификатор конкретного сотрудника. По этому идентификатору всегда можно получить все сведения о сотруднике: Фамилию Имя Отчество, в каком отделе он работает, на какой должности и т.д. В базе данных еще есть много таблиц, и почти каждая из них имеет столбец, который ссылается на другую таблицу. Например, в таблице Сотрудников, помимо прочих, может быть еще и столбец, указывающий на идентификатор филиала, в котором работает сотрудник. По идентификатору филиала в таблице Филиалов можно найти конкретную строчку с названием филиала и другой сопутствующей информацией: адресом, телефоном и т.д.
В примере, который мы разобрали выше с Сотрудниками и Автомобилями сотрудников, у каждого сотрудника может быть несколько автомобилей. Может быть! А может и не одного. Но если база данных построена так, что согласно связи, одной строчке в одной таблице потенциально может относиться несколько строчек другой таблицы, то такая связь называется один–ко–многим. Еще бывают связи один–к–одному и многие–ко–многим. Немного подробнее поговорим об этом попозже.
Итак, раз в базе данных почти все таблицы как–то относятся к другим таблицам – «Автомобили сотрудников» к «Сотрудникам», «Филиалы» к «Сотрудникам» и т.д. – такую базу данных называют реляционной (от англ. relations – отношения).
Сейчас практически все базы данных имеют реляционную модель. То есть модель данных, построенную на отношениях.
2. Группы команд языка SQL
Вопрос на собеседовании „Какие команды DML Вы знаете?“ не поставит нас в тупик, а удивит: насколько простое в этой компании собеседование!
Все команды языка SQL разделяются на 4 группы:
DML (Data Manipulation Language) – язык манипуляции данными. Набор из четырех основных команд, для работы непосредственно с информацией, хранящейся в таблицах. С помощью этих команд можно: выбирать из таблицы (чтение), вставлять новые строчки с информацией в таблицу (например, добавлять новые товары в таблицу товаров, добавлять нового сотрудника в таблицу сотрудников), редактировать что–то в строчках данных и удалять строки из таблицы. Помимо этих четырех команд работы с данными, есть еще одна команда – MERGE. Это операция также добавляет строчки в таблицу, но, если записи с такими же ключевыми значениями уже в целевой таблице есть, то MERGE их обновит;
DDL (Data Definition Language) – язык определения данных. Перед тем как строчки с данными добавлять в таблицу, надо сначала создать саму таблицу в базе данных. Вот для этого и нужны команды DDL: создание таблиц и других объектов базы данных, их редактирование и удаление;
TCL (Transaction Control Language) – язык управления транзакциями;
DCL (Data Control Language) – язык контроля доступа к данным.
К группе команд DML относятся команды: SELECT – выбрать/прочитать информацию из таблицы/таблиц, INSERT – вставить новые строчки с данными, UPDATE – изменить, хранящиеся в таблице данные, команда DELETE – удалить строчки с данными, и команда MERGE – вставить/обновить данные в таблице.
К группе команд DDL относятся команды: CREATE – создание новых объектов в базе данных; ALTER – изменение уже существующих объектов, например, расширение таблицы, то есть добавление в нее столбца, для хранения новых сведений; DROP – удаление объекта из базы данных, например, таблицы целиком. Существует еще несколько команд, которые мы рассмотрим позже.
В группе команд TCL управления транзакциями всего две команды: COMMIT и ROLLBACK. Первая подтверждает проведенные изменения, а вторая откатывает. Понятие транзакций и более подробную работу с ними мы рассмотрим в отдельной главе.
К командам контроля доступа к данным DCL относятся команды: GRANT – предоставление привилегий на определенные действия к определенным объектам для определенных пользователей, ролей или для всех; REVOKE – снятие привилегий на определенные действия к определенным объектам с определенный пользователей, ролей или всех. Например, с помощью этих команд, можно дать некоторому пользователю базы данных права на вставку данных в таблицу, которую мы создали. Или, с помощью них, мы можем предоставить права, например, на чтение информации с нашей таблицы, к примеру, сразу всем. То есть к этой группе команд относятся команды, с помощью которых можно давать права на объект базы данных или наоборот, запрещать кому–то делать что–то с таблицей или другим объектом базы данных.
Контрольные вопросы №1
В этой главе мы достаточно изучили теории, хорошо разобрались с группами команд языка SQL и теперь необходимо закрепить полученные знания, чтобы четко понимать к какой группе команд относится та или иная команда. Для этого предлагаю ответить на следующие практические вопросы:
1. Какие команды DML ты запомнил?
2. Нам необходимо добавить новое лекарство в нашу базу данных в таблицу–справочник лекарственных средств. Какую команду SQL мы должны использовать? (Ответ должен быть, например, команда UPDATE или DELETE, или другая).
3. В таблице заказов необходимо отредактировать количество проданного товара для одной из покупок, сделанных минуту назад. Клиент решил купить больше товара! Необходимо изменить значение в некоторой строке. Какая команда SQL будет выполнена?
4. Для выполнения изменения законодательства нашей компании обязательно нужно будет в базе данных хранить дополнительные сведения о товарах. Для этого потребуется добавить два новых столбца в таблицу товаров. Какая команда SQL будет выполнена?
5. Необходимо удалить ошибочно заведенного клиента, то есть удалить строку из таблицы клиентов. Какая это команда SQL?
6. Необходимо для одного из клиентов в столбце «Дата закрытия» удалить дату, так как руководство приняло решение возобновить работу с клиентом. Какая команда SQL?
7. Для расширения бизнеса потребуется одна новая таблица для хранения операций по скидочным картам. Какая команда SQL должна быть выполнена чтобы создать новую таблицу в базе данных?
8. Нужно получить остаток по счету некоторого клиента. Какая команда SQL будет выполнена?
9. Необходимо вывести список последних десяти операций по счету клиента. Какая команда SQL?
10. В базе данных создали новую таблицу. Необходимо предоставить возможность выбирать данные из этой таблицы всем пользователям. Какую команду SQL необходимо выполнить, чтобы предоставить права на выполнение команды SELECT из этой новой таблицы?
Ответы на контрольные вопросы на следующей странице.
Ответы на контрольные вопросы №1
1. Какие команды DML ты запомнил?
Ответ: команды DML: SELECT, INSERT, UPDATE, DELETE и MERGE.
2. Нам необходимо добавить новое лекарство в нашу базу данных в таблицу–справочник лекарственных средств. Какую команду SQL мы должны использовать? (Ответ должен быть, например, команда UPDATE или DELETE, или другая).
Ответ: команда INSERT.
3. В таблице заказов необходимо отредактировать количество проданного товара для одной из покупок, сделанных минуту назад. Клиент решил купить больше товара! Необходимо изменить значение в некоторой строке. Какая команда SQL будет выполнена?
Ответ: команда UPDATE.
4. Для выполнения изменения законодательства нашей компании обязательно нужно будет в базе данных хранить дополнительные сведения о товарах. Для этого потребуется добавить два новых столбца в таблицу товаров. Какая команда SQL будет выполнена?
Ответ: команда ALTER.
5. Необходимо удалить ошибочно заведенного клиента, то есть необходимо будет удалить строку из таблицы клиентов. Какая это команда SQL?
Ответ: команда DELETE.
6. Необходимо для одного из клиентов в столбце «Дата закрытия» удалить дату, так как руководство приняло решение возобновить работу с клиентом. Какая команда SQL?
Ответ: UPDATE, так как это не команда удаления строки целиком, а команда изменения ее значения в определенном столбце с даты, на пустое значение.
7. Для расширения бизнеса потребуется одна новая таблица для хранения операций по скидочным картам. Какая команда SQL должна быть выполнена чтобы создать новую таблицу в базе данных?
Ответ: команда CREATE.
8. Нужно получить остаток по счету некоторого клиента. Какая команда SQL будет выполнена?
Ответ: команда SELECT.
9. Необходимо вывести список последних десяти операций по счету клиента. Какая команда SQL?
Ответ: команда SELECT.
10. В базе данных создали новую таблицу. Необходимо предоставить возможность выбирать данные из этой таблицы всем пользователям базы данных. Какую команду SQL необходимо выполнить, чтобы предоставить права на возможность выполнения команды SELECT из этой новой таблицы?
Ответ: команда GRANT.
3. Структура команды SELECT
SELECT (с англ. «выбрать») – это команда получения информации из базы данных и преобразование ее к любому удобному виду. С помощью этой команды можно выбирать данные из одной таблицы или сразу из нескольких (позже мы узнаем, что получать данные можно не только из таблиц). Получаемый результат можно сортировать, группировать, анализировать.
SELECT – это самая часто используемая команда языка SQL. С помощью нее можно получать как табличные данные (например, список клиентов с подробными сведениями о них, топ самых продаваемых товаров за прошлый год, или список доступных банковских продуктов для клиента), так и какую–либо обобщающую информацию – одним значением (например, доступный баланс на банковской карте или количество друзей друга/подруги в социальной сети, или даже оставшееся количество мест в любимом отеле на интересующую дату). Любые данные в любом виде из базы данных получает команда SELECT.
Синтаксис команды SELECT максимально прост. Чтобы выбрать какую–либо информацию из таблицы нужно написать:
Итак, чтобы выбрать информацию из некоторой таблицы, нужно написать слово SELECT, потом какие именно столбцы интересуют (через запятую), потом слово FROM и далее имя таблицы.
Любой запрос можно писать хоть весь в одну строку, хоть разбивать его на несколько строк. Если запрос получается большой и сложный, то, чтобы он был более легко читаем, его принято разбивать на несколько строк. Постепенно мы будем привыкать к хорошему стилю написания SQL–кода.
Теперь попробуем написать первую команду выборки данных:
Приведенный выше запрос выберет данные из таблицы Persons. Покажет информацию из столбцов ID и Name. Получим результат вида:
Давай выведем еще и даты рождения сотрудников:
Чтобы полученный результат SQL–запроса упорядочить по одному или нескольким столбцам (сортировка данных), нужно в предложение добавить еще блок ORDER BY (с англ. «упорядочить по»):
Выборка информации из таблицы без условий, то есть всех строк данных (!) не часто бывает нужна и поэтому, почти всегда, на выбираемые строки из таблицы накладывают условие или условия, чтобы отбирать только подходящие условиям данные. Это делается с помощью блока WHERE. Именно в блоке WHERE пишутся одно или несколько (комбинация) условий, для определения отбираемых данных. Его место в запросе SELECT:
Блок ORDER BY всегда пишется в самом конце SQL–запроса!
Если к выводимым данным необходимо добавить данные еще из другой одной или нескольких таблиц (присоединить к выводящимся данным данные из других таблиц), то после того, как мы написали слово FROM и имя основной таблицы, мы можем присоединять дополнительные таблицы с помощью слова JOIN:
Ничего себе, сколько всего, скажешь ты, как это можно все запомнить и понять?! Каждый блок мы разберем по–отдельности и каждому уделим достаточно внимания!
Но и это еще не все. Есть еще одна возможность команды SELECT – это группировка.
Получаемые данные можно группировать по одному или нескольким признакам одновременно.
Для того чтобы указать по одинаковым значениям в каком столбце необходимо данные группировать, нужно команду SELECT дополнить блоком GROUP BY (с англ. «группировать по») и затем написать имя столбца, по которому необходима группировка. И теперь все строки получаемого набора данных будут группироваться по одинаковому значению в этом столбце.
Также, может понадобиться в конце года, например, отобрать «любимых» клиентов нашей организации для того, чтобы поздравить их с наступающими праздниками и сделать некоторый приятный бонус. Любимыми являются клиенты, у которых сумма заказов за прошедший год более 500.000 рублей.
Для решения подобной задачи, вначале, из таблицы «Продаж» мы отберем все сделки за прошедший год. Для выборки данных, согласно этому условию, воспользуемся блоком WHERE. Итак, когда данные будут извлечены из таблицы, за нужный нам промежуток времени, мы можем увидеть, что ни один из единичных заказов не больше 500.000 р. То есть ни в одной полученной строке в столбце «Сумма сделки» значение не больше 500.000 р. Но, если сгруппировать полученные данные по каждому клиенту (иными словами строки с одинаковым значением Клиента слить в одну, подсчитав Сумму сделок по каждому клиенту), то может получиться, что некоторые клиенты, суммарно за год, хорошо превышают этот порог.
До выполнения группировки мы видели в полученной таблице данных каждую строчку продаж, затем мы все данные сгруппировали по клиентам и стали видеть по каждому клиенту теперь только одну строку с общим итогом по нему.
Например, все выбранные продажи «Клиенту А» сгруппировались в одну строку, подсчитав сумму продаж ему, а все продажи «Клиенту Б» в другую строку, также с итогом по нему. И так по каждому клиенту. Теперь мы видим итоги с суммами продаж за год с группировкой по клиентам. Так как «Клиент А», например, в течение года каждый месяц делал заказы на 100.000 р. Поэтому, после группировки всех сумм его заказов, мы получим 1.200.000 р (100.000 × 12 месяцев).
Подробнее про группировку и ее мощные сопутствующие возможности, мы рассмотрим в отдельной главе. У нас будет сразу несколько уроков, связанных с группировкой, чтобы хорошо разобрать эту тему.
Место слова GROUP BY в предложении SELECT:
После группировки всех продаж за год в общем отчете, тем не менее, еще остается много клиентов, которые обращались в нашу компанию один или два раза, и, что самое главное, общая сумма их заказов не превышает порог «любимых клиентов». И таких клиентов много. Руководство нашей компании не хотело бы вручную из полученных итогов отбирать «Любимых клиентов». Чтобы оставить только нужные данные на основе получаемых сгруппированных итогов, мы воспользуемся опцией «HAVING» блока GROUP BY.
Важно понять, что только после группировки по клиентам мы смогли получить итоговую сумму заказов за год по каждому клиенту (до этого мы имели изначальную таблицу, где в строках были указаны стоимости единичных сделок), и, чтобы на основе уже этой полученной суммы (сгруппированной суммы) отфильтровать результирующий набор клиентов, мы можем применить HAVING.
На собеседованиях часто можно встретить такой вопрос: в чем разница между WHERE и HAVING? И теперь мы знаем ответ: WHERE выполняет первичный отбор данных из таблицы (таблиц) (в нашем примере, мы сначала отобрали данные продаж только за прошедший год), а HAVING отсеивает уже на основе сгруппированной информации.
То есть после того, как будут получены суммы по клиентам, в результирующем наборе останутся только те клиенты, у которых эти суммы более интересующего нас значения.
Конечно, мы можем отбирать строчки из таблицы заказов тех, где «Сумма сделки» больше, например, определенной. Но у нас задача была другая. Нам необходимо было получить клиентов, сумма заказов за год которых превысила 500.000 р. Поэтому мы применили сначала WHERE, для первичного отбора строчек данных из таблицы «Заказов» тех, которые относятся к прошедшему году, и затем воспользовались группировкой GROUP BY по клиентам с подсчетом «Сумм сделок» по каждому их них с опцией HAVING, чтобы на основе сгруппированной (агрегированной, то есть обобщенной) информации сделать еще одну фильтрацию данных.
HAVING следует писать после GROUP BY:
И это уже полная структура одного предложения SELECT. Полный список ключевых слов, которые можно применять при выборке данных. Из всех перечисленных ключевых слов обязательными являются только SELECT и FROM. Запросы могут быть даже без WHERE и без сортировки – ORBER BY. Главное, что всегда нужно указывать, – это какие столбцы отбирать и откуда.
Конечно, мы будем применять еще и кейсы, и подзапросы, но это все будет строиться на основе структуры, которая приведена выше. Поэтому, ее нужно запомнить.
Для Гуру: в СУБД MS SQL Server и MySQL даже FROM не обязателен при выводе данных, но это исключение и применяется при решении специфических задач. Объясню тебе про это на уроке про псевдотаблиц.
4. Написание простых запросов получения данных
4.1. Выборка некоторых или всех столбцов из таблицы
Дорогой читатель, в начале следующей главы мы разберем как установить ORACLE и создать базу данных на своем компьютере. А также, мы познакомимся с программой SQL Developer, одним из самых распространенных средств работы с базами данных ORACLE. Пройдя по ссылке, ты скачаешь скрипт и загрузишь его в свою новую, пока пустую, базу данных. После прогрузки скрипта, у тебя появятся таблицы с тестовыми (учебными) данными. И все это за несколько простых шагов!
Теперь у тебя будет фактически подготовленное рабочее (учебное) место!
В конце каждой главы для тебя подготовлены практические задачи! Их нужно постараться сделать максимально самостоятельно. К некоторым задачам будут даваться рекомендации к выполнению, к некоторым – нет. Это значит, что их можно будет решить любым способом. Некоторые задачи можно будет решить только комбинацией методов. Большинство задач – это стандартные задачи, которые решают специалисты по SQL, а некоторые – нестандартные. С помощью них, ты научишься нестандартно и более глубоко понимать SQL. Если ты в течение часа не смог решить некоторую задачу, ее можно отложить и попробовать вернуться к ней, например, попозже или завтра! Многие мои ученики иногда так справлялись с достаточно трудными запросами, и, на второй день, почти всегда говорили, что смогли взглянуть на задачу под другим углом.
После списка задач к каждой главе ты найдешь решения к задачам. Мы подробно вместе прорешаем каждую задачу. Но не нужно этим пользоваться сразу, если у тебя не получается решить задачу. Желательно, ответами пользоваться минимум завтра. Ты получишь больше пользы, если сможете решить задачу сам, пусть и дольше.
В предыдущей главе мы рассмотрели общую структуру любого предложения SELECT. Работая постоянно с запросами, через довольно короткое время, мы запомним назначение и расположение каждого блока и еще чуть позже, будем правильно и максимально эффективно их использовать! Теперь, в качестве примеров, составим несколько простых SQL–запросов.
Напишем запрос, выбирающий сотрудников из таблицы Persons, который отображал бы их Фамилию Имя Отчество, Дату рождения и идентификатор филиала, в котором они работают. Фамилия Имя Отчество лежит в колонке NAME, Дата рождения – в колонке BIRTHDATE и идентификатор филиала – в графе FilialID:
Выполняем запрос и получаем результат:
Как видим, вывелись именно запрошенные столбцы из таблицы. И еще, первый столбец, – сквозная нумерация строк возвращаемых данных. Мы его не запрашивали нашей SQL–командой. И на самом деле, это не ORACLE нам его вернул вместе с возвращаемыми запросом данными, а сама программа через которою мы работаем в базе данных (в нашем случае программа SQL Developer) добавила нам его для удобства. Далее не будем обращать на него внимание.
Запрос вернул 21 запись (21 строку). В целях экономии места в книге, мы иногда будем отображать не все возвращаемые данные.
4.2. Использование условий при получении данных. Ключевое слово WHERE
Теперь доработаем запрос, пусть он выведет только сотрудников, где в графе FilialID равно 2:
Как видим из получаемых данных, во втором филиале у нас работает 4 сотрудника!
СУБД ORACLE, выполняя команду SELECT, выбирает для нас такие строчки из всей таблицы Persons, где в колонке FilialID значение равно двум!
Какие символы, помимо знака равно, можно использовать в условиях:
Как мы видим, если в SQL запросе нужно выбрать данные с условием на неравенство, то мы можем написать как <>, так и !=.
Следующей командой выберем сотрудников, работающих не во втором филиале:
Выведутся данные (всего 17 строк, для экономии места вот первых 10):
4.3. Сортировка данных. Блок ORDER BY
Теперь полученные данные мы можем еще и упорядочить по Фамилии Имени Отчеству. Для этого допишем блок ORDER BY.
В блоке ORDER BY (с англ. «упорядочить по») указали графу NAME, так как согласно значению в этом столбце нам необходимо было упорядочить строки. В результате получаем следующую таблицу с данными:
Как видим, строки упорядочены (отсортированы) по Фамилии Имени Отчеству. Точно также, если нам нужно было бы расставить сотрудников не в алфавитном порядке согласно их ФИО, а, например, согласно их дате рождения, то в боке ORDER BY указали бы BIRTHDATE.
Всякий раз, указывая значение столбца, по которому ведется сортировка строк, мы можем сортировать как в прямом порядке, так и в обратном. Для сортировки строк в обратном порядке нужно сразу после имени столбца написать слово DESC. И все!
Выведем сотрудников третьего филиала, упорядоченных по Фамилии Имени Отчеству в обратном порядке:
Получаем:
А теперь выведем тех же самых сотрудников, но в прямом порядке. Не в обратном! Для этого нужно просто убрать DESC. Или вместо DESC написать ASC.
ASC и DESC – это такие «флажки» для ORACLE, указывающий на то, в каком направлении требуется упорядочить данные. Если ASC после столбца не указывать, то СУБД итак поймет, что данные нужно упорядочить в прямом порядке, ведь DESC–то нету! Так как не писать ASC проще, чем писать его, его использование уходит в прошлое. Его уже почти никто не использует. Но, если Вы придете работать в компанию, которая существует уже много лет, и Вам нужно будет в рамках некоторой задачи доработать отчет, вернее его запрос, на основе которого формируются данные, и если Вы там увидите ASC, то теперь Вы будет знать, что это означает! Язык SQL, подобно любому человеческому языку, также стремится к простоте. Отбрасывая то, что можно опустить, не использовать. И при этом сохраняя однозначность выполнения.
В процессе изучения языка SQL, мы встретим еще несколько «отмирающих» слов, неиспользование которых не является ошибкой. Эти слова попросту не несут в себе дополнительного смысла, и присутствие их даёт такой же результат, как и отсутствие.
4.4. Выборка данных по нескольким условиям. Использование AND и OR. Приоритеты операторов
Теперь рассмотрим, как сочетать несколько условий в одном блоке WHERE. Выведем сотрудников, работающих в филиале 2 или 3, упорядоченных по ФИО. По сути, нужно вывести все строчки из таблицы Persons, в которых в столбце FilialID значение равно 2 или 3. Если в строчке в графе FilialID = 2 – показываем такую строку! Если 3 – тоже показываем!
Результат: