Как думать в SQL?

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

Количество символов: 57

p(char*s){char*r=strdup(s);strrev(r);return strcmp(r,s);}

Признание: я - плохой парень, не освобождая r здесь. Моя текущая попытка того, чтобы быть хорошим:

p(char*s){char*r=strdup(s);s[0]=strcmp(strrev(r),s);free(r);return s[0];}

приносит его к 73 символам; я думаю о любых способах сделать это короче.

23
задан joe 22 July 2009 в 10:34
поделиться

9 ответов

с использованием ByteArrayOutputStream и System.setXXX очень просто:

private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
private final PrintStream originalOut = System.out;
private final PrintStream originalErr = System.err;

@Before
public void setUpStreams() {
    System.setOut(new PrintStream(outContent));
    System.setErr(new PrintStream(errContent));
}

@After
public void restoreStreams() {
    System.setOut(originalOut);
    System.setErr(originalErr);
}

примеры тестовых случаев: Предыдущие версии этого ответа после тестов назывались System.setOut (null) ; Это причина того, что комментаторы ссылаются на NullPointerExceptions.

  • Двенадцать дней Рождества следует переписать с использованием самосоединения, а ROWNUM

  • Была старая женщина, проглотившая муху следует переписать с использованием CTE ]

  • Если бы Европейский Союз назывался Европейский Союз Все , мы бы увидели 27 вариантов написания слова евро на банкнота евро вместо 2 .

  • И, наконец, вы можете прочитать неубедительную статью в моем блоге о том, как я перестал беспокоиться и научился любить SQL (чуть не забыл, что написал):

    И еще одна статья на эту тему:

    24
    ответ дан 29 November 2019 в 01:49
    поделиться

    Ключевым моментом является то, что вы манипулируете SETS & элементами множеств; и связывание различных наборов (и соответствующих элементов) вместе. Это действительно суть, имхо. Который' s почему каждая таблица должна иметь первичный ключ; почему вы видите в языке операторы множества; и почему операторы наборов, такие как UNION, не будут (по умолчанию) возвращать повторяющиеся строки.

    Конечно, на практике правила наборов искажены или нарушены, но не так сложно увидеть, когда это необходимо (в противном случае SQL был бы СЛИШКОМ ограничено). Imho, просто откройте свою дискретную книгу по математике и заново ознакомьтесь с некоторыми комплексными упражнениями.

    4
    ответ дан 29 November 2019 в 01:49
    поделиться

    Лучший совет, который я могу вам дать: каждый раз, когда вы думаете об обработке чего-либо построчно, вы останавливаетесь и спрашиваете себя, есть ли основанный на наборах способ сделать это.

    4
    ответ дан 29 November 2019 в 01:49
    поделиться

    Я научился делать множество запросов и работать над работой, требующей от вас мыслить в терминах наборов результатов.

    Судя по вашему вопросу, похоже, что вы Я писал много внешнего кода, который использует последовательное / процедурное / итеративное манипулирование данными. Если вы не участвуете в каких-либо проектах, которые требуют от вас использования навыков набора результатов, я лично не буду об этом беспокоиться.

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

    Другой хороший способ - прочитать книгу по теоретическим / математическим основам СУБД. Они касаются строго теории множеств и того, как части синтаксиса SQL-запроса напрямую связаны с лежащей в его основе математикой. Конечно, для этого нужно, чтобы вы любили математику. :)

    2
    ответ дан 29 November 2019 в 01:49
    поделиться

    Я обнаружил, что Art Of SQL был полезным ударом по голове для правильного мышления.

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

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

    Я НАСТОЯТЕЛЬНО предлагаю вам помнить, что в операторах SQL могут быть комментарии, поясняющие, что они делают, а не только хранимые процедуры.

    ссылка: Искусство Of SQL

    2
    ответ дан 29 November 2019 в 01:49
    поделиться

    Одно из упражнений, которое вы можете попробовать, это:

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

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

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

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

    обратите внимание на:

    • Рекурсия и графики - довольно продвинутые методы; вы можете начать с чего-нибудь попроще. (У Джо Селко есть хорошая книга по этой теме, если вам интересно.)
    • Часто существует большая разница между BIT и bool в стиле Си. По крайней мере, вам может потребоваться явное преобразование вывода из INT в BIT .
    • OUTER JOIN s полезны, когда часть данных может быть пустой , но постарайтесь не злоупотреблять ими.
    2
    ответ дан 29 November 2019 в 01:49
    поделиться

    When people ask me about joins I send them here it has a great visual representation on what they are!

    2
    ответ дан 29 November 2019 в 01:49
    поделиться

    Я думаю, что потребуется время, чтобы настроить (это было долго назад для меня, поэтому я плохо помню). Но, возможно, ключевым моментом является то, что SQL является декларативным - то есть вы указываете , что вы хотите сделать, а не точно , как это должно быть сделано процедурно. Так что для простого примера:

    «Получите мне имена и зарплаты сотрудников в отделах, расположенных в Лондоне»

    Соответствующий SQL почти естественный:

    select name, salary
    from employees
    join departments on departments.deptno = employees.deptno
    where departments.location = 'London';
    

    Мы «сказали» SQL, как присоединить отделы к сотрудникам, но только декларативно (NATURAL JOIN устраняет необходимость в этом, но это опасно, поэтому на практике не используется). Мы не определили процедурно , как это должно быть сделано (например, «для каждого отдела найти всех сотрудников ...»). SQL может свободно выбирать оптимальный метод выполнения запроса.

    2
    ответ дан 29 November 2019 в 01:49
    поделиться

    «Мышление наборами» Джо Селко (книга)

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

    Эта книга изменит ваш образ жизни. подумай о проблемах, которые ты решаешь с программами SQL .. Сосредоточимся на трех ключевые техники, основанные на таблицах, Celko раскрывает свою силу через подробные примеры и понятные объяснения. Как овладеете этими методами, вы обнаружите, что вы способны осмыслить проблемы, коренящиеся в наборах и разрешается декларативно программирование. Вскоре ты будешь кодировать быстрее, писать больше эффективный код и применение полного мощь SQL.

    3
    ответ дан 29 November 2019 в 01:49
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: