Запрос информации
Являясь системным администратором, чаще всего вы будете применять SQL-команду SELECT, которая используется для получения информации с сервера. Перед тем как говорить об этой команде, нужно заметить, что SELECT - это пропуск в мир SQL. Мы покажем только самые простые формы данной команды. Умение создавать хорошие запросы (и умение проектировать базы данных, к которым легко такие запросы строить) - это искусство, и более подробно этот вопрос рассматривается в книгах, целиком посвященных SQL и базам данных.
В самой простой форме SELECT служит для получения информации о сервере и соединении. В этом случае не нужно определять источник данных. Вот два примера:
-- оба зависят от производителя базы данных SELECT ©sfiERVERNAME SELECT VERSIONO.
Первый оператор возвращает имя сервера для Sybase или MS-SQL; второй - текущую версию сервера MySQL.
Получение всех записей из таблицы
Для получения всех данных из таблицы hosts применяется такой SQL код:
USE sysach
SE! ЕС Г - FROM
В результате возвращаются все строки и поля, причем поля следуют в той последовательности, в которой они определялись при создании базы данных:
name icacdr aliases
bldg roo"i Tianuf r.odel
shimmer 192.168.1.11 snm shimmy sh:rnmydood.es David Dav:
Main 309 Sun UTfra60
bendir 192.168.1.3 Den bendoodles Cindy Co;
West 143 Apple 7500/100
sander 192.168.1.55 sandy micky mickydoo Alex Rollins IT
Main 1101 Intergraph TD-325
Sulawesi 192.168.1.12 sula su-lee Ellen Monk Design
Main 1116 Apple G3
Если нужно получить только определенные поля, следует явно указать их имена:
USE sysadm
SELECT name,ipaddr FROM hosts
Когда мы определяем поля по имени, они возвращаются в той последовательности, в которой указывались, независимо от порядка, используемого при создании таблицы. Например, для получения связи IP-адресов со зданиями можно применить следующую команду:
USE sysadm
SELECT bldg.ipaddr FROM hosts
В результате получим:
bldg ipaddr
Main 192.168.1.11
West 192.168.1,3
Main 192.168,1.55
Main 192.168.1.12
Получение подмножества строк из таблицы
Базы данных не были бы такими интересными, если бы из них нельзя было получить некое подмножество данных. В SQL употребляется команда SELECT, в которую добавлено ключевое слово WHERE для определения условия:
USE sysadm
SELECT - FROM hosts WHERE blog = "Ma:r!'
В результате получаем:
name ipaddr aliases owner .\i--.r.
bldg room manuf model
shimmer 192.168.1,11 shim shimmy shimmydoodles David Cav.s but",-, -.-
Main 309 Sun Ultra60
sander 192.168 1.55 sandy iricky mickydoo Alex РоП.гь I"
Main 1101 Intergraph TD-325
Sulawesi 192.168.1.12 sula su-lee Ell"' Monk Се
Main 1116 Apple G3
С ключевым словом WHERE можно использовать стандартные условные операторы, применяемые в программировании:
=>>=<<=<>
В отличие от Perl, в SQL нет отдельных операторов для сравнения строк и чисел.
Условные операторы можно объединять посредством AND/OR и отрицать при помощи NOT. Проверить, является ли поле пустым, позволяет оператор IS NULL, а проверить обратное - IS NOT NULL. Например, этот фрагмент SQL-кода выведет список машин, для которых в таблице не указаны владельцы:
USE sysadm
SELECT name FROM hosts WHERE owner IS NULL
Если требуется найти все строки, в которых значения некоторого поля равны одному из указанных, можно использовать оператор IN для задания списка:
USE sysadm
SELECT name FROM nosts WHERE dept IN ('IT', 'Software')
Ответом будет список машин из отделов «IT» и «Software». SQL также позволяет получить строки, совпадающие с диапазоном значений (полезнее всего это применять с численными данными и датами), при помощи оператора BETWEEN. Вот пример запроса, возвращающий список машин, находящихся в основном здании на десятом этаже:
USE sysadm
SELECT name FROM hosts WHERE (bldg = 'Main') AND
(room BETWEEN '1000' AND '1999')
Наконец, ключевое слово WHERE можно использовать с LIKE для выбора строк при помощи слабого механизма соответствия шаблону (слабого в сравнении с регулярными выражениями в Perl). Например, следующий запрос выбирает все машины, в псевдонимах которых встречается строка «doodles»:
USE sysadm
SELECT name FROM nosts WHERE aliases LIKE '%dooales%'
Обратите внимание, какие метасимволы поддерживаются (табл. D.2).
Таблица D.2. Метасимволы LIKE
Метасимвол |
Значение |
Ближайший эквивалент из регулярных выражений Perl |
% |
Ноль или более символов |
.* |
- |
Один символ |
. |
[] |
Один символ из указанного списка или диапазона |
[] |
Простая обработка данных, возвращаемых в результате запросов
У оператора SELECT существуют два полезных ключевых слова: DJSTINC1 и ORDER BY. Первое позволяет изъять из запроса повторяющиеся записи. При желании получить список всех различных производителей, представленных в таблице hosts, можно было бы использовать DISTINCT:
USE sysadm
SELECT DISTINCT manuf FROM hosts
При необходимости получить отсортированные данные, можно было бы применить ORDER BY:
USE sysadm
SELECT name.ipaddr.dept,owner FROM hosts ORDER BY aept
SQL имеет несколько операторов, преобразующих данные, возвращаемые в результате запроса. Такая возможность позволяет изменять имена полей, выполнять итоговые вычисления и вычисления внутри и между полями, изменять формат выводимых полей, осуществлять подзапросы и совершать множество иных действий. За информацией о различных ключевых словах, используемых с SELECT, обратитесь к литературе, посвященной SQL.
Добавление результатов запроса в другую таблицу
На некоторых SQL-серверах можно на лету создать новую таблицу, содержащую результаты запроса, при помощи ключевого слова INTO:
USE sysadm
SELECT name,ipaddr INTO itmachines FROM hosts WHERE deot = IT'
Этот оператор работает так же, как и предыдущие, за одним исключением: результаты данного запроса помещаются в таблицу под названием itmachines. На некоторых серверах такая таблица создается на лету в случае, если она еще не существует. Этот оператор можно считать эквивалентом оператора «>» в большинстве систем Unix и командных интерпретаторах NT.
Отдельные серверы баз данных (как MySQL) не поддерживают оператор SELECT INTO; для выполнения этого действия в них нужно применять команду INSERT. Другие серверы, например MS-SQL и Sybase, требуют установки специального флага на базу данных для использования SELECT INTO, иначе команда завершится с ошибкой.