Всем привет! В этой статье пойдет речь об одной из базовых сертификаций от ORACLE — Oracle Database SQL Certified Expert.

image

Чтобы получить сертификат, нужно сдать экзамен 1Z0-047.

Стоит экзамен для разных стран по-разному. Для Азербайджана – это 150 USD. Также есть опция купить тесты для практики от Transcender вместе с ваучером на экзамен (bundle). Это обойдется Вам в 200 USD. И это выгодней, нежели покупать тесты отдельно.

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

Oracle Database 11g SQL (Oracle Press) by Jason Price (старенькая, но неплохая книга)
OCA Oracle Database 12c SQL Fundamentals I Exam Guide (Exam 1Z0-061) (Oracle Press) (был очень приятно удивлен, когда узнал сколько полезных советов она в себе таит)
Beginning Oracle SQL (Expert's Voice in Oracle) (очень много полезного. Хорошая книга)
OCE Oracle Database SQL Certified Expert Exam Guide (Exam 1Z0-047) (Oracle Press) (классика жанра)
Oracle Database Sample Schemas 12c Release 2 (12.2) (понадобится при развертывании тестовых схем)

Не могу сказать, что экзамен простой.

Поэтому решил поделиться примочками и скрытыми уловками, которые Вас там поджидают.

Итак, поехали!

1. SQL является декларативным языком программирования, который описывает какие вычисления следует произвести, но не как. Как — это удел императивных языков.

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

3. Максимальная размерность типа NUMBER – 38 знаков.

4. Маска для даты по умолчанию – DD-MON-YY. Хоть и видны только две последние цифры года, по умолчанию все равно хранятся все четыре.

5. Самая распространённая форма для транзакционных БД – это 3-я нормальная форма.

6. FOREIGN KEY может быть привязан не обязательно к PRIMARY KEY. Единственное условие – данное поле должно быть UNIQUE.

7. Максимальная размерность VARCHAR2, NVARCHAR2, RAW:

  • 32767 байт – если MAX_STRING_SIZE = EXTENDED
  • 4000 байт – если MAX_STRING_SIZE = STANDARD

8. Валидный рейндж для DATE – от 1 Января, 4712 до н.э. до 31 Декабря, 9999.

9. Размерность фракционных секунд для TIMESTAMP (всех подвидов) – может быть от 0 до 9. Но по умолчанию – 6.

10. Всего на экзамене рассматриваются:

  • 5 DML команд: SELECT, INSERT, UPDATE, DELETE, MERGE
  • 8 DDL команд: CREATE, ALTER, DROP, RENAME, TRUNCATE, COMMENT, FLASHBACK, PURGE
  • 2 DCL команды: GRANT, REVOKE
  • 3 TCL команды: COMMIT, ROLLBACK, SAVEPOINT

11. WHERE обязательно вернет FALSE, если в списке значений для оператора NOT IN есть NULL. Будьте внимательны!

12. Количество джойнов = количество таблиц в джойнах – 1.

13. Использовать имя таблицы или алиасы в USING запрещено!

14. SELECT реализует основные три концепции: PROJECTION, SELECTION, JOINING.

15. Будьте внимательны к пунктуации. Составители тестов могут преднамеренно допустить ошибку в коде!

16. Любая арифметическая операция с NULL обязательно вернет NULL.

17. Ошибочно предполагать, что результат арифметической операции с датами также будет типа даты. Нет. Как правило, тип ответа либо типа INTERVAL, либо типа NUMBER.

18. DISTINCT можно использовать с любой из агрегирующих функций.

19. Порядок выполнения команд в обычном запросе:

  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • SELECT
  • ORDER BY

20. Не существует привилегии DROP TABLE. Существует DROP ANY TABLE.

21. Чтобы дать привилегию всем юзерам, надо дать ее PUBLIC.

22. У INDEX-ов и CONSTRAINT-ов – свой неймспейс.

23. Агрегирующие функции запрещены в блоке WHERE.

24. GROUP BY может быть использован без HAVING, но HAVING – может быть использован только с GROUP BY.

25. CONSTRAINT типа NOT NULL не может быть создана вне описания поля при создании таблицы, а только вместе с описанием поля.

26. В функции MONTHS_BETWEEN() при подстановке параметров разрешается в качестве первого параметра ставить меньшую дату, а потом большую. Просто ответ будет отрицательным.

27. Тип DATE не может хранить фракционные секунды и часовые пояса.

28. Вместе с ROLLUP можно использовать любую агрегирующую функцию.

29. Группирующие функции могут быть вложены максимум на 2 уровня.

30. В ORDER BY к колонке можно обратиться 3-мя способами:

  • По имени колонки.
  • По ее алиасу.
  • По порядковому номеру.

31. NATURAL + USING либо NATURAL + ON – не место в одном запросе. Вы получите ошибку.

32. В разделе FROM может быть бесконечное количество вложенных подзапросов, но в разделе WHERE – максимум 255.

33. Всего существует 3 вида подзапросов: SINGLE-ROW, MULTIPLE-ROW и CORRELATED.

34. Отсчет символов в строке начинается с 1, а не с 0.

35. Единственный SET OPERATOR, при котором строки не сортируются – UNION ALL.

36. Случаи, когда транзакция насильно завершается:

  • Пользователь сам издал команду COMMIT или ROLLBACK.
  • Пользователь издал любую DDL или DCL команду.
  • Сессия пользователя истекла.
  • Сломался ORACLE (Не дай Бог, конечно!)

37. Наиболее подходящие поля для индексации:

  • Поля внешних ключей.
  • Поля, наиболее часто используемые в WHERE, GROUP BY и ORDER BY.

38. В ORACLE SQL не существует типа BOOLEAN.

39. То, что COUNT(1) быстрее COUNT(*) – всего лишь миф.

40. Невозможно поменять часовой пояс БД, если есть хотя бы одна таблица с полем типа TIMESTAMP WITH LOCAL TIME ZONE.

41. Функция может принять от 0 или более параметров. Но возвращает всегда 1 значение. Не больше и не меньше.

42. COUNT никогда не сможет вернуть NULL. При отсутствии строк вернет 0.

43. SELECT COUNT (ALL DUMMY) FROM DUAL – синтаксически верный запрос.

44. SEMIJOIN – это запрос с использованием оператора EXISTS.

45. Если был вызван NEXTVAL, то счетчик сработает независимо от того успешно ли был выполнен запрос или нет.

46. Если был создан синоним для объекта, а объект ликвидирован, то синоним продолжает существовать.

47. FLASHBACK TABLE невозможно откатить.

48. Для n выражений, CUBE возвращает 2 в степени n группировок.

49. SQL, PL/SQL и JAVA являются нативными языками для ORACLE DB.

50. Для формирования иерархического запроса, наличие START WITH или CONNECT BY – обязательно!

Данная статья в виде слайдиков на YouTube.

Удачи Вам всем! До скорых встреч.
Поделиться с друзьями
-->

Комментарии (24)


  1. AHDPEu
    20.04.2017 18:39

    с пунктом 50 сильно ошибаетесь

    with req_table (fields...) as (
    select fields… from table t1

    union all

    select fields… from req_table t2…
    )


    1. hasanfalizada
      20.04.2017 20:16
      +1

      Доброго времени суток. Ну… как сказать) Тут дело в терминологии. Экзамен так требует. В рамках экзамена — если речь идет о «Hierarchical query», то наличие start with и connect обязательно. Ну а в жизни, разумеется, все по разному можно представить и интерпретировать)


      1. hinterlistig
        21.04.2017 18:49

        select level from dual connect by level<10;


        1. hasanfalizada
          21.04.2017 18:51

          Так) Ну вот) Вы же используете connect. Наверное, надо было бы написать start with или connect. Так было бы корректнее.


  1. stsouthpaw
    20.04.2017 21:52

    сдали экзамен?


    1. hasanfalizada
      20.04.2017 21:52
      +1

      Да)


  1. turbanoff
    21.04.2017 09:59

    Пункт 25 не совсем понятен. Это значит, что сделать колонку NULL или NOT NULL после создания таблицы уже нельзя?


    1. hasanfalizada
      21.04.2017 10:01
      +1

      Нет. Конечно можно. Просто есть два метода создания и модификации constraint-ов: inline и outline. Ну так вот, NOT NULL — может быть создани модифицирован только inline методом.


      1. hard_sign
        21.04.2017 19:35

        а если сделать так:

        create table sample (a number not null, b number);
        alter table sample add constraint(check b is not null);

        (в синтаксической верности второй команды не уверен, а oracle под рукой нет, чтобы проверить).
        Так вот, если посмотреть словарь данных, то будет ли разница между полями A и B? Насколько я помню, никакой.


        1. hasanfalizada
          22.04.2017 09:27

          Добрый день. Нет. Синтаксис второй команды некорректен. Нужно вот так:

          alter table sample modify b not null;
          

          И только так.


  1. YokaiiSpirit
    21.04.2017 10:02
    +1

    >> 18. DISTINCT можно использовать с любой из агрегирующих функций.
    Почему-то справедливо только для чистого sql. В PLSQL, например,

    declare
    t char;
    begin
      select stringagg(distinct dummy) into t
      from dual;
    end;
    

    Вернёт ora-30482. Справедливо и для некоторых других вроде collect\listagg.


    1. hasanfalizada
      21.04.2017 10:15
      +1

      1. PL/SQL не рассматривается на экзамене.

      2. Я не встречал никогда данную функцию. Она built-in? Может устаревшая? В референсе тоже о ней ничего не сказано. Если есть информация, то скиньте линк, пожалуйста.

      3. Иcпользуйте listagg.

      4. Должен с Вами согласиться (из документации):

      Many (but not all) aggregate functions that take a single argument accept these clauses:

      DISTINCT and UNIQUE, which are synonymous, cause an aggregate function to consider only distinct values of the argument expression. The syntax diagrams for aggregate functions in this chapter use the keyword DISTINCT for simplicity.

      ALL causes an aggregate function to consider all values, including all duplicates.


  1. hard_sign
    21.04.2017 11:06

    п. 11 неверен.
    Если в списке есть NULL, то not in (..) вернёт NULL.
    Разница в том, что
    NOT FALSE = TRUE
    NOT NULL = NULL

    другими словами where X not in (1,2,3,NULL) и where not(x not in (1,2,3,NULL)) вернут одинаково пустые множества.


    1. hasanfalizada
      21.04.2017 19:01

      Доброго времени суток. Правильно. Я подразумевал, что FALSE вернет все WHERE-условие. Поправил.


      1. hard_sign
        21.04.2017 19:31

        Ну опять же ерунду написали. Откройте хотя бы документацию и посмотрите, чем NULL отличается от FALSE:

        NULL AND FALSE = FALSE
        NULL AND TRUE = NULL
        NULL OR TRUE = TRUE
        NULL OR FALSE = NULL

        NULL — это не FALSE и не TRUE, это что-то типа «ХЗ». То есть NULL это не TRUE, но и NOT NULL — это тоже не TRUE, а отсюда возможны всякие забавные спецэффекты.


        1. hasanfalizada
          22.04.2017 09:23

          Спасибо еще раз) Я знаю что есть NULL. Скажем так: WHERE не сработает (я просто не знаю, что конкретно вернет сам WHERE NULL или FALSE — после того как NOT IN вернет NULL или FALSE), и весь запрос ничего не вернет. Хм?


  1. sebres
    21.04.2017 15:44

    Максимальная размерность… RAW = 4000 байт

    Небольшая поправка:
    Лимит для RAW = 2000 байт (если MAX_STRING_SIZE = STANDARD)


    1. hasanfalizada
      21.04.2017 19:03

      Начиная с 12с — да. Спасибо!


  1. MINYSMOAL
    21.04.2017 19:03

    Сдавать данный экзамен можно сразу или требуются последовательно сдать Associate -> Professional?
    На сайте вроде как не указано, что нужно иметь эти сертификаты. Но тогда вопрос — почему для Professional нужен Associate?


    1. hasanfalizada
      21.04.2017 19:05

      Данный экзамен можно сдавать отдельно. Он особняком. Он линейки Expert. Что касается другой профессиональной линейки, то тут уж все зависит, на что направление взяли. Скажите, конкретно, куда метите, я скажу.


  1. Oraclist
    21.04.2017 19:06

    п.36. Наверное имеется ввиду DDL, вместо DML.


    1. hasanfalizada
      21.04.2017 19:07

      Каюсь. ОчЕпЯтКа. Поправил. Спасибо!


  1. Breslavets
    21.04.2017 19:07

    Надеюсь тут просто опечатка насчет DML?

    #36. Случаи, когда транзакция насильно завершается:
    #…
    #Пользователь издал любую DML или DCL команду.
    #…


    1. hasanfalizada
      21.04.2017 19:07

      Каюсь. ОчЕпЯтКа. Поправил. Спасибо!