Итак, начнем с рассмотрения простейших конструкций языка SQL. После такого рассмотрения мы научимся:
Список выбираемых элементов может содержать следующее:
получить список имен, фамилий и служебных телефонов всех работников предприятия
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, к ней можно обращаться так же, как и к "настоящей" таблице.
Все поля SELECT * 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 |
... |
Все поля в произвольном порядке SELECT first_name, last_name, phone_no, 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 |
... |
Блобы
Получение информации о BLOb выглядит совершенно аналогично обычным полям. Полученные значения можно отображать с использованием data-aware компонент Delphi, например, TDBMemo или 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. ...
Вычисления
SELECT emp_no, salary, salary * 1.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.
Литералы
Для придания большей наглядности получаемому результату можно использовать литералы. Литералы - это строковые константы, которые применяются наряду с наименованиями столбцов и, таким образом, выступают в роли "псевдостолбцов". Строка символов, представляющая собой литерал, должна быть заключена в одинарные или двойные скобки. 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 долларов в год |
Конкатенация
Имеется возможность соединять два или более столбца, имеющие строковый тип, друг с другом, а также соединять их с литералами. Для этого используется операция конкатенации (). SELECT "сотрудник " first_name " " last_name FROM employee
получить список всех сотрудников ============================================== сотрудник Robert Nelson сотрудник Bruce Young сотрудник Kim Lambert сотрудник Leslie Johnson сотрудник Phil Forest сотрудник K. J. Weston сотрудник Terri Lee сотрудник Stewart Hall ... Использование квалификатора AS
Для придания наглядности получаемым результатам наряду с литералами в списке выбираемых элементов можно использовать квалификатор AS. Данный квалификатор заменяет в результирующей таблице существующее название столбца на заданное. Это наиболее эффективный и простой способ создания заголовков (к сожалению, InterBase, как уже отмечалось, не поддерживает использование русских букв в наименовании столбцов). 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 ... Работа с датами
Мы уже рассказывали о типах данных, имеющихся в различных СУБД, в том числе и в InterBase. В разных системах имеется различное число встроенных функций, упрощающих работу с датами, строками и другими типами данных. InterBase, к сожалению, обладает достаточно ограниченным набором таких функций. Однако, поскольку язык SQL, реализованный в InterBase, соответствует стандарту, то в нем имеются возможности конвертации дат в строки и гибкой работы с датами. Внутренне дата в InterBase содержит значения даты и времени. Внешне дата может быть представлена строками различных форматов, например:
Кроме абсолютных дат, в SQL-выражениях можно также пользоваться относительным заданием дат:
Дата может неявно конвертироваться в строку (из строки), если:
получить список сотрудников, принятых на работу после 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 |
Агрегатные функции
К агрегирующим функциям относятся функции вычисления суммы (SUM), максимального (SUM) и минимального (MIN) значений столбцов, арифметического среднего (AVG), а также количества строк, удовлетворяющих заданному условию (COUNT). 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 |
Предложение FROM команды SELECT
В предложении FROM перечисляются все объекты (один или несколько), из которых производится выборка данных (рис.2). Каждая таблица или представление, о которых упоминается в запросе, должны быть перечислены в предложении FROM.