AND в MySQL — 100 жизненных приёмов и логические условия

100 практических кейсов MySQL AND: WHERE, JOIN ON, HAVING, CASE, JSON, CHECK, автоматизация.

🟢 AND в MySQL. Введение

AND в MySQL — логический оператор «И», объединяющий несколько условий. Чаще всего используется в выражениях WHERE, ON, HAVING, в CASE и проверках ограничений. Приоритет AND ниже унарных операторов и выше, чем у OR, поэтому для сложных выражений рекомендуется явно использовать скобки.

Ниже — синтаксис, типовая конструкция и 100 уникальных примеров из разных доменов.

Синтаксис

SELECT ... FROM t WHERE cond1 AND cond2;
UPDATE t SET col=expr WHERE cond1 AND cond2 AND cond3;
DELETE FROM t WHERE (condA AND condB) AND (condC OR condD);
SELECT ... FROM a JOIN b ON a.id=b.a_id AND b.active=1;
SELECT CASE WHEN (x>0 AND y>0) THEN 'Q1' ELSE 'other' END;

Типовая конструкция

SELECT id, email
FROM users
WHERE active=1 AND verified=1;

100 примеров

1. Фильтрация пользователей по статусу и верификации

SELECT id, email FROM users WHERE status='active' AND verified=1;

2. Заказы дороже суммы и по конкретной стране

SELECT id FROM orders WHERE total>100 AND country='NL';

3. Товары в наличии и с рейтингом выше 4

SELECT id, name FROM products WHERE in_stock=1 AND rating>=4;

4. Платежи за сегодня и успешные

SELECT id FROM payments WHERE DATE(paid_at)=CURDATE() AND status='success';

5. Сессии длиннее часа и с мобильного

SELECT user_id FROM sessions WHERE duration_sec>3600 AND device='mobile';

6. Логи уровня error и из сервиса billing

SELECT id FROM logs WHERE level='error' AND service='billing';

7. Доставки по городу и в статусе shipped

SELECT id FROM deliveries WHERE city='Amsterdam' AND status='shipped';

8. Отзывы с оценкой 5 и с фото

SELECT id FROM reviews WHERE rating=5 AND has_photo=1;

9. Подписки активные и не истёкшие

SELECT user_id FROM subscriptions WHERE active=1 AND valid_to>=CURDATE();

10. Кандидаты с опытом > 3 лет и знанием SQL

SELECT id FROM candidates WHERE years_exp>3 AND has_sql=1;

11. Сенсоры онлайн и с температурой ниже порога

SELECT id FROM sensors WHERE online=1 AND temp_c<min_threshold;

12. Сделки выигранные и с маржой > 20%

SELECT id FROM deals WHERE stage='won' AND margin>=0.2;

13. Билеты открытые и с приоритетом high

SELECT id FROM tickets WHERE status='open' AND priority='high';

14. Позиции заказа с qty>0 и не удалённые

SELECT order_id, line_no FROM order_items WHERE qty>0 AND deleted=0;

15. Документы опубликованные и локализованные

SELECT id FROM docs WHERE published=1 AND lang='ru';

16. Ученики старше 18 и сдан вступительный

SELECT id FROM students WHERE age>=18 AND entrance_passed=1;

17. Сотрудники full-time и в отделе data

SELECT id FROM employees WHERE contract='full' AND dept='data';

18. Устройства активные и с версией прошивки v2

SELECT id FROM devices WHERE active=1 AND fw_version LIKE '2.%';

19. Кампании запущенные и бюджет не исчерпан

SELECT id FROM campaigns WHERE started=1 AND spent < budget;

20. Лиды квалифицированные и из источника ads

SELECT id FROM leads WHERE qualified=1 AND source='ads';

21. Коммиты сегодня и автор = CI

SELECT hash FROM commits WHERE DATE(created_at)=CURDATE() AND author='ci';

22. Файлы размером >10MB и типом image

SELECT id FROM uploads WHERE size_bytes>10*1024*1024 AND mime LIKE 'image/%';

23. Бронирования подтверждены и оплачен депозит

SELECT id FROM bookings WHERE confirmed=1 AND deposit_paid=1;

24. Треки с bpm в диапазоне и жанром techno

SELECT id FROM tracks WHERE bpm BETWEEN 125 AND 135 AND genre='techno';

25. Автомобили электромобили и пробег < 50k

SELECT vin FROM cars WHERE type='ev' AND mileage_km<50000;

Ещё примеры

26. Обновить активным пользователям флаг рассылки

UPDATE users SET newsletter=1 WHERE active=1 AND unsubscribed=0;

27. Снизить цену товарам старше года и без продаж

UPDATE products SET price=price*0.9 WHERE DATEDIFF(CURDATE(), created_at)>365 AND sales_30d=0;

28. Архивировать сессии старше 30 дней и неактивные

UPDATE sessions SET archived=1 WHERE last_seen<CURDATE()-INTERVAL 30 DAY AND active=0;

29. Удалить логи debug и старше недели

DELETE FROM logs WHERE level='debug' AND created_at<CURDATE()-INTERVAL 7 DAY;

30. Удалить неактивные купоны и с нулевым остатком

DELETE FROM coupons WHERE active=0 AND remaining=0;

31. Обновить тикеты high и overdue

UPDATE tickets SET status='urgent' WHERE priority='high' AND due_at<NOW();

32. Сбросить попытки входа и снять блокировку

UPDATE users SET failed_logins=0, locked=0 WHERE locked=1 AND failed_logins>=3;

33. Удалить черновики без контента и старые

DELETE FROM drafts WHERE (title='' OR body='') AND updated_at<CURDATE()-INTERVAL 14 DAY;

34. Обновить лимит карт с истёкшим KYC и активных

UPDATE cards SET limit_amt=0 WHERE kyc_valid=0 AND status='active';

35. Удалить временные файлы и без ссылок

DELETE FROM uploads WHERE tmp=1 AND ref_count=0;

36. Повысить зарплату стажёрам data и passed=1

UPDATE employees SET salary=salary*1.1 WHERE role='intern' AND dept='data' AND passed=1;

37. Деактивировать устройства без пинга и онлайн=0

UPDATE devices SET active=0 WHERE last_ping<NOW()-INTERVAL 1 DAY AND online=0;

38. Удалить корзины пустые и старше суток

DELETE FROM carts WHERE items_count=0 AND updated_at<NOW()-INTERVAL 1 DAY;

39. Обновить статусы заказов paid и shipped

UPDATE orders SET status='completed' WHERE paid=1 AND shipped=1;

40. Удалить сообщения, помеченные как spam и старые

DELETE FROM messages WHERE is_spam=1 AND created_at< NOW()-INTERVAL 90 DAY;

41. Обновить скидку категориям seasonal и активным

UPDATE categories SET discount=15 WHERE seasonal=1 AND active=1;

42. Удалить записи очереди завершённые и без ошибок

DELETE FROM queue WHERE finished=1 AND error IS NULL;

43. Обновить статус инвойсов overdue и unpaid

UPDATE invoices SET status='overdue' WHERE due_at<CURDATE() AND paid=0;

44. Удалить регистр миграций с флагом orphan и старыми датами

DELETE FROM migrations WHERE orphan=1 AND applied_at<'2024-01-01';

45. Обновить профиль: verified и заполнен паспорт

UPDATE profiles SET level='trusted' WHERE verified=1 AND passport_no IS NOT NULL;

Ещё примеры

46. Соединить заказы и платежи по id и успешному статусу

SELECT o.id, p.amount
FROM orders o
JOIN payments p ON p.order_id=o.id AND p.status='success';

47. LEFT JOIN пользователей и профилей по id и актуальному профилю

SELECT u.id, p.city
FROM users u
LEFT JOIN profiles p ON p.user_id=u.id AND p.is_current=1;

48. JOIN товаров и категорий по ключу и активной категории

SELECT p.id, c.name
FROM products p
JOIN categories c ON c.id=p.category_id AND c.active=1;

49. CASE для сегментации по тратам и активности

SELECT u.id,
  CASE WHEN (u.orders_cnt>=5 AND u.last_seen>=CURDATE()-INTERVAL 30 DAY)
       THEN 'loyal' ELSE 'regular' END AS segment
FROM users u;

50. CASE для гео‑кластера по стране и городу

SELECT id,
  CASE WHEN (country='NL' AND city='Amsterdam') THEN 'nl-ams' ELSE 'other' END geo
FROM profiles;

51. JOIN логинов и пользователей по user_id и verified=1

SELECT l.user_id, l.login_time
FROM logins l
JOIN users u ON u.id=l.user_id AND u.verified=1;

52. JOIN доставок и складов по коду и складу активному

SELECT d.id, w.name
FROM deliveries d
JOIN warehouses w ON w.code=d.warehouse_code AND w.active=1;

53. JOIN devices и firmware по модели и актуальной версии

SELECT d.id, f.version
FROM devices d
JOIN firmware f ON f.model=d.model AND f.is_latest=1;

54. CASE на скор скоринга и kyc

SELECT c.id,
  CASE WHEN (score>=700 AND kyc_ok=1) THEN 'approved' ELSE 'manual' END decision
FROM customers c;

55. JOIN comments и posts по id и опубликованной статье

SELECT c.id, c.body
FROM comments c
JOIN posts p ON p.id=c.post_id AND p.published=1;

56. JOIN reviews и products по product_id и не удалённому товару

SELECT r.id, r.rating
FROM reviews r
JOIN products p ON p.id=r.product_id AND p.deleted=0;

57. JOIN tickets и agents по agent_id и online=1

SELECT t.id, a.name
FROM tickets t
JOIN agents a ON a.id=t.agent_id AND a.online=1;

58. JOIN routes и vehicles по vehicle_id и status=ready

SELECT r.id, v.plate
FROM routes r
JOIN vehicles v ON v.id=r.vehicle_id AND v.status='ready';

59. JOIN chat_msgs и chats по chat_id и неархивному чату

SELECT m.id, m.text
FROM chat_msgs m
JOIN chats c ON c.id=m.chat_id AND c.archived=0;

60. CASE для SLA по приоритету и просрочке

SELECT id,
  CASE WHEN (priority='high' AND due_at<NOW()) THEN 'breach' ELSE 'ok' END sla
FROM tickets;

61. JOIN stock и products по sku и активному товару

SELECT s.sku, s.qty
FROM stock s
JOIN products p ON p.sku=s.sku AND p.active=1;

62. JOIN payments и refunds по order_id и возврату подтвержденному

SELECT p.id, r.id AS refund_id
FROM payments p
JOIN refunds r ON r.order_id=p.order_id AND r.confirmed=1;

63. CASE для сегмента цены и скидки

SELECT id,
  CASE WHEN (price>=100 AND discount>0) THEN 'promo' ELSE 'base' END kind
FROM products;

64. JOIN shipments и deliveries по коду и совпадению дня

SELECT s.id, d.id AS delivery_id
FROM shipments s
JOIN deliveries d ON d.code=s.code AND DATE(d.arrive_at)=DATE(s.depart_at);

65. JOIN employees и salaries по id и активной ставке

SELECT e.id, s.amount
FROM employees e
JOIN salaries s ON s.employee_id=e.id AND s.is_current=1;

Ещё примеры

66. HAVING по сумме заказов и количеству

SELECT user_id
FROM orders
GROUP BY user_id
HAVING SUM(total)>1000 AND COUNT(*)>=3;

67. EXISTS покупка и подписка одновременно

SELECT u.id FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id=u.id)
  AND EXISTS (SELECT 1 FROM subscriptions s WHERE s.user_id=u.id AND s.active=1);

68. IN по странам и статусам

SELECT id FROM profiles WHERE country IN ('NL','DE') AND status IN ('active','trial');

69. JSON наличие ключей и значение

SELECT id FROM cfg WHERE JSON_EXTRACT(body,'$.feature')='on' AND JSON_CONTAINS_PATH(body,'one','$.threshold');

70. REGEXP по email и домену

SELECT id FROM users WHERE email REGEXP '^[a-z0-9._%+-]+@' AND email LIKE '%.nl';

71. BETWEEN по датам и по сумме

SELECT id FROM invoices WHERE issued_at BETWEEN '2025-01-01' AND '2025-12-31' AND amount BETWEEN 100 AND 1000;

72. Проверка NULL/NOT NULL одновременно

SELECT id FROM orders WHERE shipped_at IS NULL AND cancelled_at IS NULL;

73. Комбинация LIKE и сравнения

SELECT id FROM products WHERE name LIKE '%pro%' AND price<500;

74. Сложные скобки с OR

SELECT id FROM leads WHERE (source='ads' AND score>=70) OR (source='seo' AND score>=80);

75. AND в CHECK ограничении

ALTER TABLE accounts ADD CONSTRAINT chk_positive CHECK (balance>=0 AND overdraft>=0);

76. AND в GENERATED столбце (условная метка)

ALTER TABLE orders ADD COLUMN high_value TINYINT AS ((total>500) AND (country='NL')) STORED;

77. AND в триггере условия

CREATE TRIGGER bu_users BEFORE UPDATE ON users FOR EACH ROW
BEGIN
  IF (NEW.active=1 AND NEW.verified=1) THEN SET NEW.level='trusted'; END IF;
END;

78. AND в событии‑очистке

CREATE EVENT ev_purge ON SCHEDULE EVERY 1 DAY DO
  DELETE FROM logs WHERE level='debug' AND created_at<CURDATE()-INTERVAL 7 DAY;

79. AND при построении витрины

CREATE VIEW v_loyal AS
SELECT user_id FROM orders GROUP BY user_id
HAVING SUM(total)>500 AND COUNT(*)>=5;

80. AND в подзапросе коррелированном

SELECT id FROM products p WHERE EXISTS (
  SELECT 1 FROM reviews r WHERE r.product_id=p.id AND r.rating>=4
) AND p.active=1;

81. AND с SPATIAL предикатами

SELECT id FROM geo_points WHERE ST_Within(geom, ST_GeomFromText('POLYGON(...)')) AND ST_IsValid(geom);

82. AND и полнотекстовый поиск

SELECT id FROM posts WHERE MATCH(title,body) AGAINST('+mysql +index' IN BOOLEAN MODE) AND language='ru';

83. AND с окнами через фильтр WHERE

SELECT * FROM (
  SELECT id, SUM(total) OVER (PARTITION BY user_id) s FROM orders
) x WHERE s>1000 AND id IS NOT NULL;

84. AND в MERGE‑логике (эмуляция)

INSERT INTO inventory (sku, qty)
SELECT sku, SUM(qty) FROM incoming WHERE arrived=1 AND damaged=0 GROUP BY sku
ON DUPLICATE KEY UPDATE qty=VALUES(qty)+inventory.qty;

85. Финансы: и комиссия > 0, и валюта EUR

SELECT id FROM payments WHERE fee>0 AND currency='EUR';

Ещё примеры

86. E‑commerce: и в наличии, и не скрыт

SELECT id FROM products WHERE in_stock=1 AND hidden=0;

87. HR: и резюме загружено, и телефон подтверждён

SELECT id FROM candidates WHERE cv_uploaded=1 AND phone_verified=1;

88. IoT: и батарея > 30%, и сигнал стабильный

SELECT id FROM devices WHERE battery>30 AND signal>2;

89. Логистика: и доставлено, и без повреждений

SELECT id FROM deliveries WHERE status='delivered' AND damaged=0;

90. Support: и тикет открыт, и SLA нарушен

SELECT id FROM tickets WHERE status='open' AND due_at<NOW();

91. Media: и опубликовано, и видимость public

SELECT id FROM posts WHERE published=1 AND visibility='public';

92. Games: и онлайн, и рейтинг > 2000

SELECT id FROM players WHERE online=1 AND rating>2000;

93. Security: и попытка неуспешна, и ip в чёрном списке

SELECT id FROM auth_log WHERE success=0 AND ip IN (SELECT ip FROM blacklist);

94. DataOps: и задача завершена, и без ошибок

SELECT id FROM etl_runs WHERE finished=1 AND error IS NULL;

95. Маркетинг: и CTR > 5%, и показы > 10k

SELECT id FROM ads WHERE ctr>0.05 AND impressions>10000;

96. Аналитика: и дата в диапазоне, и сегмент premium

SELECT id FROM sessions WHERE at BETWEEN '2025-09-01' AND '2025-09-15' AND segment='premium';

97. Соцсеть: и друзья > 100, и постов > 50

SELECT id FROM users WHERE friends_cnt>100 AND posts_cnt>50;

98. Образование: и посещаемость 100%, и оценка ≥ 4.5

SELECT id FROM students WHERE attendance=100 AND gpa>=4.5;

99. Медицина: и прививка сделана, и ПЦР отрицательный

SELECT id FROM patients WHERE vaccinated=1 AND pcr='neg';

100. Edge‑кейс: и цена > 0, и скидка в (0,50]

SELECT id FROM products WHERE price>0 AND discount>0 AND discount<=50;

Заключение

AND соединяет предикаты и позволяет формулировать точные логические правила. Следите за приоритетом с OR и используйте скобки для читаемости и корректности. 100 примеров выше показывают, как применять AND в фильтрах, соединениях, агрегатах, JSON, CHECK и автоматизации.

Справка: официальная документация MySQL.


 

Понравилась статья? Поделиться с друзьями: