Как найти несколько значений в sql

I have two databases, where I store who is following who and another which stores the posts the user makes.

I want to select all of the people a user is following from the following database and echo out the usernames of those who that user is following and query the posts database for posts of that user.

My problem is what if a user is following multiple users,
I echoed out of the user id’s of the people this user is following and I get
44443344330

When I separate each id with commans, I get:

44,44,33,44,33,0, 

so let’s give that a variable of $user_ids;

$user_ids = "44,44,33,44,33,0, ";

the query:

$get_posts = mysql_query("SELECT * FROM posts WHERE userid = '$user_ids'");

but all it does is show the records of the first user id, 44.

How can I retrieve all of the records for all the users?

In SQL, for  matching multiple values in the same column, we need to use some special words in our query. Below, 3 methods are demonstrated to achieve this using the IN, LIKE and comparison operator(>=). For this article, we will be using the Microsoft SQL Server as our database.

Step 1: Create a Database. For this use the below command to create a database named GeeksForGeeks.

Query:

CREATE DATABASE GeeksForGeeks

Output:

Step 2: Use the GeeksForGeeks database. For this use the below command.

Query:

USE GeeksForGeeks

Output:

Step 3: Create a table CARS inside the database GeeksForGeeks. This table has 3 columns namely CAR_NAME, COMPANY and COST containing the name, company and cost of various cars.

Query:

CREATE TABLE CARS(
CAR_NAME VARCHAR(10),
COMPANY VARCHAR(10),
COST INT);

Output:

Step 4: Describe the structure of the table CARS.

Query:

EXEC SP_COLUMNS CARS;

Output:

Step 5: Insert 5 rows into the CARS table.

Query:

INSERT INTO CARS VALUES('INNOVA','TOYOTA',10000);
INSERT INTO CARS VALUES('CAMRY','TOYOTA',20000);
INSERT INTO CARS VALUES('CIAZ','HONDA',30000);
INSERT INTO CARS VALUES('POLO','VOLKSWAGEN',50000);
INSERT INTO CARS VALUES('BENZ','MERCEDES',100000);

Output:

Step 6: Display all the rows of the CARS table.

Query:

SELECT * FROM CARS;

Output:

Step 7: Retrieve the details of all the cars belonging to the companies TOYOTA and HONDA.

Note – Use of IN for matching multiple values i.e. TOYOTA and HONDA in the same column i.e. COMPANY.

Syntax:

SELECT * FROM TABLE_NAME WHERE COLUMN_NAME IN (MATCHING_VALUE1,MATCHING_VALUE2);

Query:

SELECT * FROM CARS WHERE COMPANY IN ('TOYOTA','HONDA');

Output:

Step 8: Retrieve the details of all the cars whose name starts with the letter C.

Note – Use of LIKE for matching multiple values i.e. CAMRY and CIAZ in the same column i.e. CAR_NAME.

Syntax:

SELECT * FROM TABLE_NAME WHERE COLUMN_NAME LIKE 'STARTING_LETTER%';

Query:

SELECT * FROM CARS WHERE CAR_NAME LIKE 'C%';

Output:

Step 9: Retrieve the details of all the cars having cost greater than or equal to 30000.

Note – Use of comparison operator >= for matching multiple values i.e. 30000, 50000 and 100000 in the same column i.e. COST.

Syntax:

SELECT * FROM TABLE_NAME WHERE COLUMN_NAME >=VALUE;

Query:

SELECT * FROM CARS WHERE COST>=30000;

Output:

Last Updated :
29 Oct, 2021

Like Article

Save Article

В прошлом уроке мы научились выбирать совершеннолетних пользователей с помощью простого SQL запроса.

SELECT last_name, first_name, birthday FROM users WHERE age >= 18

Теперь попробуем немного уточнить запрос. Например, выберем всех совершенолетних мужчин. В таблицу я добавил дополнительное строковое поле sex, которое хранит m для мужчин и w для женщин:

Новая таблица users

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 запроса получиться такая таблица:

Результат выполнения 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'
Результат выполнения SQL-запроса

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'

И посмотрим на результат:

Новая таблица users

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, которое содержит данные о стране производителе:

Таблица products

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

И посмотрим результат:

Результат выполнения SQL-запроса

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 <= 20000

В результате получается такая таблица:

Таблица products

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-запросах с несколькими условиями.

Посмотреть

Тарифы

    • 56 видео-уроков

      Более 7 часов видео

    • Дополнительные материалы

      Схемы, методички, исходные коды

    • Возможность скачать видео

      Смотреть уроки можно даже без интернета

    • Доступ к курсу навсегда

      Можете освежить знания через год или два

    • 271 практическое задание

      Практические занятия на тренажере

    • Поддержка преподавателя

      Помощь в решении заданий в течение 24 часов

    • Сертификат о прохождении курса

      Подтверждение ваших навыков

    • Эталонные решения

      Решения преподавателя

    • 56 видео-уроков

      Более 7 часов видео

    • Дополнительные материалы

      Схемы, методички, исходные коды

    • Возможность скачать видео

      Смотреть уроки можно даже без интернета

    • Доступ к курсу навсегда

      Условия бесплатного тарифа могут измениться

    • 271 практическое задание

      Практические занятия на тренажере

    • Поддержка преподавателя

      Помощь в решении заданий в течение 24 часов

    • Сертификат о прохождении курса

      Подтверждение ваших навыков

    • Эталонные решения

      Решения преподавателя

Регистрация

Время на прочтение
5 мин

Количество просмотров 1.1M

Введение

Язык SQL очень прочно влился в жизнь бизнес-аналитиков и требования к кандидатам благодаря простоте, удобству и распространенности. Из собственного опыта могу сказать, что наиболее часто SQL используется для формирования выгрузок, витрин (с последующим построением отчетов на основе этих витрин) и администрирования баз данных. И поскольку повседневная работа аналитика неизбежно связана с выгрузками данных и витринами, навык написания SQL запросов может стать фактором, из-за которого кандидат или получит преимущество, или будет отсеян. Печальная новость в том, что не каждый может рассчитывать получить его на студенческой скамье. Хорошая новость в том, что в изучении SQL нет ничего сложного, это быстро, а синтаксис запросов прост и понятен. Особенно это касается тех, кому уже доводилось сталкиваться с более сложными языками.

Обучение SQL запросам я разделил на три части. Эта часть посвящена базовому синтаксису, который используется в 80-90% случаев. Следующие две части будут посвящены подзапросам, Join’ам и специальным операторам. Цель гайдов: быстро и на практике отработать синтаксис SQL, чтобы добавить его к арсеналу навыков.

Практика

Введение в синтаксис будет рассмотрено на примере открытой базы данных, предназначенной специально для практики SQL. Чтобы твое обучение прошло максимально эффективно, открой ссылку ниже в новой вкладке и сразу запускай приведенные примеры, это позволит тебе лучше закрепить материал и самостоятельно поработать с синтаксисом.

Кликнуть здесь

После перехода по ссылке можно будет увидеть сам редактор запросов и вывод данных в центральной части экрана, список таблиц базы данных находится в правой части.

Структура sql-запросов

Общая структура запроса выглядит следующим образом:

SELECT ('столбцы или * для выбора всех столбцов; обязательно')
FROM ('таблица; обязательно')
WHERE ('условие/фильтрация, например, city = 'Moscow'; необязательно')
GROUP BY ('столбец, по которому хотим сгруппировать данные; необязательно')
HAVING ('условие/фильтрация на уровне сгруппированных данных; необязательно')
ORDER BY ('столбец, по которому хотим отсортировать вывод; необязательно')

Разберем структуру. Для удобства текущий изучаемый элемент в запроса выделяется CAPS’ом.

SELECT, FROM

SELECT, FROM — обязательные элементы запроса, которые определяют выбранные столбцы, их порядок и источник данных.

Выбрать все (обозначается как *) из таблицы Customers:

SELECT * FROM Customers

Выбрать столбцы CustomerID, CustomerName из таблицы Customers:

SELECT CustomerID, CustomerName FROM Customers

WHERE

WHERE — необязательный элемент запроса, который используется, когда нужно отфильтровать данные по нужному условию. Очень часто внутри элемента where используются IN / NOT IN для фильтрации столбца по нескольким значениям, AND / OR для фильтрации таблицы по нескольким столбцам.

Фильтрация по одному условию и одному значению:

select * from Customers
WHERE City = 'London'

Фильтрация по одному условию и нескольким значениям с применением IN (включение) или NOT IN (исключение):

select * from Customers
where City IN ('London', 'Berlin')

select * from Customers
where City NOT IN ('Madrid', 'Berlin','Bern')

Фильтрация по нескольким условиям с применением AND (выполняются все условия) или OR (выполняется хотя бы одно условие) и нескольким значениям:

select * from Customers
where Country = 'Germany' AND City not in ('Berlin', 'Aachen') AND CustomerID > 15

select * from Customers
where City in ('London', 'Berlin') OR CustomerID > 4

GROUP BY

GROUP BY — необязательный элемент запроса, с помощью которого можно задать агрегацию по нужному столбцу (например, если нужно узнать какое количество клиентов живет в каждом из городов).

При использовании GROUP BY обязательно:

  1. перечень столбцов, по которым делается разрез, был одинаковым внутри SELECT и внутри GROUP BY,
  2. агрегатные функции (SUM, AVG, COUNT, MAX, MIN) должны быть также указаны внутри SELECT с указанием столбца, к которому такая функция применяется.

Группировка количества клиентов по городу:

select City, count(CustomerID) from Customers
GROUP BY City

Группировка количества клиентов по стране и городу:

select Country, City, count(CustomerID) from Customers
GROUP BY Country, City

Группировка продаж по ID товара с разными агрегатными функциями: количество заказов с данным товаром и количество проданных штук товара:


select ProductID, COUNT(OrderID), SUM(Quantity) from OrderDetails
GROUP BY ProductID

Группировка продаж с фильтрацией исходной таблицы. В данном случае на выходе будет таблица с количеством клиентов по городам Германии:


select City, count(CustomerID) from Customers
WHERE Country = 'Germany'
GROUP BY City

Переименование столбца с агрегацией с помощью оператора AS. По умолчанию название столбца с агрегацией равно примененной агрегатной функции, что далее может быть не очень удобно для восприятия.

select City, count(CustomerID) AS Number_of_clients from Customers
group by City

HAVING

HAVING — необязательный элемент запроса, который отвечает за фильтрацию на уровне сгруппированных данных (по сути, WHERE, но только на уровень выше).

Фильтрация агрегированной таблицы с количеством клиентов по городам, в данном случае оставляем в выгрузке только те города, в которых не менее 5 клиентов:


select City, count(CustomerID) from Customers
group by City
HAVING count(CustomerID) >= 5 

В случае с переименованным столбцом внутри HAVING можно указать как и саму агрегирующую конструкцию count(CustomerID), так и новое название столбца number_of_clients:


select City, count(CustomerID) as number_of_clients from Customers
group by City
HAVING number_of_clients >= 5

Пример запроса, содержащего WHERE и HAVING. В данном запросе сначала фильтруется исходная таблица по пользователям, рассчитывается количество клиентов по городам и остаются только те города, где количество клиентов не менее 5:


select City, count(CustomerID) as number_of_clients from Customers
WHERE CustomerName not in ('Around the Horn','Drachenblut Delikatessend')
group by City
HAVING number_of_clients >= 5

ORDER BY

ORDER BY — необязательный элемент запроса, который отвечает за сортировку таблицы.

Простой пример сортировки по одному столбцу. В данном запросе осуществляется сортировка по городу, который указал клиент:


select * from Customers
ORDER BY City

Осуществлять сортировку можно и по нескольким столбцам, в этом случае сортировка происходит по порядку указанных столбцов:


select * from Customers
ORDER BY Country, City

По умолчанию сортировка происходит по возрастанию для чисел и в алфавитном порядке для текстовых значений. Если нужна обратная сортировка, то в конструкции ORDER BY после названия столбца надо добавить DESC:


select * from Customers
order by CustomerID DESC

Обратная сортировка по одному столбцу и сортировка по умолчанию по второму:

select * from Customers
order by Country DESC, City

JOIN

JOIN — необязательный элемент, используется для объединения таблиц по ключу, который присутствует в обеих таблицах. Перед ключом ставится оператор ON.

Запрос, в котором соединяем таблицы Order и Customer по ключу CustomerID, при этом перед названиям столбца ключа добавляется название таблицы через точку:

select * from Orders
JOIN Customers ON Orders.CustomerID = Customers.CustomerID

Нередко может возникать ситуация, когда надо промэппить одну таблицу значениями из другой. В зависимости от задачи, могут использоваться разные типы присоединений. INNER JOIN — пересечение, RIGHT/LEFT JOIN для мэппинга одной таблицы знаениями из другой,


select * from Orders
join Customers on Orders.CustomerID = Customers.CustomerID
where Customers.CustomerID >10

Внутри всего запроса JOIN встраивается после элемента from до элемента where, пример запроса:

Другие типы JOIN’ов можно увидеть на замечательной картинке ниже:


В следующей части подробнее поговорим о типах JOIN’ов и вложенных запросах.

При возникновении вопросов/пожеланий, всегда прошу обращаться!

SQL WHERE оператор позволяет задавать дополнительные условия для выборки, редактирования, удаления и других операций, производимых с записями БД.

  1. Синтаксис SQL WHERE
  2. Примеры использования SQL WHERE

Рассматриваемый оператор WHERE имеет следующий синтаксис:

SELECT column1, column2, ...
FROM table_name
WHERE condition;

Как видим, SQL запрос WHERE задаёт некоторое условие, которое позволяет отфильтровать записи в колонках таблицы table_name. При этом, когда в SQL несколько WHERE — это нормальная история, ведь так задаётся сразу несколько условий.

Рассмотрим оператор WHERE на примерах.

Примеры использования SQL WHERE

С помощью следующего SQL запроса мы виберем всех клиентов, которых зовут Иван:

SELECT * FROM Customers
WHERE Name = 'Иван';

А так мы сможем выбрать клиентов по ID, за которым они закреплены в нашей таблице:

SELECT * FROM Customers
WHERE ID = 1;

Теперь давайте усложним задачу, задав сразу несколько условий. Здесь мы также используем оператор SQL LIKE, о котором писали ранее.

Например, выведем название планеты, год её открытия, а также имя её первооткрывателя. Выбирать будем из тех планет, чьё название не начинается или не заканчивается на букву S:

SELECT PlanetName, OpeningYear, Opener
FROM Planets
WHERE PlanetName NOT LIKE '%s'
AND PlanetName NOT LIKE 'S%'

И вот такое, казалось бы, сложное условие легко реализовывается с помощью оператора WHERE.

Больше SQL команд и информации о них вы найдёте здесь.

Добавить комментарий