Введение в DELPHI

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


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

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

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

  • имена полей


  • *
  • вычисления
  • литералы
  • функции
  • агрегирующие конструкции
Список полей SELECT first_name, last_name, phone_no FROM phone_list

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

FIRST_NAMELAST_NAMEPHONE_NO
TerriLee(408) 555-1234
Oliver H.Bender(408) 555-1234
Mary S.MacDonald(415) 555-1234
MichaelYanowski(415) 555-1234
RobertNelson(408) 555-1234
KellyBrown(408) 555-1234
StewartHall(408) 555-1234
...  

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

Все поля SELECT * FROM phone_list

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

EMP_NOFIRST_NAMELAST_NAMEPHONE_EXTLOCATIONPHONE_NO
12TerriLee256Monterey(408) 555-1234
105Oliver H.Bender255Monterey(408) 555-1234
85Mary S.MacDonald477San Francisco(415) 555-1234
127MichaelYanowski492San Francisco(415) 555-1234
2RobertNelson250Monterey(408) 555-1234
109KellyBrown202Monterey(408) 555-1234
14StewartHall227Monterey(408) 555-1234
...      

Все поля в произвольном порядке SELECT first_name, last_name, phone_no, location, phone_ext, emp_no FROM phone_list

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

FIRST_NAME LAST_NAME PHONE_NOLOCATIONPHONE_EXT EMP_NO
TerriLee(408) 555-1234 Monterey25612
Oliver H.Bender(408) 555-1234 Monterey255105
Mary S.MacDonald(415) 555-1234 San Francisco 47785
MichaelYanowski(415) 555-1234 San Francisco 492127
RobertNelson(408) 555-1234 Monterey2502
KellyBrown(408) 555-1234 Monterey202109
StewartHall(408) 555-1234 Monterey22714
...      

Блобы

Получение информации о 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_NOSALARY
2105900.00121785
4 97500.00112125
5102750.00118162.5
8 64635.0074330.25
9 75060.0086319
11 86292.9499236.87812499999
12 53793.0061861.95
14 69482.6279905.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 содержит значения даты и времени. Внешне дата может быть представлена строками различных форматов, например:

  • "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_NAMELAST_NAME HIRE_DATE
PierreOsborne3-JAN-1994
JohnMontgomery30-MAR-1994
MarkGuckenheimer2-MAY-1994

Значения дат можно сравнивать друг с другом, сравнивать с относительными датами, вычитать одну дату из другой. SELECT first_name, last_name, hire_date FROM employee WHERE 'today' - hire_date > 365 * 7 + 1

получить список служащих, проработавших на предприятии к настоящему времени более 7 лет

FIRST_NAMELAST_NAMEHIRE_DATE
RobertNelson28-DEC-1988
BruceYoung28-DEC-1988

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

К агрегирующим функциям относятся функции вычисления суммы (SUM), максимального (SUM) и минимального (MIN) значений столбцов, арифметического среднего (AVG), а также количества строк, удовлетворяющих заданному условию (COUNT). SELECT count(*), sum (budget), avg (budget), min (budget), max (budget) FROM department WHERE head_dept = 100

вычислить: количество отделов, являющихся подразделениями отдела 100 (Маркетинг и продажи), их суммарный, средний, мини- мальный и максимальный бюджеты

COUNTSUMAVGMINMAX
53800000.00760000.00500000.001500000.00

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

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



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