Что такое «продвинутый» SQL? - PullRequest
54 голосов
/ 13 января 2010

Просмотр описаний должностей, где требуется «продвинутый SQL». Я могу писать базовые запросы так же, как и любой другой, и работал с базами данных MySQL в профессиональной среде, но что бы я получал с этими заданиями, если бы меня наняли? Каковы примеры продвинутого SQL и где я иду по шкале SQL noob to SQL master?

Ответы [ 11 ]

110 голосов
/ 13 января 2010

Основы


  1. SELECT извлечение столбцов из таблицы
  2. Агрегаты, часть 1: COUNT, SUM, MAX / MIN
  3. Агрегаты, часть 2: DISTINCT, GROUP BY, HAVING

Intermediate


  1. JOIN с, синтаксис ANSI-89 и ANSI-92
  2. UNION против UNION ALL
  3. NULL обработка: COALESCE & обработка собственного NULL
  4. Подзапросы: IN, EXISTS и встроенные представления
  5. Подзапросы: коррелированные
  6. WITH синтаксис: Факторинг подзапроса / CTE
  7. Просмотры

Дополнительные темы


  • Функции, хранимые процедуры, пакеты
  • Данные поворота: синтаксис CASE & PIVOT
  • Иерархические запросы
  • Курсоры: явные и неявные
  • Триггеры
  • Динамический SQL
  • Материализованные представления
  • Оптимизация запросов: индексы
  • Оптимизация запросов: объяснение планов
  • Оптимизация запросов: профилирование
  • Моделирование данных: обычные формы, от 1 до 3
  • Моделирование данных: первичные и внешние ключи
  • Моделирование данных: ограничения таблицы
  • Моделирование данных: таблицы ссылок / соответствий
  • Полнотекстовый поиск
  • XML
  • Уровни изоляции
  • Диаграммы отношений сущностей (ERD), логические и физические
  • Транзакции: COMMIT, ROLLBACK, Обработка ошибок
24 голосов
/ 13 января 2010

Оставшаяся часть списка вакансий может предоставить контекст для лучшего предположения о том, что может охватывать "Advanced SQL".

Я не согласен с комментариями и ответами, указывающими на то, что понимание JOIN и совокупных запросов - это «продвинутые» навыки; Боюсь, многие работодатели считают это довольно простым. Вот приблизительное предположение о том, что может означать «Продвинутый».

За последние несколько лет в области RDBMS появилось «ужасно» много нового!

Требование "Advanced SQL", вероятно, намекает на знание и, возможно, на знание некоторых из новых концепций , таких как:

  • CTE (общие табличные выражения)
  • UDF (пользовательские функции)
  • Расширения полнотекстового поиска / интеграция
  • настройка производительности с новыми схемами секционирования, отфильтрованными индексами, разреженными столбцами ...)
  • новые типы данных (например: ГИС / пространственные или иерархические)
  • Поддержка XML / интеграция
  • 1025 * LINQ *
  • и еще немного ... (Кстати, приведенный выше список несколько ориентирован на MSSQL, но аналогичная эволюция наблюдается в большинстве других платформ СУБД).

Хотя быть в курсе всех «за» и «против» новых функций является важной задачей для любого «продвинутого специалиста по SQL», старые «продвинутые основы», вероятно, также считаются частью «продвинутого» * ​​1031 *:

  • триггеры и хранимые процедуры в целом
  • Курсоры (когда использовать, как избежать ...)
  • экспертиза дизайна: определение таблиц, что индексировать, тип индексов
  • экспертиза производительности в целом
  • оптимизация запросов (чтение планов запросов, знание того, что по сути медлительно и т. Д.)
  • Процедурный SQL
  • ...

Примечание: вышесказанное посвящено навыкам, связанным с программированием / ведущей ролью «Расширенный SQL» может также относиться к опыту с административными ролями (репликация, резервное копирование, схема оборудования, управление пользователями ...). Если подумать, серьезный программист тоже должен быть знаком с такими практиками.

Редактировать : LuckyLindy опубликовал комментарий, который я нашел довольно проницательным. Это говорит о том, что «продвинутый» может фактически иметь иную цель, нежели подразумевать уровень «от эксперта» в большинстве категорий, перечисленных выше ...
Я повторяю этот комментарий здесь, чтобы сделать его более заметным.

Я думаю, что многие компании публикуют Advanced SQL, потому что они устали от того, что им нужен кто-то, кто говорит «Я эксперт по SQL» и не может собрать внешнее соединение из трех таблиц. Я публикую подобные сообщения в объявлениях о вакансиях, и я ожидаю, что кандидату не нужно будет постоянно приходить ко мне за помощью в написании SQL. (комментарий LuckyLindy)

11 голосов
/ 13 января 2010

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

DECLARE @date DATETIME
SELECT @date = '10/31/09'

SELECT
      t1.EmpName,
      t1.Region,
      t1.TourStartDate,
      t1.TourEndDate,
      t1.FOrdDate,
      FOrdType  = MAX(CASE WHEN o.OrderDate = t1.FOrdDate THEN o.OrderType  ELSE NULL END),
      FOrdTotal = MAX(CASE WHEN o.OrderDate = t1.FOrdDate THEN o.OrderTotal ELSE NULL END),
      t1.LOrdDate,
      LOrdType  = MAX(CASE WHEN o.OrderDate = t1.LOrdDate THEN o.OrderType  ELSE NULL END),
      LOrdTotal = MAX(CASE WHEN o.OrderDate = t1.LOrdDate THEN o.OrderTotal ELSE NULL END)
  FROM 
      (--Derived table t1 returns the tourdates, and the order dates
      SELECT
            e.EmpId,
            e.EmpName,
            et.Region,
            et.TourStartDate,
            et.TourEndDate,
            FOrdDate = MIN(o.OrderDate),
            LOrdDate = MAX(o.OrderDate)
        FROM #Employees e INNER JOIN #EmpTours et
          ON e.EmpId = et.EmpId INNER JOIN #Orders o
          ON e.EmpId = o.EmpId
       WHERE et.TourStartDate <= @date
         AND (et.TourEndDate > = @date OR et.TourEndDate IS NULL)
         AND o.OrderDate BETWEEN et.TourStartDate AND @date
       GROUP BY e.EmpId,e.EmpName,et.Region,et.TourStartDate,et.TourEndDate
      ) t1 INNER JOIN #Orders o
    ON t1.EmpId = o.EmpId
   AND (t1.FOrdDate = o.OrderDate OR t1.LOrdDate = o.OrderDate)
 GROUP BY t1.EmpName,t1.Region,t1.TourStartDate,t1.TourEndDate,t1.FOrdDate,t1.LOrdDate

(источник запроса)

И, честно говоря, это относительно простой запрос - только несколько внутренних объединений и подзапрос, а также несколько общих ключевых слов (max, min, case).

10 голосов
/ 13 января 2010

Оформить SQL для умников . Я думал, что у меня тоже неплохо получалось работать с SQL, пока я не прочитал эту книгу ... Рассматриваю тонны глубины, рассказываю о вещах, которых я не видел в других местах (разница между 3-й и 4-й нормальной формой IE, Boyce Codd Normal Форма и т. Д.) ...

10 голосов
/ 13 января 2010

Я бы ожидал:

  • создание и использование хранимых процедур
  • объединений (внутренних и внешних) и как правильно использовать GROUP BY
  • оценка производительности / настройка
  • знание эффективных (и неэффективных) способов выполнения действий в запросах (понимание того, как определенные вещи могут влиять на производительность, например, использование функций в предложениях WHERE)
  • динамический SQL и знание курсоров (и IMO несколько раз, когда их следует использовать)
  • понимание дизайна схемы, индексации и ссылочной целостности
2 голосов
/ 13 января 2010

Некоторые «расширенные» функции

  • рекурсивные запросы
  • функции управления окнами / ранжирования
  • Поворот и разворот
  • производительность настройки
1 голос
/ 14 января 2010

На моей предыдущей работе у нас был технический тест, на который всех кандидатов попросили сесть. 10 вопросов, заняло около часа. Хотя, честно говоря, 90% сбоев можно было отсеять, потому что они не могли написать оператор INNER JOIN. Даже не внешний.

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

1 голос
/ 13 января 2010

Когда вы видите их прописанными в требованиях, они, как правило, включают:

  • Просмотры
  • Хранимые процедуры
  • Определяемые пользователем функции
  • Триггеры
  • иногда Курсоры

Внутренние и внешние соединения обязательны, но я редко когда-либо упоминал об этом в требованиях. И удивительно, как многие так называемые профессионалы в области БД не могут получить простое внешнее соединение.

1 голос
/ 13 января 2010

Настройка производительности, создание индексов, хранимых процедур и т. Д.

«Продвинутый» означает что-то особенное для всех. Я полагаю, что подобные вещи означают что-то свое для каждого постера.

1 голос
/ 13 января 2010

Я предполагаю, что подзапросы и PIVOT будут соответствовать требованиям, а также множественные объединения, объединения и тому подобное.

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