Справочное руководство по Delphi

Объединение


(Union).

Операция выборки позволяет получить все строки (записи) либо часть строк одной таблицы.

  • SELECT * FROM country Получить все строки
  • таблицы Country

    COUNTRY CURRENCY

    =============== ==========

    USA Dollar

    England Pound

    Canada CdnDlr

    Switzerland SFranc



    Japan Yen

    Italy Lira

    France FFranc

    Germany D-Mark

    Australia ADollar

    Hong Kong HKDollar

    Netherlands Guilder

    Belgium BFranc

    Austria Schilling

    Fiji FDollar

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

  • SELECT * FROM country
  • WHERE currency = “Dollar” Получить подмножество строк таблицы Country, удовлетворяющее условию Currency = “Dollar”

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

  • COUNTRY CURRENCY
  • =============== ==========

    USA Dollar

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

  • SELECT currency FROM country Получить список
  • денежных единиц

    CURRENCY

    ==========

    Dollar

    Pound

    CdnDlr

    SFranc

    Yen

    Lira

    FFranc

    D-Mark

    ADollar

    HKDollar

    Guilder

    BFranc

    Schilling

    FDollar

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

  • SELECT currency FROM country
  • WHERE country = “Japan” Найти денежную

    единицу Японии

    CURRENCY

    ==========

    Yen

  • SELECT first_name, last_name
  • FROM employee

    WHERE first_name = "Roger" Получить фамилии

    работников,

    которых зовут “Roger”

    FIRST_NAME LAST_NAME

    =============== ====================

    Roger De Souza

    Roger Reeves

    Эти примеры иллюстрируют общую форму команды SELECT в языке SQL (для одной таблицы):

  • SELECT (выбрать) специфицированные поля
  • FROM (из) специфицированной таблицы

    WHERE (где) некоторое специфицированное условие является истинным


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







  • SELECT first_name, last_name, proj_name


  • FROM employee, project

    WHERE emp_no = team_leader Получить список

    руководителей проектов

    FIRST_NAME LAST_NAME PROJ_NAME

    ============== ================= ====================

    Ashok Ramanathan Video Database

    Pete Fisher DigiPizza

    Chris Papadopoulos AutoMap

    Bruce Young MapBrowser port

    Mary S. MacDonald Marketing project 3

    Операция объединения позволяет объединять результаты отдельных запросов по нескольким таблицам в единую результирующую таблицу. Таким образом, предложение UNION объединяет вывод двух или более SQL-запросов в единый набор строк и столбцов.







  • SELECT first_name, last_name, job_country


  • FROM employee

    WHERE job_country = "France"

    UNION

    SELECT contact_first, contact_last, country

    FROM customer

    WHERE country = "France" Получить список

    работников и заказчиков,

    проживающих во Франции

    FIRST_NAME LAST_NAME JOB_COUNTRY

    =============== ================= ===============

    Jacques Glon France

    Michelle Roche France

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

  • SELECT [DISTINCT] список_выбираемых_элементов (полей)


  • FROM список_таблиц (или представлений)

    [WHERE предикат]

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

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

    [ORDER BY поле (или поля) или номер (номера)];

    Рис. 2: Общий формат команды SELECT

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



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









        1.  


        2.  


        3. Команда SELECT




          1.  


          2. Простейшие конструкции команды SELECT


          3. Итак, начнем с рассмотрения простейших конструкций языка SQL. После такого рассмотрения мы научимся:



            •  


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


            •  


            • назначать к выборке “все поля”


            •  


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


            •  


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


            •  


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


            •  


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


            •  


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


            •  


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


            •  


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


            • Список выбираемых элементов может содержать следующее:



              •  


              • имена полей


              •  


              • *


              •  


              • вычисления


              •  


              • литералы


              •  


              • функции


              •  


              • агрегирующие конструкции












                        1. Список полей


                        2. SELECT first_name, last_name, phone_no


                        3. FROM phone_list получить список

                          имен, фамилий и служебных телефонов

                          всех работников предприятия

                          FIRST_NAME LAST_NAME PHONE_NO

                          ============= ==================== ====================

                          Terri Lee (408) 555-1234

                          Oliver H. Bender (408) 555-1234

                          Mary S. MacDonald (415) 555-1234

                          Michael Yanowski (415) 555-1234

                          Robert Nelson (408) 555-1234

                          Kelly Brown (408) 555-1234

                          Stewart Hall (408) 555-1234

                          ...

                          Отметим, что PHONE_LIST - это виртуальная таблица (представление), созданная в InterBase и основанная на информации из двух таблиц - EMPLOYEE и DEPARTMENT. Она не показана на рис.1, однако, как мы уже указывали в общей структуре команды SELECT, к ней можно обращаться так же, как и к “настоящей” таблице.

                        4. Все поля


                        5. SELECT *


                        6. FROM phone_list получить список служебных телефонов

                          всех работников предприятия



                          со всей необходимой информацией

                          EMP_NO FIRST_NAME LAST_NAME PHONE_EXT LOCATION PHONE_NO

                          ====== ========== ========= ========= ============= ==============

                          12 Terri Lee 256 Monterey (408) 555-1234

                          105 Oliver H. Bender 255 Monterey (408) 555-1234

                          85 Mary S. MacDonald 477 San Francisco (415) 555-1234

                          127 Michael Yanowski 492 San Francisco (415) 555-1234

                          2 Robert Nelson 250 Monterey (408) 555-1234

                          109 Kelly Brown 202 Monterey (408) 555-1234

                          14 Stewart Hall 227 Monterey (408) 555-1234

                          ...

                        7. Все поля в произвольном порядке


                        8. SELECT first_name, last_name, phone_no,


                        9. location, phone_ext, emp_no

                          FROM phone_list получить список служебных телефонов

                          всех работников предприятия

                          со всей необходимой информацией,

                          расположив их в требуемом порядке

                          FIRST_NAME LAST_NAME PHONE_NO LOCATION PHONE_EXT EMP_NO

                          ========== ========= ============== ============= ========= ======

                          Terri Lee (408) 555-1234 Monterey 256 12

                          Oliver H. Bender (408) 555-1234 Monterey 255 105

                          Mary S. MacDonald (415) 555-1234 San Francisco 477 85

                          Michael Yanowski (415) 555-1234 San Francisco 492 127

                          Robert Nelson (408) 555-1234 Monterey 250 2

                          Kelly Brown (408) 555-1234 Monterey 202 109

                          Stewart Hall (408) 555-1234 Monterey 227 14

                          ...

                        10. Блобы


                        11. Получение информации о BLOb выглядит совершенно аналогично обычным полям. Полученные значения можно отображать с использованием data-aware компонент Delphi, например, TDBMemo


                        12. или TDBGrid. Однако, в последнем случае придется самому прорисовывать содержимое блоба (например, через OnDrawDataCell). Подробнее об этом см. на уроке, посвященном работе с полями.

                          SELECT job_requirement

                          FROM job получить список

                          должностных требований

                          к кандидатам на работу

                          JOB_REQUIREMENT:

                          No specific requirements.

                          JOB_REQUIREMENT:

                          15+ years in finance or 5+ years as a CFO

                          with a proven track record.

                          MBA or J.D. degree.

                          ...

                        13. Вычисления


                        14. SELECT emp_no, salary, salary * 1.15


                        15. FROM employee получить список номеров

                          служащих и их зарплату,

                          в том числе увеличенную на 15%

                          EMP_NO SALARY



                          ====== ====================== ======================

                          2 105900.00 121785

                          4 97500.00 112125

                          5 102750.00 118162.5

                          8 64635.00 74330.25

                          9 75060.00 86319

                          11 86292.94 99236.87812499999

                          12 53793.00 61861.95

                          14 69482.62 79905.01874999999

                          ...

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

                          Например, в выражении col1 + col2 * col3

                          сначала находится произведение значений столбцов col2

                          и col3, а затем результат этого умножения складывается со значением столбца col1. А в выражении (col1 + col2) * col3 сначала выполняется сложение значений столбцов col1

                          и col2, и только после этого результат умножается на значение столбца col3.

                        16. Литералы


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


                        18. SELECT first_name, "получает", salary, "долларов в год"

                          FROM employee получить список сотрудников

                          и их зарплату

                          FIRST_NAME SALARY

                          =========== ======== ========== ==============

                          Robert получает 105900.00 долларов в год

                          Bruce получает 97500.00 долларов в год

                          Kim получает 102750.00 долларов в год

                          Leslie получает 64635.00 долларов в год

                          Phil получает 75060.00 долларов в год

                          K. J. получает 86292.94 долларов в год

                          Terri получает 53793.00 долларов в год

                          ...

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


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


                        21. SELECT "сотрудник " || first_name || " " || last_name

                          FROM employee получить список всех сотрудников

                          ==============================================



                          сотрудник Robert Nelson

                          сотрудник Bruce Young

                          сотрудник Kim Lambert

                          сотрудник Leslie Johnson

                          сотрудник Phil Forest

                          сотрудник K. J. Weston

                          сотрудник Terri Lee

                          сотрудник Stewart Hall

                          ...

                        22. Использование квалификатора AS


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


                        24. SELECT count(*) AS number

                          FROM employee подсчитать количество служащих

                          NUMBER

                          ===========

                          42

                          SELECT "сотрудник " || first_name || " " || last_name AS employee_list

                          FROM employee получить список всех сотрудников

                          EMPLOYEE_LIST

                          ==============================================

                          сотрудник Robert Nelson

                          сотрудник Bruce Young

                          сотрудник Kim Lambert

                          сотрудник Leslie Johnson

                          сотрудник Phil Forest

                          сотрудник K. J. Weston

                          сотрудник Terri Lee

                          сотрудник Stewart Hall

                          ...

                        25. Работа с датами


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



                          • “October 27, 1995”


                          • “27-OCT-1994”


                          • “10-27-95”


                          • “10/27/95”


                          • “27.10.95”


                          • Кроме абсолютных дат, в SQL-выражениях можно также пользоваться относительным заданием дат:



                            • “yesterday” вчера


                            • “today” сегодня


                            • “now” сейчас (включая время)


                            • “tomorrow” завтра




                            • Дата может неявно конвертироваться в строку (из строки), если:



                              •  


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


                              •  


                              • выражение не содержит неоднозначностей в толковании типов столбцов.








                              • SELECT first_name, last_name, hire_date


                              • FROM employee

                                WHERE hire_date > '1-1-94' получить список сотрудников,

                                принятых на работу после

                                1 января 1994 года

                                FIRST_NAME LAST_NAME HIRE_DATE

                                =============== ==================== ===========

                                Pierre Osborne 3-JAN-1994

                                John Montgomery 30-MAR-1994

                                Mark Guckenheimer 2-MAY-1994

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







                              • SELECT first_name, last_name, hire_date


                              • FROM employee

                                WHERE 'today' - hire_date > 365 * 7 + 1

                                получить список служащих,

                                проработавших на предприятии

                                к настоящему времени

                                более 7 лет

                                FIRST_NAME LAST_NAME HIRE_DATE

                                =============== ==================== ===========

                                Robert Nelson 28-DEC-1988

                                Bruce Young 28-DEC-1988











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


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


                                        3. SELECT count(*), sum (budget), avg (budget),

                                          min (budget), max (budget)

                                          FROM department

                                          WHERE head_dept = 100 вычислить: количество отделов,

                                          являющихся подразделениями

                                          отдела 100 (Маркетинг и продажи),

                                          их суммарный, средний, мини- мальный и максимальный бюджеты

                                          COUNT SUM AVG MIN MAX

                                          ====== =========== ========== ========== ===========

                                          5 3800000.00 760000.00 500000.00 1500000.00

                                        4. Предложение FROM команды SELECT


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









                                                1.  


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


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



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



                                                  • сравнение с использованием реляционных операторов






                                                  • = равно


                                                  • <> не равно

                                                    != не равно

                                                    > больше

                                                    < меньше

                                                    >= больше или равно

                                                    <= меньше или равно



                                                    • BETWEEN


                                                    • IN


                                                    • LIKE


                                                    • CONTAINING


                                                    • IS NULL


                                                    • EXIST


                                                    • ANY


                                                    • ALL












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


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

                                                                Что же может быть элементом сравнения? Элементом сравнения может выступать:



                                                                •  


                                                                • значение поля


                                                                •  


                                                                • литерал


                                                                •  


                                                                • арифметическое выражение


                                                                •  


                                                                • агрегирующая функция


                                                                •  


                                                                • другая встроенная функция


                                                                •  


                                                                • значение (значения), возвращаемые подзапросом.


                                                                • При сравнении литералов конечные пробелы игнорируются. Так, предложение WHERE first_name = ‘Петр ‘

                                                                  будет иметь тот же результат, что и предложение WHERE first_name = ‘Петр’.







                                                                • SELECT first_name, last_name, dept_no


                                                                • FROM employee

                                                                  WHERE job_code = "Admin" получить список сотрудников

                                                                  (и номера их отделов),

                                                                  занимающих должность

                                                                  администраторов

                                                                  FIRST_NAME LAST_NAME DEPT_NO

                                                                  =============== ==================== =======

                                                                  Terri Lee 000

                                                                  Ann Bennet 120

                                                                  Sue Anne O'Brien 670

                                                                  Kelly Brown 600



                                                                • SELECT first_name, last_name, dept_no,


                                                                • job_country

                                                                  FROM employee

                                                                  WHERE job_country <> "USA" получить список сотрудников

                                                                  (а также номера их отделов

                                                                  и страну),

                                                                  работающих вне США

                                                                  FIRST_NAME LAST_NAME DEPT_NO JOB_COUNTRY

                                                                  =============== ================ ======= ==============

                                                                  Ann Bennet 120 England

                                                                  Roger Reeves 120 England

                                                                  Willie Stansbury 120 England

                                                                  Claudia Sutherland 140 Canada

                                                                  Yuki Ichida 115 Japan

                                                                  Takashi Yamamoto 115 Japan

                                                                  Roberto Ferrari 125 Italy

                                                                  Jacques Glon 123 France

                                                                  Pierre Osborne 121 Switzerland











                                                                          1. BETWEEN


                                                                          2. Предикат BETWEEN задает диапазон значений, для которого выражение принимает значение true. Разрешено также использовать конструкцию NOT BETWEEN.




                                                                          3. SELECT first_name, last_name, salary

                                                                            FROM employee

                                                                            WHERE salary BETWEEN 20000 AND 30000

                                                                            получить список сотрудников,

                                                                            годовая зарплата которых

                                                                            больше 20000 и меньше 30000

                                                                            FIRST_NAME LAST_NAME SALARY

                                                                            =============== ========== ===============

                                                                            Ann Bennet 22935.00

                                                                            Kelly Brown 27000.00

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

                                                                            SELECT first_name, last_name, salary

                                                                            FROM employee

                                                                            WHERE salary >= 20000

                                                                            AND salary <= 30000 получить список сотрудников,

                                                                            годовая зарплата которых

                                                                            больше 20000 и меньше 30000

                                                                            FIRST_NAME LAST_NAME SALARY

                                                                            =============== ========== ===============

                                                                            Ann Bennet 22935.00

                                                                            Kelly Brown 27000.00

                                                                            Запрос с предикатом BETWEEN может иметь следующий вид:

                                                                            SELECT first_name, last_name, salary

                                                                            FROM employee

                                                                            WHERE last_name BETWEEN "Nelson" AND "Osborne"

                                                                            получить список сотрудников,

                                                                            фамилии которых начинаются

                                                                            с “Nelson”

                                                                            и заканчиваются “Osborne”

                                                                            FIRST_NAME LAST_NAME SALARY

                                                                            =============== =============== ================

                                                                            Robert Nelson 105900.00

                                                                            Carol Nordstrom 42742.50

                                                                            Sue Anne O'Brien 31275.00

                                                                            Pierre Osborne 110000.00

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

                                                                            SELECT first_name, last_name, salary

                                                                            FROM employee

                                                                            WHERE last_name BETWEEN "Nel" AND "Osb"

                                                                            получить список сотрудников,

                                                                            фамилии которых находятся

                                                                            между “Nel” и “Osb”

                                                                            FIRST_NAME LAST_NAME SALARY

                                                                            =============== =============== ================

                                                                            Robert Nelson 105900.00

                                                                            Carol Nordstrom 42742.50

                                                                            Sue Anne O'Brien 31275.00

                                                                            В данном примере значений “Nel” и “Osb” в базе данных нет. Однако, все сотрудники, входящие в диапазон, в нижней части которого начало фамилий совпадает с “Nel” (т.е. выполняется условие “больше или равно”), а в верхней части фамилия не более “Osb” (т.е. выполняется условие “меньше или равно” - а именно “O”, “Os”, “Osb”), попадут в выборку. Отметим, что при выборке с использованием предиката BETWEEN поле, на которое накладывается диапазон, считается упорядоченным по возрастанию.



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

                                                                            SELECT first_name, last_name, hire_date

                                                                            FROM employee

                                                                            WHERE hire_date NOT BETWEEN "1-JAN-1989" AND "31-DEC-1993" получить список самых “старых”

                                                                            и самых “молодых” (по времени

                                                                            поступления на работу)

                                                                            сотрудников

                                                                            FIRST_NAME LAST_NAME HIRE_DATE

                                                                            =============== ================ ===========

                                                                            Robert Nelson 28-DEC-1988

                                                                            Bruce Young 28-DEC-1988

                                                                            Pierre Osborne 3-JAN-1994

                                                                            John Montgomery 30-MAR-1994

                                                                            Mark Guckenheimer 2-MAY-1994

                                                                          4. IN


                                                                          5. Предикат IN проверяет, входит ли заданное значение, предшествующее ключевому слову “IN” (например, значение столбца или функция от него) в указанный в скобках список. Если заданное проверяемое значение равно какому-либо элементу в списке, то предикат принимает значение true. Разрешено также использовать конструкцию NOT IN.


                                                                          6. SELECT first_name, last_name, job_code

                                                                            FROM employee

                                                                            WHERE job_code IN ("VP", "Admin", "Finan")

                                                                            получить список сотрудников,

                                                                            занимающих должности

                                                                            “вице-президент”, “администратор”,

                                                                            “финансовый директор”

                                                                            FIRST_NAME LAST_NAME JOB_CODE

                                                                            =============== ================ ========

                                                                            Robert Nelson VP

                                                                            Terri Lee Admin

                                                                            Stewart Hall Finan

                                                                            Ann Bennet Admin

                                                                            Sue Anne O'Brien Admin

                                                                            Mary S. MacDonald VP

                                                                            Kelly Brown Admin

                                                                            А вот пример запроса, использующего предикат NOT IN:

                                                                            SELECT first_name, last_name, job_country

                                                                            FROM employee

                                                                            WHERE job_country NOT IN

                                                                            ("USA", "Japan", "England")

                                                                            получить список сотрудников,

                                                                            работающих не в США, не в Японии

                                                                            и не в Великобритании

                                                                            FIRST_NAME LAST_NAME JOB_COUNTRY

                                                                            =============== ================ ===============

                                                                            Claudia Sutherland Canada

                                                                            Roberto Ferrari Italy

                                                                            Jacques Glon France

                                                                            Pierre Osborne Switzerland

                                                                          7. LIKE


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




                                                                          9. % - замещает любое количество символов (в том числе и 0),

                                                                            _ - замещает только один символ.

                                                                            Разрешено также использовать конструкцию NOT LIKE.

                                                                            SELECT first_name, last_name

                                                                            FROM employee

                                                                            WHERE last_name LIKE "F%"

                                                                            получить список сотрудников,

                                                                            фамилии которых начинаются с буквы “F”

                                                                            FIRST_NAME LAST_NAME

                                                                            =============== ====================

                                                                            Phil Forest

                                                                            Pete Fisher

                                                                            Roberto Ferrari

                                                                            SELECT first_name, last_name

                                                                            FROM employee

                                                                            WHERE first_name LIKE "%er" получить список сотрудников,

                                                                            имена которых заканчиваются буквами “er”

                                                                            FIRST_NAME LAST_NAME

                                                                            =============== ====================

                                                                            Roger De Souza

                                                                            Roger Reeves

                                                                            Walter Steadman

                                                                            А такой запрос позволяет решить проблему произношения (и написания) имени:

                                                                            SELECT first_name, last_name

                                                                            FROM employee

                                                                            WHERE first_name LIKE "Jacq_es"

                                                                            найти сотрудника(ов),

                                                                            в имени которого

                                                                            неизвестно произношение

                                                                            буквы перед окончанием “es”

                                                                            FIRST_NAME LAST_NAME

                                                                            =============== ====================

                                                                            Jacques Glon

                                                                            Что делать, если требуется найти строку, которая содержит указанные выше специальные символы (“%”, “_”) в качестве информационных символов? Есть выход! Для этого с помощью ключевого слова ESCAPE

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

                                                                            SELECT first_name, last_name

                                                                            FROM employee

                                                                            WHERE first_name LIKE "%@_%" ESCAPE "@"

                                                                            получить список сотрудников,

                                                                            в имени которых содержится “_”

                                                                            (знак подчеркивания)

                                                                          10. CONTAINING


                                                                          11. Предикат CONTAINING аналогичен предикату LIKE, за исключением того, что он не чувствителен к регистру букв. Разрешено также использовать конструкцию NOT CONTAINING.


                                                                          12. SELECT first_name, last_name

                                                                            FROM employee



                                                                            WHERE last_name CONTAINING "ne"

                                                                            получить список сотрудников,

                                                                            фамилии которых содержат буквы

                                                                            “ne”, “Ne”, “NE”, “nE”

                                                                            FIRST_NAME LAST_NAME

                                                                            =============== ====================

                                                                            Robert Nelson

                                                                            Ann Bennet

                                                                            Pierre Osborne

                                                                          13. IS NULL


                                                                          14. В SQL-запросах NULL


                                                                          15. означает, что значение столбца неизвестно. Поисковые условия, в которых значение столбца сравнивается с NULL, всегда принимают значение unknown

                                                                            (и, соответственно, приводят к ошибке), в противоположность true

                                                                            или false, т.е.

                                                                            WHERE dept_no = NULL

                                                                            или даже

                                                                            WHERE NULL = NULL.

                                                                            Предикат IS NULL

                                                                            принимает значение true

                                                                            только тогда, когда выражение слева от ключевых слов “IS NULL” имеет значение null

                                                                            (пусто, не определено). Разрешено также использовать конструкцию IS NOT NULL, которая означает “не пусто”, “имеет какое-либо значение”.

                                                                            SELECT department, mngr_no

                                                                            FROM department

                                                                            WHERE mngr_no IS NULL получить список отделов,

                                                                            в которых еще не назначены

                                                                            начальники

                                                                            DEPARTMENT MNGR_NO

                                                                            ========================= =======

                                                                            Marketing <null>

                                                                            Software Products Div. <null>

                                                                            Software Development <null>

                                                                            Field Office: Singapore <null>

                                                                            Предикаты EXIST, ANY, ALL, SOME, SINGULAR мы рассмотрим в разделе, рассказывающем о подзапросах.

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


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

                                                                            Оператор AND

                                                                            означает, что общий предикат будет истинным только тогда, когда условия, связанные по “AND”, будут истинны.

                                                                            Оператор OR

                                                                            означает, что общий предикат будет истинным, когда хотя бы одно из условий, связанных по “OR”, будет истинным.

                                                                            Оператор NOT

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



                                                                            В одном предикате логические операторы выполняются в следующем порядке: сначала выполняется оператор NOT, затем - AND и только после этого - оператор OR. Для изменения порядка выполнения операторов разрешается использовать скобки.







                                                                          18. SELECT first_name, last_name, dept_no,


                                                                          19. job_code, salary

                                                                            FROM employee

                                                                            WHERE dept_no = 622

                                                                            OR job_code = "Eng"

                                                                            AND salary <= 40000

                                                                            ORDER BY last_name получить список служащих,

                                                                            занятых в отделе 622

                                                                            или

                                                                            на должности “инженер” с зарплатой

                                                                            не выше 40000

                                                                            FIRST_NAME LAST_NAME DEPT_NO JOB_CODE SALARY

                                                                            ============ ============= ======= ======== ===========

                                                                            Jennifer M. Burbank 622 Eng 53167.50

                                                                            Phil Forest 622 Mngr 75060.00

                                                                            T.J. Green 621 Eng 36000.00

                                                                            Mark Guckenheimer 622 Eng 32000.00

                                                                            John Montgomery 672 Eng 35000.00

                                                                            Bill Parker 623 Eng 35000.00

                                                                            Willie Stansbury 120 Eng 39224.06



                                                                          20. SELECT first_name, last_name, dept_no,


                                                                          21. job_code, salary

                                                                            FROM employee

                                                                            WHERE (dept_no = 622

                                                                            OR job_code = "Eng")

                                                                            AND salary <= 40000

                                                                            ORDER BY last_name получить список служащих,

                                                                            занятых в отделе 622

                                                                            или на должности “инженер”,

                                                                            зарплата которых не выше 40000

                                                                            FIRST_NAME LAST_NAME DEPT_NO JOB_CODE SALARY

                                                                            ============ ============= ======= ======== ===========

                                                                            T.J. Green 621 Eng 36000.00

                                                                            Mark Guckenheimer 622 Eng 32000.00

                                                                            John Montgomery 672 Eng 35000.00

                                                                            Bill Parker 623 Eng 35000.00

                                                                            Willie Stansbury 120 Eng 39224.06









                                                                                  1.  


                                                                                  2. Преобразование типов (CAST)


                                                                                  3. В SQL имеется возможность преобразовать значение столбца или функции к другому типу для более гибкого использования операций сравнения. Для этого используется функция CAST.


                                                                                  4. Типы данных могут быть конвертированы в соответствии со следующей таблицей:

                                                                                    Из типа данных В тип данных

                                                                                    ---------------------------------------

                                                                                    NUMERIC CHAR, VARCHAR, DATE

                                                                                    CHAR, VARCHAR NUMERIC, DATE

                                                                                    DATE CHAR, VARCHAR, DATE

                                                                                    SELECT first_name, last_name, dept_no

                                                                                    FROM employee

                                                                                    WHERE CAST(dept_no AS char(20))

                                                                                    CONTAINING "00" получить список сотрудников,

                                                                                    занятых в отделах,



                                                                                    номера которых содержат “00”

                                                                                    FIRST_NAME LAST_NAME DEPT_NO

                                                                                    =============== ==================== =======

                                                                                    Robert Nelson 600

                                                                                    Terri Lee 000

                                                                                    Stewart Hall 900

                                                                                    Walter Steadman 900

                                                                                    Mary S. MacDonald 100

                                                                                    Oliver H. Bender 000

                                                                                    Kelly Brown 600

                                                                                    Michael Yanowski 100

                                                                                  5. Изменение порядка выводимых строк (ORDER BY)


                                                                                  6. Порядок выводимых строк может быть изменен с помощью опционального (дополнительного) предложения ORDER BY в конце SQL-запроса. Это предложение имеет вид:

                                                                                  7. ORDER BY <порядок строк> [ASC | DESC]


                                                                                  8. Порядок строк может задаваться одним из двух способов:




                                                                                      Содержание раздела