35131

Форматирование результатов запроса

Практическая работа

Информатика, кибернетика и программирование

Например можно применить следующую команду чтобы увидеть определенные поля таблицы Slespeople упорядоченные по убыванию поля commission comm: SELECT snme comm FROM Slespeople ORDER BY 2 DESC; Мы рассматриваем это свойство ORDER BY для того чтобы продемонстрировать возможность его использования со столбцами выходных данных; эта процедура аналогична применению ORDER BY со столбцами таблицы. Например чтобы подсчитать заявки orders для каждого продавца slespeople и вывести результаты в убывающем порядке: SELECT snum COUNT DISTINCT...

Русский

2013-09-09

82 KB

3 чел.

Занятие 2

7.Форматирование результатов запроса

Упорядочение выходных полей

Таблицы являются неупорядоченными множествами, и исходящие из них данные необязательно представляются в какой-либо определенной последовательности. В SQL применяется команда ORDER BY, позволяющая внести некоторый порядок в выходные данные запроса. Она их упорядочивает в соответствии со значениями одного или нескольких выбранных столбцов. Множество столбцов упорядочиваются один внутри другого, как в случае применения GROUP BY, и можно задать возрастающую (ASC) или убывающую (DESC) последовательность сортировки для каждого из столбцов. По умолчанию принята возрастающая последовательность сортировки.

Таблица заявок (ORDERS), упорядоченная по номеру заявки, можно получить с помощью запроса:

SELECT * FROM Orders ORDER BY cnum DESC;

Упорядочение по множеству столбцов

Внутри уже произведенного упорядочения по полю cnum можно упорядочить таблицу и по другому столбцу, например, amt:

SELECT * FROM Orders ORDER BY cnum DESC, amt DESC;

Так можно использовать ORDER BY одновременно для любого количества столбцов. Во всех случаях столбцы, по которым выполняется сортировка, входят в число выбранных. Этому требованию стандарта ANSI удовлетворяет большинство систем.

Следующая команда неверна:

SELECT cname,city FROM Customers ORDER BY cnum;

Поскольку поле cnum отсутствует в списке выбранных полей, предложение ORDER BY не может его найти для упорядочения выходных данных. Даже если система позволяет это сделать, значимость такого упорядочения неочевидна, поскольку само поле, по которому выполняется сортировка, не представлено в выходных данных. Поэтому включение в них всех столбцов, используемых в предложении ORDER BY, весьма желательно.

Упорядочение составных групп

ORDER BY может использоваться с GROUP BY для упорядочения групп. ORDER BY всегда выполняется последней. Вот пример из предыдущего раздела с добавлением предложения ORDER BY. До этого выходные данные были сгруппированы, но порядок групп был произвольным; теперь группы выстроены в определенной последовательности:

SELECT snum, odate, MAX(amt) FROM Orders GROUP BY snum, odate

ORDER BY snum;

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

Упорядочение результата по номеру столбца

Вместо имен столбцов для указания полей, по которым упорядочиваются выходные данные, можно использовать номера. Но ссылаясь на них, следует иметь в виду, что это номера в определении выходных данных, а не столбцов в таблице. Т.е. первое поле, имя которого указано в SELECT, является для предложения ORDER BY полем с номером 1, независимо от его расположения в таблице. Например, можно применить следующую команду, чтобы увидеть определенные поля таблицы Salespeople, упорядоченные по убыванию поля commission (comm):

SELECT sname, comm FROM Salespeople ORDER BY 2 DESC;

Мы рассматриваем это свойство ORDER BY для того, чтобы продемонстрировать возможность его использования со столбцами выходных данных; эта процедура аналогична применению ORDER BY со столбцами таблицы.

Столбцы, полученные с помощью функций агрегирования, константы или выражения в предложении запроса SELECT, можно применить и с ORDER BY, если на них ссылаются по номеру. Например, чтобы подсчитать заявки (orders) для каждого продавца (salespeople) и вывести результаты в убывающем порядке:

SELECT snum, COUNT (DISTINCT onum) FROM Orders

GROUP BY snum ORDER BY 2 DESC;

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

SELECT snum, COUNT (DISTINCT onum) FROM Orders GROUP BY snum ORDER BY COUNT (DISTINCT onum) DESC;

Многими системами такая команда воспринимается как ошибочная.

ORDER BY с NULL-значениями

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

8.Использование множества таблиц в одном запросе

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

Соединение таблиц

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

Операция такого рода называется соединением (join) и является одной из самых мощных операций для реляционных баз данных. Как уже говорилось преимущество реляционного подхода заключается в связях (relationships), которые можно установить между элементами данных в таблице. С помощью соединений непосредственно связывается информация, содержащаяся в таблицах, независимо от их числа, а также между отдельны
ми частями любой таблицы.

При операции соединения таблицы перечисляются в предложении запроса FROM: имена таблиц разделяются запятыми. Предикат запроса может ссылаться на любой столбец любой из соединяемых таблиц и, следовательно, может использоваться для установления связей между ними. Обычно предикат сравнивает значения в столбцах различных таблиц для того, чтобы определить, удовлетворяется ли условие WHERE.

Имена таблиц и столбцов

Полное имя столбца состоит из имени таблицы, непосредственно за которым стоит точка, а за ней - имя столбца. Приведем несколько примеров:

Salespeople, snurr.

Customers.city

Orders.odate

В приводимых ранее примерах имена таблиц можно было опускать, поскольку запросы адресовались только к одной таблице, и SQL выполнял подстановку имени соответствующей таблицы в качестве префикса. Даже при формулировке запроса к множеству таблиц их имена можно опустить, если все столбцы этих таблиц различны. Однако так бывает далеко не всегда. Например, есть две простые таблицы с одинаковыми именами столбцов-city. Если для них необходимо выполнить операцию соединения, то следует указать Salespeople.city или Customers.city, что дает возможность SQL однозначно определить, о каком столбце идет речь.

Выполнение операции соединения (join)

Предположим, нужно установить связь между продавцами (Salespeople) и покупателями (Customers) в соответствии с местом их проживания, чтобы получить все возможные комбинации продавцов и покупателей из одного города. Для этого необходимо взять продавца из таблицы Salespeople и выполнить по таблице Customes поиск всех покупателей,  имеющих то же значение в столбце city. Это можно сделать, введя следующую команду:

SELECT Customers.cname, Salespeople.sname, Salespeople.city FROM Salespeople, Customers WHERE Salespeople.city = Customers.city;

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

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

9.Вложение запросов

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

Как выполняются подзапросы?

SQL позволяет вкладывать запросы друг в друга. Обычно внутренний запрос генерирует значения, которые тестируются на предмет истинности предиката. Предположим, известно имя, но мы не знаем значения поля snum для продавца Motica. Необходимо извлечь все ее заказы из таблицы Orders. Перед вами один из способов решения этой проблемы:

SELECT * FROM Orders WHERE snum = (SELECT snum FROM Salespeople WHERE sname = 'Motika');

Чтобы оценить внешний (основной) запрос, SQL прежде всего должен оценить внутренний запрос (или подзапрос) в предложении WHERE. Эта оценка осуществляется так, как если бы запрос был единственным: просматриваются все строки таблицы Salespeople и выбираются все строки, для которых значение поля sname равно Motika, для таких строк выбираются значения поля snum.  В результате выбранной оказывается единственная строка с определенным значением snum. Однако вместо простого вывода этого значения SQL подставляет его в предикат основного запроса вместо самого подзапроса.

Подзапрос должен выбирать один и только один столбец, а тип данных этого столбца должен соответствовать типу значения, указанному в предикате. Часто выбранное поле и это значение имеют одно и то же имя (в данном случае, snum).

Если бы было известно заранее значение персонального номера продавца (salesperson number) Motika, то его можно было бы указать после WHERE и тем самым освободиться от подзапроса, однако, использование подзапроса делает процедуру более гибкой. Вариант с подзапросом сработает и в случае изменения персонального номера продавца Motika. Простая замена имени продавца в подзапросе позволяет использовать его во множестве вариантов.

Значения, получаемые в процессе выполнения

подзапросов

Весьма полезно то, что подзапрос в данном случае возвращает одно и только одно значение. Если вместо WHERE sname = 'Motika' подставить WHERE city = 'London', то в результате выполнения подзапроса получается несколько значений. Это делает невозможной оценку предиката основного запроса на предмет истинности или ложности, что приводит к оценке запроса как ошибочного.

При использовании подзапросов, основанных на операторах отношения (равенства или неравенства), нужно быть уверенным, что выходными данными подзапроса является только одна строка.

Если применяется подзапрос, не генерирующий никаких значений, то это не является ошибкой, однако в настоящем случае и основной запрос не даст никаких выходных данных. Подзапросы, не генерирующие никаких выходных данных (или NULL ВЫХОД), приводят к тому, что предикат оценивается не как истинный или ложный, а как имеющий значение "неизвестно" (unknown). Предикат со значением "неизвестно" работает как и предикат со значением "ложь": основной запрос не выбирает ни одной строки. Попытку использовать нечто вроде

SELECT * FROM Orders WHERE snum = (SELECT snum FROM Salespeople WHERE city > 'Barcelona');

нельзя признать удачной.

Если в городе Barcelona есть только один продавец (salesperson) Mr.Rifkin, то подзапрос выберет единственное значение snum, и, следовательно, будет воспринят. Однако это справедливо только для текущих данных. В результате изменения состава данных таблицы Salespeople вполне реальной может стать ситуация, когда в городе (city) Barcelona появятся два продавца, тогда в результате выполнения подзапроса получим два значения, и, следовательно, запрос будет признан ошибочным.

10.Использование предложения UNION

Можно задать множество запросов одновременно и комбинировать их выходные данные с использованием предложения UNION. UNION объединяет выходные данные двух или более SQL-запросов в единое множество строк и столбцов. Для того чтобы получить сведения обо всех продавцах (salespeople) и покупателях (customers) Лондона в виде выходных данных одного запроса, следует ввести:

SELECT snum, sname FROM Salespeople WHERE city = 'London'

UNION

SELECT cnum, cname FROM Customers WHERE city = 'London';

Столбцы, выбранные с помощью двух команд, представляются в выходных данных так, как если бы они выбирались с помощью одного запроса.

Заголовки столбцов опущены, поскольку в результат объединения входят столбцы из нескольких разных таблиц. Таким образом столбцы в выходных данных не поименованы.

Только последний запрос заканчивается точкой с запятой. Отсутствие этого знака дает возможность SQL распознать, что следует еще один запрос.

11. Ввод, удаление и изменение значений полей

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

Команды обновления DML

Данные заносятся в поля и исключаются из них с помощью трех команд языка манипулирования данными (Data Manipulation Language -  DML: INSERT (вставить), UPDATE (обновить) и DELETE (удалить)). В SQL их часто называют командами обновления (update commands).

Ввод значений

Все строки в SQL вводятся при помощи команды обновления INSERT. В простейшем случае команда INSERT имеет такой синтаксис:

INSERT INTO <имя таблицы> VALUES (<значение>,<значение>...);

Например, для того чтобы ввести строку в таблицу Salespeople, можно использовать следующее предложение:

INSERT INTO Salespeople VALUES (1001, 'Peel', 'London',.12):

Команды языка манипулирования данными не генерируют выходных данных, но программа должна уведомлять пользователя о том, что данные добавлены. Имя таблицы (в данном случае Salespeople) должно быть определено предварительно (до выполнения команды INSERT) с помощью специальной команды, а каждое значение в списке значений должно иметь тип данных, соответствующий типу данных столбца, в который это значение должно быть вставлено. Согласно стандарту ANSI, эти значения не могут включать выражения. Отсюда следует, что значение 3 допустимо, а 1+2- недопустимо. Значения, конечно, вводятся в таблицу в порядке следования столбцов таким образом, что первое из значений, указанных в списке VALUES команды INSERT, вводится автоматически в столбец с номером 1, второе - в столбец с номером 2 и т.д.

Вставка NULL-значений

Если нужно вставить NULL-значение, необходимо указать его как обычное значение. Предположим, значение поля city для Ms.Peel еще неизвестно. В этом случае для нее можно вставить строку, указав значение NULL в столбце city, следующим образом:

INSERT INTO Salespeople VALUES (1001, 'Peel', NULL,.12);

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

Именование столбцов для INSERT

Для указания имен столбцов, в которые необходимо ввести значения, порядок столбцов в таблице не важен. Предположим, значения для таблицы Customers берутся из напечатанного отчета, в котором интересующие сведения представлены в таком порядке: city, cname, cnum. Для простоты желательно вводить значения в порядке, указанном в напечатанном отчете.

Можно воспользоваться командой:

INSERT INTO Customers (city, cname, cnum) VALUES ('London', 'Hoffman', 2001);

Остальные столбцы, которые присутствуют в таблице, опущены. Столбцы с именами rating и snum опущены. Это означает, что для каждого из них автоматически назначаются значения по умолчанию. По умолчанию может быть установлено либо значение NULL, либо вполне определенное значение. Если ограничения целостности не допускают использования NULL-значения в данном столбце и для столбца не назначено значение "по умолчанию", то в такой столбец можно занести значение с помощью любой команды INSERT.

Вставка результатов запроса

Команду INSERT можно применить для того, чтобы извлечь значения из одной таблицы и разместить их в другой, воспользовавшись для этого запросом. Для этого достаточно заменить предложение VALUES на соответствующий запрос, как в примере:

INSERT INTO Londonstaff SELECT * FROM Salespeople WHERE city > 'London';

По этой команде все значения, полученные с помощью запроса (т.е. все строки таблицы Salespeople, для которых значение поля city = 'London'), размещаются в таблице с именем Londonstaff. Чтобы  избежать проблем при выполнении команды; таблица Londonstaff должна удовлетворять следующим условиям: она должна иметь четыре столбца, соответствующих столбцам таблицы Salespeople в смысле типов данных, т.е. первый, второй и т.д. столбцы каждой из таблиц должны иметь один и тот же тип (использования одних и тех же имен не требуется).

Основное правило, в соответствии с которым столбцы таблицы вставляются, заключается в соответствии столбцов таблицы столбцам выходных данных запроса, в данном случае, таблице Salespeople целиком. Londonstaff является здесь независимой таблицей, имеющей ряд значений совпадающих со значениями таблицы Salespeople. Если значения в таблице Salespeople изменить, то эти изменения не отразятся на значениях, хранящихся в таблице Londonstaff (хотя эффект согласованного изменения данных можно создать, определив представления). Поскольку и запрос, и команда INSERT могут указывать столбцы по имени, при желании можно переставить выбираемые столбцы (указать имена в команде SELECT) или указать имена вставляемых столбцов в произвольном порядке (указать имена в команде INSERT).

Предположим, решено создать новую таблицу с именем Daytotals, которая будет отслеживать объемы заказов за каждый день. Допустим, необходимо ввести эти данные независимо от таблицы Orders, воспользовавшись при этом уже имеющимися в ней данными. Предположим, таблица Orders содержит данные по последнему финансовому году, а не за несколько дней, как в нашем примере. В этом случае преимущества использования предложения INSERT для вычисления и ввода значений вполне очевидны:

INSERT INTO Daytotals (date, total) SELECT odate, SUM (amt) FROM Orders GROUP BY odate;

Заметим, что имена столбцов для двух таблиц Orders и Daytotals не совпадают. Но если date и total являются единственными столбцами таблицы и следуют в ней в указанном порядке, то имена в предложении INTO можно опустить.

Исключение строк из таблицы

Строки из таблицы можно исключить с помощью команды обновления DELETE. По этой команде исключаются только целые строки, а не отдельные значения полей; таким образом имя поля не является аргументом, необходимым для выполнения команды, и воспринимается как ошибочный аргумент. Для исключения всех строк таблицы Salespeople, следует ввести следующее предложение:

DELETE FROM Salespeople;

В результате выполнения этой команды таблица становится пустой

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

DELETE FROM Salespeople WHERE snum = 1003;

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

DELETE FROM Salespeople WHERE city = 'London';

Изменение значений полей

По команде UPDATE можно изменять некоторые или все значения в существующей строке. Эта команда содержит предложение UPDATE, позволяющее указать имя таблицы, для которой выполняется операция, и SET предложение, определяющее изменение (изменения), которое необходимо выполнить для определенного столбца (столбцов). Например, для того чтобы изменить для всех покупателей рейтинг на 200, следует ввести:

UPDATE Customers SET rating = 200;

Обновление только определенных строк

Замена значения столбца во всех строках таблицы, как правило, не нужна. Поэтому в команде UPDATE, как и в команде DELETE, можно использовать предикат. Для выполнения указанной замены значений столбца rating, для всех покупателей, которые обслуживаются продавцом Peel (snum = 1001), следует ввести:

UPDATE Customers SET rating = 200 WHERE snum = 1001;

UPDAТЕ для множества столбцов

Нет нужды ограничиваться обновлением значения единственного столбца в результате выполнения команды UPDATE. В предложении SET можно указать любое количество значений для столбцов, разделенных запятыми. Все указанные изменения выполняются для каждой строки таблицы, удовлетворяющей предикату. В каждый момент времени обрабатывается одна строка таблицы.  Предположим,  Motika заменена новым продавцом (salesperson), необходимо сохранить ее персональный номер, но в соответствующую строку таблицы внести данные, о новом продавце:

UPDATE Salespeople SET sname = 'Gibson', city = 'Boston', comm = .10 WHERE snum = 1004;

В результате выполнения команды все покупатели продавца Motika со своими заказами перейдут к Gibson, поскольку они связаны с Motika по значению поля snum. Однако невозможно обновить множество таблиц с помощью единственной команды, так как нельзя использовать имя таблицы в качестве префикса имени столбца в предложении SET. Т.е. нельзя указать:

SET Salespeople.sname " 'Gibson'

в команде UPDATE, можно только:

SET sname = 'Gibson'

Использование выражений в UPDATE

В предложении SET команды UPDATE можно использовать скалярные выражения, указывающие способ изменения значений поля в отличие от предложения VALUES команды INSERT, в котором нельзя использовать  выражения. Это весьма полезная характеристика. Предположим, решено удвоить комиссионные продавцов. Можно использовать следующее выражение:

UPDATE Salespeople SET comm = comm*2;

Поскольку есть ссылка на значение существующего столбца в предложении SET, для каждой текущей строки выбирается значение указанного столбца, над которым выполняется заданная операция (в данном случае значение увеличивается в два раза). Можно комбинировать отдельные компоненты предложения UPDATE. Например, можно изменить значение комиссионных только для продавцов из Лондона с помощью предложения:

UPDATE Salespeople SET comm = comm*2 WHERE city = 'London';

Применение UPDAТЕ к NULL-значениям

Предложение SET не является предикатом. В нем можно указать значение NULL без использования какого-либо специального синтаксиса (например, такого как IS NULL). Таким образом, если нужно установить все рейтинги покупателей из Лондона (city = 'London') равными NULL-значению, необходимо ввести следующее предложение:

UPDATE Customer SET rating = NULL WHERE city = 'London';

В результате выполнения этой команды значения рейтинга для всех покупателей из Лондона станут неопределенными (имеющими NULL-значение).


 

А также другие работы, которые могут Вас заинтересовать

41525. Физическая культура в системе научной организации труда расширенного отдыха и восстановления работоспособности людей молодого и зрелого возраста 66 KB
  Роль физической культуры и спорта в формировании здорового образа жизни населения Мировые тенденции развития физической культуры Состояние человеческого ресурса в России и необходимость повышения социальной роли физической культуры и спорта Уровень развития массовой физической культуры России.
41526. Особенности направленного использования средств физической культуры в жизни людей пожилого и старшего возраста 84 KB
  Особенности направленного использования средств физической культуры в жизни людей пожилого и старшего возраста Содержание 1. Оздоровительная физическая культура в практике физического воспитания Оздоровительный и профилактический эффект массовой физической культуры неразрывно связан с повышенной физической активностью усилением функций опорнодвигательного аппарата активизацией обмена веществ. По последним данным в настоящее время только 20 населения экономически развитых стран занимаются достаточно интенсивной физической тренировкой...
41527. Возрастные и методические основы физического воспитания детей школьного возраста 101 KB
  Возрастные и методические основы физического воспитания детей младшего школьного возраста Этот период характеризуется равномерными и достаточно интенсивными темпами развития ребенка. Основная направленность физического воспитания в младшем школьном возрасте заключается в попутном стимулировании процесса развития физических качеств проявляющихся в процессе формирования двигательных умений и навыков. К основным методам обеспечивающим эффективность процессов обучения двигательным действиям и развития физических качеств могут быть отнесены...
41528. Физическая культура в системе воспитания детей раннего и дошкольного возраста 126.5 KB
  Задачи и содержание физического воспитания детей и дошкольного возраста Возрастные особенности физического развития и физической подготовленности детей раннего и дошкольного возраста Средства физического воспитания детей раннего и дошкольного возраста
41529. Общая характеристика системы физического воспитания в общеобразовательной школе 89 KB
  Общая характеристика системы физического воспитания в общеобразовательной школе Значение и задачи школьного физического воспитания Принципы методы и средства школьного физического воспитания Формы проведения школьного физического воспитания Организационное обеспечение урока физической культуры Гигиенические основы физического воспитания в ООШ. Значение и задачи школьного физического воспитания. Социальнопедагогическое значение направленного использования средств физического воспитания заключается в следующем:...
41530. ЛИНГВИСТИЧЕСКИЕ ОСОБЕННОСТИ ГЕРМАНСКИХ ЯЗЫКОВ 177 KB
  Фонетические особенности германских языков Особенности развития морфологической системы древнегерманских языков Фонетические особенности германских языков.
41531. ВОЗНИКНОВЕНИЕ И РАЗВИТИЕ АНГЛИЙСКОГО ЯЗЫКА 188.5 KB
  Проблема периодизации истории английского языка Становление английского национального языка Проблема периодизации истории английского языка.
41532. РАЗВИТИЕ ФОНЕТИЧЕСКОГО СТРОЯ АНГЛИЙСКОГО ЯЗЫКА 150 KB
  Систему согласных древнеанглийского периода составляли шумные согласные смычные и щелевые и сонанты носовые и плавные. Рассмотрим соотношение согласных звуков и букв в древнеанглийском языке. Некоторые из согласных букв были многозначными т. В позиции между гласными заднего ряда а также после согласных r и l буква ჳ обозначала заднеязычный звонкий щелевой согласный [γ] например: dჳs дни sorჳ забота folჳin следовать.
41533. ОБЩИЕ СВЕДЕНИЯ О ГЕРМАНСКИХ ЯЗЫКАХ 113 KB
  Синхроническому подходу противостоит диахронический когда каждый лингвистический факт представляется как исторический этап в процессе постоянной и бесконечной эволюции языка. Невозможно правильно понять современное состояние языка его грамматические формы фонетический строй и структуру его лексического состава если не принимать во внимание тот очевидный факт что любое явление современного языка является итогом целого ряда изменений и превращений имевших место в течение более или менее длительных промежутков времени т. Таким образом...