Perl для системного администрирования

       

Запрос информации


Являясь системным администратором, чаще всего вы будете применять 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

%

Ноль или более символов

.*

-

Один символ

.

[]

Один символ из указанного списка или диапазона

[]
В некоторых серверах баз данных добавлены расширения к SQL, позволяющие применять регулярные выражения в операторах SELECT. Например, в MySQL существует оператор REGEXP, который можно использовать с SELECT. REGEXP не обладает всей силой регулярных выражений Perl, но он значительно увеличивает их гибкость по сравнению со стандартными метасимволами SQL.



Простая обработка данных, возвращаемых в результате запросов



У оператора 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, иначе команда завершится с ошибкой.






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