Кириллов В.В., Громов Г.Ю. - Введение в реляционные базы данных. Литература для вузов isbn 9785941577705 в книге рассматриваются основные понятия баз данных и систем управления ими
Скачать 11.62 Mb.
|
4.4. Синтаксические конструкции SQL Все составляющие языка SQL можно условно разделить на следующие кон- струкции: предложения; идентификаторы (имена); константы; операторы; зарезервированные и ключевые слова; псевдостолбцы и таблица DUAL. В книге будут описываться и иллюстрироваться на примерах конструкции стандарта SQL:2003, а также его реализации в Oracle Database 10g — веду- щей СУБД в коммерческом секторе, работающей в разнообразных операци- онных системах (Linux, Solaris, Unix, Windows и пр.) и являющейся основой множества информационных систем. Отметим, что Oracle предлагает разработчикам бесплатную версию СУБД — Oracle® Database 10g Express Edition. Эту версию (Oracle Database XE) для Linux или Windows читатель может загрузить с Web- сайта корпо- рации Oracle и установить на свой персональный компьютер ( на компакт - диске , прилагаемом к книге , размещена версия Oracle Database 10g Release 2 (10.2.0.1) Express Edition for Microsoft Windows). Описание со- держимого компакт - диска размещено в приложении Б Установив Oracle и использовав другие материалы диска, можно реализо- вать все примеры и упражнения для подробного изучения разделов книги. 4.4.1. Предложения SQL В литературе по базам данных нет однозначного названия основной конст- рукции языка. В англоязычной литературе она именуется как statement, а в русскоязычной превращается в: оператор, инструкция, команда, утвер- ждение, предложение. В этой книге мы будем использовать понятие предло- жение, которое может состоять из фраз, включающих те или иные конструк- ции SQL. Любое предложение SQL состоит из ключевых и зарезервированных слов и слов, определяемых пользователем в соответствии с синтаксическими пра- Часть II. Язык SQL. Извлечение данных 68 вилами. Для записи предложений принят свободный формат, но мы рекомен- дуем придерживаться следующих правил: каждая фраза предложения должна начинаться с новой строки; начало фразы должно быть выровнено с началом остальных фраз предло- жения; части фразы, не помещающиеся в строку, должны начинаться с новой строки с некоторым отступом относительно начала всей фразы; для записи ключевых слов используйте прописные буквы; для записи определяемых пользователем слов используйте строчные бук- вы (кроме записи текстовых констант см. разд. 4.4.3); каждое предложение SQL должно заканчиваться символом точка с запя- той (;). В синтаксисе предложений используются условные обозначения, показанные в табл. 4.2. Таблица 4.2. Условные обозначения Обозначение Описание [ ] В эти скобки заключаются необязательные синтаксические единицы { } Конструкция, заключенная в эти скобки, должна рассмат- риваться как одна синтаксическая единица | Используется для разделения альтернативных синтакси- ческих единиц Указывает на то, что непосредственно предшествующая синтаксическая единица может повторяться один или не- сколько раз * Используется для замены перечня имен всех столбцов таблицы Все предложения SQL делятся на три группы: предложения манипуляции данными (Data Manipulation Language, DML) предложения определения данных (Data Definition Language, DDL) предложения определения доступа к данным (Data Control Language, DCL) Начнем изучение с предложений манипуляции данными: SELECT (выбрать), INSERT (вставить), UPDANT (обновить) и DELETE (удалить). Глава 4. Основы SQL 69 4.4.2. Идентификаторы (имена) Идентификаторы — это пользовательские или системные имена объектов баз данных. Они должны или могут присваивается базам данных, таблицам, ограничениям и правилам в таблице, столбцам таблицы, индексам, курсорам, представлениям, процедурам, триггерам и т. п. Идентификатор объекта создается при определении объекта. Например, так, как это было проиллюстрировано в разд. 4.3, для создания имен таблицы и ее столбцов: CREATE TABLE Блюда ( Код_блюда число, Блюдо текст(70), Код_вида число, Основа текст(10), Выход число, Труд число ); Затем идентификатор используется для обращения к объектам. Например: SELECT Код_блюда, Блюдо FROM Блюда; Существует два класса идентификаторов: обычные идентификаторы; идентификаторы с разделителем. В SQL:2003 и обычные идентификаторы, и идентификаторы с разделителем могут содержать от 1 до 128 символов, а в СУБД Oracle — до 30 байт (число символов зависит от их набора). Обычный идентификатор может содержать любые буквы, цифры и знак под- черкивания ( _ ), а в Oracle еще и знаки диеза ( ♯ ) и доллара ( $ ). Он должен на- чинаться с буквы и не может содержать пробелов и специальных символов. Он не может быть зарезервированным словом (см. разд. 4.4.5), например, SELECT В обход некоторых из этих ограничений можно использовать идентификато- ры с разделителем, т. е. имена объектов, заключенные в двойные кавычки ( " ). В частности, такие идентификаторы можно применять для того, чтобы давать имена с зарезервированными словами, или для того, чтобы использовать в имени обычно не употребляемые там символы (например, "Код блюда"). Часть II. Язык SQL. Извлечение данных 70 4.4.3. Константы и NULL- значения В SQL константами считаются любые числовые значения, строки символов, значения, связанные с представлением времени (дата и время), и булевы зна- чения, которые не являются идентификаторами или ключевыми словами. Числовые константы могут выглядеть так: 546 -777 +36.6 5E6 -9E-2 В них допустимы числа со знаком и без знака, в обычной и экспоненциаль- ной записи. В числовых константах разрешается использовать следующий набор символов: 0 1 2 3 4 5 6 7 8 9 + - $ . E e Не следует включать в числовую константу запятую, которая обычно исполь- зуется как разделитель элементов (например, константа 7,654 будет интер- претироваться как 7 и отдельно 654). Булевы значения, строковые константы и даты выглядят примерно так: TRUE 'С новым годом' 15-10-2007 15:06:54 15-ОКТЯБРЬ-2007 15:06:54 Строковые константы должны всегда заключаться в одинарные кавычки ( ' ' ) — апострофы. Символы в строковых константах не ограничиваются алфавитными символами. По сути, любой символ из набора символов можно представить в виде строковой константы: '1989' '57.321 + 12345' 'Это тоже строковая константа' '15-ОКТЯБРЬ-2007 15:06:54' Все приведенные примеры фактически являются совместимыми с типом данных CHARACTER (см. разд. 4.5). Не путайте строковую константу '1989' с числовой константой 1989 . Не стоит использовать строковые константы в арифметических выражениях без явного их преобразования в числовой тип. Хотя в Oracle некоторые из них и преобразуются автоматически. Например, при выполнении предложения SELECT '1989' + 1234.56 FROM DUAL; Глава 4. Основы SQL 71 будет получен результат суммирования 1989 с 1234.56: '1989'+1234.56 -------------- 3223,56 а при выполнении предложения SELECT '1989' + '1234.56' FROM DUAL; появится сообщение об ошибке: ORA-01722: неверное число При необходимости отражения в строковой константе символа одинарной кавычки, необходимо написать этот символ два раза. Например, для вывода текста: - 'К нам придет Д'Артаньян ?' придется написать запрос: SELECT '- '' К нам придет Д''Артаньян ? ''' FROM DUAL; Заметим, что все СУБД используют специальное значение — NULL (пустое или несуществующее значение), которое может быть записано в поле табли- цы базы данных. NULL -значения нужно всегда рассматривать как "отсутствие информации", а не как пустые строки, пробелы или нули. Существует несколько кратких правил о поведении NULL -значений. Значения типа NULL нельзя помещать в столбцы, определенные как NOT NULL Значения типа NULL не равны друг другу. Распространенная ошибка срав- нивать два столбца, содержащие значения NULL , и ожидать, что они совпа- дут. (Правильный метод идентификации значений NULL , в предложениях WHERE или в булевых выражениях — это использование таких выражений, как value IS NULL и value IS NOT NULL .) Столбец, содержащий значение NULL , игнорируется при вычислениях аг- регатных значений, таких, как AVG , SUM или COUNT Если столбцы, содержащие значения NULL , перечислены в предложении GROUP BY запроса, выходные данные запроса будут содержать для значе- ний NULL всего одну строку. По сути дела стандарт рассматривает все най- денные значения NULL как одну группу. В предложениях DISTINCT или ORDER BY , как и в предложении GROUP BY , значения NULL не отличаются друг от друга. Для предложения ORDER BY Oracle устанавливает значения NULL в конец получаемого набора данных. Часть II. Язык SQL. Извлечение данных 72 4.4.4. Операторы Оператор — это символ или имя, обозначающий действие, выполняемое над одним или несколькими выражениями. Они, как правило, делятся на сле- дующие категории: арифметические операторы, оператор конкатенации, опе- раторы присваивания, операторы сравнения, логические операторы и унарные операторы. Арифметические операторы выполняют математические действия над двумя значениями любого типа, относящегося к числовой категории (табл. 4.3). Таблица_4.3.'>Таблица 4.3. Арифметические операторы Оператор Описание + Сложение – Вычитание * Умножение / Деление Операторы + и – могут применяться для выполнения арифметических опера- ций над датами. Оператор конкатенации ( || ) соединяет две отдельные текстовые строки в одно строковое значение. Оператор присваивания ( = ) присваивает значение переменной или псевдо- ниму заголовка столбца. В Oracle используется оператор присваивания := Операторы сравнения проверяют равенство или неравенство двух выраже- ний (табл. 4.4). Результатом операции сравнения является булево значение: TRUE (верно), FALSE (неверно) или UNKNOWN (неизвестно). Если хотя бы одно из сравниваемых значений равно NULL , то результат также будет NULL Таблица 4.4. Операторы сравнения Оператор Описание = Равно > Больше < Меньше Глава 4. Основы SQL 73 Таблица 4.4 (окончание) Оператор Описание >= Больше или равно <= Меньше или равно <> Не равно IS NULL Имеет ли значение NULL IS NOT NULL Не имеет ли значение NULL Эти операторы наиболее часто используются во фразе WHERE для отбора строк, соответствующих условиям поиска (см. примеры в разд. 4.3). Логические операторы обычно применяются во фразе WHERE для проверки истинности какого-либо условия (табл. 4.5). Логические операторы возвра- щают булево значение TRUE или FALSE Таблица 4.5. Логические операторы Оператор Описание ALL TRUE , если весь набор сравнений даст результат TRUE AND TRUE , если оба булевых выражения дают результат TRUE ANY TRUE , если хотя бы одно сравнение из набора даст ре- зультат TRUE BETWEEN TRUE , если операнд находится внутри диапазона EXISTS TRUE , если подзапрос возвращает хотя бы одну строку IN TRUE , если операнд равен одному выражению из списка или одной или нескольким строкам, возвращаемым под- запросом LIKE TRUE , если операнд совпадает с шаблоном NOT Обращает значение любого другого булевого оператора OR TRUE , если любое булево выражение равно TRUE SOME TRUE , если несколько сравнений из набора дают резуль- тат TRUE Часть II. Язык SQL. Извлечение данных 74 Унарные операторы выполняют операцию над одним выражением числовой категории: + (числовое значение становится положительным) и – (числовое значение становится отрицательным). Приоритет операторов Когда в выражении присутствуют несколько операторов, последовательность их выполнения определяет приоритет операторов. Далее приведен список операторов, в котором они расположены в порядке от самого высокого к са- мому низкому приоритету: 1. () (выражения, стоящие в скобках). 2. + , - (унарные операторы). 3. * , / (математические операторы). 4. + , - (арифметические операторы). 5. = , > , < , >= , <= , <> (операторы сравнения). 6. IS NULL 7. NOT 8. AND 9. ALL , ANY , BETWEEN , IN , LIKE , OR , SOME 10. = (присваивание значения переменной). Если операторы имеют одинаковый приоритет, вычисления производятся слева направо. Для того чтобы изменить применяемый по умолчанию поря- док выполнения операторов, в выражении используются скобки. Выражения, заключенные в скобки, вычисляются первыми, а уже после них — все, что находится за скобками. Если применяются вложенные скобки, то первым выполняются выражения в наиболее глубоко вложенных скобках. 4.4.5. Зарезервированные и ключевые слова В SQL существуют некоторые слова и фразы, имеющие особую значимость. Ключевые слова SQL — это слова, которые настолько тесно связаны с функ- ционированием реляционной базы данных, что их нельзя использовать ни для каких других целей. В SQL:2003 определяется свой список зарезервированных и ключевых слов. Кроме этого, существующие СУБД имеют собственные списки подобных Глава 4. Основы SQL 75 слов (в том числе и Oracle). Эти слова нельзя использовать в качестве иден- тификаторов (символом * отмечены слова стандарта SQL:2003): ACCESS DEFAULT * INTEGER * ONLINE START ADD * DELETE * INTERSECT * OPTION * SUCCESSFUL ALL * DESC * INTO * OR * SYNONYM ALTER * DISTINCT * IS * ORDER * SYSDATE AND * DROP * LEVEL * PCTFREE TABLE * ANY * ELSE * LIKE * PRIOR * THEN * AS * EXCLUSIVE LOCK PRIVILEGES * TO * ASC * EXISTS LONG PUBLIC * TRIGGER AUDIT FILE MAXEXTENTS RAW UID BETWEEN * FLOAT * MINUS RENAME UNION * BY * FOR * MLSLABEL RESOURCE UNIQUE * CHAR * FROM * MODE REVOKE * UPDATE * CHECK * GRANT * MODIFY ROW USER * CLUSTER GROUP * NOAUDIT ROWID VALIDATE COLUMN HAVING * NOCOMPRESS ROWNUM VALUES * COMMENT IDENTIFIED NOT * ROWS * VARCHAR * COMPRESS IMMEDIATE * NOWAIT SELECT * VARCHAR2 CONNECT * IN * NULL * SESSION * VIEW * CREATE * INCREMENT NUMBER SET * WHENEVER * CURRENT * INDEX OF * SHARE WHERE DATE * INITIAL OFFLINE SIZE * WITH * DECIMAL * INSERT * ON * SMALLINT * 4.4.6. Псевдостолбцы, таблица DUAL и еще о словах, которые нежелательно использовать пользователям Кроме зарезервированных слов в Oracle существуют и другие, которые име- ют специальное значение. Это имена типов данных (см. разд. 4.5) и имена встроенных функций (см. разд. 4.6). Не следует использовать имена схем, Часть II. Язык SQL. Извлечение данных 76 ключевые слова DIMENSION , SEGMENT , ALLOCATE , DISABLE , имена псевдостолб- цов и таблицы DUAL (табл. 4.6), а также слова, начинающиеся с SYS_ Таблица 4.6. Псевдостолбцы и таблица DUAL Имя Значение Имя_последователь- ности.CURRVAL Текущее значение последовательности для текущего сеанса ( Имя_послед.NEXTVAL ) должно быть объявлено первым Имя_последователь- ности.NEXTVAL Следующее значение последовательности для текуще- го сеанса Имя_таблицы.LEVEL 1 — для корня, 2 — для дочернего уровня корня и т. д. Используется в команде SELECT...CONNECT BY , кото- рая реализует иерархические структуры ROWID Уникальный идентификатор строки таблицы. Для этого идентификатора существует специальный тип данных ROWID ROWNUM Позиция отдельной строки среди строк, отобранных запросом. Oracle выбирает строки в произвольном порядке и оценивает ROWNUM перед сортировкой с помощью фразы ORDER BY . Однако если ORDER BY использует индексы, то порядок ROWNUM может отличаться от его порядка без индекса DUAL Таблица, автоматически создаваемая Oracle для каж- дого пользователя. В ней один столбец с именем DUMMY и типом данных VARCHAR 2(1) . В единственной строке этой таблицы хранится значение 'X' . Отметим, что указанное значение и его описание не имеет боль- шого значения, так как чаще всего эта таблица исполь- зуется для вывода значения какого - либо выражения любого типа. Например, для получения текущей даты и времени можно дать запрос: SELECT TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') FROM DUAL; который, при выполнении запроса в 18 часов 15 минут 42 секунды 27 января 2008 года, выдаст результат: 27-янв-2008 18:15:42 Можно также дать запрос SELECT SIN(3) FROM DUAL; получив 0.141120008059867222100744802808110 27987 и т. п. |