По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Потренируйтесь в ответах на популярные вопросы по SQL на собеседованиях. В данной статье приведен список типовых вопросов по SQL, с которыми можно столкнуться на настоящем собеседовании, и даны ответы. Чтобы получить максимум из прочитанного, постарайтесь сначала отвечать на вопросы самостоятельно. Удачи! 1. Что такое SQL? SQL расшифровывается как Structured Query Language – язык структурированных запросов. Это язык программирования для взаимодействия с данными, которые хранятся в системе управления реляционными базами данных. Синтаксис SQL схож с английским языком, поэтому его легко читать, писать и интерпретировать. Он позволяет вам писать запросы, определяющие подмножество данных, которые вы ищите. Эти запросы можно сохранять, уточнять, обмениваться ими и запускать в различных базах данных. 2. Что такое база данных? База данных (БД) – это набор данных, хранимых на компьютере. При этом сами данные структурированы таким образом, что их можно было легко получить. 3. Что такое реляционная база данных? Реляционная база данных – это разновидность базы данных. В ней используется структура, которая позволяет нам идентифицировать и обращаться к данным в привязке к другим частям данных из БД. Данные в реляционной БД часто организованы в виде таблиц. 4. Что такое РСУБД? Система управления реляционными базами данных (РСУБД) – это программа, позволяющая вам создавать, обновлять и администрировать реляционную базу данных. Для доступа к базам данных большинство РСУБД использует язык SQL. Самой популярной РСУБД считается MySQL. К другим системам относятся PostgreSQL, Oracle DB, SQL Server и SQLite. 5. Что такое таблица? Таблица – это набор данных, распределенных по строкам и столбцам. Иногда их называют «связями». В таблицах могут быть сотни, тысячи и иногда даже миллионы строк данных. 6. Что такое строка и столбец в таблице? Строка – это одна запись данных в таблице. Столбец – это набор значений данных определенного типа. 7. Что такое тип данных? Тип данных – это атрибут, который определяет тип данных в столбце. В каждом столбце БД есть тип данных. Несколько часто используемых типов данных: INTEGER, TEXT, DATE, REAL. 8. Что такое первичный и внешний ключ? Первичный ключ (primary key) – это столбец, который однозначно определяет каждую строку в таблице. Первичные ключи должны соответствовать следующим требованиям: ни одно значение не может быть пустым (NULL), каждое значение должно быть уникальным и в таблице не может быть более одного столбца с первичным ключом. Например, в таблице customers первичным ключом будет customer_id. Внешний ключ (foreign key) – это первичный ключ для одной таблицы, который присутствует и в другой таблице. Например, есть дополнительная таблица orders. В каждом заказе может храниться информация о клиенте. Поэтому внешним ключом будет столбец customer_id. 9. В чем отличие ALTER от UPDATE? Оператор ALTER используется для добавления нового столбца в таблицу. Он изменяет структуру таблицы. Оператор UPDATE используется для редактирования строки в таблице. Он изменяет существующие записи в таблице. 10. Что такое запрос? Запрос (query) – это оператор SQL для получения информации, хранимой в базе данных. Запросы позволяют нам «общаться» с базой данных, задавая вопросы и возвращая результирующий набор подходящих данных. 11. Что такое подзапрос? Подзапрос (subquery) – это внутренний запрос, вложенный во внешний. Запросы можно вложить через операторы SELECT, INSERT, UPDATE или DELETE. Если есть подзапрос, то он будет выполняться до запуска внешнего оператора. 12. Что такое ограничения? Ограничения (constraints) – это набор правил, через которых базе данных сообщается об ограничении типа данных, хранимых в столбцах. Они предписывают базе данных отклонять введенные данные, если они не соответствуют ограничению. Ограничения добавляют информацию о том, как может использоваться столбец, и вызываются после типа данных для столбца. Несколько примеров ограничений: PRIMARY KEY: однозначно определяет каждую строку и требует уникальности каждого значения. UNIQUE: каждое значение в столбце должно отличаться. NOT NULL: в столбцах обязательно должны быть значения. DEFAULT: дополнительный аргумент, который подставляется в качестве предполагаемого значения для каждой новой строки, если в ней не указано значение для этого столбца. 13. Что такое оператор? Оператор (statement) – это текст, который база данных распознает как допустимую команду. Операторами можно пользоваться для выполнения таких задач, как изменение структуры таблицы, обновление данных или извлечение данных из БД. Структура операторов может варьировать, но каждый из них должен заканчиваться точкой с запятой (;). Количество строк в операторе неважно. Оператор можно записать в одну строку или разделить на несколько (для лучшей читабельности). 14. Как вы проверите, есть ли в поле значение или нет? Если в поле отсутствует значение, оно обозначается как NULL. Чтобы проверить поля на пустые значения, можно прописать в качестве условия IS NULL: WHERE [столбец] IS NULL. Чтобы найти поля со значением, добавьте в условие IS NOT NULL: WHERE [столбец] IS NOT NULL. 15. Чем отличаются DISTINCT и UNIQUE? DISTINCT – это ключевое слово, которым мы пользуемся, если хотим вернуть уникальные значения на выводе. Оно отсеивает все повторяющиеся значения в конкретном столбце. UNIQUE – это ограничение, которым пользуются, чтобы все значения столбца отличались. Оно похоже на PRIMARY KEY, с той лишь разницей, что в таблице может быть множество разных столбцов с UNIQUE. 16. Для чего используются агрегатные функции? Агрегатные функции используются для выполнения вычислений на одном или нескольких значениях и возвращают одиночное значение с осмысленной информацией. Несколько примеров агрегатных функций: COUNT(), SUM(), MAX(), MIN(), AVG() и ROUND(). 17. Что такое соединение (JOIN)? JOIN – это способ объединения строк из двух и более таблиц посредством общего столбца. 18. В чем отличие INNER JOIN от LEFT JOIN? INNER JOIN используется для объединения строк из двух таблиц, которые соответствуют условию ON. В конечный результат не попадают строки, не соответствующие условию ON. LEFT JOIN сохраняет все строки из первой таблицы, вне зависимости от того, есть ли для них совпадающая по условию ON строка во второй таблице. 19. Для чего нужны оконные функции? Оконные функции (windows functions) нужны в случаях, когда вы хотите сохранить значения своей исходной таблицы и параллельно отобразить сгруппированную или суммарную информацию. Они похожи на агрегатные функции, но не сокращают количество строк в результате, а объединяют и группируют их в несколько результатов. 20. Что такое индексы и для чего они нужны? Индексы – это мощный инструмент, который используется в фоновом режиме БД для ускорения запросов и выступает в роли справочной таблицы для данных. Они нужны для эффективного хранения данных и быстрого их получения, что может быть критически важным для успеха крупных технологических компаний, которые обрабатывают петабайты данных каждый день.
img
Полиалфавитный шифр – это криптосистема, в которой используется несколько моноалфавитных шифров. Поэтому нам необходимо иметь как минимум 2 таблицы и шифрование текста происходит следующим образом. Первый символ шифруется с помощью первой таблицы, второй символ – с помощью второй таблицы и так далее. Сильные стороны полиалфавитных шифров заключается в том, что атака по маске и атака частотным криптоанализом здесь не работает, потому что в таких шифрах две разные буквы могут быть зашифрованы одним и тем же символом. Моноалфавитные шифры были популярны вплоть до конца 16 века, так как практически все научились их вскрывать. Необходимо было что-то менять и поэтому в 1585 году был создан шифр Виженера. С этого началась новая эпоха в истории криптографии, которая называется период полиалфавитных шифров, хотя попытки создать подобные криптосистемы были и раньше за пол века до этого, но ничего серьёзного из этого не получилось. Шифр Гронсфельда Данный шифр представляет собой модификацию шифра Цезаря и по своей структуре похож на шифр Виженера. Принцип работы. Берём к примеру текст «РАБОТА» и ключ, например - «136». Ключ в данном случае не одно число, а набор цифр, для понимания можно представить в виде «1,3,6» и не важно какой длины. Далее каждой букве исходного текста присваиваем по 1 цифре ключа, например «Р(1) А(3) Б(6) О(1) Т(3) А(6)» и каждому символу исходного текста прибавляем значение ключа по методу Цезаря. Получается зашифрованный текст «СГЖПХЁ». При расшифровании проделываем ту же логику, как при расшифровании по методу Цезаря. Шифр Виженера Шифр Виженера является самым популярным полиалфавитным шифров за всю историю. Для начала создаётся квадрат Виженера. Ключом в данном методе может быть любой длины и состоять из любых символов, которые есть в таблице 3. Например возьмём ключ «ШИНА» и исходный текст «РАБОТА». Проделываем то же самое, что и при шифре Гронсфельда, к каждой букве исходного текста записываем исходную букву ключа – «Р(Ш) А(И) Б(Н) О(А) Т(Ш) А(И)». Согласно таблице 3 по диагонали находим букву исходного текста, а по вертикали находим букву ключа, их пересечение является зашифрованной буквой, таким образом проделываем для всех букв и шифруем текст, получается «СЙППКЙ». Чтобы расшифровать нам нужно точно так же под каждой буквой закрытого текста записываем букву ключа - «С(Ш) Й(И) П(Н) П(А) К(Ш) Й(И)». По вертикали находим букву ключа и по этой строке находим зашифрованную букву, пересечение с буквой по горизонтальной строки – буква исходного текста, расшифровывает и получаем исходный текст. Атака методом индекса совпадений В данном случае рассмотрим криптоанализ шифра Виженера, его так же можно применять и к шифру Гронсфельда. Нижеприведённый метод криптоанализа называется методом индекса совпадений. Атака методом индекса совпадений состоит из 2 шагов: Определяет длину ключевого слова Дешифрование текста Рассмотрим каждый из этапов: 1. Для того, чтобы найти длину ключа воспользуемся методом индекса совпадений. ИС = 0,0553 Индекс совпадений – это константа, вероятность того, что две наугад выбранные буквы в нормальном осмысленном произвольном русском тексте будут одинаковые.То есть вероятность, что две наугад выбранные буквы будут одинаковые, равна 5,53%. При атаке на шифротекст необходимо ориентироваться именно на эту вероятность. Если имеет шифротекст, зная о нём только то, что он зашифрован шифром Виженера, определяем длину ключа. В шифре Виженера ключом выступает любая последовательность цифр, начиная с 2, потому что если была бы 1 буква, то это просто шифр Цезаря. Итак, начиная с минимума, предполагаем, что длина ключа составляет 2 символа и проверяем это. Выбираем из шифротекста каждую вторую букву, начиная с первой и выписываем отдельно полученную строку. Предполагаемую длину ключа обозначаем k=2, а количество символов в этой строке за L. Далее из алфавита берём каждую букву и считаем для неё индекс совпадений, то есть берём определённую букву и подсчитываем сколько раз она встретилась в этой строке шифротекста (это число обозначаем – n), и так для всех букв. Далее высчитываем индекс совпадений по формуле ИС = n(n-1)/L(L-1) Далее высчитываем индекс совпадений для всего текста путем сложения всех индексов совпадений для всех букв отдельно. Получаем определённое значение и сравниваем его со значением константы. Если индекс совпадений очень близко к константе или больше, то это означает, что подобрана верная длина ключа. Если значение индекса намного отличается от константы, то значит подобранная длина ключа неверная и необходимо взять длину ключа 3 и выбирать из шифротекста каждую третью букву, начиная с первой и выполнять те же действия. Если индекс снова намного отличается от константы берем следующие значения ключа и выполняет те же действия, до тех пор, пока индекс совпадений будет очень близок к константе. 2. Вычислив длину ключевого слова возвращаемся к шифротексту. Разбиваем текст на количество символов символов в ключе, например, при длине ключа k=3, делим текст на 3 части. В первую часть будет входить каждая третья буква, начиная с первой, во вторую часть – каждая третья буква, начиная со второй, и третья часть – каждая третья буква, начиная с третьей. После этого выписываем отдельно каждую часть. Отдельная часть представляет собой обычный шифр Цезаря. Далее дешифруем каждую часть методом частотного криптоанализа. Находим самую частую букву каждой части шифротекста, сравниваем её с буквой «О», так как она в русском алфавите самая частая и сравниваем шифрованную букву с буквой «О». Вычисляем разницу позиций между ними – в ответе получим число, равное ключу и дешифруем с помощью него по шифру Цезаря первую часть шифротекста. Такие же действия проделываем и для остальных частей, затем восстанавливаем части дешифрованного шифротекста и получаем исходный текст. Автокорреляционный метод Данный метод проще в реализации, чем метод индекса совпадений, но последовательность действий точно такая: Определение ключа Дешифрование текста Имея шифротекст, необходимо посчитать количество букв в нём. Желательно весь шифротекст записать в одну строку, затем сделать копию и разместить под ней же. Как и в случае с методом индекса совпадением предполагаем для начала минимальную длину ключа, то есть k=2. Затем в копии строки шифротекста убираем первые два символа и дописываем их в конец строки. Далее ищем количество совпадающих букв между этими двумя строками и находим долю количества совпадений от общего количества символов в тексте по формуле: Y = n/L Y - Доля количества совпадений n – количество совпадений L – количество символов в шифротексте Полученное значение сравниваем со значением контанты индекса совпадений, так же – если это значение намного отличается, предполагаем длину ключа k=3 и делаем ту же процедуру до тех пор, пока доля количества совпадений будет близка к константе индекса совпадений. После нахождения длины ключа проделываем то же самое, что и в методе индекса совпадений и дешифруем текст. Шифр Тритемиуса Шифр Тритемиуса позиционируется усиленным шифром Цезаря и описывается формулой: C = (m+s(p))modN C - номер зашифрованного символа в алфавите m - номер символа открытого текста в алфавите n - количество символов в алфавите s(p) - это ключ, который представляет собой математическую функцию, например: s(p) = 2p+const p - порядковый номер символа в исходном тексте const - любое число, которое задаётся в ручную Точно так же, как в шифре Цезаря каждый символ, перед тем, как шифровать, будет переводится в число, согласно определённой таблице. Первое, что нужно сделать – пронумеровать все символы в исходном тексте, то есть каждый символ получается свой номер в зависимости от своей позиции в тексте. Шифрование происходит посимвольно. Расшифрование происходит похожим способом и описывается формулой: C = (m-s(p))modN Шифр для своего времени очень неплох, потому что не смотря на свою простоту, то есть самая сложная часть – это выбрать функцию s(p). Он демонстрирует достаточно высокий криптоустойчивости, то есть не уступает ни шифру Виженера, ни шифру Гросфельда. Книжный шифр Книжный шифр – не является популярным шифром среди старых шифров, но при грамотном подходе к использованию, обеспечивает криптостойкость на порядки выше, чем шифр Виженера и Гронсфельда. Это симметричный шифр, в котором в качестве ключа используется любая книга на выбор, и процесс шифрования происходит посимвольно. Выбираем первый символ исходного текста и находим его в нашей книге (с любого места). И в качестве зашифрованного символа используем комбинацию из 3 цифр (номер страницы, номер строки, номер символа в строке) и проделываем тоже самое с остальными символами исходного текста. При этом для повышения безопасности при повторении символа в исходном тексте выбирать для него другую комбинацию в книге, чтобы зашифрованные комбинации не повторялись. Чтобы получатель смог расшифровать полученное сообщение должен обладать точно такой же книгой. Поочередно смотрит комбинацию и находит её в данной книге и расшифровывает полученное сообщение. Недостаток этого шифра – это непрактичность и трудоёмкость при шифровании и расшифровании.
img
Любая программа – это набор инструкций, будь то добавление 2 чисел или отправка запроса по сети. Компиляторы и интерпретаторы берут понятный для человека код и переводят его на машинный язык, который может прочесть компьютер. В компилируемом языке целевая машина переводит программу самостоятельно. В интерпретируемом языке исходный код не переводится самой машиной; его читает и выполняет другая программа (интерпретатор). Подробное объяснение Представьте ситуацию: вы решили приготовить хумус. Но имеющийся у вас рецепт написан на древнегреческом. У вас, как человека не знающего этого языка, есть два варианта. Вариант 1: кто-то уже перевел этот рецепт на ваш язык. Поэтому вы (и любой человек, знающий ваш язык) сможете прочесть рецепт в переводе и приготовить хумус. Переведенный рецепт и будет компилированной версией. Есть и другой вариант: у вас есть друг, который знает древнегреческий. Поэтому, решив приготовить хумус, вы пригласили этого друга к себе. Друг сидит рядом и переводит рецепт – строчка за строчкой, – а вы занимаетесь готовкой. Ваш друг – это интерпретатор (переводчик) для интерпретируемой версии рецепта. Компилируемые языки Компилируемые языки сразу переводятся в машинный код, который может выполнить процессор. В результате они выполняются быстрее и эффективнее, чем интерпретируемые языки. Кроме того, в таких языках разработчик лучше контролирует аппаратные средства (управление памятью, использование ЦП и т.д.). Компилируемым языкам требуется дополнительный этап «сборки», при котором их сначала компилируют вручную. Каждый раз при внесении изменений вам нужно будет «пересобирать» программу. Вернемся к примеру с хумусом. Перевод рецепта делался до того, как попал к вам в руки. Если автор рецепта захочет изменить тип оливкового масла, то весь рецепт придется переводить заново, а затем повторно отправлять вам. Примеры истинных компилируемых языков: C, C++, Erlang, Haskell, Rust и Go. Интерпретируемые языки Интерпретаторы проходятся по каждой строке программы и выполняют все команды. Если автор из нашего примера захочет заменить оливковое масло, то он просто зачеркнет старую запись и добавит новую. А затем ваш друг-переводчик сразу увидит это изменение и переведет его вам. Интерпретируемые языки гораздо медленнее компилируемых. Но с появлением JIT-компиляции (динамической компиляции) эта разница начинает сокращаться. Примеры популярных интерпретируемых языков: PHP, Ruby, Python и JavaScript. Небольшое пояснение В большинстве языков программирования есть компилируемые и интерпретируемые реализации, а сам язык необязательно относится только к компилируемым или интерпретируемым. Но для простоты и удобства их принято относить к тому или иному типу. Например, Python можно выполнять как компилируемую программу или интерпретируемый язык в интерактивном режиме. А большинство инструментов командной строки, интерфейсов командной строки и оболочек чисто теоретически относятся к интерпретируемым языкам. Плюсы и минусы Плюсы компилируемых языков Обычно программы, скомпилированные в машинный код, выполняются быстрее интерпретируемых. Это связано с тем, что при переводе кода в процессе его выполнения увеличивается потребление ресурсов, что, в свою очередь, замедляет программу. Минусы компилируемых языков Основные недочеты компилируемых языков: нужно больше времени для завершения полной компиляции перед тестированием; сгенерированный двоичный код зависит от платформы. Плюсы интерпретируемых языков Интерпретируемые языки более гибкие и чаще предлагают такие возможности, как динамическая типизация и меньший размер программы. Кроме того, исходный код программы выполняют интерпретаторы, поэтому сам код не зависит от платформы. Минусы интерпретируемых языков Самый главный недочет этих языков – скорость выполнения. Она обычно ниже, чем в компилируемых языках.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59