Questions tagged [sql]

Структурированный язык запросов SQL(Structed Query Language) — формальный язык программирования для манипуляции данными в реляционных базах данных. Чтобы задать хороший вопрос, используйте инструкцию в полном описании метки. Вопрос должен содержать структуру таблиц, тестовые данные и примеры запросов, иллюстрирующих проблему. Указывайте используемую СУБД. Желательно использовать ANSI SQL запросы.

SQL (Structured Query Language) — структурный язык запросов. Используется в системах управления реляционными базами данных (СУБД).

Что должно быть в вопросе по SQL?

Полная и подробная инструкция: Как задавать хорошие вопросы про SQL?

Вопросы по возможности должны содержать структуру таблиц, тестовые данные и примеры запросов, иллюстрирующих проблему. Кроме того, в метках стоит указывать вид СУБД, которая используется, например, , , , .
В ответах следует стараться использовать ANSI SQL запросы.

Базовые понятия

Одно из подмножеств SQL называется DDL (data definition language) — язык описания данных, который используется для действий над структурой данных: создание, изменение, удаление таблиц, представлений, индексов, и т. д. Основные команды DDL:

  • CREATE — создает объект базы данных, например, таблицы в базе данных;
  • ALTER — изменяет структуру существующего объекта базы данных каким-либо образом (добавляет колонки, меняет тип колонок, добавляет ограничения...);
  • DROP — удаляет объект из базы данных, например таблицу, как правило безвозвратно.

Другое подмножество SQL называется DML (data manipulation language) — язык манипуляции данными. Основные команды DML:

  • SELECT — формирует выборку из одной или нескольких таблиц базы данных;
  • INSERT — добавляет данные в таблицу;
  • UPDATE — изменяет данные в существующих записях таблицы;
  • DELETE — удаляет записи из таблицы.

Следующее подмножество - DCL (data control language) — язык определения доступа к данным, содержит команды:

  • GRANT — наделяет пользователя базы данных определенными привилегиями для выполнения конкретных действий (выборки, изменения данных, изменения структуры данных и т.д.);
  • REVOKE — аннулирует ранее выданные разрешения для пользователя.

И подмножество TCL (transaction control language) — язык управления транзакциями. Содержит команды:

  • COMMIT — фиксирует действия над данными, после начала транзакции;
  • ROLLBACK — отменяет изменения, внесенные после начала транзакции;
  • SAVEPOINT — делит транзакцию на более мелкие участки.

На протяжении множества лет разработчики разных систем управления базами данных, постоянно развивая свои продукты, добиваясь при этом простоты использования и скорости выполнения, реализовали собственные диалекты SQL. В результате получилось, что все используют SQL, но со специфическими изменениями, и один и тот же запрос в разных СУБД может работать по-разному, а может и вовсе не работать из-за несовместимости синтаксиса.

Стандарты ISO/IEC (или ANSI) существенно помогают в разрешении таких ситуаций, но с переменным успехом. Да, запросы написанные по стандарту должны быть переносимыми между разными СУБД, однако никто не гарантирует одинаковой производительности. И даже производительность запроса с использованием своего диалекта может отличаться от производительности ANSI запроса.

Большинство СУБД имеют свой диалект для написания хранимых процедур. Например, в Oracle это PL/SQL, в PostgreSQL — PL/pgSQL. Для остальных запросов обе СУБД используют SQL. Поэтому, если ваш вопрос относится к проблемам, связанным с хранимыми процедурами, используйте также метки и . В Microsoft SQL Server используется Transact-SQL и для обычных запросов (DML) и для написания хранимых процедур, для таких вопросов стоит добавить метку .

Рекомендации по добавлению меток

Данная метка предназначена для общих вопросов, связанных с SQL, а также в качестве дополнения к меткам для вопросов, связанных с конкретными СУБД. Например, вопросы по Microsoft SQL Server должны быть с меткой , а вопросы по MySQL должны быть с меткой . Кроме того, для уточнения какие функции СУБД используются или могут быть использованы, можно добавлять метки, содержащие версию, например , .

Пожалуйста, прочитайте краткое описание о стандарте SQL (SQL-92 наиболее полно поддерживается большинством СУБД) или обратитесь к полному изданию (англ.).

Полезные ресурсы

Всегда старайтесь указывать используемую структуру базы данных, пример данных и ожидаемый результат. Это сильно поможет отвечающим и ускорит решение проблемы. Также вы можете самостоятельно локализовать проблему и создать тестовый пример, воспользовавшись онлайн-сервисами, например, SQL Fiddle.

Бесплатные книги по SQL

На русском языке:

На английском языке:

Бесплатные онлайн курсы по SQL/Базам данных

На русском языке:

На английском языке:

13663 questions
12
votes
1 answer

В чём разница между using и on в join-запросах?

Сабж в заголовке, т.е. равносильны ли запросы (если mysql рассматривать) SELECT * FROM `tab1` RIGHT JOIN `tab` ON `table2`.`id` = `table1`.`id` и SELECT * FROM `tab1` RIGHT JOIN `tab2` USING(`id`) если нет, то какой лучше и в чём различие?
fosh4455
  • 868
12
votes
1 answer

Почему INNER JOIN в SQL получило такое название?

Понятно что слово INNER переводится как ВНУТРЕННИЙ. Не понятно почему именно внутреннее соединение а не красное соединение или зеленое?
perfect
  • 10,021
12
votes
7 answers

Как выбрать пропущеные ID?

Есть поле ID в некой таблице Tab, некоторые номера пропущены, например: 1,2,4,5,6,8 Как выбрать номера 3 и 7? Я давно делал такой запрос и вот не могу вспомнить как )) Там помню в условии было ID+1
nMike
  • 1,936
  • 7
  • 28
  • 47
7
votes
3 answers

В чем разница между DISTINCT и GROUP BY?

Читаем: Оператор SQL DISTINCT используется для указания на то, что следует работать только с уникальными значениями столбца. Оператор SQL GROUP BY используется для объединения результатов выборки по одному или нескольким столбцам. В результате…
perfect
  • 10,021
7
votes
1 answer

Ограничение количества строк с IN

Есть SQL запрос: SELECT * FROM technologies WHERE technology_category_id IN (1,2,3) Можно ли одним запросом вывести по шесть строк для каждого id, которые внутри IN? LIMIT ограничивает общее количество результатов.
Artem
  • 81
7
votes
3 answers

Как вывести несколько чисел используя только SQL запрос?

Нужно написать SQL запрос, который бы возвращал точно такой вывод: id| --- 1 | 2 | 3 | 5 | Представьте, что в БД нет ни одной таблицы, и создавать их нельзя. mysql> SELECT 1 id UNION SELECT 2 id UNION SELECT 3 id UNION SELECT 5 id; +----+ | id…
jekaby
  • 2,824
6
votes
1 answer

Что значит оптимизировать SQL запрос

Какие принципы используются для оптимизации sql запросов. Вопрос теоретический, дело в том ,что при работе с БД судя по моему общению, сводится к ускорению работы бд и к оптимизации запросов.С ускорением теория есть, а вот что значит оптимизация…
6
votes
2 answers

Большое ли преимущество использования IN вместо множества OR в sql?

На примере select * from table where property in ('a','b','c') или select * from table where property='a' or property='b' or property='c'
6
votes
4 answers

Вывод одной строки на каждое имя с учетом метки

Есть таблица stuff_id с полями id и name. Есть таблица stuff_phone с полями id, phone, preference. У одного сотрудника может быть несколько телефонов. У одного из его телефонов может быть предпочтение, в таком случае для этого телефона в поле…
zer_ik
  • 743
6
votes
2 answers

Корректировка sql запроса

Получил на собеседовании задание по sql: Получить имя и количество раз, сколько оно повторялось, но вывести только те имена, которые повторялись больше 2-х раз - сортировка по количеству повторений, от большего до меньшего. Моим решением…
Aleksei
  • 413
  • 3
  • 14
6
votes
3 answers

SQL команда выборки

Представим, что есть некая таблица Users, в которой есть идентификатор (primary key) с именем id. Но по какой-то причине id были вырваны строки. И получилась такая вот таблица: id 1,2,3,5,6,7,8,10,12 Вопрос, как получить с использованием только…
6
votes
3 answers

Что такое SQL Transactions, Transaction Isolation Levels?

Что такое SQL Transactions, Transaction Isolation Levels?
arcs_host
  • 333
6
votes
4 answers

Порядок выполнения операторов sql запроса

Пожалуйста, дайте порядок выполнения операторов sql запроса или дайте ссылку, где прочитать об этом: что за чем выполняется. Например (с потолка): SELECT t1.id AS id, t1.name AS name, count(*) AS cnt FROM tbl_name1 t1 INNER JOIN tbl_name2 t2…
FoxManiac
  • 466
  • 1
  • 4
  • 10
5
votes
1 answer

Как правильно спроектировать базу данных?

в качестве примера, есть 3 словаря русский, белорусский, украинский и 3 описания (или толкование) слов, т.е. когда выбирается русский язык и белорусский для описание (перевода) слова то прога ищет значение слова в таблице на белорусском, для примера…
5
votes
2 answers

Троичная логика в SQL

В SQL фигурирует значение NULL, функциональная роль которого заключается в обозначении отсутствующих или неизвестных данных. Для этого значения установлены правила выполнения предикатов, которые при участии NULL возвращают не TRUE или FALSE, а…
1
2 3
74 75