Средства языка запросов sql
Простые SQL запросы — короткая справка и примеры
Язык SQL или Structured Query Language (язык структурированных запросов) предназначен для управления данными в системе реляционных баз данных (RDBMS). В этой статье будет рассказано о часто используемых командах SQL, с которыми должен быть знаком каждый программист. Этот материал идеально подойдёт для тех, кто хочет освежить свои знания об SQL перед собеседованием на работу. Для этого разберите приведённые в статье примеры и вспомните, что проходили на парах по базам данных.
Что такое SQL
За счет того, что информация в базе данных упорядочена, разделена на определённые сущности и представлена в виде таблиц, к ней легко обратиться и найти нужную нам информацию.
И тут возникает главный вопрос: а как к ней обратиться и получить необходимую нам информацию?
Для этого должен быть специальный инструмент, и здесь к нам на помощь как раз и приходит SQL, который является тем инструментом, с помощью которого происходит манипулирование данными (создание, извлечение, удаление и т.д.) в базе данных.
SQL (Structured Query Language) — язык структурированных запросов, с помощью него пишутся специальные запросы (так называемые SQL инструкции) к базе данных с целью получения данных из базы данных или для манипулирования этими данными.
Также обязательно стоит отметить и то, что база данных, и в частности реляционная модель, основана на теории множеств, которая подразумевает объединение разных объектов в одно целое, под одним целым в базе данных как раз и имеется в виду таблица. Это важно, так как язык SQL работает именно со множеством, с набором данных, т.е. с таблицами.
Что такое СУБД
У Вас может возникнуть вопрос, если база данных это некая информация, которая хранится в таблицах, то как она выглядит физически? Как на нее посмотреть в целом?
Если очень коротко, то это просто файл, созданный в специальном формате, именно так и выглядит база данных (в большинстве случаев БД включает несколько файлов, но сейчас на этом уровне это не так важно).
Идем дальше, если база данных это файл в специальном формате, то как его создать или открыть? И тут возникает сложность, ведь просто так, без каких-либо инструментов создать такой файл, т.е. реляционную базу данных, нельзя, для этого нужен специальный инструмент, который мог бы создавать и управлять базой данных, иными словами, работать с этими файлами.
Таким инструментом как раз и выступает СУБД – это система управления базами данных, сокращенно СУБД.
Какие СУБД бывают
На самом деле, существует достаточно много различных СУБД, некоторые из них платные и стоят немалых денег, если говорить о полнофункциональных версиях, но даже у самых, так скажем, «крутых» есть бесплатные редакции, которые, кстати, отлично подходят для обучения.
Среди всех по своим возможностям и популярности можно выделить следующие системы:
Виды SQL запросов
DDL (Data Definition Language) — язык определения данных. Задачей DDL запросов является создание БД и описание ее структуры. Запросами такого вида устанавливаются правила того, в каком виде различные данные будут размещаться в БД.
DML (Data Manipulation Language) — язык манипулирования данными. В число запросов этого типа входят различные команды, используя которые непосредственно производятся некоторые манипуляции с данными. DML-запросы нужны для добавления изменений в уже внесенные данные, для получения данных из БД, для их сохранения, для обновления различных записей и для их удаления из БД. В число элементов DML-обращений входит основная часть SQL операторов.
DCL (Data Control Language) — язык управления данными. Включает в себя запросы и команды, касающиеся разрешений, прав и других настроек СУБД.
TCL (Transaction Control Language) — язык управления транзакциями. Конструкции такого типа применяют чтобы управлять изменениями, которые производятся с использованием DML запросов. Конструкции TCL позволяют нам производить объединение DML запросов в наборы транзакций.
Основные типы SQL запросов по их видам:
Простые SQL запросы
Создаём таблицу
Для того, чтобы создать таблицу в SQL, используется выражение CREATE TABLE. Он принимает в качестве параметров все колонки, которые мы хотим внести, а также их типы данных.
Давайте создадим табличку с названием “Months”, в которой будет три колонки:
Код будет выглядеть вот так:
CREATE TABLE months (id int, name varchar(10), days int);
Также, когда создаются таблицы, принято добавлять так называемый primary key. Это колонка, значения в которой уникальны. Чаще всего primary key колонкой является id, но в нашем случае это может быть и name, так как имена всех месяцев уникальны.
Ввод данных
Теперь давайте добавим пару месяцев в нашу табличку. Сделать это можно с помощью команды INSERT. Есть два разных способа использовать INSERT:
Первый способ не подразумевает указания названий колонок, а лишь принимает значения в том порядке, в котором они указаны в таблице.
INSERT INTO months VALUES (1,‘January’,31);
Первый способ короче второго, однако если в будущем мы захотим добавить дополнительные колонки, все предыдущие запросы работать не будут. Для решения данной проблемы следует использовать второй способ. Его суть в том, что перед вводом данных мы указываем названия колонок.
INSERT INTO months (id,name,days) VALUES (2,‘February’,29);
В случае, если мы не укажем одну из колонок, на её место будет записано NULL или заданное значение по умолчанию, но это уже совсем другая история.
Select
Данный запрос используется в случае, если нам нужно показать данные в таблице. Наверное, самым простым примером использования SELECT будет следующий запрос:
Результатом данного запроса будет таблица со всеми данными в таблице characters. Знак звёздочки (*) означает то, что мы хотим показать все столбцы из таблицы без исключений. Так как в базе данных обычно больше одной таблицы, нам необходимо указывать название таблицы, данные из которой мы хотим посмотреть. Сделать это мы можем, используя ключевое слово FROM.
Когда вам нужны лишь некоторые столбцы из таблицы, то вы можете указать их имена через запятую вместо звёздочки.
SELECT name, weapon FROM characters
Также иногда нам нужно отсортировать выводимые данные. Для этого мы используем ORDER BY “название столбца”. ORDER BY имеет два модификатора: ASC (по возрастанию) (по умолчанию) и DESC (по убыванию).
SELECT name, weapon FROM “characters” ORDER BY name DESC
Where
Теперь мы знаем, как показать только конкретные столбцы, но что если мы хотим включить в вывод лишь некоторые конкретные строки? Для этого мы используем WHERE. Данное ключевое слово позволяет нам фильтровать данные по определённому условию.
SELECT *
FROM characters
WHERE weapon = ‘pistol’;
И/или
К примеру, у нас есть табличка, в которой записаны данные о 4 самых продаваемых музыкальных альбомах всех времён. Давайте выведем только те, жанром которых является рок, а продажи были меньше, чем 50 миллионов копий.
SELECT *
FROM albums
WHERE genre = ‘rock’ AND sales_in_millions
Примечание: убедитесь, что используете WHERE, когда удаляете запись из таблицы. Иначе вы удалите все записи из таблицы, сами того не желая.
Удаление таблиц
Если мы хотим удалить все данные из таблицы, но при этом оставить саму таблицу, нам следует использовать команду TRUNCATE:
В случае, если мы хотим удалить саму таблицу, то нам следует использовать команду DROP:
На этой ноте мы завершаем данный SQL-туториал. Само собой, это не всё, и для полного освоения нужно ещё много изучить, однако данное вступление даст вам толчок для дальнейшего изучения.
Обзор основных SQL запросов
Каждый сайт в Интернете, любой проект, обрабатывающий значительный объем информации, вынужден хранить эту информацию в тех или иных базах данных (БД). Подавляющее большинство проектов информацию сохраняют в БД реляционного типа, делая записи в различных подобиях таблиц. Как внесение новых записей, так и обращение к имеющимся, осуществляется с благодаря использованию запросов, составляемых конструкциями SQL (structured query language) – непроцедурного декларативного языка структурированных запросов. В нашем случае это подразумевает, что, используя конструкции SQL, мы будем обращаться к БД, сообщая что нужно сделать с данными, но не указывая способ, как именно это нужно сделать.
Основываясь на указанных стандартах языка SQL, ряд организаций выпустили свои, расширенные версии стандартов указанного языка. Подобные версии иногда называют диалектами SQL.
Варианты спецификаций SQL разрабатываются компаниями и сообществами и служат, соответственно, для работы с разными СУБД (Системами Управления Базами Данных) – системами программ, заточенных под работу с продуктами из своей инфраструктуры.
Наиболее применяемые на сегодня СУБД, использующие свои стандарты (расширения) SQL:
MySQL – СУБД, принадлежащая компании Oracle.
PostgreSQL – свободная СУБД, поддерживаемая и развиваемая сообществом.
Microsoft SQL Server – СУБД, принадлежащая компании Microsoft. Применяет диалект Transact-SQL (T-SQL).
Благодаря тому, что диалекты SQL что создаются, специфицируются и используются разными организациями, имеют как общие черты, так и ряд отличий в возможностях расширений.
Общими чертами диалектов являются основные конструкции, применимые практически без отличий во многих реляционных БД. Основные отличия диалектов состоят в различиях использованных типов данных, количеством, реализацией и детальными возможностями команд. Разные диалекты применяют как разные наборы зарезервированных слов, так и разные наборы команд.
Здесь мы будем рассматривать запросы, применяя конструкции из спецификаций диалекта T-SQL.
Коснемся классификации SQL запросов.
Выделяют такие виды SQL запросов:
DDL (Data Definition Language) — язык определения данных. Задачей DDL запросов является создание БД и описание ее структуры. Запросами такого вида устанавливаются правила того, в каком виде различные данные будут размещаться в БД.
Основные типы SQL запросов по их видам:
Ниже мы рассмотрим практические примеры применения SQL запросов для взаимодействия с БД используя запросы двух категорий – DDL и DML.
Создание и настройка базы данных
Нам нужна будет для примеров БД MS SQL Server 2017 и MS SQL Server Management Studio 2017.
Рассмотрим последовательность действий того, как создать SQL запрос. Воспользовавшись Management Studio, для начала создадим новый редактор скриптов. Чтобы это сделать, на стандартной панели инструментов выберем «Создать запрос». Или воспользуемся клавиатурной комбинацией Ctrl+N.
Нажимая кнопку «Создать запрос» в Management Studio, мы открываем тестовый редактор, используя который можно производить написание SQL запросов, сохранять их и запускать.
Используем для начала простые запросы SQL, благодаря которым можно создать и настроить новую БД, чтобы получить возможность в дальнейшем с ней работать.
Создадим новую БД с именем «b_library» для библиотеки книг. Чтобы это делать наберем в редакторе такой SQL запрос:
Далее выделим введенный текст и нажмем F5 или кнопку «Выполнить». У нас создастся БД «b_library».
Все дальнейшие манипуляции мы можем провести с этой созданной нами БД. Для этого сначала подключимся к этой базе:
В БД «b_library» создадим таблицу авторов «tAuthors» с такими столбцами: AuthorId, AuthorFirstName, AuthorLastName, AuthorAge:
Заполним нашу таблицу таким авторами: Александр Пушкин, Сергей Есенин, Джек Лондон, Шота Руставели и Рабиндранат Тагор. Для этого используем такой SQL запрос:
Мы можем посмотреть в «tAuthors» записи, путем отправления в СУБД простого SQL запроса:
В нашей БД «b_library» мы создали первую таблицу «tAuthors», заполнили «tAuthors» авторами книг и теперь можем рассмотреть различные примеры SQL запросов, которыми мы сможем взаимодействовать с БД.
Примеры простых запросов SQL к базам данных.
Рассмотрим основные запросы SQL.
SELECT
1) Выведем все имеющиеся у нас БД:
2) Выведем все таблицы в созданной нами ранее БД «b_library»:
3) Выводим еще раз имеющиеся у нас записи по авторам книг из созданной выше «tAuthors»:
4) Выведем информацию о том, сколько у нас имеется записей строк в «tAuthors»:
5) Выведем из «tAuthors» две записи, начиная с четвертой. Используя ключевое слово OFFSET, пропустим первые три записи, а благодаря использованию ключевого слова FETCH – обозначим выборку только следующих 2 строк (ONLY):
6) Выведем из «tAuthors» все записи с сортировкой в алфавитном порядке по первой букве имени автора:
7) Выведем из «tAuthors» данные, предварительно по AuthorId отсортировав их по убыванию:
8) Выберем записи из «tAuthors», значение AuthorFirstName у которых соответствует имени «Александр»:
9) Выберем из «tAuthors» записи, где имя автора AuthorFirstName начинается с «се»:
10) Выберем из «tAuthors» записи, в которых имя автора (AuthorFirstName) заканчивается на «ат»:
11) Сделаем выборку всех строк из «tAuthors», значение AuthorId в которых равняется 2 или 4:
13) Проведем выборку из «tAuthors» по столбцам AuthorFirstName и AuthorLastName:
14) Получим из «tAuthors» все строки, у которых AuthorId не равняется трем:
INSERT
INSERT – это вид запроса SQL, при применении которого СУБД выполняет добавление новых записей в БД.
Добавим в «tAuthors» нового автора – Уильяма Шекспира, 51 год. Соответственно в поле AuthorFirstName добавится Уильям, в AuthorLastName добавится Шекспир, в AuthorAge – 51. В AuthorId, в нашем случае, автоматически добавится значение, инкрементированное от предыдущего на 1.
UPDATE
UPDATE – SQL запрос, позволяющий внести изменения или дописывать новую информацию в те записи, которые уже существуют.
Внесем корректировки в шестую запись (AuthorId = 6). Значения изменим для полей имени, фамилии и возраста автора.
Затем, обратимся к БД, чтобы вывести все имеющиеся записи:
Мы видим изменения информации в записи автора под номером 6.
DELETE
DELETE – SQL запрос, выполняя который в СУБД производится операция удаления определенной строки из таблицы в БД.
Обратимся к «tAuthors» с командой на удаление строки, где AuthorId = 5:
Чтобы увидеть изменения, снова обратимся к базе для вывода всех записей:
Мы видим, что запись автора под номером 5 теперь отсутствует в «tAuthors» и, соответственно, не выводится с другими записями.
DROP
DROP – ключевое слово в SQL, применяемое для удаления данных с помощью запроса. К примеру удаление некоторой таблицы из БД.
После рассмотрения ряда простых запросов к БД мы можем полностью удалить нашу таблицу «tAuthors» целиком, выполнив простой SQL запрос:
Далее рассмотрим сложные запросы SQL.
Примеры сложных запросов к базе данных MS SQL
Сложные запросы SQL представляют из себя комбинации простых запросов. Выполняясь, простые запросы возвращают сгруппированные в промежуточные таблицы наборы данных. А сложный запрос уже манипулирует данными, полученными благодаря простым «подзапросам».
Рассмотрим в SQL примеры сложных запросов.
Заполним «tBooks» такими книгами:
2) Сделаем выборку данных из «tBooks» всех книг, авторами которых являются люди, с именами «Александр» или «Сергей»:
3) Сделаем выборку по книгам из таблицы «tBooks», у которых именами авторов являются НЕ «Сергей» и НЕ «Александр»:
4) Возьмем таблицу «tBooks» и сделаем из нее выборку всех книг с указанием как имен, так и фамилий авторов этих книг из «tAuthors»:
Выводы
Мы с вами рассмотрели несколько вариантов простых и сложных SQL запросов. Конечно эту статью не стоит рассматривать ни как учебное пособие, ни как исчерпывающий перечень возможностей запросов в T-SQL, и других диалектах. Скорее ее можно считать примером SQL запросов для начинающих. Однако она может послужить для Вас отправной точкой.
Формирование запросов средствами языка SQL
Оператор SQL состоит из зарезервированных слов и из слов, определяемых пользователем. Зарезервированные слова являются постоянной частью языка SQL, имеют фиксированное значение, их нельзя разбивать на части. Слова, определяемые пользователем, представляют собой имена различных объектов базы данных и записываются в соответствии с синтаксическими правилами.
Слова в операторе располагаются строго в определённой последовательности. Имена формируются из символов алфавита, заданного стандартом языка. Разрешено использовать строчные и прописные буквы латинского алфавита (AZ, a-z), цифры (0-9) и символ подчёркивания (_). Имя может иметь длину до 128 символов, должно начинаться с буквы и не может содержать пробелы.
Большинство элементов языка нечувствительны к регистру. Язык SQL имеет свободный формат, то есть там, где допустим один пробел между элементами, разрешено ставить любое количество пробелов и пустых строк. Это позволяет SQL-операторы и их фрагменты записывать с использованием отступов и выравнивания, что облегчает чтение и понимание запросов.
Точка с запятой является стандартным разделителем, но в некоторых реализациях (в частности, в компоненте Query) разделитель в конце команды необязателен.
Набор объектов, используемых в базе данных, зависит от СУБД. К основным объектам относятся таблицы, представления, хранимые процедуры, триггеры, индексы, ключи, создаваемые пользователем функции, ограничения целостности и др.
Представлениями (просмотрами) называют виртуальные таблицы, содержимое которых определяется запросом. Подобно реальным таблицам представления содержат именованные столбцы и строки с данными. Для конечных пользователей представление выглядит как таблица, но в действительности оно только представляет данные, расположенные в одной или нескольких таблицах.
Информация, которую видит пользователь через представление, не сохраняется в базе данных как самостоятельный объект. Таблицы – на диске, представления – в оперативной памяти.
Хранимые процедуры представляют собой группу команд SQL, объединённых в один модуль. Такая группа команд компилируется и выполняется как единое целое.
Триггерами называется специальный класс хранимых процедур, автоматически запускаемых при добавлении, изменении или удалении данных из таблицы. Триггеры выполняются до или (и) после события изменения записи в таблице.
Оператор SELECT
Общая форма команды SELECT
Общая форма оператора SELECT приводится в стандартах. В более простых случаях достаточно воспользоваться только некоторыми возможностями оператора SELECT:
SELECT [DISTINCT] список_выбираемых_полей
FROM список_таблиц или представлений
[GROUP BY спецификация_группировки
[ORDER BY спецификация_сортировки];
Квадратные скобки означают необязательность использования дополнительных конструкций команды.
Простейшие конструкции языка SQL позволяют:
· назначать поля, которые должны быть выбраны;
· назначать к выборке все поля;
· управлять вертикальным и горизонтальным порядком выбираемых
· подставлять собственные заголовки полей в результирующей таблице;
· производить вычисления в списке выбираемых элементов;
· использовать литералы в списке выбираемых элементов;
· ограничивать число возвращаемых строк;
· формировать сложные условия поиска;
· устранять одинаковые строки из результата.
Поля и предложение FROM
После слова SELECT приводится список выражений, определяющий значения, формируемые запросом. В самом простом случае список выражений является списком полей таблицы.
В предложении FROM перечисляются все объекты (один или несколько), из которых производится выборка данных. Каждая таблица или представление, которые упоминаются в запросе, должны быть перечислены в предложении FROM. В простейшем случае после слова FROM записывается имя таблицы, из которой извлекаются данные. Если требуется извлечение значений всех полей, то вместо списка полей можно указать символ *. Например, чтобы получить сведения из всех полей таблицы country, надо записать:
SELECT * FROM country
Для получения данных из определённых полей используется команда, в которой после слова SELECT перечислены только нужные поля:
SELECT Last_Name,First_Name,City,Country,Phone FROM custoly
Если требуется вывести имя, фамилию, телефон, а затем другие поля, то надо просто перечислить имена полей в требуемом порядке:
SELECT First_Name,Last_Name,Phone,City,Country FROM custoly
Для уточнения объекта, которому принадлежит поле, перед именем поля указывается имя объекта. Задание составного имени имя_таблицы.имя_поля является обязательным при использовании нескольких таблиц или представлений, а также при использовании имён полей с пробелами. При задании полей, имена которых содержат пробел, надо использовать кавычки или апострофы.
Например, при выводе данных из таблицы biolife для полей Species Name и Length (cm) используются составные имена:
SELECT Category,Common_Name,biolife.»Species Name», biolife.»Length (cm)»
SELECT Category,Common_Name,biolife.’Species Name’, biolife.’Length (cm)’
biolife.’Species Name’,biolife.’Length (cm)’
Литералы
Для придания большей наглядности получаемому результату можно использовать литералы. Литералы – это строковые константы, которые применяются наряду с наименованиями столбцов и позволяют сопровождать выводимые данные пояснениями. Строковая константа записывается в кавычках или
SELECT LastName,»получает»,Salary,» в год» FROM employee
SELECT LastName,‘получает’,Salary,‘ в год’ FROM employee
К сожалению, могут возникнуть проблемы с кириллицей.
Конкатенация
Имеется возможность сцеплять данные из двух или более столбцов, имеющих строковый тип, друг с другом, а также соединять их с литералами.
Для этого используется операция конкатенации, которая задаётся двумя вертикальными чёрточками (||).
SELECT FirstName||’ ‘||LastName,HireDate FROM employee
Этот запрос выводит список сотрудников с указанием даты поступления на работу.
Использование квалификатора AS
Для придания наглядности получаемым результатам наряду с литералами в списке выбираемых элементов можно использовать квалификатор AS. Данный квалификатор заменяет в результирующей таблице существующее название поля на заданное. Таким способом можно дать название создаваемому в запросе полю (например, вычисляемому) или заменить реальное имя на другое, более простое либо более понятное пользователю.
SELECT VenueNo,Event_Name AS Name, Event_Description AS Description
SELECT VenueNo,Event_Name AS Name,
Event_Date AS events.’Date’,Event_Time AS events.’Time’
В последнем запросе вместо имён полей Event_Name, Event_Date, Event_Time для столбцов используются названия Name, Date, Time. Поскольку идентификаторы Date и Time в таблицах формата Paradox используются для задания типов данных, то при формировании названий столбцов пришлось использовать составные имена.
Предложение WHERE
Ограничения на число выводимых строк
Число возвращаемых в результате запроса строк может быть ограничено путем использования предложения WHERE, содержащего условия отбора. Так как в языке SQL применяется трёхзначная логика, то условие отбора для отдельных строк может принимать значения true, false или unknown.
Значение unknown получается при сравнении значения null c любым другим значением, включая null. Запрос возвращает в качестве результата только те строки, для которых предикат имеет значение true. При формировании условия используются следующие операции: сравнения (=, <>, >, =, ‘Canada’
Пример 5. Получить список заказчиков из US с указанием названия фирмы, города и штата:
SELECT Company,City,State FROM customer
Поле, участвующее в формировании условия, необязательно включать в перечень выводимых полей.
Операция BETWEEN
Предикат BETWEEN задает диапазон значений, для которого выражение принимает значение true. Разрешено также использовать конструкцию NOT BETWEEN.
Пример 6. Получить список сотрудников, у которых зарплата лежит в диапазоне от 25 000
SELECT LastName,FirstName,Salary FROM employee
WHERE Salary BETWEEN 25000 and 30000
Тот же запрос с использованием операторов сравнения будет выглядеть следующим образом:
SELECT LastName,FirstName,Salary FROM employee
WHERE Salary>=25000 and Salary ‘1.01.94’
SELECT FirstName,LastName,HireDate FROM employee
SELECT FirstName,LastName,HireDate FROM employee
Таблицы формата Paradox поддерживают только часть из перечисленных выше форматов. В запросах приведены варианты разрешённых форматов даты.
Пример 16. Выполнить сравнение результатов двух вариантов запроса, отличающихся только форматом записи даты.
При работе с датами часто возникают проблемы в связи с особенностями форматов записи. Следующие два примера показывают, что для получения корректного результата надо знать, в какой последовательности задаются год, месяц и день.
SELECT FirstName,LastName,HireDate FROM employee
Дата 12/30/93 означает: 12 – месяц, 30 –день, 93 – год.
Привычная форма даты 31.12.1992 означает: 31–день, 12–месяц, 1992–год. Значения дат можно сравнивать друг с другом, вычитать одну из другой.
Пример 17. Получить список служащих, проработавших на предприятии к 1/01/2000 более 8 лет:
SELECT FirstName,LastName,HireDate FROM employee
WHERE ‘1/01/2000’-HireDate > 8*365+2
Пример 18. Получить список сотрудников, поступивших на работу до 1.01.89 и после 31.12.93, то есть раньше 1989 г. и позже 1993 г.:
SELECT FirstName,LastName,HireDate FROM employee
WHERE HireDate NOT BETWEEN «1-JAN-1989» AND «31-DEC-1993»
Кроме абсолютных дат некоторые реализации языка SQL (например, InterBase) позволяют оперировать относительными значениями: yesterday (вчера), today (сегодня), now (сейчас, включая время), tomorrow (завтра).
Дата может неявно конвертироваться в строку (из строки), если строка, представляющая дату, имеет один из разрешённых форматов и выражение не содержит неоднозначностей в толковании типов столбцов.