42330

Выборка данных

Лабораторная работа

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

Изучить используемый в реляционных СУБД оператор извлечения данных из таблиц. Получить навыки работы с оператором SELECT в программе "IBExpert". SELECT [DISTINCT LL] { величина [ величина ]} [INTO :Переменная [ :Переменная ]] FROM tbleref [ tbleref ] [WHERE условие поиска ] [GROUP BY Колонка [ Колонка ]] [HVING условие поиска ] [UNION [LL] select_expr ] [ORDER BY список сортировки ]; величина = {Колонка :Переменная константа выражение функция udf [ величина [ величина ]] NULL USER} [S Псевдоним] константа = Число 'Строка' выражение = SQL выражение возвращающее единичное значение функция = COUNT [LL] величина DISTINCT величина SUM [LL] величина ...

Русский

2013-10-29

173.5 KB

8 чел.

18     

  1.  Лабораторная работа №7. Выборка данных 
    1.  Цель работы

Изучить используемый в реляционных СУБД оператор извлечения данных из таблиц. Получить навыки работы с оператором SELECT в программе "IBExpert".

Время выполнения: 6 часов.

  1.  Исходные данные 

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

  1.  Используемые программы

Все операции выполняются с помощью приложения "IBExpert". Отчет создается в редакторе "OpenOffice.pro".

  1.  Теоретические сведения 

В SQL имеется единственный оператор, который предназначен для выборки данных из базы данных. Как и операторы INSERT, DELETE и UP-DATE он относится к подмножеству DML.

Ниже приведен почти полный синтаксис оператора SELECT.

SELECT [DISTINCT | ALL]

 {* | <величина> [, <величина> …]}

 [INTO :Переменная [, :Переменная …]]

 FROM <tableref> [, <tableref> …]

[WHERE <условие поиска>]

[GROUP BY Колонка [, Колонка …]]

[HAVING <условие поиска>]

[UNION [ALL] <select_expr>]

[ORDER BY <список сортировки>];

<величина> = {Колонка | :Переменная | <константа>

 | <выражение> | <функция>

 | udf ([<величина> [, <величина> …]])

| NULL | USER} [AS Псевдоним]

<константа> = Число | 'Строка'


<выражение> = SQL выражение, возвращающее единичное значение

<функция> = COUNT (* | [ALL] <величина> | DISTINCT <величина>)

  | SUM ([ALL] <величина>  | DISTINCT <величина>)

  | AVG ([ALL] <величина> | DISTINCT <величина>)

  | MAX ([ALL] <величина> | DISTINCT <величина>)

  | MIN ([ALL] <величина> | DISTINCT <величина>)

  | CAST(<величина> AS <тип данных>)

  | UPPER(<величина>)

  | GEN_ID(Имя_Генератора, <величина>)

 <tableref> = {<joined_table> | table | view

  | procedure[(<величина> [, <величина> …])]}

  [Псевдоним]

<joined_table> = <tableref> <join_type> JOIN <tableref>

  ON <условие поиска> | (<joined_table>)

 <join_type> = [INNER] | {LEFT | RIGHT | FULL } [OUTER]

 

<условие поиска> =

  <величина> <оператор сравнения>

     {<величина> | (<select_one>)}

 | <величина> [NOT] BETWEEN <величина> AND <величина>

 | <величина> [NOT] LIKE <величина>

 | <величина> [NOT] IN

    (<величина> [, <величина> ...] | <select_list>)

 | <величина> IS [NOT] NULL

 | <величина> {>= | <=} <величина>

 | <величина> [NOT] {= | < | >} <величина>

 | {ALL | SOME | ANY} (<select_list>)

 | EXISTS (<select_expr>)

 | SINGULAR (<select_expr>)

 | <величина> [NOT] CONTAINING <величина>

 | <величина> [NOT] STARTING [WITH] <величина>

 | (<условие поиска>)

 | NOT <условие поиска>

 | <условие поиска> OR <условие поиска>

 | <условие поиска> AND <условие поиска>

<оператор сравнения> = {= | < | > | <= | >= | !< | !> | <> | !=}

<select_one> = оператор SELECT, выбирающий одну колонку и возвращающий     ровно одно значение


<select_list> = оператор SELECT, выбирающий одну колонку, возвращающий ноль или много значений

<select_expr> = оператор SELECT, выбирающий несколько величин и возвращающий ноль или много значений

 

<список сортировки> =

 {Колонка | Номер}

 [ASC | DESC]

[, <список сортировки> ...]

Некоторые параметры, входящие в этот оператор, описаны в табл. 1.

Таблица : Описание параметров оператора SELECT

Параметр

Описание

DISTINCT | ALL

DISTINCT – предотвращает дублирование данных, которые будут извлечены. ALL (по умолчанию) – приведет к извле-чению всех данных

{* | <величина> [, <величина> ...]}

Звездочка (*) означает, что надо извлекать все колонки из указанных таблиц. <величина> [, <величина> ...] – извлекает список указанных колонок, переменных или выражений

INTO :Переменная [, :Переменная ...]

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

FROM <tableref> [, <tableref> ...]

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

table

Имя существующей в базе данных таблицы

view

Имя существующего базе данных просмотра

procedure

Имя существующей хранимой процедуры, предназначенной для использования в операторе SELECT

Псевдоним

Короткое альтернативное имя для таблицы, просмотра или колонки. После описания в <tableref>, псевдоним может использоваться для ссылок на таблицу или просмотр

join_type

Задает тип соединения, которое может быть внутренним или внешним


WHERE <условие поиска>

Указывает условие, которое ограничивает количество извлекаемых строк

GROUP BY Колонка [, Колонка ...]

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

HAVING <условие поиска>

Использует совместно с GROUP BY. Задает условие, которое ограничивает количество возвращаемых групп

UNION [ALL]

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

ORDER BY <список сортировки>

Указывает колонки, по которым будет производиться сортировка извлекаемых строк. Можно указывать либо имена колонок, либо их порядковые номера в списке извлекаемых колонок. Если указать ASC, то строки будут выдаваться в порядке возрастания значений сортируемых полей, если DESC – в порядке убывания значений

Как видно из синтаксиса оператора SELECT, обязательными являются только предложение SELECT с перечнем выдаваемых колонок и предложение FROM.

Пример простейшего оператора SELECT:

-- Выдать перечень всех служащих:

 SELECT * FROM Employee;

Ниже приведено несколько упрощенных вариантов синтаксиса оператора SELECT, помогающих научиться составлять простые запросы.

Упрощенный синтаксис внутреннего соединения (стандарт SQL-92):

SELECT Колонка [, Колонка ...] | *

  FROM <tableref_left> [INNER] JOIN <tableref_right>

        [ON <условие поиска>]

  [WHERE <условие поиска>];

 

Упрощенный синтаксис внешнего соединения:

SELECT Колонка [, Колонка ...] | *

    FROM <tableref_left>

         {LEFT | RIGHT | FULL} [OUTER] JOIN

        <tableref_right>


        [ON <условие поиска>]

    [WHERE <условие поиска>];

Упрощенный синтаксис использования подзапроса:

SELECT [DISTINCT] Колонка [, Колонка …]

   FROM <tableref> [, <tableref> …]

   WHERE

     {expression {[NOT] IN | <оператор сравнения>}

     | [NOT] EXISTS

     }

     (SELECT [DISTINCT] Колонка [, Колонка …]

           FROM <tableref> [, <tableref> ...]

          WHERE <условие поиска>

     );

  1.  Тестовая база данных

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

Таблица "Торговый агент" (Salespeople) содержит следующие столбцы:

  •   SNUM – номер агента;
    •   SNAME – имя агента;
    •   CITY – город, где работает агент;
    •   COMM – комиссионные торгового агента.

                            Торговый агент (Salespeople)

SNUM

SNAME

CITY

COMM

1001

Смирнов

Москва

0.12

1002

Перов

Пенза

0.13

1004

Яворский

Москва

0.11

1007

Ривкин

Тамбов

0.15

1003

Протасов

Саратов

0.10

Таблица "Покупатель" состоит из следующих столбцов:

  •   CNUM – номер покупателя;
    •   CNAME – имя покупателя;
    •   CITY – город проживания покупателя;
    •   RATING – некоторый рейтинг, присвоенный покупателю;
    •   SNUM – номер торгового агента, за которым закреплен покупатель.


                    Заказчики (Customers)

CNUM

CNAME

CITY

RATING

SNUM

2001

Горовой

Москва

100

1001

2002

Дергунов

Саранск

200

1003

2003

Крайнов

Пенза

200

1002

2004

Говоров

Тамбов

300

1002

2006

Прохоров

Москва

100

1001

2008

Абрамов

Пенза

300

1007

2007

Переверзев

Саранск

100

1004

Таблица "Заказ" (Orders) содержит следующие столбцы:

  •   ONUM – номер заказа;
    •   AMT – сумма заказа;
    •   ODATE – дата заказа;
    •   CNUM – номер покупателя;
    •   SNUM – номер торгового агента.

                    Заказ (Orders)

ONUM

AMT

ODATE

CNUM

SNUM

3001

18.69

10.03.1990

2008

1007

3003

767.19

10.03.1990

2001

1001

3002

1900.10

10.03.1990

2007

1004

3005

5160.45

10.03.1990

2003

1002

3006

1098.16

10.03.1990

2008

1007

3009

1713.23

10.04.1990

2002

1003

3007

75.75

10.04.1990

2004

1002

3008

4723.00

10.05.1990

2006

1001

3010

1309.95

10.06.1990

2004

1002

3011

9891.88

10.06.1990

2006

1001

Примеры

Чтобы найти сумму всех покупок в таблице "Заказ", мы можем ввести следующий запрос:

SELECT SUM (amt) FROM Orders;

Результат его выполнения – число 26658.4

Запрос

SELECT AVG (amt) FROM Orders

вернет среднее значение сумм сделок — 2665.84.


  1.  Функция COUNT

Функция COUNT отличается от других агрегатных функций тем, что она не выполняет математических действий над значением столбца. Она считает число значений в данном столбце, или число строк в таблице. Если необходимо подсчитать количество различных значений некоторого поля в таблице, функцию COUNT надо использовать с DISTINCT. Например, чтобы подсчитать количество продавцов в настоящее время описанных в таблице сделок, мы можем использовать следующий запрос:

SELECT COUNT ( DISTINCT snum ) FROM Orders;

Результат — 5.

Иногда возникает необходимость решить обратную задачу – подсчитать количество значений поля вместе с повторениями. Для этого существует описатель ALL (он подразумевается по умолчанию). Например:

SELECT COUNT ( ALL rating ) FROM Customer

Подсчитает количество повторений поля rating с повторениями.

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

SELECT COUNT (*) FROM Customer

Результат — 7.

Внимание! Только COUNT (*) может подсчитывать значения NULL. Все остальные функции игнорируют неопределенные значения.

  1.  Простые вычисления

Столбцы, значение которых может быть получено с помощью простых арифметических действий через другие столбцы в БД, как правило, не хранятся. SQL предоставляет простой способ производить подобные вычисления. Также можно помещать в некоторый столбец константу. Например, чтобы представить комиссионные торгового агента в процентном отношении, а не в виде десятичного числа можно записать такой запрос:

SELECT snum, sname, city, comm*100 FROM Salespeople

Можно дополнить наш запрос знаком процента, выводимым после поля comm*100:

SELECT snum, sname, city, comm*100, ' % ' FROM Salespeople

Знак процента в данном случае – константное выражение. При выполнении вычислений в запросе допустимы арифметические действия – сложение, вычитание, умножение, деление.

  1.  Вычисления в агрегатных функциях

Допустим, мы хотим вывести 10% от стоимости самой дорогой сделки. Тогда можно записать такой запрос:

SELECT MAX (amt*0.1) FROM Orders


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

  1.  Использование GROUP BY

Как уже было упомянуто ранее, таблицу можно группировать самыми разными способами. В случае, если мы не группируем таблицу вообще, в списке вывода запроса присутствуют только агрегатные функции. Таблица в этом случае рассматривается целиком. В случае, если мы группируем таблицу по какому-то полю, в списке вывода могут присутствовать те поля, относительно которых таблица группируется и агрегатные функции. При этом все поля, не охваченные агрегатными функциями, должны быть перечислены в предложении GROUP BY.

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

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

Результат выполнения запроса:

SNUM

MAX

1001

767.19

1002

1713.23

1003

75.75

1014

1309.95

1007

1098.16

В данном случае таблица группируется относительно номера торгового агента, поэтому поле snum присутствует в списке вывода запроса и в предложении GROUP BY.

  1.  Использование HAVING

HAVING подобен WHERE – он задает условия отбора групп так же, как это делает WHERE для строк. Например, если мы хотим узнать, какие торговые агенты имеют заработок от одной сделки более чем 3000, и в какой день, можно использовать следующий запрос:

SELECT snum, odate, MAX ((amt))

FROM Orders 

GROUP BY snum, odate 

HAVING MAX ((amt)) > 3000.00;

Результат работы запроса:

SNUM

ODATE

MAX

1001

10.05.1990

4723.00

1001

10.06.1990

9891.88


1002

10.03.1990

5160.45

Внимание! В предложении HAVING нельзя проверять имена полей на какое-либо условие – для этого существует WHERE. То, что вы проверяете в HAVING должно иметь только одно значение для группы.

  1.  Порядок выполнения работы

Лабораторную работу следует выполнять в следующем порядке:

  1.  Создать на компьютере sqledu02 (или на локальном компьютере) рабочую папку для хранения файлов, получаемых при выполнении лабораторной работы №7. Эта папка должна располагаться в той же папке, что и папка для лабораторной работы №6, и называться "ЛР7" . Пример правильного названия рабочей папки при выполнении лабораторной работы №2: "sqledu02:\D:\Data\ЛР7".
  2.  Открыть окно "Редактор скриптов" в приложении "IBExpert".
  3.  Используя кнопку   [Загрузить из файла] на панели инструментов, открыть диалоговое окно "Open SQL File" и с его помощью открыть файл сценария,  созданный при выполнении лабораторной работы №6.
  4.  Используя кнопку [Save as] на панели инструментов, сохранить загруженный сценарий в папке "sqledu02:\D:\Data\ЛР7".  
  5.  Изменить в сценарии путь до файла с базой данных, чтобы база данных создавалась в папке "ЛР7".   
  6.  Открыть в приложении "IBExpert" этот сценарий, исправить комментарии и сделать, чтобы база данных теперь создавалась в папке "ЛР7".
  7.  Выполнить сценарий и сохранить его в папке "ЛР7".
  8.  Зарегистрировать созданную базу данных в программе "IBExpert" и подключиться к ней.
  9.  Изучить синтаксис оператора SELECT и примеры запросов к базе данных.  
  10.  Открыть окно "Редактор скриптов" в приложении "IBExpert". 
  11.  Выполнить в окне "Редактор скриптов" следующие запросы к своей базе данных и сохранить их, добавив комментарии, в рабочей папке в файле "select7_xx.sql", где xx — это номер варианта задания..
    •  Создать запрос, выводящий все строки таблицы, указанной в варианте задания.
    •   Создать запрос, задающий порядок столбцов, отличный от исходного.
    •   Продемонстрировать действие модификатора DISTINCT.
    •   Ограничить вывод запроса, используя WHERE с простым условием.
    •   Ограничить вывод запроса, используя WHERE и составное условие.
    •   Продемонстрировать действие специальных функций IN, BETWEEN, LIKE, и IS NULL в условии.
    •   Продемонстрировать работу специальных функций с условием NOT.
    •   Ознакомиться с принципами работы агрегатных функций COUNT, SUM, AVG, MAX, MIN.
    •   Продемонстрировать использование COUNT(*)
    •   Продемонстрировать выполнение простых вычислений в запросе.


  •   Использовать простое вычисление как параметр агрегатной функции.
    •   Ознакомиться с использованием предложения GROUP BY, продемонстрировать его работу.
    •   Ознакомиться с использованием предложения HAVING, продемонстрировать его работу.
  1.  Создать в папке "ЛР7" резервную копию базы данных.
  2.  Создать и сохранить в папке "ЛР7" файл с отчетом о выполнении лабораторной работы,  который должен называться "Отчет7-xx.odt", где xx — это номер варианта задания.
    1.  Ход работы

Для выполнения запросов в приложении "IBExpert" необходимо выполнить следующие действия:

  1.  Подключиться к базе данных и выполнить команду Инструменты > SQL Редактор (F12). В результате откроется окно "SQL Редактор" (рис. 1).
  2.  Ввести в поле на вкладке "Редактор" текст запроса.
  3.  Нажать на панели инструментов кнопку [Выполнить] (F9).
  4.  Если запрос правильный, то в результате произойдет его выполнение и результат будет отображен на вкладке "Результаты" (рис. 2).
  5.  Количество извлеченных в результате выполнения запроса строк отображается над сеткой с данными справа. На рис. 2 там содержится строка "20 records fetched". В данном примере извлечено столько строк, сколько требуется, чтобы заполнить сетку (в ней помещается только 20 строк)TP*PT.
  6.  Чтобы узнать, сколько всего строк соответствуют выполненному оператору, надо перейти в конец отображаемого набора данных.


Чтобы выполнить другой запрос, надо вернуться на вкладку "Редактор", заменить содержимое редактора на новый запрос и повторить те же действия. К тексту ранее выполнявшихся правильных запросов можно вернуться, если перейти на вкладку "История запросов", либо находясь на вкладке "Редактор" нажимать кнопки [Предыдущий запрос] и [Следующий запрос].

Созданный запрос будет сохранен в приложении "IBExpert". Чтобы создать новый запрос надо на вкладке "Редактор" нажать кнопку [Новый запрос] и ввести текст этого запроса. Справа в окне приложения "IBExpert" находится окно "This database queries" (Рисунок 3), в котором отображаются номера всех созданных ранее запросов. Этим окном можно пользоваться для повторного вызова в редактор выполненных ранее запросов (чтобы снова не вводить вручную прежний запрос).


  1.  Варианты заданий

Вариант задания (Таблица 2) выбирается по формуле (N mod 24)+1, где N – последние две цифры зачетной книжки студента.

Таблица : Варианты заданий к лабораторной работе №7

№ варианта

Имя пользователя

Имя файла БД

Имя таблицы

1

TEAM001

SALARY.FDB

Рабочий

2

TEAM002

STUFF.FDB

Собрано

3

TEAM003

STUFFPLUS.FDB

Изделия

4

TEAM004

TELEPHONE.FDB

Разговоры

5

TEAM005

TOOLS.FDB

Поставщик

6

TEAM006

EXAMIN.FDB

Студент

7

TEAM007

LIBRARY.FDB

Книга

8

TEAM008

AVIA.FDB

Рейс

9

TEAM009

SHOP.FDB

Ассортимент

10

TEAM010

HCOMMAND.FDB

Спортсмен

11

TEAM011

STUDENT.FDB

Студент

12

TEAM012

SERVIS.FDB

Исполнитель

13

TEAM013

REGION.FDB

Регион

14

TEAM014

OPTSHOP.FDB

Товар

15

TEAM015

OPTLEKI.FDB

Лекарства

16

TEAM016

SPORTSMEN.FDB

Спортсмен

17

TEAM017

DANCING.FDB

Танцор


18

TEAM018

BIRTHDOM.FDB

Мать

19

TEAM019

TENNIS.FDB

Спортсмен

20

TEAM020

CURSES.FDB

Расценки

21

TEAM021

TEACHER.FDB

Преподаватель

22

TEAM022

HOSPITAL.FDB

Больной

23

TEAM023

SOLDAT.FDB

Призывник

24

TEAM024

YUSHOP.FDB

Изготовитель

  1.  Отчет о выполнении работы

Отчет о выполнении лабораторной работы №7 необходимо оформить на листах формата A4. Для создания отчета следует использовать шаблон отчета для соответствующей лабораторной работы, который необходимо открыть с помощью приложения OpenOffice.

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

  1.  Цель работы.
  2.  Краткое описание предметной области в соответствии с вариантом.
  3.  Данные о версии СУБД, использованной в лабораторной работе.
  4.  Перечисление всех использованных при выполнении лабораторной работы команд главного меню приложения "IBExpert" с краткими пояснениями выполняемых действий.
  5.  Перечень файлов, полученных при выполнении лабораторной работы с указанием их имен, места расположения, даты изменения и размеров (сценарий, база данных, резервная копия базы данных, файл с отчетом).
  6.  Письменные ответы на контрольные вопросы.
  7.  Выводы.
  8.  Распечатку сценария создания базы данных с комментариями, которые должны содержать сведения об авторе, дате создания, всех выполняемых действиях и пояснения к выполняемым действиям.

  1.  Контрольные вопросы 
  2.  Какие обязательные разделы входят в оператор SELECT?
  3.  Перечислить в правильном порядке все возможные разделы оператора SELECT.
  4.  Как надо задавать числовые и текстовые константы?
  5.  Как надо проводить сравнение с пустым значением?


  1.  Какие есть способы задания дат в операторе SELECT?
  2.  Какие бывают виды соединений таблиц в запросах?
  3.  Какие есть два способа задать внутреннее соединение?
  4.  Какие бывают виды внешних соединений?
  5.  В чем отличие внутренних и внешних соединений?
  6.  Для чего используются псевдонимы?
  7.  Что такое самосоединение?
  8.  Что такое объединение?
  9.  Где и для чего применяется ключевое слово BETWEEN? Можно ли его заменить другими операторами?
  10.  Где и для чего применяется ключевое слово LIKE?
  11.  Чем отличается оператор CONTAINING от оператора LIKE?
  12.  Перечислить встроенные агрегатные функции.
  13.  Какая встроенная функция используется для преобразования типов?
  14.  Как устранить дублирование строк?
  15.  Как изменить порядок выводимых строк?
  16.  Почему при просмотре результатов запроса (рис. 2) имена некоторых столбцов выделены жирным шрифтом?

    ?


 

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

64592. Историческая основа дипломатической школы Египта 37 KB
  Во время войн на территории северного Египта мы встречаем первый случай предъявления ультиматума вождем гиксосов правителю Фив. Кстати после изгнания гиксосов из Египта между правителями Египта и другими древневосточными государствами установился систематический обмен посольствами.
64593. Критика эмпиризма 16.63 KB
  Причины в опыте не наблюдаются в этом проблема эмпиризма. Проблема непосредственности. Проблема описания факта. Проблема интерпретации факта.
64594. Обязанности нанимателей и работников по охране труда 30 KB
  Наниматель обязан обеспечить все рабочие места техническим оборудованием соответствующим требованиям по ОТ улучшать условия труда и быта работающих соблюдать законодательство о труде.
64595. Понятие архитектуры вычислительной системы 88.01 KB
  Организация памяти в ЭВМ Память используется для хранения следующих объектов: Компьютерные программы. В памяти недопустима обработка данных и следовательно применимы всего две операции: выборка информация не разрушается...
64598. Структурная схема ЭВМ 75.87 KB
  ЭВМ персональный компьютер ПК это универсальная вычислительная диалоговая система реализованная на базе микропроцессорных средств компактных внешних запоминающих устройств способная выполнять последовательность операций над информацией определенной программы.
64599. Понятие и сущность государства 25.5 KB
  Государство многогранное явление поэтому существует множество его определений. На протяжении нескольких веков государство определяли по-разному: Государство это самодовлеющее общение граждан ни в каком другом общении не нуждающееся и ни от кого другого не зависящее Аристотель.