Язык SQL. Курс «Введение в реляционные базы данных»
SQL – это язык программирования декларативного типа. В отличие от привычных нам процедурных языков, в которых есть условия, циклы и функции, в декларативных языках подобных алгоритмических конструкций почти нет. Декларативные выражения представляют собой скорее запросы, описание того, что хочет получить человек.
В случае SQL человек формулирует запрос на извлечение или модификацию данных, а алгоритм его выполнения почти полностью ложится на плечи конкретной СУБД. Хотя если один и тот же результат может быть получен с помощью разных запросов, программисту лучше выбрать тот, который создаст меньшую нагрузку на СУБД. То есть программисту желательно иметь представление о том, как работает СУБД.
Запрос производится к таблицам базы данных, результатом обработки запроса также является таблица, которую при желании можно сохранить.
Язык SQL предназначен для создания и изменения реляционных баз данных, а также извлечения из них данных.
Однако в процессе развития языка SQL в нем появились новые средства. Стало возможно описывать и хранить такие объекты как индексы, представления, триггеры и процедуры. То есть в современных диалектах SQL есть элементы процедурных языков.
Язык SQL и СУБД обычно не используются сами по себе, а выполняют функцию промежуточного встроенного компонента, обеспечивающего связь между прикладным ПО или программой, которую пишет программист, и базой данных. В языках программирования существуют свои библиотеки, обеспечивающие API для различных СУБД.
Сам язык SQL состоит из операторов, инструкций и вычисляемых функций. Зарезервированные слова, которыми обычно выступают операторы, принято писать заглавными буквами. Однако написание их не прописными, а строчными буквами к ошибке не приводит.
Операторы делятся на:
операторы определения данных (Data Definition Language, DDL)
CREATE создаёт объект БД (базу данных, таблицу, представление, пользователя и т. д.)
ALTER изменяет объект
DROP удаляет объект
операторы манипуляции данными (Data Manipulation Language, DML)
SELECT выбирает данные, удовлетворяющие заданным условиям
INSERT добавляет новые данные
UPDATE изменяет существующие данные
DELETE удаляет данные
операторы определения доступа к данным (Data Control Language, DCL)
GRANT предоставляет пользователю или группе разрешения на определённые операции с объектом
REVOKE отзывает ранее выданные разрешения
DENY задаёт запрет, имеющий приоритет над разрешением
операторы управления транзакциями (Transaction Control Language, TCL)
COMMIT применяет транзакцию
ROLLBACK откатывает все изменения, сделанные в контексте текущей транзакции
SAVEPOINT делит транзакцию на более мелкие участки
Стандарты SQL позволяют обеспечить переносимость баз данных между разными СУБД. На самом деле это весьма условно. Разные СУБД используют свои диалекты SQL. Например, SQLite не понимает ряд типов данных.
В разных СУБД есть свои расширения для придания SQL «процедурности». Это хранимые процедуры (stored procedures) и процедурные языки-надстройки. Так в Oracle Database используется PL/SQL, в PostgreSQL – PL/pgSQL.
Несмотря на наличие диалектов, запросы, содержащие только DDL и DML, обычно переносимы между разными СУБД.
SQL простыми словами — ProductStar на vc.ru
На основе материалов спикеров курса “SQL с 0 для анализа данных” собрали все, что нужно знать об SQL на первых порах. Привели реальные кейсы использования языка запросов и показали, как написать ваш первый код.
1413 просмотров
Навигация
- Что такое SQL?
- Кому и для чего необходимо уметь его использовать?
- С чего начать обучение SQL?
- Типы данных
- Интересные факты об SQL
Что такое SQL?
SQL, или Structured Query Language, — это язык структурированных запросов, использующийся для работы с базой данных: извлечения, обновления, добавления и удаления информации из нее.
Представить можно так:
Только вместо всем нам понятной фразы “принеси чай” используется особый синтаксис, другой язык. При работе с данными, как и при разговоре с представителем другой страны, вы будете использовать язык, понятный собеседнику, в нашем случае — компьютеру:
Кому и для чего нужно знать SQL?
Знание SQL часто требуют не только от аналитиков, но и от продактов, проджектов и даже маркетологов. И не зря, ведь у языка структурированных запросов действительно масса возможностей.
- Извлечение данных
С помощью SQL вы работаете с данными, которые уже собирает ваша компания. Например, у сервиса ЯндексТакси есть данные по поездкам, таксистам, пользователям, работе службы поддержки и так далее. Так, с помощью SQL можно извлечь информацию по всем поездкам в Москве в промежуток с 18 до 19 часов для анализа спроса в час-пик.
- Изменение данных
К примеру, изменить имена всех пользователей “Татьяна” на “Марина”. Если представить более реалистичный кейс — можно исключить из базы данных пользователей, которые попали в нее по ошибке.
- Добавление данных
SQL позволяет объединять базы данных, выгружать скачанные БД (например, какую-то информацию от ваших конкурентов) для дальнейшего анализа.
- Валидация данных
Например, отчеты других аналитических систем, использующиеся в других отделах, могут не вызывать доверия из-за подозрительных скачков (просело количество посещений сайта, резко уменьшились клики и тд). С помощью SQL можно быстро сделать запрос в источник данных и проверить, так ли плоха ситуация.
- Скорость
Как уже упоминали, SQL полезен не только аналитикам. Представим, что вы продакт, вам необходимо быстро проверить новую гипотезу, а для этой задачи без данных не обойтись. Гораздо быстрее постановки ТЗ и согласования с аналитиками.
Примеры использования SQL:
- Онлайн-магазин: посчитать количество покупателей из Самары за предыдущий год
- Видео-платформа: найти топ-10 фильмов, у которых было больше всего просмотров за 2020 год в категории “комедии”
- Маркетинг: найти email пользователей, которые совершили покупку после нажатия на кнопку в рассылке
- Игры: определить, на каких уровнях игры пользователи тратят больше всего времени и после каких перестают заходить в приложение
Зачастую функционала GoogleAnalitics, YandexMetrics, Excel и Tableau бывает недостаточно из-за слишком большого объема данных, долгой настройки или сложных экспериментов.
Поэтому большинство компаний и используют SQL.С чего начать?
Систем управления базами данных (СУБД) несколько, например, MySQL, Oracle, SQLServer или PostgreSQL. На курсе “SQL с 0 для анализа данных” Анна Атласова, бизнес-аналитик из Amazon, для начала советует попрактиковаться на web-версии SQLite.
Как и любой язык, SQL имеет определенные слова, которые выстраиваются в предложения, или команды. Рассмотрим пару базовых SQL-запросов на примере данных.
Открываем SQLite, загружаем базу данных.
SQLite -> File -> Open DB
В примере будем использовать БД Airbnb, сервиса для аренды жилья, ее мы даем на курсе (делимся лайфхаком: если уже оставляли заявку, попросите своего менеджера дать демо-доступ к нашей платформе, сможете попрактиковаться на этой базе данных). Открываем, слева появляются таблицы “hosts” и “listings”, то есть владельцы и информация о самом жилье (квартиры/дома/комнаты и тд).
Пришло время сделать первый запрос.
Чтобы посмотреть на всю таблицу целиком, запрашиваем (SELECT) все данные (*) из (FROM) таблицы владельцев (hosts). Получаем нашу таблицу под блоком ввода кода.
На скриншоте выше, видно, например, что Анна с id 43984 является владельцем жилья в Ирландии на Airbnb с 7 октября 2009 года. “F” в последнем столбце означает, что девушка не явлется супер-хостом (особый статус на сервисе), то есть значение в столбце = false.
Чтобы выдало конкретные столбцы, вместо *
прописываем их названия.SELECT Name, Location
FROM hosts
Так мы получим таблицу из 2х столбцов: имени и местоположения.
SELECT что мы хотим (столбец/-цы) FROM откуда мы хотим (таблица)
Чтобы ограничить строки, используем LIMIT число. Например, LIMIT 3, тогда в нашей таблице появятся только 3 строки.
Слишком просто?
Копаем глубже
При написании запроса важно учитывать тип данных, который содержится в таблице. Например, это может быть число, текст и дата.
- Для вывода числа будет достаточно использовать сами числа. Например:
SELECT *
FROM hosts
WHERE id = 43984
- Для текста используем кавычки:
SELECT *
FROM hosts
WHERE name = ‘Anna’
- Для даты — формат “год-месяц-число”
SELECT *
FROM hosts
WHERE host_since = ‘2009-10-07’
Оператор WHERE задает условие, то есть, например, “Я хочу вывести все данные из таблицы с владельцами жилья, у кого id соответствует 43984” (скорее всего результат получим один, обычно id не повторяются) или “Я хочу вывести все данные владельцев, кого зовут Анна” (здесь уже не факт, что результат будет единственным).
С оператором WHERE также можно использовать знаки больше или меньше: “<”, “>”, они, например, позволяют отфильтровать владельцев жилья, попавших в БД после определенной даты. Сделать это можно так: WHERE host_since > ‘2010-01-01’. В таблице получим всех хостов, присоединившихся к Airbnb после 1 января 2010.
Порядок ключевых слов в SQL
С некоторыми ключевыми словами мы уже познакомились, поэтому обратим внимание на важную особенность работу SQL — все ключевые слова и операторы должны иметь определенный порядок:
- SELECT
- FROM
- WHERE
- GROUP BY
- HAVING
- ORDER BY
- LIMIT
При нарушении порядка, SQL запутается и перестанет вас понимать 🙁
Важно еще отметить, что SELECT и FROM — ключевые слова, остальные — опциональные, поэтому использовать WHERE или другие операторы без SELECT FROM не получится.
Парочку интересных фактов
Немного расслабимся и перейдем к рандомным фактам об SQL.
- SQL был придуман еще в 1970-х, после чего до 2003 стадартизировался и улучшался. Сейчас мы базово все еще работаем на версии двадцитилетней давности, несмотря на несколько доработок и появление множества “диалектов”.
- Раньше SQL назывался SEQL (Structured English Query Language), поэтому многие специалисты продолжают использовать эту аббревиатуру, произнося “сикуэл”, а не “эс-кью-эл”. В документациях нередко встречаются оба варианта, поэтому оба можно считать верными.
- SQL не является языком программирования, так как не может делать циклы или архитектуры.
- Обучаться SQL как аналитикам, так и продактам лучше всего на курсе от ProductStar, ознакомиться с программой и навыками, которые получите после прохождения обучения можно здесь.
sqlite — Чем отличаются операторы SQL «IS» и «=»?
Спросил
Изменено 11 лет, 7 месяцев назад
Просмотрено 40 тысяч раз
21
Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.
Я создаю несколько готовых операторов, использующих параметризованные значения. Например:
SELECT * FROM "Foo" WHERE "Bar"=@param
Иногда @param
может быть NULL
. В таких случаях я хочу, чтобы запрос возвращал записи, где Bar
равен NULL
, но приведенный выше запрос этого не сделает. Я узнал, что для этого я могу использовать оператор IS
. Другими словами:
SELECT * FROM "Foo" WHERE "Bar" IS @param
Помимо разной обработки NULL
, есть ли другие способы, которыми два приведенных выше оператора будут вести себя по-разному? Что если @param
не NULL
, а, скажем, 5
? Является ли в этом случае использование оператора IS
безопасным (и разумным) решением? Есть ли какой-то другой подход, который я должен использовать?
- sql
- sqlite
- ноль
- операторы
- равенство
1
Вам нужны записи из Foo, где Bar = @param, или если @param имеет значение null, где Bar имеет значение null. Некоторые из предложенных решений дадут вам нулевые записи с ненулевым @param, что не похоже на ваше требование.
Выберите * из Foo, где (@param равно null, а Bar равно null) или (Bar = @param)
Это не говорит о том, является ли это Oracle, SQL Server или другой СУБД, потому что каждая из них реализует немного разные вспомогательные функции. SQL ISNULL (первый, второй) как NVL (первый, второй). Мне нравится COALESCE() SQL Server за его общую применимость.
Сравнение IS предназначено только для нулевых сравнений.
Если вы используете SQL Server и вам действительно нужна другая таблица логической истинности 3VL для решения вашей проблемы (то есть, если вам нужно, чтобы «NULL=NULL» было «истинно» в какой-то момент время, а также признать, что это устарело и, за исключением ваших причин, в целом не очень хорошая идея), в вашем кодовом блоке вы можете использовать директиву
SET ANSI_NULLS OFF
Вот BOL на нем: http://msdn.microsoft. com/en-us/library/ms188048.aspx
5
Возможно, вы думаете об этом неправильно. Например, если вы говорите о SQL Server (поскольку это то, что у меня есть), ваш второй пример приведет к синтаксической ошибке. Значение в правой части IS не может быть 5.
Чтобы объяснить, рассмотрите объяснение MSDN этих двух операторов в T-SQL (обратите внимание, что вопросы о «SQL» и о «SQL Server» не обязательно совпадают) .
Оператор равенства (=)
Оператор IS NULL
Обратите внимание на кое-что важное. Там не является оператором «IS» в T-SQL. В частности, существует оператор
, который сравнивает одно выражение с NULL.
Это не то же самое , что и оператор =
, который сравнивает два выражения друг с другом и имеет определенное поведение, когда одно или оба выражения оказываются равными NULL!
3
Редактировать: (обновление из OP: это не делает то, что я. Если @param равен 5, я хочу видеть только записи, в которых Bar равен 5. Я хочу видеть записи, в которых Bar равен NULL, если и только если @param равен NULL . Прошу прощения, если мой вопрос не прояснил это.)
В этом случае, я думаю, вы должны попробовать что-то вроде этого:
SELECT * FROM Foo WHERE Bar=@param OR (Bar IS NULL AND @param IS НУЛЕВОЙ)
Предыдущий пост:
Почему бы просто не использовать ИЛИ?
SELECT * FROM "Foo" WHERE "Bar"=@param OR "Bar" IS NULL
В SQL Server можно использовать ISNULL:
SELECT * FROM "Foo" WHERE ISNULL("Bar",@param)=@param
4
Я не знаю, какую версию SQL вы используете, но IS не имеет смысла в контексте, который вы только что описали. Я получаю синтаксическую ошибку, если пытаюсь использовать его так, как вы описали. Почему вы хотите использовать его вместо = в любом случае? Это обычное использование, и разработчики программного обеспечения ожидают найти его.
3
Какую конкретную базу данных вы используете?
Если вы выполняете поиск по нулевому (или не нулевому) значению, лучше всего использовать IS. Я не могу указать техническую причину, но я постоянно использую этот синтаксис.
SELECT * FROM Table WHERE Поле IS NULL SELECT * FROM Table WHERE Поле НЕ НУЛЕВОЕ
1
Зарегистрируйтесь или войдите
Зарегистрироваться через Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
IS DISTINCT FROM — Оператор сравнения, который рассматривает два значения NULL как одно и то же
В SQL null
не равен ( =
) чему-либо — даже другому null
. Согласно трехзначной логике SQL, результатом null = null
является не true , а unknown . В SQL есть предикат is [not] null
для проверки того, является ли конкретное значение null
.
С [не] отличается от
SQL также предоставляет оператор сравнения, который обрабатывает два null
значения совпадают.
<выражение> НЕ ОТЛИЧАЕТСЯ ОТ <выражения>
Обратите внимание, что вы должны использовать инвертированную форму с , а не
, чтобы получить логику, аналогичную оператору равенства ( =
).
В следующей таблице истинности показаны различия между знаком равенства ( =
) и тем, что не отличается от
.
А | В | А = В | A IS NOT DISTINCT FROM B |
---|---|---|---|
0 | 0 | true | true |
0 | 1 | false | false |
0 | null | unknown | false |
null | null | unknown | true |
The result with equals ( =
) is unknown if one operator is null
. не отличается от
сравнение true если оба значения null
или false если только одно null
.
Соответствующие альтернативы
Примечание
Несмотря на то, что существуют стандартные альтернативы , которые не отличаются от
, часто лучше использовать собственную альтернативу.
Из-за трехзначной логики SQL , полностью эквивалентная замена A, не отличается от B
, которая работает во всех базах данных SQL, удивительно сложна — даже если мы ограничиваем требование случаями, когда вычисляются выражения A
и B
является детерминированным и не имеет побочных эффектов.0
СЛУЧАЙ, КОГДА (a = b) или (a IS NULL AND b IS NULL) ТОГДА 0 ИНАЧЕ 1 END = 0
Результатом выражения в предложении when
является true , если оба аргумента равны или оба равны null
. Если только один аргумент равен null
, результатом будет unknown , а не false . Часто это не проблема, потому что SQL обычно обрабатывает unknown как false при принятии двоичных решений, таких как принятие или отклонение строки для 9.0020, где пункт .
Для получения полностью эквивалентной функциональности не отличается от
, т.е. либо истина , либо ложь , но никогда неизвестно — выражение case
сводит трехзначный результат к двузначному. В некоторых базах данных не является ложным,
можно использовать вместо выражения case
. Этот метод объясняется в « Бинарные решения, основанные на трехзначных результатах ».
От своего имени
Я зарабатываю на жизнь обучением SQL, настройкой и консультированием SQL, а также своей книгой «Объяснение производительности SQL». Узнайте больше на https://winand.at/.
Другим вариантом является использование табличных операторов, которые внутренне используют отдельные сравнения. В следующем фрагменте используется пересечение с
для определения общего подмножества. Каждый из двух сравниваемых наборов содержит только одно значение (одна строка с одним столбцом). Если это дважды одно и то же значение, общее подмножество будет этим значением. В противном случае общее подмножество пусто. Эту логику можно легко проверить на примере 9.0020 где предложение с существует
предикат:1
СУЩЕСТВУЕТ (ЗНАЧЕНИЯ (A) ПЕРЕСЕЧАТЬ ЦЕННОСТИ (Б) )
Это имеет то преимущество, что не повторяет никаких выражений. К сожалению, он работает не со всеми базами данных из-за использования предложения values
. Выбор из фиктивной таблицы с одной строкой может использоваться для получения соответствующего и широко поддерживаемого решения.
Совместимость
Предикат [не] отличается от предиката
вводился в два этапа: SQL:1999 добавлен T151, «DISTINCT predicate». Необязательное отрицание с вместо
было добавлено SQL:2003 как функция T152, «Предикат DISTINCT с отрицанием».
- Доступно в 11.1 Mod Pack 1/Fix Pack 1 в отличие от , предлагают запатентованную альтернативу, которая более удобна, чем аналогичная альтернатива, описанная выше. Следующие проприетарные функции полностью совместимы, т.е. они имеют двузначный результат и никогда не возвращают неизвестно . BigQueryDb2 (LUW)MariaDBMySQLOracle DBPostgreSQLSQL ServerSQLiteintersect, выберите без декодирования (A, B, 0, 1) = 0A is BA <=> B
Exists
,select
безиз
,9042 intersect стандартное решение с использованием
существует
,значения
ипересекаются
можно легко изменить для работы с большим количеством баз данных с помощьювыбрать
безиз
вместо значений9Предложение 0021:
СУЩЕСТВУЕТ (ВЫБЕРИТЕ c1 ПЕРЕСЕЧАТЬ ВЫБЕРИТЕ c2 )
decode — Db2, Oracle, h3
Db2, база данных Oracle и h3 имеют проприетарную функцию
decode
, которая использует, не отличается от внутренней семантики
. 2 Следующий пример имеет тот же эффект, что иA не отличается от B
:DECODE(A, B, 0, 1) = 0
is
— SQLite, h3Оператор
is
SQLite (документация) и h3 (документация) может сравнить два выражения (а не толькоравно [не] null
), и имеет ту же семантику, что и, не отличающуюся от
.<=>
- MySQL, MARIADBMySQL предлагает запатентованный
<=>
Оператор сравнения, который работает как, не отличается от
. делает некоторое сравнение равенства (=
) действовать так, как если бы это былоне отличается от сравнения
.Предупреждение
ANSI_NULLS OFF
устарел: его использование может вызвать ошибки в будущих версиях SQL Server.Также обратите внимание, что это влияет не на все знаки равенства, а только на те, где одна сторона сравнения является переменной или литералом
null
.