русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

INNER JOIN


Дата добавления: 2013-12-23; просмотров: 1424; Нарушение авторских прав


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

INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN

SELECT FIELD [,... n] FROM Table1

Table2 ON <условие>

Для дальнейших пояснений будут использоваться следующие таблицы: Люди, проживающие в городах (таблица Person), Города (таблица City)

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

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

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

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

Результат:

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

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

LEFT OUTER JOIN.Оператор левого внешнего соединения LEFT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

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

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи левой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие правой таблице, заполняются значениями NULL.

SELECT * FROM Person LEFT OUTER JOIN City ON Person.CityId = City.Id



Результат:

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

RIGHT OUTER JOIN.Оператор правого внешнего соединения RIGHT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным. Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

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

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи правой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие левой таблице, заполняются значениями NULL.

SELECT * FROM Person RIGHT OUTER JOIN City ON Person.CityId = City.Id

Результат:

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

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

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

  1. В результат включается внутреннее соединение (INNER JOIN) первой и второй таблиц по предикату p.
  2. В результат добавляются те записи первой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие второй таблице, заполняются значениями NULL.
  3. В результат добавляются те записи второй таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие первой таблице, заполняются значениями NULL.

SELECT * FROM Person FULL OUTER JOIN City ON Person.CityId = City.Id

Результат:

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

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

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

SELECT * FROM Person CROSS JOIN City

или

SELECT * FROM Person, City

Результат:

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

 


«Стековое» программирование. Основы языка Forth (Форт).

 

Ключевыми компонентами Форт-системы, определяющими основные свойства и возможности языка, являются словарь и отдельный стек данных. Словарь Форта представляет собой совокупность слов, с каждым из которых связан некоторый фрагмент исполняемого кода и которые можно рассматривать как специфические подпрограммы. Словарь отражает текущее состояние языка, т.е. набор команд, из которых может быть составлена программа. Каждое слово реализует какую-либо операцию и может использовать для этих целей другие слова, определенные в словаре ранее. Любой фрагмент текста Форт-система пытается интерпретировать как слово из своего словаря. В процессе разработки программы словарь может быть дополнен специфическими и необходимыми для решения задачи словами. Новые слова обычно определяются на основе уже существующих и в дальнейшем, в свою очередь, могут использоваться при описании других слов. Это связано с тем, что все слова в Форт-системе совершенно равноправны. Обычно транслятор Форта не устанавливает различий между своими «родными» словами и словами, добавленными программистом. Поэтому существующие в базовом языке слова при необходимости могут быть переопределены программистом и получить иной смысл.

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

Синтаксис языка Форт достаточно необычен по сравнению с большинством других языков. Исходный текст программы представляет собой последовательно обрабатываемый Форт-транслятором набор слов и чисел, разделенных пробелами или переводами строки. Все числа, встречающиеся в тексте программы, в конечном итоге попадают в стек. Слова обрабатываются в зависимости от текущего режима: либо ищутся в словаре и непосредственно выполняются, либо компилируются и «записываются» в словарь. Управление режимом работы транслятора Форта также осуществляется с помощью слов. Они могут рекурсивно вызывать транслятор, подключать другие словари для поиска слов, временно переключать входной поток на другой источник и выделять последующие слова как часть своих параметров. Благодаря этим возможностям в язык вводятся элементы привычных синтаксических конструкций, например ветвления и циклов, которые также представляют собой слова. Если в режиме интерпретации слово не найдено в словаре и не опознано как число, то Форт прерывает трансляцию, выполняет очистку стека и выдает сообщение об ошибке.

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

5 2 *

В данном случае «*» представляет собой специальное слово. При выполнении этого примера в стек будут последовательно занесены числа 5 и 2, после чего выполнится слово «*», которое выберет их из стека, перемножит и занесет в стек полученный результат. Для того чтобы вывести полученный результат, необходимо использовать слово «.» (точка), которое выбирает (изымает) число, находящееся на вершине стека, и выводит его на экран. Таким образом, выполнение строки

5 2 * .

приведет к выводу на экран числа 10. При постфиксной нотации возможны операции типа a b с * +. При этом результат будет равен a + (b * c).

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

· SWAP — меняет местами два верхних элемента стека.

· DUP — дублирует верхний элемент стека.

· OVER — копирует 2-й элемент стека и заносит его наверх.

· ROT — переносит последний элемент стека наверх.

· DROP — удаляет верхний элемент стека.

· DEPTH — помещает в вершину стека количество элементов, находившихся в нем до выполнения этого слова.

Например, для того чтобы вычислить (а - b) * с, когда в исходном состоянии стек содержит a, b, с, необходимо изменить порядок элементов на c, а, b. Для получения требуемого порядка элементов в стеке можно выполнить набор слов SWAP ROT SWAP. В результате, чтобы вычислить указанное выражение для исходного состава элементов стека потребуется выполнить следующую последовательность слов:

SWAP ROT SWAP - *

Таким образом, при работе со стеком необходимо учитывать его текущее состояние. При попытке записать в стек слишком большое количество чисел или извлечь что-то из «пустого» стека возникнет сообщение об ошибке.

Для работы со словарем, его модификации и дополнения в Форте предусмотрены специальные слова. Добавление новых и переопределение существующих слов в словаре осуществляется с помощью команды «:» (двоеточие) и имеет следующий синтаксис:

: <ОПРЕДЕЛЯЕМОЕ_СЛОВО> [<СУЩЕСТВУЮЩИЕ СЛОВА>] ;

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

Рассмотрим, например, определение слова, позволяющего возвести в квадрат число, находящееся на вершине стека:

: SQUARE DUP * ;

В соответствии с ним будет продублировано число, находящееся на вершине стека. В результате в начале стека будут находится два одинаковых числа, соответствующих исходной вершине стека. После этого они будут выбраны из стека словом «*», перемножены и результат будет размещен на вершине стека. Сразу после определения слово SQUARE можно использовать в программе. Например,

7 SQUARE .

выведет на экран число 49. А следующее определение на базе только что описанного слова SQUARE позволит вычислять уже куб числа:

: CUBE DUP SQUARE * ;

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

Еще одна особенность языка Форт заключается в том, что он дает возможность программисту определить некоторые слова на языке ассемблера, когда требуется максимальное быстродействие. Базовая Форт-система содержит множество слов, которые определены не с помощью других слов, а непосредственно на машинном языке. К числу таких слов относятся, например, +, *, DUP, SWAP.

Примеры программ на Forth

Программа перевода английских единиц измерения в дюймы (1 ярд= 36 дюймам и 1 фут = 12 дюймам).

 

: ярдов 36 * ;

: футов 12 * ;

: ярд ярдов ;

: фут футов ;

1 ярд 5 футов + 1 дюйм + . (результат 97)

6 ярдов 1 фут + . (результат 228)

 

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

 

: ?жарко 220 > if ."Опасный перегрев" ELSE ."Норма" THEN ;

 

290 ?жарко (результат – сообщение "Опасный перегрев")

130 ?жарко (результат – сообщение "Норма")

 

Примеры циклов

: ДЕКАДА 10 0 DO I . LOOP (арифметический цикл)

ДЕКАДА (результат – цифры: 0 1 2 3 4 5 6 7 8 9)

 

: ТЕСТ 0 Begin 1 + ."привет" 3 > UNTIL (цикл с постусловием)

ТЕСТ (результат – четыре сообщения "привет" )

 

 




<== предыдущая лекция | следующая лекция ==>
СПЕЦИФИКАЦИИ В ВИДЕ ГРАФИЧЕСКИХ СХЕМ. | Базовый FORTRAN (Formula translation).


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.008 сек.