MySQL Выборка данных по условию
Здравствуйте, не получается составить корректный запрос. Есть две таблицы author и book у обеих есть поле id_author . Мне требуется сделать выборку таких id_author которые есть в таблице author но отсутствуют в таблице book . Использую сейчас не очень корректный запрос и не пойму даже почему он работает неправильно:
SELECT `author`.`id_author` FROM book, author WHERE `book`.`id_author` <> `author`.`id_author`
Данный код выводит не только все значения но ещё и дублирует их (В начале вывел из одной таблицы потом из второй)
Отслеживать
задан 3 июн 2017 в 13:36
P Vladimir P Vladimir
3 2 2 бронзовых знака
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
требуется сделать выборку таких id_author которые есть в таблице author но отсутствуют в таблице book.
SELECT a.id_author FROM author a LEFT JOIN book b ON a.id_author = b.id_author WHERE b.id_author IS NULL
Как сделать выборку данных по условию из таблицы sql запросом
Основным действием выполняемым с помощью SQL запросов в системе ZuluGIS является выборка данных для их вывода в виде таблицы в области результатов запроса. Выборка данных производится с помощью ключевого слова SELECT , после которого задаются параметры выборки.
Как правило, выборка данных производится из записей полей БД слоев карты, но ключевое слово SELECT также может использоваться для вывода в поле результатов вычисления произвольных выражений, приведенных в строке после SELECT . Можно одновременно вывести результаты вычисления нескольких выражений, перечислив их через запятую.
Например, команда SELECT «Результаты вычисления», 2+2 , выведет в области результатов таблицу из двух ячеек с данными « Результаты вычисления » и 4 .
Строка команды выборки состоит из трех основных частей, в которых задается какие поля таблиц выводятся в итоговую таблицу, из каких слоев берутся данные и по каким условиям отбираются данные для итоговой таблицы.
При запросе данных из одного слоя карты, для использования в команде выборки полей данных достаточно указывать только их названия. Если же в выборке используются поля из нескольких слоев, то названия полей требуется указывать в формате . .
Типовой запрос имеет следующий вид:
SELECT [ FROM ] [ WHERE ]
SELECT
Часть команды выборки в которой задаются колонки выводимой таблицы данных. В области через запятую перечисляются названия полей, значения которых выводятся в колонках таблицы, либо выражения, результаты расчета которых выводятся в таблице («Операторы и функции языка SQL»).
Для вывода в таблице значений всех полей данных из указанных в запросе слоев, задайте вместо списка полей символ « * » . В таком случае, значения полей в таблице будут выводиться в том же порядке, в котором они заданы в БД.
Для того чтобы в итоговой таблице выводились только отличающиеся друг от друга записи, задайте списком полей ключевое слово DISTINCT («Избавление от повторяющихся записей»).
FROM
Часть строки выборки в которой через запятую перечисляются слои карты из которых запрашиваются данные.
Если все поля в запросе указаны в формате . , часть запроса с ключевым словом FROM может быть опущена.
Если данные запрашиваются из более чем одного слоя карты, в итоговой таблице будет выведено декартово пересечение записей запрошенных слоев. Например, в случае запроса полей из двух слоев в итоговой таблице будет набор записей со всеми возможными комбинациями полей из записей первого и второго слоя, т.е., например при запросе поля А из слоя содержащего 2 записи и запросе поля B из слоя также содержащего две записи, в итоговой таблице будет четыре записи со следующими данными: A1 + B1 , A1 + B2 , A2 + B1 , A2 + B2 .
WHERE
Часть, в которой задаются условия, в соответствии с которыми отбираются записи данных в таблицу результатов.
В качестве условий могут использоваться операции сравнения, проверки равенства, вхождения значений полей в заданный диапазон, проверки относительного расположения элементов и т.д. Подробно синтаксис условий будет рассмотрен далее.
Если в таблице результатов требуется вывести все записи для указанных полей, эта часть запроса может быть опущена.
Также в команде выборки могут использоваться различные дополнительные команды, рассматриваемые в последующих подразделах.
Примеры выборок
Простейшая выборка
SELECT * FROM Кварталы
В результате данного запроса выводится таблицу со всеми записями данных об объектах слоя Кварталы , причем в таблице выводятся все доступные поля данных слоя.
Рисунок 712. Пример выполнения запроса
Команда выборки с перечислением требуемых полей
SELECT Sys, perimeter, [Количество этажей] FROM Здания
В результате запроса выводится таблица с полями Sys , perimeter , Количество этажей всех записей слоя Здания .
Команда выборки без FROM части
SELECT Здания.Sys, Здания.Адрес
В данном запросе для всех полей явно указан используемый слой, поэтому нет необходимости дополнительно указывать слой с помощью ключевого слова FROM .
Выборка с отбором по условию
SELECT [Номер дома] FROM Здания WHERE Улица='5й Южный пер.'
В результате данного запроса выводится таблица со значениями поля Номер дома для всех записей слоя Здания у которых значение поля Улица равняется строке 5й Южный пер. .
Выборка по нескольким слоям
SELECT Кварталы.sys, Здания.Улица + " " + Здания.[Номер дома] FROM Здания, Кварталы WHERE Здания.Geometry.STWithin(Кварталы.Geometry)
В результате такого запроса будут отобраны объекты слоя Здания располагаются в объектах слоя Квартал и будет выведена таблица из двух столбцов, в первом из которых выводятся поля Sys объектов слоя Квартал , а во втором — адреса зданий в слое Здания помещающихся в указанных объектах слоя Квартал . Используемая в данном запросе конструкция Здания.Geometry.STWithin(Кварталы.Geometry) проверяет, не располагается ли объект слоя Здания внутри объекта слоя Кварталы (подробнее «Работа с пространственными данными в запросах»).
Как сделать выборку данных по условию из таблицы sql запросом
Для получения данных применяется команда SELECT . В упрощенном виде она имеет следующий синтаксис:
SELECT список_столбцов FROM имя_таблицы
Например, пусть ранее была создана таблица Products, и в нее добавлены некоторые начальные данные:
CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL ); INSERT INTO Products VALUES ('iPhone 6', 'Apple', 3, 36000), ('iPhone 6S', 'Apple', 2, 41000), ('iPhone 7', 'Apple', 5, 52000), ('Galaxy S8', 'Samsung', 2, 46000), ('Galaxy S8 Plus', 'Samsung', 1, 56000), ('Mi6', 'Xiaomi', 5, 28000), ('OnePlus 5', 'OnePlus', 6, 38000)
Получим все объекты из этой таблицы:
SELECT * FROM Products
Символ звездочка * указывает, что нам надо получить все столбцы.

Получение всех столбцов с помощью символа звездочки * считается не очень хорошей практикой, так как, как правило, не все столбцы бывают нужны. И более оптимальный подход заключается в указании всех необходимых столбцов после слова SELECT. Исключение составляет тот случай, когда надо получить данные по абсолютно всем столбцам таблицы. Также использование символа * может быть предпочтительно в таких ситуациях, когда в точности не известны названия столбцов.
Если нам надо получить данные не по всем, а по каким-то конкретным столбцам, то тогда все эти спецификации столбцов перечисляются через запятую после SELECT:
SELECT ProductName, Price FROM Products

Спецификация столбца необязательно должна представлять его название. Это может быть любое выражение, например, результат арифметической операции. Так, выполним следующий запрос:
SELECT ProductName + ' (' + Manufacturer + ')', Price, Price * ProductCount FROM Products
Здесь при выборке будут создаваться три столбца. Первый столбец представляет результат объединения двух столбцов ProductName и Manufacturer. Второй столбец — стандартный столбец Price. А третий столбец представляет значение столбца Price, умноженное на значение столбца ProductCount.

С помощью оператора AS можно изменить название выходного столбца или определить его псевдоним:
SELECT ProductName + ' (' + Manufacturer + ')' AS ModelName, Price, Price * ProductCount AS TotalSum FROM Products
В данном случае результатом выборки являются данные по 3-м столбцам. Первый столбец ModelName объединяет столбцы ProductName и Manufacturere, второй представляет стандартный столбец Price. Третий столбец TotalSum хранит произведение столбцов ProductCount и Price. При этом, как в случае со столбцом Price, необязательно определять название результирующего столбца с помощью AS.

DISTINCT
Оператор DISTINCT позволяет выбрать уникальные строки. Например, в нашем случае в таблице может быть по несколько товаров от одних и тех же производителей. Выберем всех производителей:
SELECT DISTINCT Manufacturer FROM Products

В данном случае критерием разграничения строк является столбец Manufacturer. Поэтому в результирующей выборке будут только уникальные значения Manufacturer. И если, к примеру, в базе данных есть два товара с производителем Apple, то это название будет встречаться в результирующей выборке только один раз.
Выборка с добавлением
SELECT INTO
Выражение SELECT INTO позволяет выбрать из одной таблицы некоторые данные в другую таблицу, при этом вторая таблица создается автоматически. Например:
SELECT ProductName + ' (' + Manufacturer + ')' AS ModelName, Price INTO ProductSummary FROM Products SELECT * FROM ProductSummary
После выполнения этой команды в базе данных будет создана еще одна таблица ProductSummary, которая будет иметь два столбца ModelName и Price, а данные для этих столбцов будут взяты из таблицы Products:

При выполнении этой команды таблица, в которую идет выборка (в данном случае ProductSummary), не должна существовать в базе данных.
Но, допустим, мы потом решили добавить все данные из таблицы Products в уже существующую таблицу ProductSummary. В этом случае можно опять же использовать команду INSERT :
INSERT INTO ProductSummary SELECT ProductName + ' (' + Manufacturer + ')' AS ModelName, Price FROM Products
Здесь добавляемые значения фактически представляют результат выборки из таблицы Products.
Урок 2. Составные условия
В прошлом уроке мы научились выбирать совершеннолетних пользователей с помощью простого SQL запроса.
SELECT last_name, first_name, birthday FROM users WHERE age >= 18
Теперь попробуем немного уточнить запрос. Например, выберем всех совершенолетних мужчин. В таблицу я добавил дополнительное строковое поле sex, которое хранит m для мужчин и w для женщин:
| id | first_name | last_name | birthday | age | sex |
|---|---|---|---|---|---|
| 1 | Дмитрий | Иванов | 1996-12-11 | 20 | m |
| 2 | Олег | Лебедев | 2000-02-07 | 17 | m |
| 3 | Тимур | Шевченко | 1998-04-27 | 19 | m |
| 4 | Светлана | Иванова | 1993-08-06 | 23 | w |
| 5 | Олег | Ковалев | 2002-02-08 | 15 | m |
| 6 | Алексей | Иванов | 1993-08-05 | 23 | m |
| 7 | Алена | Процук | 1997-02-28 | 18 | w |
Давайте добавим вывод столбца sex и оставим только мужчин. Для этого в блоке условий, который начинается со слова WHERE нужно добавить AND sex = ‘m’:
SELECT last_name, first_name, birthday, sex FROM users WHERE age >= 18 AND sex = 'm'
После выполнения SQL запроса получиться такая таблица:
| id | last_name | first_name | birthday | sex |
|---|---|---|---|---|
| 1 | Иванов | Дмитрий | 1996-12-11 | m |
| 3 | Шевченко | Тимур | 1998-04-27 | m |
| 6 | Иванов | Алексей | 1993-08-05 | m |
Посмотрим на SQL запрос. Сейчас блок WHERE содержит составное условие: возраст больше или равен 18 годам и пол равен m. Это простое логическое выражение, которому соответствуют все записи для которых оба условия верны. То есть у которых одновременно и возраст от 18 лет и sex = «m».
Кстати, о sex = «m». Так как мы используем равенство, в результируеющей таблице в колонке sex для всех записей у нас выводится m. Это не логично, ведь мы и так знаем, что выбираем мужчин, поэтому смысла в том, что мы эту информацию выводим в таблице нет. А значит можно удалить sex из запроса. Удалим и посмотрим на результат выполнения SQL-запроса:
SELECT last_name, first_name, birthday FROM users WHERE age >= 18 AND sex = 'm'
| id | last_name | first_name | birthday |
|---|---|---|---|
| 1 | Иванов | Дмитрий | 1996-12-11 |
| 3 | Шевченко | Тимур | 1998-04-27 |
| 6 | Иванов | Алексей | 1993-08-05 |
Строки выводятся те же, однако столбца sex больше нет.
Обратите внимание, что извлекаем мы столбцы last_name, first_name, birthday, а фильтрутем по age и sex. То есть не обязательно чтобы столбцы, которые мы получаем, совпадали со столбцами в условии. Главное, чтобы все они были в таблице.
Но вернемся к составным условиям.
Кроме операции AND (И), в условии можно применять OR (ИЛИ). Давайте заменим AND на OR, а также вернем колонки sex и age:
SELECT last_name, first_name, birthday, sex FROM users WHERE age >= 18 OR sex = 'm'
И посмотрим на результат:
| id | last_name | first_name | birthday | sex | age |
|---|---|---|---|---|---|
| 1 | Иванов | Дмитрий | 1996-12-11 | m | 20 |
| 2 | Лебедев | Олег | 2000-02-07 | m | 17 |
| 3 | Шевченко | Тимур | 1998-04-27 | m | 19 |
| 4 | Иванова | Светлана | 1993-08-06 | w | 23 |
| 5 | Ковалев | Олег | 2002-02-08 | m | 15 |
| 6 | Иванов | Алексей | 1993-08-05 | m | 23 |
| 7 | Процук | Алена | 1997-02-28 | w | 18 |
Получили всех мужчин, а также женщин, которым исполнилось 18 лет. В частности в SQL-таблице две женщины старше 18 лет и все мужчины, даже те, которым меньше 18. Всё это соответствует условию ИЛИ. ИЛИ возраст от 18 лет, ИЛИ мужской пол.
Теперь переключимся на таблицу products. В ней появилось поле country, которое содержит данные о стране производителе:
| id | name | count | price | country |
|---|---|---|---|---|
| 1 | Телевизор | 3 | 43200.00 | RU |
| 2 | Микроволновая печь | 4 | 3200.00 | RU |
| 3 | Холодильник | 3 | 12000.00 | UA |
| 4 | Роутер | 1 | 1340.00 | US |
| 5 | Компьютер | 0 | 26150.00 | US |
| 6 | Утюг | 6 | 3200.00 | BL |
| 7 | Пылесос | 11 | 4500.00 | UA |
Давайте выберем товары, произведененные в России, Белоруссии и на Украине. Напишем SQL-запрос:
SELECT * FROM products WHERE country = "RU" OR country = "UA" OR country = "BL"
После выполнения запроса мы получим следующую таблицу:
| id | name | count | price | country |
|---|---|---|---|---|
| 1 | Телевизор | 3 | 43200.00 | RU |
| 2 | Микроволновая печь | 4 | 3200.00 | RU |
| 3 | Холодильник | 3 | 12000.00 | UA |
| 6 | Утюг | 6 | 3200.00 | BL |
| 7 | Пылесос | 11 | 4500.00 | UA |
Разберем запрос: в блоке WHERE мы используем три условия, разделенные OR (или). Во всех трех условиях мы с помощью символа равенства сравниваем значение в столбце country с одной из стран: ИЛИ Россия, ИЛИ Украина, ИЛИ Белоруссия.
Если мы хотим получить товары еще каких-то стран, то нужно добавить еще условия OR. Это не очень удобно, так как запрос становится громоздиким.
Но его можно упростить. Кроме стандартных условий сравнения AND и OR в языке SQL есть условие принадлежности IN, которое в данном случае подходит лучше. Напишем после WHERE:
SELECT * FROM products WHERE country IN ("RU", "UA", "BL")
Конструкция получилась короче и понятней. И с помощью неё мы выбираем данные, в которых страна равна любом из значений перечисленных в скобках. После запуска запроса мы получим результат, аналогичный предыдущему.
Но давайте добавим к запросу еще одно условие. Например нам нужны не просто товары, а товары стоимостью до 10 000 рублей. Напишем:
SELECT * FROM products WHERE country IN ("RU", "UK", "BL") AND price < 10000
И посмотрим результат:
| id | name | count | price | country |
|---|---|---|---|---|
| 2 | Микроволновая печь | 4 | 3200.00 | RU |
| 6 | Утюг | 6 | 3200.00 | BL |
| 7 | Пылесос | 11 | 4500.00 | UA |
Получили новую таблицу с тремя записями, которые удовлетовряют новому условию. И в этом условии мы совместили AND и IN. То есть в SQL-запросах можно совмещать логические операции AND и OR с оператором IN. Что делает их очень гибкими.
Теперь давай попробуем выбрать товары, стоимостью от 10000 до 20000.
Условие с country уберем и напишем:
SELECT * FROM products WHERE price >= 10000 AND price
В результате получается такая таблица:
| id | name | count | price | country |
|---|---|---|---|---|
| 3 | Холодильник | 3 | 12000.00 | UA |
Выполним — получили 1 товар в этом ценовом интервале. Рассмотрим на запрос. Как видите в этой конструкции мы снова написали двойное условие по одному полю — price. И с одной строны всё логично и понятно, а с другой стороны эту конструкцию также можно упростить.
SELECT * FROM products WHERE price BETWEEN 10000 AND 20000
Теперь запрос звучит так: ВЫБРАТЬ все столбцы из таблицы products, в которых цена между 10000 и 20000. Звучит более чем понятно.
После запуска мы получим всё тот же один товар.
Вообще AND, OR, IN и BETWEEN — это основные конструкции для построения условий в SQL запросах и используются они в блоке WHERE. Вы можете применять их как по одиночке, так комбинируя в самых разлчных вариантах.
Следующий урок
Урок 3. Порядок AND и OR
Вы узнаете о приоритете AND и OR, а также с ошибками, которые возникают у новичков в SQL-запросах с несколькими условиями.
Полный курс с практикой
- 57 уроков
- 261 задание
- Сертификат
- Поддержка преподавателя
- Доступ к курсу навсегда
- Можно в рассрочку
