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

 

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

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

Стандарт SQL определяется ANSI и ISO , однако большенство коммерческих программ БД расширяют SQL без уведомления ANSI добавляя различные особенности в этот язык, которые как они считают будут весьма полезнымми. Иногда они несколько нарушают стандарт языка, хотя хорошие идеи имеют тенденцию к развитию и вскоре становяться стандартами рынка сами по себе в силу полезности своих качеств.

 

                               Состав языка SQL

Язык SQLпредназначен для манипулированиями данными в реляционных БД. Определение структуры БД и для управлениями правами доступа к данным в многопользовательской среде. По этому в язык SQL в качестве составных частей входят: язык маним\пулированиями данными (Data Manipulation Language, DML) и язык определения данных (Data Definition Language, DDL). Следует отметить, что это не отдельные языки, а различные команды одного языка. Такое деление проведено только лишь с точки зрения различного функционального назначения этих команд. Язык манипулирования данными используется для управления данными в таблицах БД. Он состоит из 4-х основных команд:

SELECT                 (выбрать)

INSERT                 (вставить)

UPDATE               (обновить)

DELETE                (удалить)

Язык определения данных используется для создания и изменения структуры БД и ее составных частей-таблиц, индексов.

Основными его командами являются:

CREATE DATABASE создает БД 

CREATE TABLE                 создает Таблицу

CREATE INDEX создает индекс

ALTER DATABASE модифицировать

ALTER TABLE   

ALTER INDEX   

DROP DATABASE            удалить

DROP TABLE     

DROP INDEX      

рассмотрим команды языка манипулирования  данными.

 

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

Операция проекции позволяет выделить подмножество столбцов таблицы SELECT StudNo FROM student (список всех номеров зачеток).

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

SELECT Studno FROM student

WHERE toGroup = 1 (вывести список зачеток у выбранной группы)

Предложеные примеры илюстрируют общую форму команды select в языке SQL для одной таблицы

 

SELECT (выбрать поля)

FROM    (из таблицы)

WHERE (где)

 

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

SELECT Student.Studno

FROM Student, headgroup

WHERE headgroup.ToStudent=Student.id

 

SELECT *

FROM student

UNION объединение

SELECT *

FROM student_old

 

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

SELECT [DISTINCT] список полей

FROM    из таблицы (таблиц)

[WHERE               предикат]

[GROUP BY поле [HAVING предикат]]

[UNION другое выражение_Select]

[ORDER BY имя_поля_или_номер];

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

Команда select позволяет:

- назначать поля которые должны быть выбраны

-назначать к выборке все поля(*)

-управлять вертикальным и горизонтальным порядком выбираемых полей.

-подставлять собственные заголовки полей в результирующей таблице

-производить вычесление в списке выбираемых элементов

-использовать литералы в списке выбирамых элементов

-ограничивать число возвращаемых строк

-формировать сложные условия поиска, используя реляционые и логические операторы.

-устранять одинаковые строки из результата

 

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

SELECT salary, salary * 1.15

FROM salary

получить список зарплаты служащих, в том числе увеличиную на 15 %.

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

                Литералы

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

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

SELECT "Зарплата ", salary

FROM salary

 

                               Конкатенация

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

SELECT Surname+' '+FirstName+' '+PatName

FROM people

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

SELECT count(*) AS RecCount

FROM Student (считает количество студентов)

 

                               Агрегатные функции

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

SELECT min(StudNo) AS minid                      

FROM Student

 

SELECT avg(Salary) AS avgsalary

FROM Salary

 

                предложение from команды select

В предложении From перечисляются все объекты (1 или несчколько) из которых производиться выборка данных. Каждая таблица или представление о которых упоминается в запросе, должны быть перечислены в предложении from

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

Число возвращаемых в результате запроса строк может быть ограничено путем использования предложения where, содержащего условие отбора. Условие отбора для отдельных строк может принимать значение true, false и unknow. При этом запрос возвращает в качестве результата только те строки, для которых предикат имеет значение true.

Типы предикатов используемы в предложении where:

=

<> 

!=

> 

< 

>=

<=

BETWEEN

IN

LIKE

IS NULL

EXIST

ANY

ALL

 

                Опреации сравнения

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

                предикат between

задает диапозон значений для которого выражение принимает значение true. Разрешено также испольщование конструкции not between

SELECT salary

FROM salary

WHERE salary BETWEEN 2000 AND 6000

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

SELECT salary

FROM salary

WHERE salary>2000 and  salary<6000

запрос с предикатом between может иметь следующий вид

SELECT SurName, Firstname, PatName

FROM People

WHERE SurName BETWEEN "а" AND "п"

Все люди входящие в диапозон в нижней части которого начало фамилии совпадает с а т.е. выполняется условие >= а в верхней части фамелия не более п (т.е. <=) попадут в выбор.

Следует отметить что при выборке с использованием преликата between поле на которое накладывается диапозон считается упорядоченым по возрастанию.

Not between позволяет получать выборку записей указаные поля которых имеют значения < нижней границы и > Больше верхней

 

предикат IN проверяет входит ли заданое значение предшествующее ключевому слову IN в указаный в скобках список. Если заданое проверяеме значение равно какому либо элемнту в списке, то предикат принимает значение true. Разрешено также использовать конструкцию not in

SELECT Name

FROM "Group"

WHERE Name IN ("181", "182")

 

                LIKE

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

%-заменяет любое количество символов (и ноль)

_-заменяет один символ.

разрешено использовать not LIKE

 

SELECT *

FROM people

WHERE SurName LIKE "A%"

 

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

 

SELECT firstname, Surname

FROM people

WHERE Surname LIKE "%@_%" ESCAPE "@"

 

escape символ не должен быть \ и должен представлять собой символ никогда не появляющийся в упоминаемом столбце, как информационный символ. Часто для этих целей используется символ @ и ~

               

                IS NULL

В запросах NULL означает что значение столбца неизвестно, поисковые условия в которых значение столбца сравнивается с NULL всегда принимают значения unknown ( и соответственно приводят к ошибке) в противоположность к true и false. предикат IS NULL принимает значение true только тогда когда  выражение слева от ключевых слов имеет значение null. Разрешено использовать конструкцию IS NOT NULL.

SELECT *

FROM People

WHERE Passport IS NULL

 

                               Логические операторы

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

В одном предикате логические операторы выполняются в следующем порядке:not,and,or.

 

                ORDER BY

порядок выводимых строк может быть изменен с помощью дополнительного (опцилонального) предложения ORDER BY в конце SQL-запроса. Это предложение имеет вид ORDER BY <порядок строк> [ASC | DESC].

Способ упорядочивания определяется дополнительными зарезервированными словами [ASC | DESC]. По умолчанию по возрастанию (ASC).

SELECT *

FROM student

ORDER BY ToGroup

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

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

SELECT *

FROM student

ORDER BY 3

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

 

                Устранения дублирования (модификатор DISTINCT)

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

 

                соединение JOIN

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

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

2.Задавать имена столбцов различными способами.

3.Определять внешнее соединение.

4.определять соединение таблицы с собой.

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

Соединяемые поля могут присутствовать в списке выбираемых элементов предложения where может содержать множественное условие соединения. Условие соединения может также комбинироваться с другими предикатами в предложении where

               

                Внутрение соединения.

Внутренее соединение возвращает только те строки для которых условия соединения принимает значение true

SELECT *

FROM student, "group"

WHERE "group".id = 1

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

SELECT *

FROM student, "group"

WHERE "group".id = 1

AND ToGroup = "group".id

 

 

select *

from people,student,"group"

where "group".Name ="181"

and ToGroup = "group".id

and People.id=Student.ToPeople

Рассмотрим варианты работы с использованием зарезервированого слова join.

Условие соединения записываются в предложение from, в котором слева и справа от join указываются соединяемые таблицы. условие поиска основаные на правой таблице помещаются в предложение ON. Условие поиска основаные на левой таблице помещаются в предложении where

select People.Surname,People.FirstName,PatName

from people JOIN student

ON People.id=Student.toPeople

 

                самосоединение

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

SELECT *

FROM people p1,people p2

WHERE P1.FirstName = P2.FirstName

and P1.ID<>p2.id                                                //выбор отдноименцев.

 

                Внешнее соединение

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

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

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

right join - все наоборот

inner join -

 

Full Outer Join-соединяет таблицу включает в результирующий в набор данных все записи (в том числе и не связаные) из всез таблиц перечисленых после from. В не связаных записях недостающие значения полей заменяются на null

 

select * from people

full outer Join student on (people.id=student.topeople)

 

                Group by

можно сгрупировать по значению поля.

select togroup, count (togroup)

from student

group by togroup                               /показывает список груп и число студентов в них

 

 

HAVING-наложение ограничения на группировку записей.

если в результате нужно выдавать агрегацию не по всем группам а только по тем из них, которые отвечают некоторым условиям после предложения group by указывают having <условие поиска>, где <условие поиска> укаказывается по темже правилам, что и условия поиска where. За важным исключением:в условии поиска предложения having можно указывать агрегатные функции.

 

select togroup, count (togroup) as colstud

from student

group by togroup

having (count (togroup)>=2)                           //в каких группах более чем два студента

 

                использование функции UPPER

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

Эта функция может фигурировать как списке столбцов результирующего набора (после select) так и в условии поиска в предложении where.

Lower() -конвернтирует символы в маленькие буквы.

TRIM([LEADING|TRAILING|BOTH] [trimmed_char] FROM column_reference)-удаляет левые, правые, по умолчанию пробелы.

CAST (<значение> AS <тип данных>)-иногда необходимо трактовать значение одного типа как значение другого типа. Например использовать числовое значение как символьную строку или наоборот. Фунукция CAST делает копию значения, преобразуя его к указоному типу данных.При этом не следует забывать о множестве типов данных.

 

select cast(name as INTEGER)

from "group"

select cast(Date_Open as character(10)) as datestr

from ":DBdemos:clients"

 

EXTRACT(extract_field FROM column_reference) возвращает поле из даты (типа date или timestate)

 extract_field-может быть годом днем месяцем часом минутой или секундой

 

select Extract( YEAR from Date_Open ) as YY

from ":DBdemos:clients"                   //выбираем из даты год.

 

                Использование подзапросов.

Часто невозможно рештить поставленую задачу путем использования одного запроса. Это особенно актуально в тех случаях, когда при использовании условия поиска в предложении where с параметрема <Сравнимаемое значение><оператор><значение, с которым надо сравнить> Значение с которым надо сравнить заранее неопределено и должно быть выполнено в момент выполнения опреатора selsect

 

 

 

 

 

 

Hosted by uCoz