Oracle PL/SQL •MySQL •SQL Server. Join sql описание


Join (SQL) - это... Что такое Join (SQL)?

У этого термина существуют и другие значения, см. Join. Правильный заголовок этой статьи — JOIN. Он показан некорректно из-за технических ограничений.

JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в раздел FROM операторов SELECT, UPDATE или DELETE.

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

  • в схему таблицы-результата входят столбцы обеих исходных таблиц (таблиц-операндов), то есть схема результата является «сцеплением» схем операндов;
  • каждая строка таблицы-результата является «сцеплением» строки из одной таблицы-операнда со строкой второй таблицы-операнда.

Определение того, какие именно исходные строки войдут в результат и в каких сочетаниях, зависит от типа операции соединения и от явно заданного условия соединения. Условие соединения, то есть условие сопоставления строк исходных таблиц друг с другом, представляет собой логическое выражение (предикат).

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

Описание оператора

SELECT FIELD [,... n] FROM Table1 {INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN Table2 ON <condition>

В большинстве СУБД при указании слов LEFT, RIGHT, FULL слово OUTER можно опустить. Слово INNER также в большинстве СУБД можно опустить.

В общем случае СУБД при выполнении соединения проверяет условие (предикат) condition. Для CROSS JOIN условие не указывается.

Для перекрёстного соединения (декартова произведения) CROSS JOIN в некоторых реализациях SQL используется оператор «запятая» (,):

SELECT FIELD [,... n] FROM Table1, Table2

Виды оператора JOIN

Для дальнейших пояснений будут использоваться следующие таблицы:

Люди, проживающие в городах (таблица Person)

Name CityId
Андрей 1
Леонид 2
Сергей 1
Григорий 4

Города (таблица City)

Id Name
1 Москва
2 Санкт-Петербург
3 Казань

INNER JOIN

Оператор внутреннего соединения INNER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы сопоставляется с каждой строкой второй таблицы, после чего для полученной «соединённой» строки проверяется условие соединения (вычисляется предикат соединения). Если условие истинно, в таблицу-результат добавляется соответствующая «соединённая» строка.

Описанный алгоритм действий является строго логическим, то есть он лишь объясняет результат, который должен получиться при выполнении операции, но не предписывает, чтобы конкретная СУБД выполняла соединение именно указанным образом. Существует множество способов реализации операции соединения, например соединение вложенными циклами (англ. inner loops join), соединение хэшированием (англ. hash join), соединение слиянием (англ. merge join). Единственное требование состоит в том, чтобы любая реализация логически давала такой же результат, как при применении описанного алгоритма.

SELECT * FROM Person INNER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва

OUTER JOIN

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

LEFT OUTER JOIN

Оператор левого внешнего соединения LEFT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи левой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие правой таблице, заполняются значениями NULL.
SELECT * FROM Person LEFT OUTER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва
Григорий 4 NULL NULL
RIGHT OUTER JOIN

Оператор правого внешнего соединения RIGHT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи правой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие левой таблице, заполняются значениями NULL.
SELECT * FROM Person RIGHT OUTER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Сергей 1 1 Москва
Леонид 2 2 Санкт-Петербург
NULL NULL 3 Казань
FULL OUTER JOIN

Оператор полного внешнего соединения FULL OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение первой и второй таблиц по предикату (условию) p. Слова «первой» и «второй» здесь не обозначают порядок в записи (который неважен), а используются лишь для различения таблиц.

  1. В результат включается внутреннее соединение (INNER JOIN) первой и второй таблиц по предикату p.
  2. В результат добавляются те записи первой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие второй таблице, заполняются значениями NULL.
  3. В результат добавляются те записи второй таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие первой таблице, заполняются значениями NULL.
SELECT * FROM Person FULL OUTER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Сергей 1 1 Москва
Леонид 2 2 Санкт-Петербург
NULL NULL 3 Казань
Григорий 4 NULL NULL

CROSS JOIN

Оператор перекрёстного соединения, или декартова произведения CROSS JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы соединяется с каждой строкой второй таблицы, давая тем самым в результате все возможные сочетания строк двух таблиц.

SELECT * FROM Person CROSS JOIN City

или

SELECT * FROM Person, City

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Андрей 1 2 Санкт-Петербург
Андрей 1 3 Казань
Леонид 2 1 Москва
Леонид 2 2 Санкт-Петербург
Леонид 2 3 Казань
Сергей 1 1 Москва
Сергей 1 2 Санкт-Петербург
Сергей 1 3 Казань
Григорий 4 1 Москва
Григорий
4 2 Санкт-Петербург
Григорий 4 3 Казань

Если в предложении WHERE добавить условие соединения, то есть ограничения на сочетания кортежей, то результат эквивалентен операции INNER JOIN с таким же условием:

SELECT * FROM Person, City WHERE Person.CityId = City.Id

Таким образом, CROSS JOIN + WHERE(предикат) и INNER JOIN(предикат) синтаксически являются альтернативными формами записи одной и той же логической операции внутреннего соединения. Синтаксис CROSS JOIN + WHERE для операции соединения называют устаревшим,[1][2] поскольку его не рекомендует стандарт SQL ANSI.

Примечания

Ссылки

dic.academic.ru

FROM оператор | Oracle PL/SQL •MySQL •SQL Server

Это SQL руководство объясняет, как использовать SQL FROM с синтаксисом и примерами.

Описание

SQL оператор FROM используется для указания списка таблиц и любых объединений, необходимых для SQL предложения.

Синтаксис

FROM table1[ { INNER JOIN| LEFT [OUTER] JOIN| RIGHT [OUTER] JOIN| FULL [OUTER] JOIN } table2ON table1.column1 = table2.column1 ]

Параметры или аргументы

table1 и table2 это таблицы, используемые в SQL предложении. Эти две таблицы присоединяются на основании table1.column1 = table2.column1.

Примечание

  • При использовании FROM в SQL предложении, должна быть хотя бы одна таблица, перечисленная в операторе FROM.
  • Если в SQL FROM есть две или более таблиц, то, как правило, они присоединяются при помощи INNER или OUTER joins.

ПРИМЕР — С ОДНОЙ ТАБЛИЦЕЙ

Рассмотрим как использовать FROM с одной таблицей.

SELECT * FROM suppliers WHERE city = 'Newark' ORDER BY city DESC;

SELECT *

FROM suppliers

WHERE city = 'Newark'

ORDER BY city DESC;

В этом примере, в операторе FROM мы указали одну таблицу — suppliers. В SQL предложении нет joins (объединений), т.к. используется одна таблица.

ПРИМЕР – ДВУХ ТАБЛИЦ С INNER JOIN

Рассмотрим, как использовать FROM с двумя таблицами и INNER JOIN (внутреннее присоединение).

SELECT products.product_name, inventory.quantity FROM products INNER JOIN inventory ON products.product_id = inventory.product_id WHERE products.product_id < 1000;

SELECT products.product_name, inventory.quantity

FROM products

INNER JOIN inventory

ON products.product_id = inventory.product_id

WHERE products.product_id < 1000;

Этот пример показывает, как в операторе FROM перечислены две таблицы — products и inventory. Мы используем оператор FROM и INNER JOIN для соединения таблиц products и inventory, на основании наличия в обеих таблицах столбца product_id.

ПРИМЕР – ДВУХ ТАБЛИЦ С OUTER JOIN

Давайте рассмотрим, как использовать FROM для соединения вместе двух таблиц с помощью OUTER JOIN. В этом случае, мы будем рассматривать на примере LEFT OUTER JOIN.

SELECT contacts.last_name, contacts.first_name, employees.emp_number FROM contacts LEFT OUTER JOIN employees ON contacts.contact_id = employees.employee_id WHERE contacts.last_name = 'Anderson';

SELECT contacts.last_name, contacts.first_name, employees.emp_number

FROM contacts

LEFT OUTER JOIN employees

ON contacts.contact_id = employees.employee_id

WHERE contacts.last_name = 'Anderson';

В этом примере в SQL FROM перечислены две таблицы — contacts и employees. Мы используем оператор FROM и LEFT OUTER JOIN для соединения таблиц contacts и employees на основании столбца contact_id из таблицы contacts и столбца employee_id из таблицы employees.

oracleplsql.ru

Left join (SQL) - пример, подробное описание, ошибки использования

Компьютеры 3 мая 2017

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

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

Подготовка необходимых таблиц

Допустим, в нашей базе данных имеется информация о людях и их недвижимом имуществе. Основная информация основывается на трех таблицах: Peoples (люди), Realty (недвижимость), Realty_peoples (таблица с отношениями, кому из людей какая недвижимость принадлежит). Предположим, в таблицах хранятся следующие данные по людям:

Peoples

id

L_name

F_name

Middle_name

Birthday

1

Иванова

Дарья

Борисовна

16.07.2000

2

Пугин

Владислав

Николаевич

29.01.1986

3

Евгеньин

Александр

Федерович

30.04.1964

4

Аннина

Любовь

Павловна

31.12.1989

5

Герасимовская

Надежда

Павловна

14.03.1992

6

Герасимовский

Олег

Альбертович

29.01.1985

7

Сухановский

Юрий

Андреевич

25.09.1976

8

Сухановская

Юлия

Юрьевна

01.10.2001

По недвижимости:

Realty

id

address

1

г. Архангельск, ул. Воронина, д. 7, кв.6

2

г. Архангельск, ул. Северодвинская, д. 84, кв. 9, комн. 5

3

Архангельская область, г. Северодвинск, ул. Ленина, д. 134, кв. 85

4

Архангельская область, г. Новодвинск, ул. Пролетарская, д. 16, кв. 137

5

г. Архангельск, пл. Терехина, д. 89, кв. 13

По отношениям люди - недвижимость:

Realty_peoples

id_peoples

id_realty

type

7

3

Общая совместная собственность

8

3

Общая совместная собственность

3

5

Собственность

7

1

Собственность

5

4

Общая долевая собственность

6

4

Общая долевая собственность

Left join (Sql) – описание

Левое соединение имеет следующий синтаксис:

Table_A LEFT JOIN table_B [{ON предикат} | {USING список_столбцов}]

И схематично выглядит так:

И переводится данное выражение как «Выбрать все без исключения строки из таблицы А, а из таблицы В вывести только совпадающие по предикату строки. Если в таблице В не нашлось пары для строк таблицы А, то заполнить результирующие столбцы Null - значениями».

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

Left join - примеры использования

С помощью левого соединения мы можем посмотреть, у всех ли людей из списка Peoples имеется недвижимость. Для этого выполним следующий в left join sql пример запроса:

SELECT Peoples.*, Realty_peoples.id_realty, Realty_peoples.type

FROM Peoples LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples;

И получим следующий результат:

Запрос1

id

L_name

F_name

Middle_name

Birthday

id_realty

type

1

Иванова

Дарья

Борисовна

16.07.2000

2

Пугин

Владислав

Николаевич

29.01.1986

3

Евгеньин

Александр

Федерович

30.04.1964

5

Собственность

4

Аннина

Любовь

Павловна

31.12.1989

5

Герасимовская

Надежда

Павловна

14.03.1992

4

Общая долевая собственность

6

Герасимовский

Олег

Альбертович

29.01.1985

4

Общая долевая собственность

7

Сухановский

Юрий

Андреевич

25.09.1976

1

Собственность

7

Сухановский

Юрий

Андреевич

25.09.1976

3

Общая совместная собственность

8

Сухановская

Юлия

Юрьевна

01.10.2001

3

Общая совместная собственность

Как видим, у Ивановой Дарьи, Пугина Владислава и Анниной Любови нет зарегистрированных прав на недвижимость.

А что бы мы получили, используя внутреннее соединение Inner join? Как известно, оно исключает несовпадающие строки, поэтому три человека из нашей итоговой выборки просто бы выпали:

Запрос1

id

L_name

F_name

Middle_name

Birthday

id_realty

type

3

Евгеньин

Александр

Федерович

30.04.1964

5

Собственность

5

Герасимовская

Надежда

Павловна

14.03.1992

4

Общая долевая собственность

6

Герасимовский

Олег

Альбертович

29.01.1985

4

Общая долевая собственность

7

Сухановский

Юрий

Андреевич

25.09.1976

1

Собственность

7

Сухановский

Юрий

Андреевич

25.09.1976

3

Общая совместная собственность

8

Сухановская

Юлия

Юрьевна

01.10.2001

3

Общая совместная собственность

Казалось бы, второй вариант так же отвечает условиям нашей задачи. Однако, если мы дальше начнем присоединять еще и еще таблицы, три человека из результата уже безвозвратно исчезнут. Поэтому на практике при объединении множества таблиц намного чаще используются соединения Left и Right, чем Inner join.

Продолжим рассматривать с left join sql примеры. Присоединим таблицу с адресами наших объектов недвижимости:

SELECT Peoples.*, Realty_peoples.id_realty, Realty_peoples.type, Realty.address

FROM Peoples

LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples

LEFT JOIN Realty ON Realty.id = Realty_peoples.id_realty

Теперь мы получим не только вид права, но и адреса объектов недвижимости:

Запрос1

id

L_name

F_name

Middle_name

Birthday

id_realty

type

address

1

Иванова

Дарья

Борисовна

16.07.2000

2

Пугин

Владислав

Николаевич

29.01.1986

3

Евгеньин

Александр

Федерович

30.04.1964

5

Собственность

г. Архангельск, пл. Терехина, д. 89, кв. 13

4

Аннина

Любовь

Павловна

31.12.1989

5

Герасимовская

Надежда

Павловна

14.03.1992

4

Общая долевая собственность

Архангельская область, г. Новодвинск, ул. Пролетарская, д. 16, кв. 137

6

Герасимовский

Олег

Альбертович

29.01.1985

4

Общая долевая собственность

Архангельская область, г. Новодвинск, ул. Пролетарская, д. 16, кв. 137

7

Сухановский

Юрий

Андреевич

25.09.1976

3

Общая совместная собственность

Архангельская область, г. Северодвинск, ул. Ленина, д. 134, кв. 85

7

Сухановский

Юрий

Андреевич

25.09.1976

1

Собственность

г. Архангельск, ул. Воронина, д. 7, кв.6

8

Сухановская

Юлия

Юрьевна

01.10.2001

3

Общая совместная собственность

Архангельская область, г. Северодвинск, ул. Ленина, д. 134, кв. 85

Left join - типичные ошибки использования: неверный порядок таблиц

Основных ошибок, допускаемых при левом внешнем соединении таблиц, две:

  1. Неверно выбран порядок таблиц, из-за которого были потеряны данные.
  2. Ошибки при использовании Where в запросе с объединенными таблицами.

Рассмотрим ошибку первую. Перед решением любой задачи стоит четко понимать, что именно мы хотим получить в итоге. В рассматриваемом выше примере мы вывели всех до единого людей, но абсолютно потеряли сведения об объекте под номером 2, у которого собственника не нашлось.

Если бы мы переставили таблицы в запросе местами, и начали бы с «… From Realty left join Peoples…» то ни одну недвижимость мы бы не потеряли, чего не скажешь о людях.

Однако не стоит, испугавшись левого соединения, переходить на полное внешнее, которое включит в результате и совпадающие, и не совпадающие строки.

Ведь объем выборок зачастую очень велик, и лишние данные реально ни к чему. Главное - разобраться, что вы хотите в итоге получить: всех людей со списком имеющихся у них недвижимости, либо список всей недвижимости с их собственниками (если есть).

Left join - типичные ошибки использования: правильность запроса при задании условий в Where

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

Вернемся к запросу, когда мы с помощью левого соединения получили данные по всем людям и имеющейся у них недвижимости. Вспомните следующий с применением left join sql пример:

FROM Peoples LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples;

Допустим, мы хотим уточнить запрос и не выводить данные, где тип права – «Собственность». Если мы просто допишем, применяя left join sql, пример следующим условием:

...

Where type <> "Собственность"

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

Запрос1

id

L_name

F_name

Middle_name

Birthday

id_realty

type

5

Герасимовская

Надежда

Павловна

14.03.1992

4

Общая долевая собственность

6

Герасимовский

Олег

Альбертович

29.01.1985

4

Общая долевая собственность

7

Сухановский

Юрий

Андреевич

25.09.1976

3

Общая совместная собственность

8

Сухановская

Юлия

Юрьевна

01.10.2001

3

Общая совместная собственность

Чтобы предупредить появление ошибок по этой причине, лучше всего задать условие отбора сразу при соединении. Предлагаем рассмотреть следующий с left join sql пример.

SELECT Peoples.*, Realty_peoples.id_realty, Realty_peoples.type

FROM Peoples

LEFT JOIN Realty_peoples ON (Peoples.id = Realty_peoples.id_peoples AND type <> "Собственность")

Результат будет следующим:

Запрос1

id

L_name

F_name

Middle_name

Birthday

id_realty

type

1

Иванова

Дарья

Борисовна

16.07.2000

2

Пугин

Владислав

Николаевич

29.01.1986

3

Евгеньин

Александр

Федерович

30.04.1964

4

Аннина

Любовь

Павловна

31.12.1989

5

Герасимовская

Надежда

Павловна

14.03.1992

4

Общая долевая собственность

6

Герасимовский

Олег

Альбертович

29.01.1985

4

Общая долевая собственность

7

Сухановский

Юрий

Андреевич

25.09.1976

3

Общая совместная собственность

8

Сухановская

Юлия

Юрьевна

01.10.2001

3

Общая совместная собственность

Таким образом, выполнив простой с left join sql пример, мы получили список из всех людей, выведя дополнительно, у кого из них недвижимость в долевой/совместной собственности.

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

Источник: fb.ru Компьютеры Coalesce sql: описание, особенности использования, примеры

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

Компьютеры Как составлять SQL-запросы - подробные примеры

Каждый из нас регулярно сталкивается и пользуется различными базами данных. Когда мы выбираем адрес электронной почты, мы работаем с базой данных. Базы данных используют поисковые сервисы, банки для хранения данных о ...

Компьютеры Подробное описание, что это за ошибка 0xe06d7363. Как исправить проблему?

Не редко пользователь, пытающийся запустить игру или программу, сталкивается с проблемой, когда у него появляется окно, например, mk10.exe ошибка приложения 0xe06d7363. Как исправить, что это за ошибка, и чем она вызв...

Самосовершенствование Белая сенсорика: подробное описание, примеры

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

Бизнес Описание продукта: пример того, как составить подробное описание, составление бизнес-плана

Если вам не удалось отыскать бизнес-план (БП) с описанием, характеристикой продукта, который вы планируете продвигать, то необходимо приступить к его самостоятельному составлению. Какие разделы включает бизнес-план? К...

Автомобили Регулировка карбюратора К-151 своими руками: подробное описание

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

Автомобили ВАЗ-2107: шумоизоляция своими руками. Подробное описание комплекса работ

Автомобиль ВАЗ-2107 - отличный классический продукт Тольяттинского автозавода прошлых лет. Несмотря на то что он снят с производства, 7-ка остается на колёсах у многих водителей. Недорогой и простой в обслуживании, ап...

Автомобили "Ниссан Примера" P12: описание, технические характеристики, фото

Последним представителем, замыкающим линейку автомобилей среднего сегмента Nissan Primera, является модель «Ниссан Примера» P12. Отзывы автовладельцев свидетельствуют о том, что ждать от машины чего-то све...

Автомобили Irbis TTR 250R - подробное описание

Irbis TTR 250R - это мотоцикл, предназначенный для мотокроссов по бездорожью класса эндуро. Данная модель имеет отличный ход на дороге и по пересеченной местности. Ее конек - это преодоление бродов, рек, исполнение пр...

Автомобили Подробное описание «ГАЗ-САЗ-35071»

Автомобиль «ГАЗ-САЗ-35071» выпускается Саранским заводом автосамосвалов на базе модели 3309 Горьковского завода. Машина относится к среднему классу общего назначения, имеет цельнометаллический кузов.

monateka.com