Тарифы Услуги Сим-карты

SQL "для чайников": что нужно знать начинающим? Основы языка SQL и построение SQL-запросов. Сортировка, поиск, фильтрация данных

В этой главе…

  • Что такое SQL
  • Заблуждения, связанные с SQL
  • Взгляд на разные стандарты SQL
  • Знакомство со стандартными командами и зарезервированными словами SQL
  • Представление чисел, символов, дат, времени и других типов данных
  • Неопределенные значения и ограничения
  • Использование SQL в системе клиент/сервер
  • SQL в сети

SQL - это гибкий язык, который можно использовать самыми разными способами. Он является самым распространенным инструментом, используемым для связи с реляционной базой данных. В этой главе я объясню, чем является SQL и чем он не является, в частности, чем SQL отличается от компьютерных языков других типов. Затем вы познакомитесь с командами и типами данных, которые поддерживает стандартный SQL. Кроме того, я объясню такие основные понятия, как неопределенные значения и ограничения . И, наконец, будет дан обзор того, как SQL вписывается в среду клиент/сервер, а также в Internet и интранет-сети организаций.

Чем является SQL и чем он не является

Первое, что надо уяснить насчет SQL, - этот язык не является процедурным , как FORTRAN, Basic, С, COBOL, Pascal и Java. Чтобы решить задачу с помощью одного из этих процедурных языков, приходится писать процедуру, которая выполняет одну за другой указанные операции, пока выполнение задачи не будет закончено. Процедура может быть линейной последовательностью или содержать ветвление, но в любом случае программист указывает порядок выполнения.

Иными словами, SQL является непроцедурным языком. Чтобы с его помощью решить задачу, сообщите SQL, что именно вам нужно, как если бы вы говорили с джином из лампы Аладдина. И при этом не надо говорить, каким образом получить для вас то, что вы хотите. Система управления базами данных (СУБД) сама решит, как лучше всего выполнить ваш запрос.

Хорошо. Только что я сказал, что SQL не является процедурным языком. В сущности, это правда. Однако миллионы программистов вокруг (и вы, возможно, один из них) привыкли решать задачи процедурным путем, поэтому в последние годы оказывалось немалое давление, чтобы дополнить SQL некоторыми процедурными возможностями. Поэтому теперь в составе новой версии спецификации SQL, SQL:2003, имеются такие средства процедурного языка, как блоки BEGIN, условные операторы IF, функции и процедуры. Благодаря этим новым средствам, можно хранить программы на сервере с тем, чтобы их могли повторно использовать многие пользователи.

Для иллюстрации того, что я имел в виду, когда говорил "сообщите системе, что именно вам нужно", предположим, что у вас имеется таблица EMPLOYEE с данными о служащих и вы хотите выбрать из нее все строки, соответствующие всем "старшим" работникам. Под "старшими" работниками можно подразумевать каждого, кто старше 40 лет или кто получает более 60000 долларов в год. Нужную вам выборку можно сделать с помощью следующего запроса:

SELECT * FROM EMPLOYEE WHERE AGE >40 OR SALARY >60000;

Этот оператор выбирает из таблицы EMPLOYEE все строки, в которых или значение столбца AGE (возраст) больше 40 или значение в столбце SALARY (зарплата) больше 60000. SQL сам знает, каким образом надо выбирать информацию. Ядро базы данных проверяет базу и принимает для себя решение, каким образом следует выполнять запрос. Все, что от вас требуется, - указать, какие данные вам нужны.

Помни:
Запрос - это вопрос, который вы задаете базе данных. Если какие-либо ее данные удовлетворяют условиям вашего запроса, то SQL передает их вам
.

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

Выбирать информацию из базы данных можно одним из следующих способов.

  • С помощью однократного непрограммируемого запроса с консоли компьютера, вводя команду SQL и читая на экране результаты ее выполнения. Консоль - это традиционный термин, означающий компьютерное оборудование, которое выполняет работу клавиатуры и экрана, применяемых в современных ПК. Запросы с консоли пригодны тогда, когда требуется быстрый ответ на конкретный запрос. Для удовлетворения какой-либо текущей потребности вам могут потребоваться такие данные из базы, которые до этого никогда не требовались. Возможно, они вам никогда больше не понадобятся, но сейчас они нужны. Введите с клавиатуры соответствующий SQL-запрос, и через некоторое время на вашем экране появится результат.
  • С помощью программы, которая извлекает из базы данных информацию, а затем создает на основе этих данных отчет, выводимый или на экран, или на печать . Язык SQL можно использовать и так. Сложный запрос SQL, который, возможно, еще пригодится в будущем, можно поместить прямо в программу. Это позволяет многократно использовать его в дальнейшем. Таким образом, формулировка запроса выполняется один раз. Как вставлять код SQL в программы, написанные на другом языке, рассказывается в главе 15.

На сегодняшний день курсы SQL "для чайников" становятся все более популярными. Это можно очень просто объяснить, ведь в современном мире все чаще можно встретить так называемые "динамичные" веб-сервисы. Они отличаются достаточно гибкой оболочкой и основываются на Все начинающие программисты, которые решили посвятить сайтов, прежде всего записываются на курсы SQL "для чайников".

Зачем изучать данный язык?

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

Что такое SQL?

Или язык структурированных запросов, был создан с одной-единственной целью: определять предоставлять к ним доступ и обрабатывать их за достаточно короткие промежутки времени. Если вы знаете SQL-значение, тогда вам будет понятно, что этот сервер относят к так называемым "непроцедурным" языкам. То есть в его возможности входит всего лишь описание каких-либо компонентов или результатов, которые вы хотите увидеть в будущем на сайте. Но при не указывает на то, какие точно результаты собирается получить. Каждый новый запрос в этом языке является как бы дополнительной "надстройкой". Именно в таком порядке, в каком они введены в базе данных, запросы и будут исполняться.

Какие процедуры можно совершать с помощью этого языка?

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

  • создавать самые разнообразные таблицы;
  • получать, хранить и изменять полученные данные;
  • изменять структуры таблиц на свое усмотрение;
  • объединять полученную информацию в единые блоки;
  • вычислять полученные данные;
  • обеспечивать полную защиту информации.

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

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

  1. DDL - является командой, которая определяет данные. Она используется для того, чтобы создавать, изменять и удалять самые разнообразные объекты в базе.
  2. DCL - является командой, которая управляет данными. Ее используют для предоставления доступа разным пользователям к информации в базе, а также чтобы использовать таблицы или представления.
  3. TCL - команда, которая управляет разнообразного рода транзакциями. Ее главной целью является определение хода транзакции.
  4. DML - манипулирует полученными данными. В ее задачу входит позволение пользователю перемещать различную информацию из базы данных или вносить туда ее.

Типы привилегий, которые существуют в этом сервере

Под привилегиями подразумеваются те действия, которые может выполнить тот или иной пользователь в соответствии со своим статусом. Самой минимальной, безусловно, является обычный вход в систему. Конечно же, со временем привилегии могут меняться. Старые будут удаляться, а новые добавляться. На сегодняшний день, все те, кто проходит курсы SQL Server "для чайников", знают, что существует несколько типов разрешенных действий:

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

История создания SQL

Этот язык был создан исследовательской лабораторией IBM в 1970 году. В то время название его было несколько иным (SEQUEL), но через несколько лет использования его поменяли, немного сократив. Несмотря на это, даже сегодня многие известные мировые специалисты в области программирования все еще произносят название по старинке. Создана была SQL с одной-единственной целью - изобрести язык, который был бы настолько простым, что его могли бы без особых проблем выучить даже простые пользователи Интернета. Интересен тот факт, что на то время SQL был не единственным подобным языком. В Калифорнии еще одна группа специалистов разработала похожий Ingres, но он так и не стал широко распространенным. До 1980 года существовало несколько вариаций SQL, которые лишь в некоторой мере отличались друг от друга. Чтобы предотвратить замешательства, в 1983-м был создан стандартный его вариант, который популярен и сегодня. Курсы SQL "для чайников" позволяют узнать намного больше о сервисе и полностью изучить его за несколько недель.

Введение

SQL -- это язык структурированных запросов (Structured Query Language) к реляционным базам данных. История SQL тесно связана с историей развития реляционных баз данных. В 1974-1975 годах был создан первый прототип реляционной СУБД. Кроме разработки самой СУБД, в рамках проекта System/R в компании IBM проводилась работа над созданием языка запросов к базам данных. Первый язык запросов получил название SEQUEL -- Structured English Query Language. Вторая реализация проекта System/R была установлена на компьютерах нескольких заказчиков IBM с целью опытной эксплуатации в 1978-1979 гг. В этой реализации язык запросов имел уже название SQL, но до сих пор еще можно услышать от пользователей старое название этого языка.

В 1982 году компания IBM начала поставки на рынок коммерческого продукта SQL/Data System, а в 1983 году объявила о создании версии SQL/Data System для операционной системы VM/CMS. В 1983 году IBM выпустила новую реляционную СУБД -- Database 2 (DB2). Благодаря влиянию компании IBM на рынок вычислительных систем SQL DB2 стал фактическим стандартом языка баз данных.

Во второй половине восьмидесятых годов резко увеличилась производительность реляционных СУБД и с развитием реляционных технологий связывались большие надежды. Появились, в частности, новые версии СУБД Ingress и Oracle с производительностью, в два-три раза превышающей производительность предыдущих версий. Росту производительности СУБД способствовало и увеличение общего быстродействия компьютеров.

Опубликование в 1986 году стандарта SQL (ANSI/ISO) официально утвердило SQL как стандартный язык реляционных СУБД. С появлением более мощных персональных компьютеров и объединением их в локальные сети возникла необходимость в новых СУБД. Поставщики таких СУБД снова стали ориентироваться на SQL-технологии. И, наконец, SQL стал ключевой частью архитектуры клиент/сервер.

Первоначально SQL фирмы IBM имел простой синтаксис, но на протяжении нескольких лет производители программного обеспечения в области систем управления базами данных добавляли к своим реализациям новые возможности, многие из которых вошли в стандарты ANSI SQL. Версия языка ANSI SQL была принята организацией International Standards Organization (ISO), отделением ООН со штаб-квартирой в Женеве и комитетом International Electrotechnical Commission (IEC) как продукт ISO/IEC9075:1992 или язык баз данных SQL (SQL-92). Отдельный стандарт ANSI X.3.168-1989 определяет встроенный язык баз данных SQL(SQL-89). Современные СУБД поддерживают SQL-89 и многие дополнения из SQL-92.

Кроме того, большинство СУБД имеют свои ключевые SQL-слова для создания патентованных диалектов SQL, таких как Transact-SQL (сервера SQL Server) или SQL Jet.

Мы будем использовать SQL Jet и Transact-SQL, не уделяя внимания их отличиям от ANSI SQL-92.

Отметим, что историческое название SQL не совсем точно отражает суть этого языка, поскольку он давно уже предназначен не только для построения запросов (если, конечно, под «запросом» понимать только извлечение информации из базы данных). Сейчас SQL позволяет реализовать все функции СУБД: организацию данных, извлечение информации, модификацию данных, управление доступом, совместное использование данных, обеспечение целостности данных.

Типы команд SQL

база данные запрос таблица

В ANSI SQL имеется шесть основных типов команд:

Команды языка определения данных (data definition language -- DDL) позволяют создавать новые таблицы в базе данных, добавлять индексы и т.д.; основными командами языка определения данных являются:

Команды языка обработки данных (data manipulation language -- DML) используются для добавления, корректировки и удаления строк в таблицах и включают команды:

Команда языка запросов данных (data query language -- DQL) (единственная команда) используется для получения данных из таблиц и определения формы представления этих данных:

Команды языка управления данными (data control language -- DCL) определяют доступ отдельных пользователей и групп пользователей к объектам базы данных посредством полномочий, предоставляемых и отменяемых командами

Команды языка обработки транзакций (transaction processing language -- TPL) обеспечивают обновление всех строк, используемых в операторе DML, и включают следующие команды

BEGIN TRANSACTION

Начать транзакцию

COMIT TRANSACTION

Завершить транзакцию

SAVE TRANSACTION

Создать точку сохранения внутри транзакции

Команды языка управления курсором (cursor control language -- CCL) выполняют операции с отдельными строками одной или нескольких таблиц и включают команды: DECLARE CURSOR, FETCH INTO и UPDATE WHERE CURRENT.

Создатели СУБД, в общем-то, не обязаны поддерживать все команды SQL-92, и можно с уверенностью утверждать, что, практически, нет ни одной коммерческой СУБД, в которой реализованы все команды SQL-92. В частности, в SQL Jet не поддерживаются никакие зарезервированные слова команд DCL и CCL.

SQL в MS ACCESS

В MS ACCESS SQL применяется в основном для выполнения запросов, хотя очень удобно также удалять, добавлять и обновлять записи баз данных. Используя SQL-запросы, можно выбирать из таблиц базы данных только необходимые записи. При этом мы можем получить доступ не просто к одной таблице, а к сложной выборке из связанных между собой таблиц или наборов данных.

SQL-запросы можно также применять в приложениях, использующих объектные модели DAO, RDO или ADO. Кроме того, SQL как стандартный способ управления базами данных реализован во многих СУБД, включая Microsoft Access и SQL Server.

Инструкция SELECT

Для работы с базами данных в Microsoft Access применяется язык запросов, включающий единственную инструкцию SELECT. Рассмотрим некоторые вопросы, связанные с ее использованием. Синтаксис (неполный) инструкции SELECT в SQL Jet следующий:

SELECT {* | table.* | [ table. ] field1 [, table. ] field2 [, …] ] }

FROM table1 ] [, …]

[ IN externaldatabase ]

[,…]]]

Инструкция SELECT включает следующие основные элементы:

  • ? SELECT означает, что из некоторых таблиц базы данных необходимо выбрать набор (таблицу данных).
  • ? Необязательные слова ALL, DISTINCT, DISTINCTROW и ТОР называются предикатами (predicates) и определяют выбор следующим образом:

ALL указывает, что в набор передаются все строки (даже с дублируемыми значениями);

DISTINCT указывает, что в набор передаются только сдублированные строки;

DISTINCTROW указывает, что в результирующий наборбудет включена каждая строка, в которой есть отличие в значении любого из полей исходных таблиц (а не только полей, указанных для отображения в операторе SELECT);

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

  • ? Список {* | table.* | [ table. ] field1 [, table. ] field2 [, …] ] } (фигурные скобки здесь обозначают список) состоит из имен полей таблиц(ы) запроса. Звездочка (*) означает выбор всех полей таблицы. Если в запросе указывается несколько таблиц, то для определения поля используется наименование таблицы, отделяемое от имени поля точкой (.). Поле может получать «алиасное» имя (псевдоним) при помощи ключевого слова AS.
  • ? После слова FROM указываются таблицы, из которых выбираются ранее указанные поля. Здесь table1 (,table2) -- это имя таблицы (или таблиц), содержащей данные, externaldatabase -- имя базы данных, если не используется текущая база.

Неотмеченные элементы инструкции SELECT мы будем рассматривать по мере изучения более сложных запросов к таблицам.

Для примеров использования SELECT будем работать с базой данных Lab 3.mdb, создание и заполнение которой рассматривалось в предыдущей лабораторной работе.

Изучать инструкции SELECT, как и другие инструкции, можно в приложениях Access.

Последнее замечание перед тем, как начать рассмотрение SQL-инструкций, касается способа записи этих инструкций в строке. Нет никаких правил написания SQL-инструкций относительно их положения в строке. Можно писать инструкцию в одной строке, можно -- в нескольких.

Будем следовать следующему правилу: каждое предложение типа SELECT, FROM, WHERE и т.д. будет начинаться с новой строки. Если будет необходимо, на новой строке будет выполнен отступ. Так SQL-инструкции удобнее записывать, так их легче понимать.

Для тестирования SQL-инструкций в среде Access выберите в левой части главного окна Access в меню Объекты опцию Запросы и дважды щелкните команду Создание запроса в режиме конструктора. Появившееся окно Добавление таблицы нам в данном случае не нужно, поэтому его следует закрыть.

Не обращая внимания на рассмотренные в предыдущей лабораторной работе средства Access, предназначенные для создания запроса QBE, выберите команду Режим SQL в меню Вид (рис.1), чтобы, наконец, получить доступ к тому окну, в котором можно будет набирать SQL-инструкции.

Рисунок 1. Выбор команды Режим SQL

Инструкцию SELECT будем изучать по принципу «от простого -- к сложному»: сначала выбросим из полного синтаксиса этой инструкции все необязательные элементы, а затем постепенно будем использовать их, получая более сложные запросы. Если отбросить все необязательные предложения из списка {* | table.* | [ table. ] field1 [, table. ] field2 [, …] ] } и оставить только элемент *, то получим самый простой вариант SELECT-инструкции (SQL-запроса), который будет иметь вид (рис. 2):

SELECT * FROM Продукты;


Рисунок 2. Простейший запрос на SQL

Результат показан на рис. 3.


Рисунок 3. Результат выполнения простейшего запроса

Выбор в SQL-запросе определенных полей

Чаще всего вам не нужно будет получать набор со всеми полями одной (или более) таблицы. Например, поскольку поле КодПрод в таблице

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

Например;

SELECT Продукт, ЕдИзм

FROM Продукты;

Для изменения запроса используем команду Режим SQL в меню Вид (рис. 3.1)

Результат запроса показан на рис 4.

Рисунок 4. Выбор определенных полей

При этом можно изменить заголовки:

FROM Продукты;

Результат см. на рис. 5.

Выбор в SQL-запросе определенных записей

Ключевое слово WHERE в синтаксисе инструкции SELECT позволяет указывать определенные типы записей, которые должны попадать в набор.

Например:

SELECT Продукт AS [Наименование продукта], ЕдИзм AS [Единица измерения]

FROM Продукты

WHERE ЕдИзм = "л";

Результат выборки показан на рис. 6.

В области слова WHERE можно располагать сложное условное выражение с использованием знаков логических операций и функций. Например:

FROM Товары WHERE Цена1 > 50 AND Цена1 < 200;

SELECT НаимТовара as [Наименование товара], Цена1 as [Цена закупочная]

FROM Товары

WHERE Цена1 > 50 AND Len (НаимТовара) < 20;

В первом случае запрашиваются товары, оптовая цена которых находится в диапазоне оптовых цен (55-200), а во втором -- цены которых больше 50 денежных единиц и длина наименования не превышает 20 символов.

Кроме операций < и >, в инструкции SELECT можно использовать операции = (равно), <= (меньше или равно) и >= (больше или равно), а также AND, OR и NOT. Но еще большие возможности по отбору необходимых записей предоставляют такие операторы, как IS NULL, BETWEEN, IN и LIKE.

Оператор IS NULL позволяет найти в таблице записи, в полях которых не указаны данные, например:

SELECT НаимТовара AS [Наименование товара], Цена1 AS [Цена закупочная]

FROM Товары

WHERE Цена2 IS NULL OR Цена1 < 50;

Оператор BETWEEN позволяет указать диапазон, в котором находятся данные некоторого поля, например:

SELECT НаимТовара as [Наименование товара], Цена1 as [Цена закупочная]

FROM Товары

WHERE Цена1 BETWEEN 42 AND 120;

Оператор IN позволяет указать список, в котором находятся данные некоторого поля, например:

SELECT НаимТовара as [Наименование товара], Цена1 as [Цена закупочная]

FROM Товары

WHERE Цена1 IN (42, 105,750)

В SQL-инструкции можно также использовать оператор LIKE, например инструкция:

SELECT НаимТовара as [Наименование товара],Цена1 as [Цена закупочная]

FROM Товары

WHERE НаимТовара LIKE "(VCD)*";

позволяет получить только те записи, у которых в наименовании первые пять символов совпадают со строкой "(VCD)".

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

SELECT НаимТовара as [Наименование товара], Цена1 as [Цена закупочная]

FROM Товары

WHERE НаимТовара LIKE "*мишень*";

Оператор NOT, который инвертирует логическое выражение, может использоваться с операторами IS NULL, BETWEEN, IN, LIKE. При этом, практически, речь идет об операторах IS NOT NULL, NOT BETWEEN, NOT IN и NOT LIKE, например, как в следующих четырех инструкциях:

SELECT НаимТовара AS [Наименование товара], Цена! AS [Цена закупочная]

FROM Товары

WHERE Цена2 IS NOT NULL OR Цена1 < 50;

SELECT НаимТовара as [Наименование товара], Цена1 as [Цена закупочная]

FROM Товары

WHERE Цена1 NOT BETWEEN 42 AND 120;

SELECT НаименованиеТовара as [Наименование товара], Цена! as [Цена закупочная]

FROM Товары

WHERE Цена1 NOT IN (42, 105,750);

SELECT НаимТовара as [Наименование товара], Цена1 as [Цена закупочная]

FROM Товары

WHERE НаимТовара NOT LIKE "(VCD)*";

Результирующие данные запроса можно форматировать с использованием, например, функции Format. В следующем запросе данные форматируются при помощи строки "### ##0.00$":

SELECT НаимТовара as [Наименование товара],

Format(Цена1*1.2,"### ##0.00р") as [Цена оптовая]

FROM Товары

WHERE Цена1 < 100

Обратите внимание еще и на то, что функция Format в качестве первого аргумента получает произведение Цена1*1.2. Таким образом, мы получаем другую цену из некоторой базовой.

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

SELECT StrConv(Продукт,1) AS [Наименование продукта], ЕдИзм AS [Единица измерения]

FROM Продукты;

Результат такого запроса показан на рис. 7.

Рисунок 7. Результат запроса с указанием формата представления информации

Выбор данных из более чем одной таблицы

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

SELECT { * | field1 [, field2 [, ...]]}

Например (Запрос 6):

SELECT Продукты.Продукт AS [Наименование продукта], Продукты.ЕдИзм AS [Единица измерения]

FROM Продукты;

Или (Запрос 7)

SELECT tab.Продукт AS [Наименование продукта], tab.ЕдИзм AS [Единица измерения]

FROM Продукты tab;

Во второй инструкции использовано альтернативное имя таблицы (локальный псевдоним), но обе инструкции выдают один и тот же результирующий набор.

Следующая инструкция позволяет получить наименования (из таблицы Продукты) и количества (из таблицы Продажи) продуктов (результат выполнения -- на рис. 8):

FROM Продукты, Продажи

WHERE Продукты.КодПрод = Продажи.КодПрод;

Рисунок 8. Выборка из двух таблиц

Обратите внимание на выражение Продукты.КодПрод = Продажи.КодПрод.

Именно оно используется для связи таблиц Продукты и Продажи по ключевому полю КодПрод.

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

SELECT Продукты.Продукт AS [Наименование продукта], Продажи.Количество AS [Количество]

FROM Продукты, Продажи

WHERE Продажи.ДатаПродажи > #3/25/2003# AND Продукты.КодПрод = Продажи.КодПрод;

Рисунок 9. Выборка из двух таблиц с ограничением по дате

При помощи локальных псевдонимов можно сократить предыдущую инструкцию (Запрос10).

FROM Продукты a, Продажи b

WHERE b.ДатаПродажи > ;

Вывод выбранных данных в определенном порядке

Для сортировки данных в инструкции SELECT имеются слова ORDER BY:

SELECT { * | field1 [, field2 I, .-.]]}

FROM table1 [, table2 [, ...]

[, field2 ][, ...]]]

Здесь к тем элементам SQL-запроса, которые уже рассмотрены, добавлено необязательное предложение ORDER BY. Как следует из синтаксиса инструкции SELECT, используя слова ASC и DESC, можно изменять «направление» сортировки («по возрастанию» и «по убыванию»). Сортировать можно по нескольким полям (сначала по одному, затем -- по другому, и так далее) и даже по различным элементам одного и того же поля с использованием функций.

В следующей инструкции используется сортировка выводимого набора в порядке убывания количества продаж (Запрос11):

SELECT a.Продукт AS [Наименование продукта], b.Количество AS [Количество]

FROM Продукты a, Продажи b

WHERE b.ДатаПродажи > #3/25/2003# AND a.КодПрод = b.КодПрод

ORDER BY а. Продукт DESC;

Агрегирующие функции в инструкции SELECT

В инструкциях языка ANSI SQL предусмотрены так называемые агрегирующие функции, которые определяют количество записей, вычисляют суммы всех значений полей в наборе, находят минимальные или максимальные, а также средние значения. К агрегирующим функциям относятся функции COUNT, SUM, MAX, MIN и AVG.

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

SELECT COUNT(Продукт) AS [Всего наименований]

FROM Продукты;

На рис. 10 показан результат выполнения этого запроса.

Рисунок 10. Подсчет количества продуктов

Функция AVG в инструкции SELECT позволяет найти среднее значение для строк, входящих в запрос. Например, следующая инструкция определяет среднюю цену продажи для сделок, совершенных после указанной даты (Запрос13):

SELECT Format(AVG (ЦенаПродажи), "### ##0.00р") AS [Средняя цена]

FROM Продажи

WHERE ДатаПродажи > #3/25/2003#;

Группировка данных в инструкции SELECT

Часто в наборах, получаемых при помощи SELECT-инструкций, встречаются повторяющиеся значения. Для рассматриваемой нами базы данных это могут быть, например, наименования продуктов в запросе (рис. 3.8). Такие повторяющиеся значения можно объединять в группы, используя для групп агрегирующие функции.

В инструкции SELECT для объединения значений в группы используется предложение GROUP BY.

Следующая инструкция имеет результатом список проданных продуктов и их суммарные количества (результат -- на рис. 11):

FROM Продукты a, Продажи b

WHERE b.ДатаПродажи > #3/25/2003# AND a.КодПрод = b.КодПрод

GROUP BY a.Продукт;

Рисунок 11. Группировка объема продаж по наименованиям продуктов

Предположим, что нам нужна информация о суммарном количестве только тех продуктов, для которых количество продаж меньше определенного числа. Чтобы выполнить этот запрос, мы не можем использовать предложение WHERE, так как оно «работает» со значениями данных, расположенными в таблице, а нам нужно наложить некоторые ограничения на вычисляемые данные. Для решения подобной задачи следует использовать предложение HAVING, которое так же связано с предложением GROUP BY, как WHERE с SELECT. Другими словами, предложение HAVING налагает некоторые условия на выбранные посредством предложения GROUP BY данные.

Следующая инструкция позволяет получить список продуктов и суммарное количество продаж. Причем в список включаются только те продукты, для которых суммарное количество продаж меньше чем 20 (результат -- на рис. 12):

SELECT a.Продукт AS [Наименование продукта], SUM(b.Количество) AS [Количество]

FROM Продукты a, Продажи b

WHERE b.ДатаПродажи > #3/25/2003# AND a.КодПрод = b.КодПрод

GROUP BY a.Продукт

HAVING SUM(b.Количество) < 20;

Рисунок 12. Группировка продаж, не превышающих заданной величины

Подзапросы в инструкции SELECT

Подзапрос -- это запрос, который размещается внутри другого запроса, а точнее, является частью предложения WHERE (или HAVING) основного запроса и заключается в круглые скобки. Иногда подзапросы называют вложенными запросами. Запрос, содержащий подзапрос, называют сложным запросом. При выполнении сложного запроса сначала выполняется подзапрос (он для этого и заключается в скобки!), а затем -- основной запрос.

Выходные данные подзапроса обычно используются при оценке выражения в предложении WHERE (или HAVING) основного (по отношению к данному подзапросу) запроса с использованием таких операторов, как =, >, <, о, IN, NOT IN, AND, OR. (Эти операторы можно использовать и внутри подзапроса.)

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

  • ? Предложение SELECT подзапроса обычно содержит только один столбец и, следовательно, может иметь результатом массив однородных (только строковые значения, только целые значения и т.д.) значений или только одно значение. Очень редко встречаются случаи использования нескольких столбцов. Если подзапрос возвращает массив значений, соответствующее этому подзапросу предложение WHERE может содержать только многозначные операторы, например, IN.
  • ? Предложение ORDER BY следует использовать только в основном запросе. В подзапросе для упорядочения данных необходимо применять предложение GROUP BY.
  • ? Недопустимо использование в основном запросе предложения BETWEEN

Простой синтаксис подзапроса для оператора SELECT следующий:

SELECT { * I table.* | field1 [, field2 [, ...]])

FROM table1 [, table2 [, ...]

WHERE field1 operator

(SELECT { * I table.* I field1 [, field2 [, ...]]}

FROM table1 [, table2 [, ...]

WHERE )

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

Напомним, что схема данных (рис.13) БД Lab 3.mdb та же, что и в Lab 2.mdb.


Рисунок 13. Схема данных Lab 3.mdb

Запрос, связывающий продажи продуктов с поставщиками выглядит следующим образом:

SELECT a.Продукт AS [Наименование продукта], b.Количество AS [Количество], d.КодПост AS [Поставщик]

FROM Продукты a, Продажи b, Поставки c, Поставщики d

WHERE a.КодПрод = b.КодПрод AND b.КодПрод = c.КодПрод AND c.КодПост = d.КодПост;

Его результат показан на рис.14.


Рисунок 14. Продажи, связанные с поставщиками

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

SELECT ТОР 1 КодПост

FROM Поставки

GROUP BY КодПост

ORDER BY COUNT(КодПрод) DESC

Предложение TOP 1 указывает на то, что в результирующий набор попадает только одна запись, а поскольку набор сортируется (по убыванию) по суммарным количествам продуктов, то в результате мы получаем код поставщика с наибольшим количеством наименований. Результат такого запроса показан на рис.15.

Рисунок 15. Код поставщика с наибольшим количеством наименований

Остается подготовить запрос, который возвращает список проданных продуктов для указанного кода поставщика, но если ранее мы бы указывали этот код явно, то теперь определяем его в подзапросе (результат -- на рис. 16):

SELECT a.Продукт AS [Наименование продукта], b.Количество AS Количество, d.КодПост AS Поставщик

FROM Продукты AS a, Продажи AS b, Поставки AS c, Поставщики AS d

WHERE a.КодПрод = b.КодПрод AND b.КодПрод = c.КодПрод AND c.КодПост = d.КодПост AND c.КодПост =

(SELECT TOP 1 КодПост

FROM Поставки

GROUP BY КодПост

ORDER BY COUNT(КодПрод) DESC);

Рисунок 16. Продажи продуктов от поставщика с наибольшим количеством наименований

Анализ такого запроса показывает, что количество проданных наименований существенно меньше количества наименований продуктов, предоставленных данным поставщиком.

Заменив в первой строке запроса d.КодПост на d. Поставщик получим результат официальным названием фирмы (рис.17).

SQL - язык структурных запросов, созданный сотрудниками фирмы IBM для реляционных баз данных в начале 1970-х гг., а затем реализованный в рамках реляционных СУБД других фирм-разработчиков. Впоследствии SQL фактически стал стандартом в области языков запросов к реляционным базам данных.

В 1989 г. Американский национальный институт стандартов (American National Standards - ANSI) на основе анализа различных реализаций SQL разработал стандарт SQL-86. В 1992 г. появилась его новая версия - SQL-92, или SQL2. Эта версия реализована практически во всех современных СУБД. В настоящее время разрабатывается версия стандарта SQL3.

SQL представляет собой набор операторов, позволяющих осуществлять выборку (оператор SELECT) данных, их модификацию (оператор UPDATE) и удаление (оператор DELETE), а также ввод новых данных (оператор INSERT). Кроме того, в данный язык входят операторы определения переменных, создания и вызова хранимых процедур, функций и специальных процедур - триггеров. Всего SQL содержит более 100 операторов и позволяет разрабатывать сложные приложения. Одним из основных операторов SQL является SELECT.

Оператор SELECT предназначен для осуществления запросов по выборке данных из БД. Его синтаксис приведен далее:

SELECT Ссписок выбираемых полей>

В данном описании использованы следующие обозначения:

  • ? ссписок таблиц> - синтаксическая конструкция, требующая дальнейшего уточнения;
  • ? - синтаксическая конструкция внутри квадратных скобок (является необязательной и, в зависимости от ситуации, может использоваться или отсутствовать);
  • ? ASC | DESC - наличие символа “|” означает, что может использоваться синтаксическая конструкция, находящаяся слева или справа от этого символа;
  • ? DICTINCT - указывает на необходимость исключения из результата одинаковых кортежей (записей);
  • ? ссписок выбираемых полей> - список атрибутов (полей), которые входят в состав результирующего отношения. Кроме атрибутов здесь могут быть представлены и выражения;
  • ? ссписок таблиц> - список отношений (таблиц), которые используются в запросе;
  • ? = [ [сусловие связи>]...]
  • ? [АЫБсусловие отбора> [А]>Ш|(Ж]...]
  • ? сусловие связи> - используется для связи таблиц, используемых в запросе;
  • ? сусловие отбора> - выражение, определяющее, какие кортежи (записи) будут включены в результат. При составлении этого выражения можно использовать арифметические (+, -, х, /) и логические операции (AND, OR, NOT), а также встроенные функции SQL.

Текст запроса заканчивается знаком «;».

Сформулируем запрос: «Вывести следующую информацию о поставках контрагентом с кодом 1: номер накладной, дата поставки».

SELECT №накладной, ДатаПоставки

FROM Поставка

WHERE КодКонтрагента=1;

В этом запросе ссписок выбираемых полей> представлен атрибутами (полями) Мнакладной, ДатаПоставки, ссписок таблиц> - одним отношением (таблицей) Поставка, а сусловие выборки> включает одно сусловие отбора> - КодКонтрагента=1.

В связи с тем, что здесь используется только одна таблица, сусловие связи> отсутствует; сусловие соединения> будет рассмотрено далее.

Рассмотрим пример с использованием нескольких отношений (таблиц). Переформулируем первый запрос: «Вывести следующую информацию о поставках товаров контрагентами: номер накладной, наименование контрагента, дата поставки». В SQL он представляется следующим образом:

SELECT №накладной, ДатаПоставки, НаимКонтрагента FROM Контрагент INNER JOIN Поставка ON Контрагент. КодКонтрагента = Поставка.КодКонтрагента;

Здесь сусловие связи> представлено выражением (Контрагент.Код- Контрагента = Поставка. Код Контрагента). Оно указывает, при помощи каких атрибутов (полей) осуществляется связывание таблиц.

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

SELECT №накладной, ДатаПоставки, КодТовара, Цена- Поставщика х Количество AS суммаПозиции FROM Поставка INNER JOIN СпецПоставки ON Поставка. №накладной = СпецПоставки.№накладнойПоставки;

При составлении вычисляемых атрибутов могут использоваться встроенные функции:

COUNT(*) - подсчитывает количество кортежей (записей); MAX(Atr) - выдает наибольшее значение атрибута Atr;

MIN(Atr) - выдает наименьшее значение атрибута Atr. Рассмотрим пример.

Необходимо определить общее количество поставленных товаров:

SELECT КодТовара, Sum(Количество) AS Поставлено FROM СпецПоставки GROUP BY КодТовара;

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

Кроме того, SQL позволяет упорядочить результаты запросов по возрастанию или убыванию нескольких атрибутов (полей) при помощи конструкции вида

Где - перечень атрибутов (полей), в соответствии с которыми производится сортировка результата запроса; AS С (DESC) - признак упорядочивания по возрастанию (убыванию).

Упорядочим записи результата запроса по убыванию:

SELECT КодТовара, Sum(Количество) AS Поставлено

FROM СпецПоставки

GROUP BY КодТовара

ORDER BY Sum (Количество) DESC;

Конструкция

Join on , где, - связываемые отношения (таблицы);

Определяет внешнее (левое - left и правое - right) или внутреннее (inner) соединение отношений (таблиц).

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

Рассмотрим внутреннее соединение на примере запроса: «Определить количество поставок каждым контрагентом из справочника». С использованием конструкции

SELECT НаимКонтрагента, Count(№накладной) AS Количество

FROM Контрагент LEFT JOIN Поставка ON Контрагент. КодКонтрагента = Поставка.КодКонтрагента GROUP BY Контрагент.НаимКонтрагента;

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

На этом обзор основных конструкций языка SQL завершается. Сложные SQL-запросы, а также ряд других параметров будут рассматриваться далее при решении конкретных задач в п. 3.4.5 и 3.4.6.

Основы языка SQL

Конспект урока

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

Баумана Кафедра САПР Основы языка SQL Федорук В.ru 2636526 АННОТАЦИЯ Данное учебное пособие предназначено для изучения основ языка SQL стандартного языка манипулирования данными в СУБД реализующих реляционную модель данных. Описывается синтаксис наиболее употребимых операторов языка SQL приводятся примеры. Учебная база данных реализована в среде СУБД mySQL средства доступа к ней встроены в учебное пособие.

Московский Государственный Технический Университет

имени Н.Э.Баумана

Кафедра САПР

Основы языка SQL

Федорук В.Г.

[email protected]

263-65-26

АННОТАЦИЯ

Данное учебное пособие предназначено для изучения основ языка SQL - стандартного языка манипулирования данными в СУБД, реализующих реляционную модель данных. Описывается синтаксис наиболее употребимых операторов языка SQL, приводятся примеры. Обучающимся дается возможность в интерактивном режиме проверить свои знания.
Учебная база данных реализована в среде СУБД mySQL, средства доступа к ней встроены в учебное пособие.

Краткие сведения из теории
Основы синтаксиса языка SQL
Учебная база данных
Типы данных языка SQL
Манипулирование таблицами

Создание таблицы
Модификация таблицы
Удаление таблицы

Добавление строк в таблицу
Выборка данных из таблиц

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

Манипулирование строками таблиц

Удаление строк
Модификация строк

Литература
Упражнения

Краткие сведения из теории

Язык SQL (Structured Query Language - структурированный язык запросов) представляет собой стандартный высокоуровневый язык описания данных и манипулирования ими в системах управления базами данных (СУБД), построенных на основе реляционной модели данных .

Язык SQL был разработан фирмой IBM в конце 70-х годов. Первый международный стандарт языка был принят международной стандартизирующей организацией ISO в 1989 г. , а новый (более полный) - в 1992 г. . В настоящее время все производители реляционных СУБД поддерживают с различной степенью соответствия стандарт SQL92.

Единственной структурой представления данных (как прикладных, так и системных) в реляционной базе данных (БД) является двумерная таблица. Любая таблица может рассматриваться как одна из форм представления теоретико-множественного понятия отношение (relation), отсюда название модели данных - "реляционная".
В реляционной модели данных таблица обладает следующими основными свойствами:

  1. идентифицуруется уникальным именем;
  2. имеет конечное (как правило, постоянное) ненулевое количество столбцов;
  3. имеет конечное (возможно, нулевое) число строк;
  4. столбцы таблицы идентифицируются своими уникальными именами и номерами;
  5. содержимое всех ячеек столбца принадлежит одному типу данных (т.е. столбцы однородны), содержимым ячейки столбца не может быть таблица;
  6. строки таблицы не имеют какой-либо упорядоченности и идентифицируются только своим содержимым (т.е. понятие "номер строки" не определено);
  7. в общем случае ячейки таблицы могут оставаться "пустыми" (т.е. не содержать какого-либо значения), такое их состояние обозначается как NULL.

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

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

  1. требования уникальности содержимого каждой ячейки какого-либо столбца и/или совокупности ячеек в строке, относящихся к нескольким столбцам;
  2. запрета для какого-либо столбца (столбцов) иметь "пустые" (NULL) ячейки.

Ограничение в виде требования уникальности тесно связано с понятием ключа таблицы. Ключом таблицы называется столбец или комбинация столбцов, содержимое ячеек которого(ых) используется для прямого доступа ("быстрого" определения местоположения) к строкам таблицы. Различают ключи первичный (он может быть только единственным для каждой таблицы) и вторичные. Первичный ключ уникален и однозначно идентифицирует строку таблицы. Столбец строки, определенный в качестве первичного ключа, не может содержать "пустое" (NULL) значение в какой-либо своей ячейке. Вторичный ключ определяет местоположение, в общем случае, не одной строки таблицы, а нескольких "подобных" (в любом случае ускоряя доступ к ним, хотя не в такой степени как ключ первичный).
Ключи используются внутренними механизмами СУБД для оптимизации затрат на доступ к строкам таблиц (путем, например, их физического упорядочения по значениям ключей или построения двоичного дерева поиска).

Основными операциями над таблицами являются следующие.

  1. Проекция - построение новой таблицы из исходной путем включения в нее избранных столбцов исходной таблицы.
  2. Ограничение - построение новой таблицы из исходной путем включения в нее тех строк исходной таблицы, которые отвечают некоторому критерию в виде логического условия (ограничения).
  3. Объединение - построение новой таблицы из 2-ух или более исходных путем включения в нее всех строк исходных таблиц (при условии, конечно, что они подобны).
  4. Декартово произведение - построение новой таблицы из 2-ух или более исходных путем включения в нее строк, образованных всеми возможными вариантами конкатенации (слияния) строк исходных таблиц. Количество строк новой таблицы определяется как произведение количеств строк всех исходных таблиц.

Пречисленные выше 4 операции создают базис, на основе которого может быть построено большинство (но не все) практически полезных запросов на извлечение информации из реляционной БД.
Примечание . Набор операций будет полным, если дополнить его операциями пересечения и вычитания. Однако в данном пособии реализация этих операций в языке SQL не рассматривается.

Кроме перечисленных выше в языке SQL реализованы операции модификации содержимого строк таблицы и пополнения таблицы новыми строками (что теоретически может рассматриваться как операция объединения), а также операции управления таблицами.
Рассмотренные выше операции над таблицами реляционной БД обладая функциональной полнотой, будучи реализованы на практике в своем "чистом" каноническом виде, как правило, крайне неэкономичны (в первую очередь это относится к комбинации операций ограничения и декартового произведения). Разработчики реальных реляционных СУБД прибегают ко всевозможным приемам и "ухищрениям" для минизации вычислительных затрат (в первую очередь, машинного времени) при выполнении этих операций. Общим способом, нашедшим отражение в языке SQL, повышения эффективности выполнения запросов в реляционных СУБД являются импользование ключей индексов.

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

В настоящее время наибольшее распространение получили реляционные SQL СУБД двух групп:

  1. мощные крупные коммерческие СУБД, ориентированные на хранение огромных объемов информации (от гигабайт);
  2. мобильные компактные свободно распространяемые (в том числе и в исходных кодах) СУБД, использование которых оправдано и для БД объемом всего лишь в десятки килобайт.

Наиболее известными СУБД первой группы являются:

  1. Sybase SQLserver фирмыSybase, Inc. ;
  2. Oracle фирмы Oracle Corporation;
  3. Ingres фирмыComputer Associates International ;
  4. Informix фирмы Informix Corporation.

К наиболее популярным СУБД второй группы относятся:

  1. PostgreSQL организации PostgreSQL;
  2. microSQL фирмыHughes Technologies Pty. Ltd. ;
  3. mySQL фирмыT.C.X DataKonsult AB .

В данном учебном пособии практические упражнения, которые может выполнить обучающийся после изучения основ языка SQL, реализуются средствами СУБД mySQL.

Все перечисленные выше СУБД построены по принципу "клиент-сервер", как это показано на рисунке ниже.

SQL-сервер реализует собственно хранение данных и манипулирование ими. Он принимает запросы на языке SQL от своих клиентов, выполняет их и возвращает результаты (чаще всего в виде вновь построенных таблиц) клиентам. Для общения с клиентами используется специальный протокол (как правило, реализованный в виде протокола прикладного уровня стека сетевых протоколов TCP/IP).
Клиентскую часть СУБД составляют клиенты трех основных типов.

  1. Интерактивные клиенты, обеспечивающие пользователю-человеку возможность общения с SQL-сервером непосредственно с помощью языка SQL.
  2. ИПП-клиенты, обеспечивающие интерфейс прикладного программирования (ИПП) прикладным программам, использующим средства SQL-сервера. Такой ИПП может быть средством общения прикладной программы с SQL-сервером на языке SQL или набором стандартных функций доступа к реляционной SQL БД без формирования символьных строк запросов (например, стандартный интерфейс ODBC).
  3. WWW-клиенты, встраиваемые в World Wide Web-сервера и обеспечивающие доступ к информационным возможностям SQL-сервера пользователям сети Internet по протоколу HTTP (протоколу передачи гипертекстовых документов).

Именно WWW-клиент СУБД mySQL используется в учебном пособии для выполнения практических упражнений.

Основы синтаксиса языка SQL

"Программа" на языке SQL представляет собой простую линейную последовательность операторов языка SQL. Язык SQL в своем "чистом" виде операторов управления порядком выполнения запросов к БД (типа циклов, ветвлений, переходов) не имеет.
Операторы языка SQL строятся с применением:

  1. зарезервированных ключевых слов;
  2. идентификаторов (имен) таблиц и столбцов таблиц;
  3. логических, арифметических и строковых выражений, используемых для формирования критериев поиска информации в БД и для вычисления значений ячеек результирующих таблиц;
  4. идентификаторов (имен) операций и функций, используемых в выражениях.

Все ключевые слова, имена функций и, как правило, имена таблиц и столбцов представляются 7-мибитными символами кодировки ASCII (иначе говоря - латинскими буквами).
В языке SQL не делается различия между прописными (большими) и строчными (маленькими) буквами, т.е., например, строки "SELECT", "Select", "select" представляют собой одно и то же ключевое слово.
Для конструирования имен таблиц и их столбцов допустимо использовать буквы, цифры и знак "_" (подчеркивание), но первым символом имени обязательно должна быть буква.
Запрещено использование ключевых слов и имен функций в качестве идентификаторов таблиц и имен столбцов. Полный список ключевых слов и имен функций (а он весьма обширен) можно найти в документации на конкретную СУБД.
Оператор начинается с ключевого слова-глагола (например, "CREATE" - создать, "UPDATE" - обновить, "SELECT" - выбрать и т.п.) и заканчивается знаком ";" (точка с запятой). Оператор записывается в свободном формате и может занимать несколько строк. Допустимыми разделителями лексических единиц в операторе являются:

  1. один или несколько пробелов,
  2. один или несколько символов табуляции,
  3. один или несколько символов "новая строка".

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

  1. Прописными (большими) буквами (напрмер, SELECT, FROM, WHERE) набраны зарезервированные слова.
  2. Курсивом (например, имя_табл , сложн_условие ) набраны переменные (нетерминальные символы), подлежащие замене в реальном операторе конструкцией из терминальных символов (идентификаторов, знаков операций, имен функций и т.п.).
  3. В квадратные скобки ("[...]") заключается необязательная часть оператора, которую можно опустить при создании реального оператора (сами квадратные скобки в текст оператора не включаются).
  4. Вертикальная черта ("|") означает возможность выбора ("или") из двух или нескольких вариантов синтаксической конструкции (сама вертикальная черта в текст оператора не включается). Подчеркнутый вариант (например, в "[ ALL | DISTINCT }") является умолчательным.
  5. Последовательность символов ", ..." обозначает возможность повторения произвольное количество раз (в том числе и нулевое) предшествующей запятой конструкции. Символ "," включается в реальный оператор в качестве разделителя перед каждым повторением конструкции.

К сожалению, разработчики реальных СУБД неаккуратно обращаются с требованиями стандартов языка SQL в части комментариев. Поэтому комментарии при использовании в различных СУБД в текстах "программ" на языке SQL могут помечаться следующими способами:

  1. от двойного минуса ("--") до конца строки;
  2. от символа "#" до конца строки;
  3. между последовательностями "/*" и "*/" (стиль комментариев языка СИ).

Учебная база данных

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

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

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

Для идентификации узлов и КЭ их помечают номерами (числами из натурального ряда 1...). Задача ручного разбиения двумерного (а тем более трехмерного) объекта на КЭ является трудоемкой и нетривиальной, поэтому в реальных промышленных системах анализа, реализующих МКЭ, существует, как правило, несколько автоматических процедур покрытия исследуемой области сеткой КЭ. Однако сгенерированная любым способом (автоматически/вручную/комбинированно) сетка КЭ нуждается в проверке некоторым набором правил ее корректности, обеспечивающих минимальность вычислительных затрат и точность получаемых результатов.

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

В задачах исследования поведения механических объектов под воздействием внешних факторов с каждым КЭ связан набор свойств материала, покрываемого КЭ, в состав которого входят, например, плотность (density) среды, модуль Юнга (elastic module), коэффициент Пуассона (Poisson"s coefficient), прочность (strength) и др.

Задачей МКЭ является исследование поведения объектов (в нашем примере механических) при различных граничных условиях (воздействиях внешней среды), в состав которых входят:

  1. произвольно направленная сила;
  2. произвольно направленный момент сил;
  3. "заделка", жестко фиксирующая положение узла сетки по линейным координатам и углу вращения;
  4. шарнир, позволяющий узлу свободно "вращаться" относительно его фиксируемого положения по линейным координатам;
  5. "каток", дающий узлу возможность свободно перемещаться по оси x или y.

Описанная выше информация является предметом хранения и манипулирования в учебной БД, используемой в данном пособии. Основу БД составляют четыре таблицы:

  1. таблица "nodes", содержащая информацию об узлах КЭ-сетки (идентификатор, x- и y-координаты);
  2. таблица "elements", содержащая информацию обо всех КЭ, составляющих сетку (номер КЭ, идентификаторы трех вершин, наименование материала);
  3. таблица "materials", содержащая информацию о свойствах различных конструкционных материалов (наименование, плотность, модуль Юнга, коэффициент Пуассона, прочность);
  4. таблица "loadings", содержащая информацию о граничных условиях решаемой задачи (вид условия, его "направление", номер узла приложения, числовое значение).

Типы данных языка SQL

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

  1. INT[(len )] - целое число длиной 4 байта, представляемое при выводе максимально len цифрами;
  2. SMALLINT[(len )] - целое число длиной 2 байта, представляемое при выводе максимально len цифрами;
  3. FLOAT[(len ,dec )] - действительное число, представляемое при выводе максимально len символами с dec цифрами после десятичной точки;
  4. CHAR(size ) - строка символов фиксированной длины размером size символов;
  5. VARCHAR(size ) - строка символов переменной длины максимальным размером до size символов;
  6. BLOB (Binary Large OBject) - массив произвольных (двоичных) байтов (максимальный размер зависит от реализации, обычно это 65535 байт); этот тип данных может использоваться, например, для хранения изображений;
  7. DATE - астрономическая дата;
  8. TIME - астрономическое время.

Символьные константы (типа CHAR и VARCHAR) записываются как последовательности символов, заключенные в одиночные апострофы, например "brass" (латунь).
Десятичные константы (типа FLOAT) могут записываться в "научной" нотации как последовательности следующих компонент:

  1. знак числа;
  2. десятичное число с точкой;
  3. символ "е";
  4. знак ("+" или "-") показателя степени;
  5. целое число, играющее роль показателя степени числа 10.

Например, десятичное число -0,123 может быть записано как -12.3е-2.

Отличие типов данных CHAR и VARCHAR заключается в том, что для хранения в таблице строк символов типа CHAR используется точно size байт (хотя содержание хранимых строк может быть значительно короче), в то время как для строк типа VARCHAR незанятые символами строк ("пустые") байты в таблице не хранятся.
Подчеркнем, что величины len и dec (в отличие от size ) не влияют на размер хранения данных в таблице, а только форматируют вывод данных из таблицы.

Примечание. Тип данных BLOB поддерживается непосредственно не всеми СУБД, однако каждая из них предлагает его аналог (например, BINARY или IMAGE).

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

Предыдущая часть

Почему SQL?

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

Рассматриваемый же ниже непроцедурный язык SQL (Structured Query Language - структуризованный язык запросов) ориентирован на операции с данными, представленными в виде логически взаимосвязанных совокупностей таблиц. Особенность предложений этого языка состоит в том, что они ориентированы в большей степени на конечный результат обработки данных, чем на процедуру этой обработки. SQL сам определяет, где находятся данные, какие индексы и даже наиболее эффективные последовательности операций следует использовать для их получения: не надо указывать эти детали в запросе к базе данных.

Для иллюстрации различий между ЯМД рассмотрим следующую ситуацию. Пусть, например, вы собираетесь посмотреть кинофильм и хотите воспользоваться для поездки в кинотеатр услугами такси. Одному шоферу такси достаточно сказать название фильма - и он сам найдет вам кинотеатр, в котором показывают нужный фильм. (Подобным же образом, самостоятельно, отыскивает запрошенные данные SQL.)

Для другого шофера такси вам, возможно, потребуется самому узнать, где демонстрируется нужный фильм и назвать кинотеатр. Тогда водитель должен найти адрес этого кинотеатра. Может случиться и так, что вам придется самому узнать адрес кинотеатра и предложить водителю проехать к нему по таким-то и таким-то улицам. В самом худшем случае вам, может быть, даже придется по дороге давать указания: "Повернуть налево... проехать пять кварталов... повернуть направо...". (Аналогично больший или меньший уровень детализации запроса приходится создавать пользователю в разных СУБД, не имеющих языка SQL.)

Появление теории реляционных баз данных и предложенного Коддом языка запросов "alpha", основанного на реляционном исчислении , инициировало разработку ряда языков запросов, которые можно отнести к двум классам:

  1. Алгебраические языки, позволяющие выражать запросы средствами специализированных операторов, применяемых к отношениям (JOIN - соединить, INTERSECT - пересечь, SUBTRACT - вычесть и т.д.).
  2. Языки исчисления предикатов представляют собой набор правил для записи выражения, определяющего новое отношение из заданной совокупности существующих отношений. Другими словами исчисление предикатов есть метод определения того отношения, которое нам желательно получить (как ответ на запроc) из отношений, уже имеющихся в базе данных.

Разработка, в основном, шла в отделениях фирмы IBM (языки ISBL, SQL, QBE) и университетах США (PIQUE, QUEL) . Последний создавался для СУБД INGRES (Interactive Graphics and Retrieval System), которая была разработана в начале 70-х годов в Университете шт. Калифорния и сегодня входит в пятерку лучших профессиональных СУБД. Сегодня из всех этих языков полностью сохранились и развиваются QBE (Query-By-Example - запрос по образцу) и SQL, а из остальных взяты в расширение внутренних языков СУБД только наиболее интересные конструкции.

В начале 80-х годов SQL "победил" другие языки запросов и стал фактическим стандартом таких языков для профессиональных реляционных СУБД. В 1987 году он стал международным стандартом языка баз данных и начал внедряться во все распро-страненные СУБД персональных компьютеров. Почему же это произошло?

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

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

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

Для исключения указанных и некоторых других недостатков была предложена технология "Клиент-Сервер", по которой запросы пользовательских ЭВМ (Клиент) обрабатываются на специальных серверах баз данных (Сервер), а на ЭВМ возвращаются лишь результаты обработки запроса. При этом, естественно, нужен единый язык общения с Сервером и в качестве такого языка выбран SQL. Поэтому все современные версии профессиональных реляционных СУБД (DB2, Oracle, Ingres, Informix, Sybase, Progress, Rdb) и даже нереляционных СУБД (например, Adabas) используют технологию "Клиент-Сервер" и язык SQL. К тому же приходят разработчики СУБД персональных ЭВМ, многие из которых уже сегодня снабжены языком SQL.

Бытует мнение: Поскольку большая часть запросов формулируется на SQL, практически безразлично, что это за СУБД - был бы SQL.

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

  1. предложения определения данных (определение баз данных, а также определение и уничтожение таблиц и индексов);
  2. запросы на выбор данных (предложение SELECT);
  3. предложения модификации данных (добавление, удаление и изменение данных);
  4. предложения управления данными (предоставление и отмена привилегий на доступ к данным, управление транзакциями и другие). Кроме того, он предоставляет возможность выполнять в этих предложениях:
  5. арифметические вычисления (включая разнообразные функциональные преобразования), обработку текстовых строк и выполнение операций сравнения значений арифметических выражений и текстов;
  6. упорядочение строк и (или) столбцов при выводе содержимого таблиц на печать или экран дисплея;
  7. создание представлений (виртуальных таблиц), позволяющих пользователям иметь свой взгляд на данные без увеличения их объема в базе данных;
  8. запоминание выводимого по запросу содержимого таблицы, нескольких таблиц или представления в другой таблице (реляционная операция присваивания).
  9. агрегатирование данных: группирование данных и применение к этим группам таких операций, как среднее, сумма, максимум, минимум, число элементов и т.п.

В SQL используются следующие основные типы данных, форматы которых могут несколько различаться для разных СУБД:

  1. INTEGER - целое число (обычно до 10 значащих цифр и знак);
  2. SMALLINT- "короткое целое" (обычно до 5 значащих цифр и знак);
  3. DECIMAL(p,q) - десятичное число, имеющее p цифр (0 < p < 16) и знак; с помощью q задается число цифр справа от десятичной точки (q < p, если q = 0, оно может быть опущено);
  4. FLOAT- вещественное число с 15 значащими цифрами и целочисленным порядком, определяемым типом СУБД;
  5. CHAR(n)- символьная строка фиксированной длины из n символов (0 < n < 256);
  6. VARCHAR(n)- символьная строка переменной длины, не превышающей n символов (n > 0 и разное в разных СУБД, но не меньше 4096);
  7. DATE- дата в формате, определяемом специальной командой (по умолчанию mm/dd/yy); поля даты могут содержать только реальные даты, начинающиеся за несколько тысячелетий до н.э. и ограниченные пятым-десятым тысячелетием н.э.;
  8. TIME- время в формате, определяемом специальной командой, (по умолчанию hh.mm.ss);
  9. DATETIME- комбинация даты и времени;
  10. MONEY- деньги в формате, определяющем символ денежной единицы ($, руб, ...) и его расположение (суффикс или префикс), точность дробной части и условие для показа денежного значения.

В некоторых СУБД еще существует тип данных LOGICAL, DOUBLE и ряд других. СУБД INGRES предоставляет пользователю возможность самостоятельного определения новых типов данных, например, плоскостные или пространственные координаты, единицы различных метрик, пяти- или шестидневные недели (рабочая неделя, где сразу после пятницы или субботы следует понедельник), дроби, графика, большие целые числа (что стало очень актуальным для российских банков) и т.п.

Ориентированный на работу с таблицами SQL не имеет достаточных средств для создания сложных прикладных программ. Поэтому в разных СУБД он либо используется вместе с языками программирования высокого уровня (например, такими как Си или Паскаль), либо включен в состав команд специально разработанного языка СУБД (язык систем dBASE, R:BASE и т.п.). Унификация полных языков современных профессиональных СУБД достигается за счет внедрения объектно-ориентированного языка четвертого поколения 4GL. Последний позволяет организовывать циклы, условные предложения, меню, экранные формы, сложные запросы к базам данных с интерфейсом, ориентированным как на алфавитно-цифровые терминалы, так и на оконный графический интерфейс (X-Windows, MS-Windows).

Таблицы SQL

До сих пор понятие "таблица", как правило, связывалось с реальной или базовой таблицей, т.е. c таблицей, для каждой строки которой в действительности имеется некоторый двойник, хранящийся в физической памяти машины (рис.1.2). Однако SQL использует и создает ряд виртуальных (как будто существующих) таблиц: представлений, курсоров и неименованных рабочих таблиц, в которых формируются результаты запросов на получение данных из базовых таблиц и, возможно, представлений. Это таблицы, которые не существуют в базе данных, но как бы существуют с точки зрения пользователя.

Базовые таблицы создаются с помощью предложения CREATE TABLE (создать таблицу), подробное описание которого приведено в главе 5. Здесь же приведем пример предложения для создания описания таблицы Блюда:

Рис. 1.2. База данных в восприятии пользователя

CREATE TABLE Блюда

(БЛ SMALLINT,

Блюдо CHAR (70),

В CHAR (1),

Основа CHAR (10),

Выход FLOAT,

Труд SMALLINT);

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

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

SELECT БЛ,Блюдо

FROM Блюда

WHERE Основа = "Овощи";

и мгновенно получить на экране следующий результат его реализации:

Для выполнения этого предложения SELECT (выбрать), подробное описание которого будет дано в главах 2 и 3, СУБД должна сначала сформировать пустую рабочую таблицу, состоящую из столбцов БЛ и Блюдо, тип данных которых должен совпадать с типом данных аналогичных столбцов базовой таблицы Блюда. Затем она должна выбрать из таблицы Блюда все строки, у которых в столбце Основа хранится слово Овощи, выделить из этих строк столбцы БЛ и Блюдо и загрузить укороченные строки в рабочую таблицу. Наконец, СУБД должна выполнить процедуры по организации вывода содержимого рабочей таблицы на экран терминала (при этом если в рабочей таблице содержится более 20-24 строк, она должна использовать процедуры постраничного вывода и т.п.). После выполнения запроса СУБД должна уничтожить рабочую таблицу.

Если, например, надо получить значение калорийности всех овощей, включенных в таблицу Продукты, то можно набрать на терминале запрос

SELECT Продукт, Белки, Жиры, Углев,

((Белки+Углев)*4.1+Жиры*9.3)

FROM Продукты

WHERE Продукт IN ("Морковь","Лук","Помидоры","Зелень");

и получить на экране следующий результат его реализации:

Продукт

Белки

Жиры

Углев

((Белки+Углев)*4.1+Жиры*9.3)

Помидоры

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

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

Например, в запросе на получение состава овощных блюд

SELECT БЛ , ПР , Вес

FROM Состав

WHERE БЛ IN (1,3,17,23);

пришлось перечислять номера этих блюд, так как в таблице Состав нет данных об основных продуктах блюда (они есть в таблице Блюда). Полученный состав овощных блюд (рис.1.3,а) оказался "слепым": в нем и блюда и продукты представлены номерами, а не именами. Удобнее и нагляднее (рис.1.3,б)

запрос сформированный по трем таблицам:

SELECT Блюдо, Продукт, Вес

FROM Состав,Б люда, Продукты

WHERE Состав.БЛ = Блюда.БЛ

AND Состав.ПР = Продукты.ПР

AND Основа = "Овощи";

В нем для получения рабочей таблицы выполняется естественное соединение таблиц Блюда, Продукты и Состав (условие соединения - равенство значений номеров блюд и значений номеров продуктов). Затем выделяются строки, у которых в столбце Основа хранится слово Овощи, и из этих строк - столбцы Блюдо, Продукт и Вес.

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

Представление - это пустая именованная таблица, определяемая перечнем тех столбцов таблиц и признаками тех их строк, которые хотелось бы в ней увидеть. Представление является как бы "окном" в одну или несколько базовых таблиц. Оно создается с помощью предложения CREATE VIEW (создать представление), подробное описание которого приведено в главе 5. Здесь же приведем пример предложения для создания представления Состав_блюд:

CREATE VIEW Состав_блюд

AS SELECT Блюдо, Продукт, Вес

FROM Состав,Блюда,Продукты

WHERE Состав.БЛ = Блюда.БЛ

AND Состав.ПР = Продукты.ПР;

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

SELECT Блюдо,Продукт,Вес

FROM Состав_блюд

WHERE Основа = "Овощи";

и получить на экране терминала данные, которые представлены на рис. 1.3,б. А для получения состава супа Харчо можно дать запрос

SELECT Блюдо, Продукт, Вес

FROM Состав_блюд

WHERE Блюдо = "Суп харчо";

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

Наконец, еще об одних виртуальных таблицах - курсорах. Курсор - это пустая именованная таблица, определяемая перечнем тех столбцов базовых таблиц и признаками тех их строк, которые хотелось бы в ней увидеть. В чем же различие между курсором и представлением?

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

DECLARE Блюд_состав CURSOR FOR

SELECT Блюдо,Продукт,Вес

FROM Состав,Блюда,Продукты

WHERE Состав.БЛ = Блюда.БЛ

AND Состав.ПР = Продукты.ПР

AND Блюдо = "Суп харчо";

и его активизации (OPEN Блюд_состав) будет создана временная таблица с составом блюда "Суп харчо" и специальным указателем, определяющим в качестве текущей первую строку этой таблицы. С помощью предложения FETCH (выбрать), которое обычно исполняется в программном цикле, можно присвоить определенным переменным значения указанных столбцов этой строки. Одновременно курсор будет передвинут к следующей строке таблицы. После обработки в программе полученных значений переменных выполняется следующее предложение FETCH и т.д. до окончания перебора всех продуктов Харчо.

Структуризированный язык запросов (SQL)

Предыдущая часть

2.1. О предложении SELECT

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

Предложение SELECT может использоваться как:

  1. самостоятельная команда на получение и вывод строк таблицы, сформированной из столбцов и строк одной или нескольких таблиц (представлений);
  2. элемент WHERE- или HAVING-условия (сокращенный вариант предложения, называемый "вложенный запрос");
  3. фраза выбора в командах CREAT VIEW, DECLARE CURSOR или INSERT;
  4. средство присвоения глобальным переменным значений из строк сформированной таблицы (INTO-фраза).

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

  1. звездочка (*) для обозначения "все" - употребляется в обычном для программирования смысле, т.е. "все случаи, удовлетворяющие определению";
  2. квадратные скобки () – означают, что конструкции, заключенные в эти скобки, являются необязательными (т.е. могут быть опущены);
  3. фигурные скобки ({}) – означают, что конструкции, заключенные в эти скобки, должны рассматриваться как целые синтаксические единицы, т.е. они позволяют уточнить порядок разбора синтаксических конструкций, заменяя обычные скобки, используемые в синтаксисе SQL;
  4. многоточие (...) – указывает на то, что непосредственно предшествующая ему синтаксическая единица факультативно может повторяться один или более раз;
  5. прямая черта (|) – означает наличие выбора из двух или более возможностей. Например обозначение ASC|DESC указывает, можно выбрать один из терминов ASC или DESC; когда же один из элементов выбора заключен в квадратные скобки, то это означает, что он выбирается по умолчанию (так, |DESC означает, что отсутствие всей этой конструкции будет восприниматься как выбор ASC);
  6. точка с запятой (;) – завершающий элемент предложений SQL;
  7. запятая (,) – используется для разделения элементов списков;
  8. пробелы () – могут вводиться для повышения наглядности между любыми синтаксическими конструкциями предложений SQL;
  9. прописные жирные латинские буквы и символы – используются для написания конструкций языка SQL и должны (если это специально не оговорено) записываться в точности так, как показано;
  10. строчные буквы – используются для написания конструкций, которые должны заменяться конкретными значениями, выбранными пользователем, причем для определенности отдельные слова этих конструкций связываются между собой символом подчеркивания (_);
  11. термины таблица, столбец, ... – заменяют (с целью сокращения текста синтаксических конструкций) термины имя_таблицы, имя_столбца, ..., соответственно;
  12. термин таблица – используется для обобщения таких видов таблиц, как базовая_таблица, представление или псевдоним; здесь псевдоним служит для временного (на момент выполнения запроса) переименования и (или) создания рабочей копии базовой_таблицы (представления).

Предложение SELECT (выбрать) имеет следующий формат:

подзапрос подзапрос] ...

столбец | номер_элемента_SELECT} [ | DESC]

[,{[таблица.]столбец | номер_элемента_SELECT} [ | DESC]] ...;

и позволяет объединить (UNION) а затем упорядочить (ORDER BY) результаты выбора данных, полученных с помощью нескольких "подзапросов". При этом упорядочение можно производить в порядке возрастания - ASC (ASCending) или убывания DESC (DESCending), а по умолчанию принимается ASC.

В этом предложении подзапрос позволяет указать условия для выбора нужных данных и (если требуется) их обработки

  1. SELECT (выбрать) - данные из указанных столбцов и (если необходимо) выполнить перед выводом их преобразование в соответствии с указанными выражениями и (или) функциями
  2. FROM (из) - перечисленных таблиц, в которых расположены эти столбцы
  3. WHERE (где) - строки из указанных таблиц должны удовлетворять указанному перечню условий отбора строк
  4. GROUP BY (группируя по) - указанному перечню столбцов с тем, чтобы получить для каждой группы единственное агрегированное значение, используя во фразе SELECT SQL-функции SUM (сумма), COUNT (количество), MIN (минимальное значение), MAX (максимальное значение) или AVG (среднее значение)
  5. HAVING (имея) - в результате лишь те группы, которые удовлетворяют указанному перечню условий отбора групп

и имеет формат

SELECT [ | DISTINCT]{ * | элемент_SELECT [,элемент_SELECT] ...}

FROM {базовая_таблица | представление} [псевдоним]

[,{базовая_таблица | представление} [псевдоним]] ...

Элемент_SELECT - это одна из следующих конструкций:

[таблица.]* | значение | SQL_функция | системная_переменная

где значение – это:

[таблица.]столбец | (выражение) | константа | переменная

Синтаксис выражений имеет вид

({[ [+] | - ] {значение | функция_СУБД} [ + | - | * | ** ]}...)

а синтаксис SQL_функций – одна из следующих конструкций:

{SUM|AVG|MIN|MAX|COUNT} ([|DISTINCT][таблица.]столбец)

{SUM|AVG|MIN|MAX|COUNT} ( выражение)

COUNT(*)

Фраза WHERE включает набор условий для отбора строк:

WHERE WHERE_ условие [ WHERE_ условие ]...

где WHERE_условие – одна из следующих конструкций:

значение { = | <> | < | <= | > | >= } { значение | (подзапрос) }

значение_1 BETWEEN значение_2 AND значение_3

значение IN { (константа [,константа]...) | (подзапрос) }

значение IS NULL

EXISTS (подзапрос)

Кроме традиционных операторов сравнения (= | <> | < | <= | > | >=) в WHERE фразе используются условия BETWEEN (между), LIKE (похоже на), IN (принадлежит), IS NULL (не определено) и EXISTS (существует), которые могут предваряться оператором NOT (не). Критерий отбора строк формируется из одного или нескольких условий, соединенных логическими операторами:

  1. AND - когда должны удовлетворяться оба разделяемых с помощью AND условия;
  2. OR - когда должно удовлетворяться одно из разделяемых с помощью OR условий;
  3. AND NOT - когда должно удовлетворяться первое условие и не должно второе;
  4. OR NOT - когда или должно удовлетворяться первое условие или не должно удовлетворяться второе,

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

При обработке условия числа сравниваются алгебраически - отрицательные числа считаются меньшими, чем положительные, независимо от их абсолютной величины. Строки символов сравниваются в соответствии с их представлением в коде, используемом в конкретной СУБД, например, в коде ASCII. Если сравниваются две строки символов, имеющих разные длины, более короткая строка дополняется справа пробелами для того, чтобы они имели одинаковую длину перед осуществлением сравнения.

Наконец, синтаксис фразы GROUP BY имеет вид

GROUP BY [таблица.]столбец [,[таблица.]столбец] ...

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

С помощью фразы HAVING (синтаксис которой почти не отличается от синтаксиса фразы WHERE)

HAVING HAVING_ условие [ HAVING_ условие ]...

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

значение { = | <> | < | <= | > | >= } { значение | (подзапрос)

| SQL_функция }

{значение_1 | SQL_функция_1} BETWEEN

{значение_2 | SQL_функция_2} AND {значение_3 | SQL_функция_3}

{значение | SQL_функция} IN { (константа [,константа]...)

| (подзапрос) }

{значение | SQL_функция} IS NULL

[таблица.]столбец LIKE "строка_символов"

EXISTS (подзапрос)

2.2. Выборка без использования фразы WHERE

2.2.1. Простая выборка

Запрос выдать название, статус и адрес поставщиков

SELECT Название, Статус, Адрес

FROM Поставщики;

дает результат, приведенный на рис. 2.1,а.

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

SELECT ПС, Название, Статус, Город, Адрес, Телефон

FROM Поставщики;

или использовать его более короткую нотацию:

SELECT *

FROM Поставщики;

Здесь "звездочка" (*) служит кратким обозначением всех имен полей в таблице, указанной во фразе FROM. При этом порядок вывода полей соответствует порядку, в котором эти поля определялись при создании таблицы.

Еще один пример. Выдать основу всех блюд:

SELECT Основа

FROM Блюда;

дает результат, показанный на рис. 2.1,б.

2.2.2. Исключение дубликатов

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

SELECT DISTINCT Основа

FROM Блюда ;

Результат приведен на рис. 2.1,в.

2.2.3. Выборка вычисляемых значений

Из синтаксиса фразы SELECT (п.2.1) видно, что в ней может содержаться не только перечень столбцов таблицы или символ *, но и выражения.

Например, если нужно получить значение калорийности всех продуктов, то можно учесть, что при окислении 1 г углеводов или белков в организме освобождается в среднем 4.1 ккал, а при окислении 1 г жиров - 9.3 ккал, и выдать запрос:

FROM Продукты;

результат которого приведен на рис. 2.2,а.

Фраза SELECT может включать не только выражения, но и отдельные числовые или текстовые константы. Следует отметить, что текстовые константы должны заключаться в апострофы ("). На рис. 2.2,б приведен результат запроса:

SELECT Продукт, "Калорий =", ((Белки+Углев)*4.1+Жиры *9.3)

FROM Продукты;

А что произойдет, если какой-либо член выражения не определен, т.е. имеет значение NULL и каким образом появилось такое значение?

Если при загрузке строк таблицы в какой-либо из вводимых строк отсутствует значение для какого-либо столбца, то СУБД введет в такое поле NULL-значение. NULL-значение "придумано" для того, чтобы представить единым образом "неизвестные значения" для любых типов данных. Действительно, так как при вводе данных в столбец или их изменении СУБД запрещает ввод значений не соответствующих описанию данных этого столбца, то, например, нельзя использовать пробел для отсутствующего значения числа. Нельзя для этих целей использовать и ноль: нет месяца или дня недели равного нулю, да и для чисел ноль не может рассматриваться как неизвестное значение в одном месте и как известное - в другом. При выводе же NULL-значения на экран или печатающее устройство его код воспроизводится каким-либо специально заданным символом или набором символов: например, пробелом (если его нельзя перепутать с текстовым значением пробела) или сочетанием -0-.

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

Например, при выполнении запроса

SELECT ПР, Цена, К_во, (Цена * К_во)

FROM Поставки;

и разных "настройках" СУБД могут быть получены разные результаты:

Структуризированный язык запросов (SQL)

Предыдущая часть

2.3. Выборка c использованием фразы WHERE

2.3.1. Использование операторов сравнения

В синтаксисе фразы WHERE (п.2.1) показано, что для отбора нужных строк таблицы можно использовать операторы сравнения = (равно), <> (не равно), < (меньше), <= (меньше или равно), > (больше), >= (больше или равно), которые могут предваряться оператором NOT, создавая, например, отношения "не меньше" и "не больше".

Так, для получения перечня продуктов, практически не содержащих углеводов, можно сформировать запрос

FROM Продукты

WHERE Углев = 0;

и получить:

Продукт

Белки

Жиры

Углев

Говядина

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

SELECT Продукт, Белки, Жиры, Углев, K, Ca, Na, B2, PP, C

FROM Продукты

WHERE Углев = 0 AND Na = 0;

Результат запроса имеет вид

Продукт

Белки

Жиры

Углев

Добавим к этому запросу еще одно условие

SELECT Продукт, Белки, Жиры, Углев, K, Ca, Na, B2, PP, C

FROM Продукты

WHERE Углев = 0 AND Na = 0 AND Продукт <> "Судак";

и получим на экране сообщение "No rows exist or satisfy the specified clause" или аналогичное (в зависимости от вкусов разработчиков разных СУБД), информирующее об отсутствии строк, удовлетворяющих заданному(ым) условию(ям).

2.3.2. Использование BETWEEN

С помощью BETWEEN ... AND ... (находится в интервале от... до...) можно отобрать строки, в которых значение какого-либо столбца находятся в заданном диапазоне.

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

Можно задать и NOT BETWEEN (не принадлежит диапазону между), например: BETWEEN особенно удобен при работе с данными, задаваемыми интервалами, начало и конец которых расположен в разных столбцах.

Для примера воспользуемся таблицей "минимальных окладов" (табл. 2.1), величина которых непосредственно связана со студенческой стипендией. В этой таблице для текущего значения минимального оклада установлена запредельная дата окончания 9 сентября 9999 года.

Таблица 2.1 Минимальные оклады

Миноклад

Начало

Конец

Если, например, потребовалось узнать, какие изменения минимальных окладов производились в 1993/94 учебном году, то можно выдать запрос

SELECT Начало, Миноклад

FROM Миноклады

WHERE Начало

и получить результат:

Отметим, что при формировании запросов значения дат следует заключать в апострофы, чтобы СУБД не путала их с выражениями и не пыталась вычитать из 31 значение 8, а затем 1994.

Для выявления всех значений минимальных окладов, которые существовали в 1993/94 учебном году, можно сформировать запрос

SELECT *

FROM Миноклады

WHERE Начало BETWEEN "1-9-1993" AND "31-8-1994"

OR Конец BETWEEN "1-9-1993" AND "31-8-1994"

Миноклад

Начало

Конец

Наконец, для получения минимального оклада на 15-5-1994:

2.3.3. Использование IN

Выдать сведения о блюдах на основе яиц, крупы и овощей

SELECT *

FROM Блюда

WHERE Основа IN (Яйца Крупа Овощи);

Результат:

Рассмотренная форма IN является в действительности просто краткой записью последовательности отдельных сравнений, соединенных операторами OR. Предыдущее предложение эквивалентно такому:

SELECT *

FROM Блюда

WHERE Основа=Яйца OR Основа=Крупа OR Основа=Овощи;

Можно задать и NOT IN (не принадлежит), а также возможность использования IN (NOT IN) с подзапросом (см. главу 3).

2.3.4. Использование LIKE

Выдать перечень салатов

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

  1. символ _ (подчеркивание) – заменяет любой одиночный символ,
  2. символ % (процент) – заменяет любую последовательность из N символов (где N может быть нулем),
  3. все другие символы означают просто сами себя.

Следовательно, в приведенном примере SELECT будет осуществлять выборку записей из таблицы Блюда, для которых значение в столбце Блюдо начинается сочетанием "Салат" и содержит любую последовательность из нуля или более символов, следующих за сочетанием "Салат". Если бы среди блюд были "Луковый салат", "Фруктовый салат" и т.п., то они не были бы найдены. Для их отыскания надо изменить фразу WHERE:

WHERE Блюдо LIKE "%салат%"

или при отсутствии различий между малыми и большими буквами (такую настройку допускают некоторые СУБД):

WHERE Блюдо LIKE "% Салат %"

Это позволит отыскать все салаты.

2.3.5. Вовлечение неопределенного значения (NULL-значения)

Как было рассказано в п.2.2.3, если при загрузке данных не введено значение в какое-либо поле таблицы, то СУБД поместит в него NULL-значение. Аналогичное значение можно ввести в поле таблицы, выполняя операцию изменения данных. Так, при отсутствии сведений о наличии у поставщиков судака и моркови в столбцы Цена и К_во соответствующих строк таблицы Поставки вводится NULL и там будет храниться код NULL-значения, а не 0, 0. или пробел. (Отметим, что в распечатке таблицы Поставки рис.1.1 в этих местах расположен пробел, установленный в СУБД для представления NULL-значения при выводе на печать).

В этом случае для выявления названий продуктов, отсутствующих в кладовой, шеф-повар может дать запрос

Естественно, что для выявления продуктов, существующих в кладовой, следует дать запрос

SELECT DISTINCT ПР

FROM Наличие

WHERE К _ во IS NOT NULL;

Использование условий

столбец IS NULL и столбец IS NOT NULL

вместо, например,

столбец = NULL и столбец <> NULL

связано с тем, что ничто - и даже само NULL-значение - не считается равным другому NULL-значению. (Несмотря на это, два неопределенных значения рассматриваются, однако, как дубликаты друг друга при исключении дубликатов, и предложение SELECT DISTINCT даст в результате не более одного NULL-значения.)

2.4. Выборка с упорядочением

Синтаксис фразы упорядочения был дан в п. 2.1. Простейший вариант этой фразы - упорядочение строк результата по значению одного из столбцов с указанием порядка сортировки или без такого указания. (По умолчанию строки будут сортироваться в порядке возрастания значений в указанном столбце.)

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

При включении в список ORDER BY нескольких столбцов СУБД сортирует строки результата по значениям первого столбца списка пока не появится несколько строк с одинаковыми значениями данных в этом столбце. Такие строки сортируются по значениям следующего столбца из списка ORDER BY и т.д.

Например, выдать содержимое таблицы Блюда, отсортировав ее строки по видам блюд и основе:

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

Например, запрос

SELECT Продукт, ((Белки+Углев)*4.1+Жиры*9.3)

FROM Продукты

ORDER BY 2;

позволит получить список продуктов, показанный на рис.2.2,в – переупорядоченный по возрастанию значений калорийности список рис.2.2,а.

2.5. Агрегирование данных

2.5.1 SQL-функции

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

  1. COUNT - число значений в столбце,
  2. SUM - сумма значений в столбце,
  3. AVG - среднее значение в столбце,
  4. MAX - самое большое значение в столбце,
  5. MIN - самое малое значение в столбце.

Для функций SUM и AVG рассматриваемый столбец должен содержать числовые значения.

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

Аргументу всех функций, кроме COUNT(*), может предшествовать ключевое слово DISTINCT (различный), указывающее, что избыточные дублирующие значения должны быть исключены перед тем, как будет применяться функция. Специальная же функция COUNT(*) служит для подсчета всех без исключения строк в таблице (включая дубликаты).

2.5.2. Функции без использования фразы GROUP BY

Если не используется фраза GROUP BY, то в перечень элементов_SELECT можно включать лишь SQL-функции или выражения, содержащие такие функции. Другими словами, нельзя иметь в списке столбцы, не являющихся аргументами SQL-функций.

Например, выдать данные о массе лука (ПР=10), проданного поставщиками, и указать количество этих поставщиков:

Результат:

SELECT SUM(К_во),COUNT(К_во)

FROM Поставки

WHERE ПР = 10;

SUM(К_во)

COUNT(К_во)

Если бы для вывода в результат еще и номера продукта был сформирован запрос

SELECT ПР,SUM(К_во),COUNT(К_во)

FROM Поставки

WHERE ПР = 10;

то было бы получено сообщение об ошибке. Это связано с тем, что SQL-функция создает единственное значение из множества значений столбца-аргумента, а для "свободного" столбца должно быть выдано все множество его значений. Без специального указания (оно задается фразой GROUP BY) SQL не будет выяснять, одинаковы значения этого множества (как в данном примере, где ПР=10) или различны (как было бы при отсутствии WHERE фразы). Поэтому подобный запрос отвергается системой.

Правда, никто не запрещает дать запрос

SELECT "Кол-во лука =",SUM(К_во),COUNT(К_во)

FROM Поставки

WHERE ПР = 10;

Отметим также, что в столбце-аргументе перед применением любой функции, кроме COUNT(*), исключаются все неопределенные значения. Если оказывается, что аргумент - пустое множество, функция COUNT принимает значение 0, а остальные - NULL.

Например, для получения суммы цен, средней цены, количества поставляемых продуктов и количества разных цен продуктов, проданных коопторгом УРОЖАЙ (ПС=5), а также для получения количества продуктов, которые могут поставляться этим коопторгом, можно дать запрос

SELECT SUM(Цена ),AVG(Цена ),COUNT(Цена ),

COUNT(DISTINCT Цена ),COUNT(*)

FROM Поставки

WHERE ПС = 5;

и получить

SUM(Цена)

AVG(Цена)

COUNT(Цена)

COUNT(DISTINCT Цена)

COUNT

В другом примере, где надо узнать "Сколько поставлено моркови и сколько поставщиков ее поставляют?":

SELECT SUM(К_во),COUNT(К_во)

FROM Поставки

WHER ПР = 2;

будет получен ответ:

SUM(К_во)

COUNT (К_во)

Наконец, попробуем получить сумму массы поставленного лука с его средней ценой ("Сапоги с яичницей"):

Результат:

SELECT (SUM(К_во) +AVG(Цена))

FROM Поставки

WHERE ПР = 10;

SUM(К_во)+AVG(Цена)


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

49031. Цифровая система передачи непрерывных сообщений 539.5 KB
Кодирование отсчетов сигнала bti: kразрядный равномерный двоичный код с добавлением одного бита проверки на четность. Канал связи с постоянными параметрами и аддитивной помехой имеет полосу пропускания ΔFk значительно большую чем ширина спектра модулированного сигнала ΔFU. Смесь сигнала и шума на выходе канала zt=stnt где st= ut∙Kпк сигнал на выходе канала nt аддитивный гауссовский шум с равномерным энергетическим спектром белый...
49032. Разработка технологического процесса изготовления детали по чертежу 1.51 MB
Технология изготовления заготовки Возможные способы изготовления заготовки. Технологический процесс изготовления заготовки. Технология изготовления детали Технологический процесс стр...
49034. Разработка технологии изготовления заготовки и детали с выбором оборудования и инструмента 271.5 KB
Задание по курсовой работе Целью и заданием данной курсовой работы является разработка технологии изготовления заготовки и детали. Технологический процесс изготовления заготовки Данную заготовку получаем в литейной форме продольный разрез которой показан на рисунке.
49035. Технологический процесс изготовления заготовки опоры 735.17 KB
При литье в кокиль отливки получают путем заливки расплавленного металла в металлические формы – кокили. Полости в отливках оформляют песчаными, оболочковыми или металлическими стержнями. Кокили с песчаными или оболочковыми стержнями используют для получения отливок сложной конфигурации.
49036. СИСТЕМА АВТОМАТИЧЕСКОГО РЕГУЛИРОВАНИЯ ЧАСТОТЫ ВРАЩЕНИЯ ДВИГАТЕЛЯ ПОСТОЯННОГО ТОКА 2 MB
Анализ действующих на систему возмущающих воздействия и их влияние на статические характеристики САР Принцип работы системы Классификация САР Позвенное аналитическое описание процессов в САУ. Получим дифференциальные уравнения и передаточные функции звеньев САУ Разработка структурной схемы САР Уравнения динамики замкнутой САР Анализ на структурную устойчивость САР Расчёт требуемого коэффициента усиления в разомкнутом состоянии...
49037. Экономическая теория. Особенности экономических процессов 957.34 KB
Экономика – одна из древнейших наук, которая всегда привлекала внимание ученых и образованных людей. Объясняется это тем, что изучение экономической теории – это реализация объективной необходимости познания мотивов, действий людей в хозяйственной деятельности, законов хозяйствования во все времена.
49038. ПРАВА ГРОМАДЯН У СФЕРІ ВИКОНАВЧОЇ ВЛАДИ: АДМІНІСТРАТИВНО-ПРАВОВЕ ЗАБЕЗПЕЧЕННЯ РЕАЛІЗАЦІЇ ТА ЗАХИСТУ 798.5 KB
Досліджуються актуальні проблеми адміністративно-правового забезпечення реалізації та захисту прав громадян у сфері виконавчої влади. Ґрунтовно розглядаються політико-правові аспекти взаємодії людини, держави і управління, розвиток демократичних засад державного управління у світлі сучасного європейського досвіду...
49039. Выполнение действия в виде функций с динамическим распределением памяти программным способом 365.5 KB
Вывести результат сглаживания заданной вещественной матрицы размером 10 на 10. Соседями элемента Аij в матрице назовем элементы. Операция сглаживания матрицы дает новую матрицу того же размера, каждый элемент которой получается как среднее арифметическое имеющихся соседей соответствующего элемента исходной матрицы.