Задача по SQL на этот понедельник
Всем доброго понедельника!
Как насчёт очередной небольшой задачи по SQL с нашего Телеграм-канала?
В базе данных (на примере СУБД ORACLE), среди прочих, есть три таблицы, определённые следующим образом:
/* Таблица Сотрудники */
CREATE TABLE PERS (
ID NUMBER PRIMARY KEY,
FIO VARCHAR(100) NOT NULL,
PHONE VARCHAR(10) DEFAULT '' NOT NULL);
/* Автомобили сотрудников */
CREATE TABLE CARS (
ID NUMBER PRIMARY KEY,
BRAND VARCHAR(50) NOT NULL,
MODEL VARCHAR(50) NOT NULL,
ID_PERS_OWNER NUMBER NOT NULL,
CONSTRAINT FK_CAR_OWNER FOREIGN KEY
(ID_PERS_OWNER) REFERENCES PERS(ID)
);
/* Сотрудники-водители */
CREATE TABLE DRIVERS (
ID_PERS NUMBER PRIMARY KEY,
DRIVE_LICENSE_NUM VARCHAR(20) DEFAULT NULL,
CONSTRAINT FK_PERS_DRIVER FOREIGN KEY
(ID_PERS) REFERENCES PERS(ID)
);
В таблице PERS данные:
ID FIO PHONE
1 Иванов И.И. 9057553111
2 Петров П.П. 9104454545
3 Сидоров А.И. 9113457778
В таблице CARS данные:
ID BRAD MODEL ID_PERS_OWNER
1 Ауди А4 1
2 Фиат Панда 2
3 Форд Мондео 2
Какой результат вернёт выполнение следующего SQL-скрипта, состоящего из трёх команд?
TRUNCATE TABLE DRIVERS;
INSERT INTO DRIVERS
(ID_PERS)
SELECT p.ID
FROM PERS p
JOIN CARS c
On c.ID_PERS_OWNER = p.ID;
SELECT COUNT(*)
FROM DRIVERS;
SQLTest — год вместе!
Чуть больше года назад я запустил проект sqltest.online — бесплатный онлайн-тренажёр, призванный помочь всем желающим освоить SQL на практике. Сегодня мы с гордостью подводим итоги этого замечательного года!
Наши достижения:
Тренажёр предоставляет вам пять баз данных (MySQL, PostgreSQL, MS SQL Server, SQLite, Firebird) для отработки навыков.
Вам доступно почти 300 разнообразных практических задач.
Реализована возможность пройти тест на знание SQL и узнать свой рейтинг.
По данным Яндекс.Метрики:
Наш сайт посетили более 38 000 человек, просмотрев более 350 000 страниц!
Более 2700 зарегистрированных пользователей решили почти 50 000 задач — это потрясающий результат!
Наше дружное сообщество в Telegram объединяет более 700 активных участников.
Огромное спасибо всем, кто был с нами в этот год! Ваша поддержка и активность — лучшая мотивация для нас.
Хотите поддержать проект?
Мы рады, что SQLTest помогает вам в изучении SQL. Если вы хотите внести свой вклад в развитие проекта и поддержать его дальнейшее существование, вы можете сделать пожертвование. Любая сумма будет принята с благодарностью и направлена на улучшение и развитие.
Хотите поддержать проект и рассказать о своём продукте или услуге нашей заинтересованной аудитории? Свяжитесь с нами по поводу размещения рекламы на сайте sqltest.online!
ЧЕТЫРЕ РАЗА! — ПЕРЕПИСЫВАЛ... проект! (Supabase, Strapi, AppWrite, Directus, FilamentPHP)
AppWrite, SupaBase, Directus, Strapi - не понравились
AppWrite
Есть всё, кроме массового импорта. Мощнейшая вещь.
Но настройка его сложна для новичка, и жрет о 2-4гб оперативки на сервере.
SupaBase
Крутая штука, не допёр как сделать авторизацию 🤣
И тоже с настройкой были траблы.
Плюс мне не нравится HTTP Basic Авторизация по захардкоженным credentials в конфиге прокси сервера.
За то импорт и экспорт нормальный есть
Directus
Очень крутая штука, особенно его Flows.
Стал сильно продуманнее за прошедшие полгода с моей встречи с ним.
Но все так же документация меня вымораживает. Много не раскрытых тем, и скрытых, не упомянутых ограничений.
Например условная нода логики в тех же Flow - не поддерживает тупую проверку входных данных на их наличие... Не уверен что мне когда-либо понравится это. И так же во flows много других ограничений, хотя задумка улетная.
В остальном это комбайн для супер быстрого старта, толком даже без настроек, всё мышкой можно сделать.
Ограничения так же можно обойти, сделав простое расширение, я так пол логики в прошлом проекте сделал, но теряется весь шарм легкости и наглядности. 🥲
Думаю ребята в нужном направлении двигаются, и их время просто ещё не настало, держу звезду на гитзабе за них.
Strapi
HeadlessCMS, да. Крутая, да. Популярная? А вот хз-хз.
Вроде раньше много где встречал про неё статьи, и на гитхабе звезд куча насыпано.
НО КАК? Как может не быть у такой популярной CMS функционала для импорта/экспорта, хотя бы банального!?
Он справделивости ради есть в официальном маркете расширений, но... На прошлую версию 😖 Не без обратной совместимости 😩
Ну я его тоже оставил откисать.
FilamentPHP
Тяжелая артилерия из TALL Stack компонентов и не то что целой системы, а уже целой ЭКОсистемы для любого рода панелей, да еще и на базе Laravel 😤
Ну это козырь был.
Я пытался, честно, вот даже описал что меня останавило, и на каждый из вариантов я потратил минимум 4 часа времени.
Думал ребята допили свои проекты, обещающие супер быстрый старт, но везде какие-то проблемы...
В итоге я все же снова взял в работу этот стэк для бэка. Нельзя на нем не сделать бэк. Ну нет ограничений, сколько бы я не придумывал.
Меня просто удивляет продуманность этого Filament. Баги есть, не без них, конечно. Как оказалось без ошибок ни то, что люди, роботы не справятся 🙃 (Отсылка к нейросетям)
Тут я за пару дней уложился извернуться и не сорвать сроки, а сделано:
Админка
Бизнес логика
Token Based Авторизация по API
(пришлось потратить полдня, чтобы разобраться в этой теме, так как я её намеренно игнорировал последние 3 года)API c аутентификацией по токену
Расширение для хрома на WXT + React (TanStack Router, Query, Store)
Для расширения хромовского - я вообще только с WXT работал и голым React, чисто для верстки.
К сожалению - опять не пригодился Background скрипт, так что всё ещё познать вполне не удастся разработку расширений...
Но с TanStack я не работал. Как-то раз для крипто проекта пытался его настроить и за целый день - так и не вышло. Сейчас же скажу - это мастхэв! Очень крутая штука!
Ну и отказался от Tailwind и SCSS в пользу CSS Modules в паре с clsx. И я не сказал бы, что стили писать долго. В моем случае я заказы беру вообще без дизайна и предпочтений, так что 50-80% от них пишет нейросеть, а я просто не претендую на произведение искусства 😆
Кто работал с этими комбайнами, опишите свой опыт, мб я чего не догоняю...
Конкретно с AppWrite - разбираться не стал в силу ограничения по срокам, а supabase по инерции последним выбыл.
SQL задача по оконным функциям
Всем привет!
Как начёт ещё одной задачи по SQL задачу с нашего Телеграм-канала?
В таблице SALES_TOTAL хранятся итоги по продажам каждого товара за каждый день. Запрос
SELECT t.*
FROM SALES_TOTAL t
WHERE t.PRODUCT_ID = 8
AND t.SALE_DATE >= '2024-01-01'
ORDER BY t.SALE_DATE
возвращает данные по продажам некоторого товара с идентификатором 8 за каждый день, начиная с начала 2024 года:
PRODUCT_ID SALE_DATE AMOUNT
8 2024-01-01 5
8 2024-01-02 4
8 2024-01-03 7
8 2024-01-04 8
...
В столбце AMOUNT отображается количество штук проданного товара за каждый день.
Чтобы в результирующей таблице, помимо существующих столбцов, получить ещё один столбец с количеством проданного товара с начала года по день, указанный в таблице накопительным итогом, нужно в блок SELECT через запятую добавить:
Задача с собеседования по SQL с заложенной в неё ошибкой
Продолжаю тему разборов задач с собеседований по SQL. В этот раз выложу полное содержание, чтобы пост не удалили.
Итак, в базе данных есть таблица CLIENTS, содержащая три строки:
И есть таблица INVOICES, в которой две строки:
И сама задача звучит так: какое количество строк вернёт указанный ниже запрос:
SELECT * FROM CLIENTS WHERE EXISTS (SELECT COUNT(*) FROM INVOICES WHERE ID_CLIENT = CLIENTS.ID)
Здесь нужно было заметить неправильное использование EXISTS.
Оператор EXISTS используют для проверки того, возвращается ли что-то подзапросом, указанным в скобках. Как правило, в скобках для оператора EXISTS/NOT EXISTS пишут:
SELECT *
или:
SELECT 1
В задаче выше нарочно допущена ошибка (в EXISTS нарочно написано SELECT COUNT).
SELECT COUNT всегда будет возвращать данные. Написанный в скобочках подзапрос всегда будет возвращать количество, хоть и иногда 0. Но данные-то есть. Ноль - это тоже данные. Поэтому EXISTS будет давать TRUE для каждой из трех строчек основного запроса.
Ещё больше интересных задач с собеседований я публикую в моем Телеграм-канале по SQL!









