Вход

Структура языка SQL

Рекомендуемая категория для самостоятельной подготовки:
Курсовая работа*
Код 198459
Дата создания 03 июня 2017
Страниц 33
Мы сможем обработать ваш заказ (!) 17 апреля в 12:00 [мск]
Файлы будут доступны для скачивания только после обработки заказа.
1 600руб.
КУПИТЬ

Описание

ЗАКЛЮЧЕНИЕ
Трудно спрогнозировать будущее развития реляционных баз данных и как будет происходить их интеграция с объектно-ориентированными технологиями. Вектор технологий разработки приложенийпо всей видимостипереместился в сторону объектно-ориентированных инструментальных методик и средств.
Увеличивается популярность языков Java иС++, которые используются не только в клиентских приложениях, но и в серверных приложениях. Но ведь основныепринципы табличной организации данных в реляционной модели взяты из языка СОВОL с его полями и записями и не имеют ничего общего с объектами.Проблему несоответствия
между реляционной и объектной архитектурами производители объектно-ориентированных СУБД решили радикально: они вообще исключилиреляционную модельи используют строго объектную организацию баз д ...

Содержание

Содержание
ВВЕДЕНИЕ 3
I. ИНТЕРАКТИВНЫЙ И ВЛОЖЕННЫЙ SQL 5
1.1. Субподразделения SQL 5
1.2. Команды DDL для работы с таблицами 6
1.3. Команды манипулирования данными 8
II. ВСТРОЕННЫЙ SQL 17
2.1. Основные концепции встроенного SQL 17
2.2. Статический SQL 19
2.3. Динамический SQL 22
2.4. Будущее языка SQL 25
2.4.1. Распределенные базы данных 26
2.4.2. Массивные хранилища данных 27
2.4.3. Сверхпроизводительные базы данных 28
2.4.4. Встроенные базы данных 29
ЗАКЛЮЧЕНИЕ 31
Список литературы 33

Введение

ВВЕДЕНИЕ
SQL символизирует собой Структурированный Язык Запросов. Это – язык, который дает вам возможность создавать и работать в реляционных базах данных, которые являются наборами связанной информации сохраняемой в таблицах[9].
Мир баз данных становится все более и более единым.Это привело к необходимости создания стандартного языка, который мог бы использоваться, чтобы функционировать в большом количестве различных видов компьютерных сред. Стандартный язык позволит пользователям знающим один набор команд, использовать их чтобы создавать,изменять, отыскивать ипередавать информацию независимо от того работают ли они на персональном компьютере, на универсальной ЭВМ, илисетевой рабочей станции.
В нашем все более и более взаимосвязанном компьютерном мире, пользователь снабжённый таким языком , имеет колоссальное преимущество в использовании и обобщении информации из ряда источников с помощью большого количества способов.
Независимость от специфики компьютерных технологий и элегантность, а также его поддержка в области технологии реляционных баз данныхлидерами промышленности, сделало SQLосновным стандартным языком.И вероятно в течение обозримого будущего оставит его таковым. Поэтому, любой, кто хочет работать с базами данных должен знать SQL.
SQL является, в первую очередь,информационно-логическим языком, предназначенным для описания, изменения и извлечения данных, которые хранятся вреляционных базах данных [3]. SQL можно назватьязыком программирования, при этом он не являетсяполноценным языком программирования, но вместе с тем стандарт языка предусматривает спецификациейSQL/PSM возможность егопроцедурных расширений.
Изначально SQL был основным способом работы пользователя сбазой данныхи позволял выполнять следующий набор операций:
• создание в базе данных новой таблицы;
• изменение структур таблиц;
• добавление в таблицу новых записей;
• изменение записей и удаление записей;
• выборка записей из одной или нескольких таблиц (в соответствии с заданным условием).
Со временем SQL усложнился— обогатился новыми конструкциями, обеспечил возможность описания и управления новыми объектами, например, индексы, представления, хранимые процедуры и триггеры.И стал приобретать черты, свойственные языкам программирования.
При всех своих изменениях SQL остаётся единственным механизмом связи между базой данных и прикладным программным обеспечением. В то же время современные СУБД, а также информационные системы, использующие СУБД, предоставляют пользователю развитые средства визуального построения запросов.
Поскольку SQL не является привычным процедурным языком программирования (то есть не предоставляет средств для построения ветвлений,циклов ит.д.), вводимые разными производителями расширения касаются в первую очередь процедурных расширений. Этохранимые процедуры и процедурные языки-надстройки. Практически в каждой СУБД применяется свой процедурный язык, в частности, в OracleDatabase используетсяPL/SQL, в Interbase и Firebird—PSQL, в DB2—SQL PL[en], вMicrosoft SQL ServerиAdaptiveServerEnterprise—Transact-SQL, вPostgreSQL—PL/pgSQL.

Фрагмент работы для ознакомления

Результаты не отсортированы и могут следовать в различном порядке в разные моменты времени.В результатах могут содержаться строки-дубликаты (запросе при наличии однофамильцев), повторение одной и той же строки во многих случаях только затрудняет восприятие результата.Удаление строк-дубликатов из результатов запроса для этих целей в команду выборки введено ключевое слово DISTINCT, которое записывается сразу после SЕLЕСТ.Например, для того, чтобы удалить дубликаты однофамильцев из запроса достаточно немного изменить его текст:SELECT DISTINCT name_st FROM studentsПри большом ожидаемом количестве строк-дубликатов в результатах запроса использование DISTINCT позволяет существенно сократить размер выборки.Фраза ORDER ВY..., необходимая для представления результатов выборки в отсортированном виде, обязательно должна быть последней в команде SELECT, поскольку сортировка результатов всегда завершает выполнение запроса на выборку.После ключевых слов ORDER ВY следует указание, как именно требуется отсортировать результаты. Сортировка может быть выполнена по одному или нескольким столбцам. В последнем случае сначала выполняется сортировка по первому из столбцов, указанных в списке, в случае наличия одинаковых значений, строки с одинаковыми значениями сортируются по второму из столбцов и т.д.В качестве критерия для отбора строк таблицы можно задать любое логическое выражение, используя фразу WHERE. В процессе выполнения запроса будет выполнен отбор только тех строк, для которых данное выражение принимает значение «истина». Таким образом, результатом операции выборки может быть произвольное число строк таблицы (от нуля до всех строк).Например, запрос:SELECT * FROM students WHERE cod_st=10возвратит все данные о студенте, у которого личный код=10. Такой запрос гарантированно вернет не более одной строки.Условие отбора строк может включать следующие операции:операции сравнения < , > , <= , >= , !=(<>) , =операция проверки на отсутствие данных IS NULL или их наличие IS NOT NULLлогические операции: АND, ОR, NOTоперация вхождения значения в заданный диапазон значений BETWEEN начальное значение АND конечное значениеоперация принадлежности значения заданному множеству IN (множество)операция соответствия заданному шаблону (для текстовых столбцов) LIKE 'шаблон'В шаблоне для операции LIKE разрешено использовать два символа-заменителя:% заменяет последовательность из любого количества любых символов (в том числе и пустая последовательность)_ заменяет один любой символ в заданной позиции.Важной функцией любой информационной системы является автоматическое формирование отчетности на основе данных, хранящихся в БД. Во многих отчетах требуется отображать не сами данные, а результаты их статистической обработки, например, суммарные или средние значения по различным показателям. Выполнять статистическую обработку данных в клиентских приложениях неэффективно, поскольку при этом но, поскольку при этом придется пересылать по сети большое количество необработанной информации с сервера. Более разумным решением является обеспечение возможности выполнять статистическую обработку данных непосредственно на сервере.С этой целью в команду SELECT введены агрегатные (статистические, итоговые) функции. Основная особенность этих функций состоит в том, что каждая из них вычисляет одно итоговое значение по какому-либо столбцу (это может быть и вычисляемый столбец) для множества строк таблицы.В стандарте определено 5 агрегатных функций:SUM (имя_столбца) — сумма значений заданного столбца,AVG (имя_столбца) — среднее значениеMIN (имя столбца), МАХ(имя_столбца) — минимальное и максимальное значениеCOUNT ([DISTINCT] * или имя столбца) — подсчет количества строк.Агрегатные функции могут вычисляться как по всей таблице, так и по отдельным группам строк, в последнем случае над таблицей выполняется операция группировки.При группировке формируются группы с одинаковыми значениями в столбце группировки (или нескольких столбцах), запрос возвращает столько строк, сколько получилось групп. Фактически количество групп совпадает с количеством уникальных значений в столбце группировки, поэтому группировку принято выполнить по столбцам, содержащим большое количество повторяющихся значений. Тогда количество групп будет значительно меньше, чем количество строк в таблице.Обобщив примеры, выведем общее правило для запросов с группировкой: в списке выражений, который следует за словом SELECT, могут быть только выражения из фразы GROUP BY и агрегатные функции (или выражения на их основе).После группировки можно отобрать группы, удовлетворяющие определенному условию. Для этих целей служит фраза HAVING.Например, пусть требуется выбрать тех студентов, у которых средний бал >4. Текст запроса имеет вид:SELECT соd_st, AVG(mark) аvg_markFROM marksGROUP ВY cod_stHAVING АVG(mark)>4Следует отметить, что фраза HАVING может использоваться только после фразы GROUP ВY.II. ВСТРОЕННЫЙ SQL2.1. Основные концепции встроенного SQLЯзык SQL можно использовать для доступа к базам данных в двух режимах, при интерактивной работе и в прикладных программах. По большей части сам язык одинаков в обоих вариантах. Эта двойственность SQL имеет несколько преимуществ [5]:программисты могут относительно легко научиться писать программы, которые в ходе своей работы обращаются к базам данных;все возможности, доступные в интерактивном языке запросов, автоматически доступны и в прикладных программах;инструкции SQL, предназначенные для использования в программах, вначале могут быть проверены в интерактивном режиме, а затем вставлены в исходный текст программы;программы могут работать с базами данных на уровне таблиц и результатов запросов. SQL действительно является языком, который можно использовать при написании программ, но называть его полноценным языком программирования было бы неверно. В нем отсутствуют даже самые простые возможности настоящих языков программирования. В SQL нельзя объявлять переменные, в нем отсутствуют инструкция IF для проверки условий, инструкция перехода GOTO, инструкции FOR, DO и WHILE для организации циклов и т.д. SQL можно назвать подъязыком, который служит только для управления базами данных. Чтобы создать программу, предназначенную для работы с базой данных, ее нужно написать на обычном языке программирования, таком как Java, C#, C, Visual Basic, и по мере необходимости встраивать в нее инструкции SQL.Стандарт SQL1 описывал только программный SQL. В него не была включена даже интерактивная инструкция SELECT, а вошла только программная инструкция SELECT. Стандарт SQL2 был опубликован в 1992 году. Он включил в себя спецификацию интерактивного SQL, который назывался в стандарте "прямым обращением к SQL". А также спецификацию расширенных форм программного SQL, а именно, динамического SQL.Поставщики коммерческих реляционных СУБД предлагают два основных способа применения SQL в прикладных программах:Встроенный SQL. При таком подходе инструкции SQL встраиваются непосредственно в исходный текст программы, которая создана на "полноценном" языке программирования. Здесь используются специальные инструкции встроенного SQL для пересылки информации из базы данных в программу. Исходный текст программы, который включает в себя инструкции встроенного SQL, перед компиляцией подается на вход специального препроцессора SQL. Он с помощью ряда других программных модулей преобразует этот исходный текст в исполняемую программу.Интерфейс программирования приложений. При этом подходе программа взаимодействует с СУБД посредством совокупности функций, называемой интерфейсом программирования приложений (application program interface — API). Посредством вызова API-функций, программа передает в СУБД инструкции SQL и получает обратно результаты запросов. В этом случае не требуется специального препроцессора.Встроенный SQL использовался в первых реляционных СУБД компании IBM; в 80-х годах этот подход был принят также в большинстве коммерческих реляционных СУБД. Сначала в стандарте ANSI/ISO для программного SQL был определен отдельный модульный язык. Но в 1989 году стандарт был расширен; в него вошло определение встроенного SQL для таких языков программирования, как Ада, С, СОВОL, FORTRAN, Расаl и PL/I. Эта спецификация поддерживается и в SQL2.Параллельно с развитием встроенного SQL в 80-х годах поставщики некоторых СУБД занялись разработкой интерфейсов АРI-функций. Появившаяся в то время на рынке СУБД Sybase, предлагала только такой интерфейс и не поддерживала встроенный SQL. СУБД SQL Server компании Microsoft созданная на ее основе придерживалась такой же идеологии. Вскоре после появления SQL Server компания Microsoft представила протокол ODBC (Open Database Connectivity). Это еще один интерфейс вызовов функций, в целом основанный на программном интерфейсе SQL Server. Он обеспечивает независимость от конкретной СУБД и разрешает доступ к нескольким СУБД посредством единого набора функций. Недавно появился новый протокол JDBC (Java Database Connectivity). Он предназначен для обеспечения доступа к реляционным базам данных из программ, написанных на языке Java.В целом сегодня активно используются оба подхода. В табл. 1 перечислены ведущие реляционные СУБД и указано, какие интерфейсы программирования они поддерживают.Таблица 1. Поддержка интерфейсов программного SQL в СУБД [1]СУБДAPIВстроенная поддержка языкаDB2ODBC, JDBCAssembler, Java, C++InformixODBC, JDBCC, C++SQL ServerDB-Library, ODBCC#, VisualBasicOracleOCI, ODBC, JDBCC, C++SybaseDB-Library, ODBC, JDBCC, C++2.2. Статический SQLРассмотрим, как СУБД выполняет инструкции SQL. Выполнение инструкции SQL в СУБД происходит в пять этапов (рис.1):Рис. 1. Как СУБД обрабатывает инструкцию SQLОсуществляется синтаксический анализ инструкции SQL. СУБД разделяет инструкцию на отдельные слова, потом проверяет, правильно ли в инструкции указана команда, используются ли допустимые предложения и т.д. На этом этапе выявляются синтаксические ошибки.Осуществляется проверка правильности параметров инструкции SQL. С помощью обращения к системному каталогу выясняется, существуют ли в базе данных таблицы, указанные в инструкции, существуют ли указанные столбцы и являются ли их имена однозначными, имеет ли пользователь привилегии, необходимые для выполнения инструкции. На этом этапе обнаруживаются семантические ошибки.Происходит оптимизация инструкции - СУБД исследует возможные способы ее выполнения. Выясняется, может ли быть использован индекс для ускорения поиска; нужно ли вначале применить условие отбора к таблице А, а затем объединить ее с таблицей В, или лучше начать с объединения таблиц, а условия отбора применить потом; можно ли избежать последовательного поиска по всей таблице или хотя бы ограничить его некоторой частью всей таблицы. После исследования возможных альтернатив СУБД выбирает одну из них.СУБД генерирует для инструкции план выполнения, который является двоичным представлением действий, необходимых для выполнения инструкции. План выполнения в СУБД является эквивалентом объектного кода программы.И, наконец, СУБД реализует разработанный план, тем самым выполняя инструкцию.Обратите внимание на то, что перечисленные на рис. 1 этапы отличаются по числу обращений к базе данных и по времени работы процессора, требуемому для их выполнения. Синтаксический анализ инструкции SQL не требует обращения к базе данных и, как правило, проводится очень быстро. Оптимизация же, наоборот, требует интенсивной работы процессора и обращения к системному каталогу базы данных. Для сложных многотабличных запросов оптимизатор может исследовать более десятка альтернативных путей выполнения запроса. Однако стоимость выполнения запроса "неправильным" способом так высока по сравнению со стоимостью его выполнения "правильным" (или, по крайней мере, "лучшим из найденных") способом, что время, затраченное на оптимизацию, с избытком компенсируется более быстрым выполнением запроса.В интерактивном режиме СУБД при вводе инструкции SQL последовательно проходит через все пять этапов, а пользователь в это время ожидает ответа. У СУБД нет выбора - она не знает, какую инструкцию вы введете, до тех пор, пока вы этого не сделаете. Поэтому СУБД не может с опережением обрабатывать интерактивные инструкции. Однако в случае с программным SQL ситуация меняется в корне. Ряд описанных этапов может быть реализован уже во время компиляции. Тогда во время выполнения, при эксплуатации программы пользователем, необходимо будет осуществить только оставшиеся этапы. СУБД пытается в процессе компиляции завершить как можно больший объем работы, потому что после создания окончательной версии программы она может выполняться пользователями в промышленных приложениях тысячи раз. В частности, СУБД стремится произвести оптимизацию еще во время компиляции, если это возможно.Главная идея встроенного SQL состоит в непосредственном объединении инструкций SQL с программой, написанной на базовом или включающем языке программирования, таком как Java, C#, C, Visual Basic. Объединение осуществляется на основе следующих принципов:Инструкции SQL смешиваются с инструкциями базового языка в исходном тексте программы. Исходная программа со встроенным SQL поступает на вход препроцессора SQL, который компилирует инструкции SQL.Встроенные инструкции SQL могут ссылаться на переменные базового языка программирования. Это позволяет использовать данные из программы в инструкциях SQL.Встроенные инструкции SQL получают результаты SQL-запросов с помощью переменных базового языка. Это позволяет программе пользоваться полученными данными и обрабатывать их.Для присвоения значений NULL столбцам базы данных и получения значений NULL из базы данных в программе применяются специальные переменные.Для обеспечения построчной обработки результатов запроса во встроенный SQL добавляется несколько новых инструкций, которых нет в интерактивном SQL.2.3. Динамический SQLВозможности встроенного SQL отписанные в предыдущем пункте, реализуются в так называемом статическом SQL. Статический SQL пригоден для написания обычных программ обработки данных. Например, для учебной базы данных с помощью статического SQL можно написать программу, которая позволит ввести новый или обновить существующий заказ, получить информацию о заказе и клиенте, а также позволит работать с файлом клиента и создавать все необходимые отчеты. Для решения каждой из перечисленных задач программист определяет схему доступа к базе данных и жестко "закрепляет" ее в программе в виде ряда встроенных инструкцийОднако существует достаточно большой класс приложений, в которых невозможно заранее определить схему доступа к базе данных. Например, программа создания запросов или программа, генерирующая отчеты, должна иметь возможность во время выполнения решать, какие инструкции SQL она будет использовать для доступа к базе данных. Программа для работы с электронными таблицами, установленная на персональном компьютере и имеющая доступ к серверной базе данных, также должна иметь возможность сформировать запрос к этой базе данных "на ходу". Перечисленные программы, а также другие клиентские приложения общего назначения невозможно написать, используя инструкции статического SQL. Для создания этих программ необходима усовершенствованная разновидность встроенного SQL, которая называется динамический SQL. Общая концепция, лежащая в основе динамического SQL, проста встроенная инструкция SQL не записывается в исходный текст программы. Вместо этого программа формирует текст инструкции во время выполнения в одной из своих областей данных, а затем передает сформированную инструкцию в СУБД для динамического выполнения. Хотя детали реализации являются довольно сложными, весь динамический SQL построен на этом простом принципе, о котором не следует забыватьЧтобы понять, как работает динамический SQL, и сравним его со статическим SQL полезно еще раз рассмотреть процесс выполнения инструкции SQL в СУБД. Для статической инструкции SQL первые четыре действия выполняются на этапе компиляции. В процессе компиляции программы утилита BIND (или ее эквивалент) сохраняет в базе данных план выполнения инструкции. А во время выполнения программы СУБД просто реализует план для данной инструкции.В случае с динамическим SQL ситуация абсолютно иная. Не известно заранее, какие инструкции к необходимо будет выполнять после запуска программы, поэтому СУБД не может приготовиться к их выполнению. Во время выполнения программы СУБД получает текст инструкции (называемый строкой инструкции или строкой SQL), которая должна быть динамически выполнена, и проходит через все пять этапов, изображенных на рис. 2.Рис. 2. Процесс выполнения инструкций SQL в СУБДКак и следовало ожидать, динамический SQL, менее эффективен (в смысле производительности), чем статический SQL. По этой причине всегда, когда это возможно, используется статический SQL, и большинству прикладных программистов раньше никогда не приходилось иметь дело с динамическим SQL. Однако в связи с тем, что для работы с базами данных в настоящее время широко применяется архитектура клиент/сервер, роль динамического SQL стала более важной. Пользователи персональных компьютеров все чаще работают с базами данных в таких приложениях, как электронные таблицы, текстовые процессоры и графические реакторы, а клиентские программы доступа к данным – это одна из наиболее быстро растущих областей баз данных. Во всех этих приложениях необходим динамический SQL.Важность динамического SQL еще больше возросла с появлением в последние годы трехуровневых Internet-архитектур, в которых управляющее ПО расположено на одной системе (прикладной, или промежуточный, уровень), а СУБД – на другой (информационный, или серверный, уровень). В большинстве таких систем программная логика довольно непостоянна, динамична по своей природе. Она должна адаптироваться к меняющимся условиям бизнеса, к появлению новых деловых правил. Регулярно изменяющаяся программная среда плохо сочетается со статическим SQL, в котором между программой и содержимым базы данных существует жесткая связь.Как следствие, в трехуровневых архитектурах применяются вызовы функций различных программных интерфейсов SQL, связывающих программы промежуточного уровня с базами данных серверного уровня. В этих интерфейсах явно заимствуются многие концепции из динамического SQL в частности, имеются функциональные аналоги инструкций PREPARE, EXECUTE и EXECUTE IММЕDIAТЕ. Поэтому важно четко понимать принципы работы динамического SQL, чтобы представлять, что происходит "за кулисами" программных интерфейсов SQL.2.4. Будущее языка SQLРазвитие рынка SQL и баз данных в следующем десятилетии вряд ли кто-нибудь возьмется сегодня предсказать. Перед нами открывается новая эра в жизни всего компьютерного мира — эра всеобщего перехода в среду Internet, влияние которой еще не понято до конца даже специалистами. Как эра систем клиент/сервер ознаменовалась появлением персональных компьютеров, так и кардинальные изменения в архитектуре систем, предназначенных для управления данными стали следствием изменения на рынке компьютерных систем. Скорее всего, влияние Internet будет увеличиваться все больше и больше. И все же, отдельные направления в развитии систем управления базами данных в настоящее время просматриваются достаточно четко. 2.4.1. Распределенные базы данныхНа сегодняшний день наибольшее распространение получили корпоративные приложения и еще более масштабные системы.

Список литературы

Список литературы
1. Бьюли А. Изучаем SQL. – Пер. с англ. – СПб: Символ-Плюс, 2007. –312 с.
2. Гарсиа-Молина Г., Ульман Дж., Уидом Дж. Системы баз данных. Полный курс. Пер. с англ.: — М.: Изд. дом «Вильямс», 2004. — 1088 с.
3. Голицына О.Л., Максимов Н.В., Попов И.И. Базы данных: Учебное пособие. – М.: ФОРУМ: ИНФРА-М, 2007.
4. Дейт К. Введение в системы баз данных: проектирование. Реализация и управление. Пер. с англ. – СПб.: БХВ-Петербург, 2004. – 324 с.
5. Дж. Грофф, П. ВайнбергSQL: Полное руководство: Пер. с англ. – 3-е изд., перераб. и доп. – К.: Издательская группа BHV, 2015 – 960 с.
6. К. Дж. Дейт SQL и реляционная теория. Как грамотно писать код на SQL. – Пер. с англ. – СПб.: Символ-Плюс, 2010. – 480 с., ил.
7. Кузнецов С. Д. Основы баз данных. — 2-е изд. — М.: Интернет-Университет Информационных Технологий; БИНОМ. Лаборатория знаний, 2007. — 484 с.
8. Малыхина М.П. Базы данных: основы, проектирование, использование, 2-е изд. перераб. и доп. – СПб.: БХВ-Петербург, 2007. – 528 с.
9. Мартин Грабер. Введение в SQL, БХВ-Петербург, 2010. – 228 с.
10. Ржеуцкая С.Ю. Базы данных. Язык SQL: учеб.пособие / С.Ю. Ржеуцкая. – Вологда: ВоГТУ, 2010. –159 с.
11. Фиайли К.SQL. Руководство по изучению языка: Пер. с англ. – М.: ДМК Пресс, 2013 – 456 с.
Очень похожие работы
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.00514
© Рефератбанк, 2002 - 2024