Введение в DELPHI

       

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


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

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

  • сравнение с использованием реляционных операторов
  • = равно
  • <> не равно
  • != не равно
  • > больше
  • < меньше
  • >= больше или равно
  • <= меньше или равно
  • BETWEEN
  • IN
  • LIKE
  • CONTAINING
  • IS NULL


  • EXIST
  • ANY
  • ALL
  • Операции сравнения

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

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

    • значение поля
    • литерал
    • арифметическое выражение
    • агрегирующая функция
    • другая встроенная функция
    • значение (значения), возвращаемые подзапросом.

    При сравнении литералов конечные пробелы игнорируются. Так, предложение WHERE first_name = 'Петр ' будет иметь тот же результат, что и предложение WHERE first_name = 'Петр'. SELECT first_name, last_name, dept_no FROM employee WHERE job_code = "Admin" получить список сотрудников (и номера их отделов), занимающих должность администраторов

    FIRST_NAMELAST_NAME DEPT_NO
    TerriLeev000
    AnnBennet120
    Sue AnneO'Brien670
    KellyBrown600
    SELECT first_name, last_name, dept_no, job_country FROM employee WHERE job_country <> "USA"

    получить список сотрудников (а также номера их отделов и страну), работающих вне США

    FIRST_NAMELAST_NAME DEPT_NO JOB_COUNTRY
    AnnBennet120England
    RogerReeves120England
    WillieStansbury120England
    ClaudiaSutherland140Canada
    YukiIchida115Japan
    TakashiYamamoto115Japan
    RobertoFerrari125Italy
    JacquesGlon123France
    PierreOsborne121Switzerland

    BETWEEN

    Предикат BETWEEN задает диапазон значений, для которого выражение принимает значение true. Разрешено также использовать конструкцию NOT BETWEEN. SELECT first_name, last_name, salary FROM employee WHERE salary BETWEEN 20000 AND 30000

    получить список сотрудников, годовая зарплата которых больше 20000 и меньше 30000

    FIRST_NAMELAST_NAMESALARY
    AnnBennet22935.00
    KellyBrown27000.00

    Тот же запрос с использованием операторов сравнения будет выглядеть следующим образом: SELECT first_name, last_name, salary FROM employee WHERE salary >= 20000 AND salary <= 30000

    получить список сотрудников, годовая зарплата которых больше 20000 и меньше 30000

    FIRST_NAMELAST_NAMESALARY
    AnnBennet22935.00
    KellyBrown27000.00

    Запрос с предикатом BETWEEN может иметь следующий вид: SELECT first_name, last_name, salary FROM employee WHERE last_name BETWEEN "Nelson" AND "Osborne"

    получить список сотрудников, фамилии которых начинаются с "Nelson" и заканчиваются "Osborne"

    FIRST_NAMELAST_NAMESALARY
    RobertNelson105900.00
    CarolNordstrom42742.50
    Sue AnneO'Brien31275.00
    PierreOsborne110000.00

    Значения, определяющие нижний и верхний диапазоны, могут не являться реальными величинами из базы данных. И это очень удобно - ведь мы не всегда можем указать точные значения диапазонов! SELECT first_name, last_name, salary FROM employee WHERE last_name BETWEEN "Nel" AND "Osb"

    получить список сотрудников, фамилии которых находятся между "Nel" и "Osb"

    FIRST_NAMELAST_NAMESALARY
    RobertNelson105900.00
    CarolNordstrom42742.50
    Sue AnneO'Brien31275.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_NAMELAST_NAMEHIRE_DATE
    RobertNelson28-DEC-1988
    BruceYoung28-DEC-1988
    PierreOsborne3-JAN-1994
    JohnMontgomery30-MAR-1994
    MarkGuckenheimer 2-MAY-1994

    IN

    Предикат IN проверяет, входит ли заданное значение, предшествующее ключевому слову "IN" (например, значение столбца или функция от него) в указанный в скобках список. Если заданное проверяемое значение равно какому-либо элементу в списке, то предикат принимает значение true. Разрешено также использовать конструкцию NOT IN. SELECT first_name, last_name, job_code FROM employee WHERE job_code IN ("VP", "Admin", "Finan")

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

    FIRST_NAMELAST_NAMEJOB_CODE
    RobertNelsonVP
    TerriLeeAdmin
    StewartHallFinan
    AnnBennetAdmin
    Sue AnneO'Brien Admin
    Mary S.MacDonaldVP
    KellyBrownAdmin

    А вот пример запроса, использующего предикат NOT IN: SELECT first_name, last_name, job_country FROM employee WHERE job_country NOT IN ("USA", "Japan", "England")

    получить список сотрудников, работающих не в США, не в Японии и не в Великобритании

    FIRST_NAMELAST_NAMEJOB_COUNTRY
    Claudia SutherlandCanada
    RobertoFerrariItaly
    JacquesGlonFrance
    Pierre OsborneSwitzerland

    LIKE

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

    • % - замещает любое количество символов (в том числе и 0),
    • _ - замещает только один символ.

    Разрешено также использовать конструкцию NOT LIKE. SELECT first_name, last_name FROM employee WHERE last_name LIKE "F%"

    получить список сотрудников, фамилии которых начинаются с буквы "F"

    FIRST_NAMELAST_NAME
    PhilForest
    Pete Fisher
    RobertoFerrari
    SELECT first_name, last_name FROM employee WHERE first_name LIKE "%er"

    получить список сотрудников, имена которых заканчиваются буквами "er"

    FIRST_NAMERogerRogerWalter
    LAST_NAME
    De Souza
    Reeves
    Steadman

    А такой запрос позволяет решить проблему произношения (и написания) имени: SELECT first_name, last_name FROM employee WHERE first_name LIKE "Jacq_es"

    найти сотрудника(ов), в имени которого неизвестно произношение буквы перед окончанием "es"

    FIRST_NAMEJacques
    LAST_NAME
    Glon

    Что делать, если требуется найти строку, которая содержит указанные выше специальные символы ("%", "_") в качестве информационных символов? Есть выход! Для этого с помощью ключевого слова ESCAPE нужно определить так называемый escape-символ, который, будучи поставленным перед символом "%" или "_", укажет, что этот символ является информационным. Escape-символ не может быть символом "\" (обратная косая черта) и, вообще говоря, должен представлять собой символ, никогда не появляющийся в упоминаемом столбце как информационный символ. Часто для этих целей используются символы "@" и "~". SELECT first_name, last_name FROM employee WHERE first_name LIKE "%@_%" ESCAPE "@"

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

    CONTAINING

    Предикат CONTAINING аналогичен предикату LIKE, за исключением того, что он не чувствителен к регистру букв. Разрешено также использовать конструкцию NOT CONTAINING. SELECT first_name, last_name FROM employee WHERE last_name CONTAINING "ne"

    получить список сотрудников, фамилии которых содержат буквы "ne", "Ne", "NE", "nE"

    FIRST_NAMELAST_NAME
    RobertNelson
    AnnBennet
    PierreOsborne

    IS NULL

    В SQL-запросах NULL означает, что значение столбца неизвестно. Поисковые условия, в которых значение столбца сравнивается с 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

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

    DEPARTMENTMNGR_NO
    Marketing<null>
    Software Products Div.<null>
    Software Development<null>
    Field Office: Singapore<null>

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

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

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

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

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

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

    В одном предикате логические операторы выполняются в следующем порядке: сначала выполняется оператор NOT, затем - AND и только после этого - оператор OR. Для изменения порядка выполнения операторов разрешается использовать скобки. SELECT first_name, last_name, dept_no, job_code, salary FROM employee WHERE dept_no = 622 OR job_code = "Eng" AND salary <= 40000 ORDER BY last_name

    получить список служащих, занятых в отделе 622 или на должности "инженер" с зарплатой не выше 40000

    FIRST_NAMELAST_NAMEDEPT_NOJOB_CODESALARY
    Jennifer M.Burbank622 Eng53167.50
    PhilForest622Mngr75060.00
    T.J.Green621Eng36000.00
    MarkGuckenheimer622Eng32000.00
    JohnMontgomery672Eng35000.00
    BillParker623Eng35000.00
    WillieStansbury120Eng39224.06
    SELECT first_name, last_name, dept_no, 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_NAMEDEPT_NOJOB_CODESALARY
    T.J.Green621Eng36000.00
    MarkGuckenheimer622Eng32000.00
    JohnMontgomery672Eng35000.00
    BillParker623Eng35000.00
    WillieStansbury120Eng39224.06



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