﻿
<h1 class=p1>Команды SQL</h1>
<table border="0" cellspacing="10">
    <tr valign="top">
        <td>
            <a class=bluelink href="#1" title="Создание базы данных">create database</a>&nbsp;<br>
            <a class=bluelink href="#2" title="Выбрать базу данных для работы">use</a>&nbsp;<br>
            <a class=bluelink href="#3" title="Создание таблицы">create table</a>&nbsp;<br>
            <a class=bluelink href="#4" title="Показать структуру таблицы">describe</a>&nbsp;<br>           
        </td>
        <td>
            <a class=bluelink href="#5" title="Изменение структуры таблицы">alter table</a>&nbsp;<br>
            <a class=bluelink href="#6" title="Удаление таблицы">drop table</a>&nbsp;<br>           
            <a class=bluelink href="#7" title="Удаление базы данных">drop database</a>&nbsp;<br>
            <a class=bluelink href="#8" title="Вставить новые записи в таблицу">insert into…values</a>&nbsp;<br>            
        </td>
        <td>        
            <a class=bluelink href="#9" title="Удаление записей из таблицы">delete</a>&nbsp;<br>
            <a class=bluelink href="#10" title="Запрос на выборку записей">select</a>&nbsp;<br>         
            <a class=bluelink href="#11" title="Обновление значений записей таблицы">update</a>&nbsp;<br>
            <a class=bluelink href="#12" title="Показать список баз данных или список таблиц">show</a>&nbsp;<br>            
        </td>
    </tr>
</table>
<br>

<p class=text>В этом разделе мы изучим основные команды языка SQL. Для этого на компьютере с установленным MySQL необходимо запустить клиента mysql, в окне которого можно вводить команды SQL.</p>
<p class=prim><b>Примечание</b></p>
<p class=text><i>Команды SQL не чувствительны к регистру, но традиционно они набираются прописными буквами.</i></p>

<h2 class=p1>Типы полей базы данных</h2>
<p class=text>Список наиболее часто встречающихся типов приведен в таблицах 13.6 - 13.8. Для многих типов данных задается максимальная ширина отображения, указываемая в скобках, которую мы далее будем обозначать символом max. К примеру, запись INT(2) означает, что значение данного поля не может превышать 100.</p>
<p class=text>К <b>числовым типам</b> относятся целые числа и числа с плавающей точкой. Для чисел с плавающей точкой, кроме максимальной ширины отображения можно также указывать число значащих цифр после запятой, далее обозначаемое символом P.</p>
<p class=prim><b>Таблица 13.6.</b> Числовые типы</p>
<table border="1" CELLSPACING="0" WIDTH="100%" cellpadding="3" bordercolorlight="gray" bordercolordark="white">
<tr  class=tableheader><td><p class=zagtable><b>Тип</b></td><td><p class=zagtable><b>Описание</b></td></tr>
<tr><td><p class=pnull>TINYINT[(max)]</td><td><p class=pnull>Очень маленькие целые числа диапазона -127…128.</td></tr>
<tr><td><p class=pnull>SMALLINT[(max)]</td><td><p class=pnull>Маленькие целые числа диапазона -32768…32767.</td></tr>
<tr><td><p class=pnull>MEDIUMINT[(max)]</td><td><p class=pnull>Средние целые числа.</td></tr>
<tr><td><p class=pnull>INT[(max)]</td><td><p class=pnull>Обычные целые числа.</td></tr>
<tr><td><p class=pnull>FLOAT[(max,P)]</td><td><p class=pnull>Числа с плавающей точкой одинарной точности.</td></tr>
<tr><td><p class=pnull>DOUBLE[(max,P)]</td><td><p class=pnull>Числа с плавающей точкой двойной точности.</td></tr>
<tr><td><p class=pnull>DECIMAL[(max,P)]</td><td><p class=pnull>Числа с плавающей точкой, приведенные к типу char.</td></tr>
</table>
<p class=text><b>Типы даты и времени</b> приведены в таблице 13.7.</p>
<p class=prim><b>Таблица 13.7.</b> Типы даты и времени</p>
<table border="1" CELLSPACING="0" WIDTH="100%" cellpadding="3" bordercolorlight="gray" bordercolordark="white">
<tr class=tableheader><td><p class=zagtable><b>Тип</b></td><td><p class=zagtable><b>Описание</b></td></tr>
<tr><td><p class=pnull>DATE</td><td><p class=pnull>Дата в формате ГГГГ-ММ-ДД.</td></tr>
<tr><td><p class=pnull>TIME</td><td><p class=pnull>Время в формате ЧЧ-ММ-СС.</td></tr>
<tr><td><p class=pnull>DATETIME</td><td><p class=pnull>Дата и время в формате  ГГГГ-ММ-ДД ЧЧ-ММ-СС.</td></tr>
<tr><td><p class=pnull>YEAR</td><td><p class=pnull>Год в формате ГГ или ГГГГ.</td></tr>
<tr><td><p class=pnull>TIMESTAMP</td><td><p class=pnull>Метка времени для отсчетов по транзакциям в формате ГГГГ-ММ-ДД ЧЧ-ММ-СС.</td></tr>
</table>
<p class=text>Основные <b>строковые типы</b> приведены в таблице 13.8.</p>
<p class=prim><b>Таблица 13.8.</b> Строковые типы</p>
<table border="1" CELLSPACING="0" WIDTH="100%" cellpadding="3" bordercolorlight="gray" bordercolordark="white">
<tr  class=tableheader><td><p class=zagtable><b>Тип</b></td><td><b><p class=zagtable>Описание</b></td></tr>
<tr><td><p class=pnull>CHAR (len)[BINARY]</td><td><p class=pnull>Строки с длиной len, которое не превышает 255 символов. Ключевое слово BINARY указывает на то, что данные должны обрабатываться независимо от регистра.</td></tr>
<tr><td><p class=pnull>CHAR</td><td><p class=pnull>Синоним CHAR(1).</td></tr>
<tr><td><p class=pnull>VARCHAR (len)[BINARY]</td><td><p class=pnull>Синоним CHAR(len)за исключением того, что строки могут быть произвольной длины.</td></tr>
<tr><td><p class=pnull>TEXT</td><td><p class=pnull>Строки с максимальной длиной символов равной 65535. Данные этого типа чувствительны к регистру.</td></tr>
<tr><td><p class=pnull>BLOB</td><td><p class=pnull>Двоичные строки с максимальной длиной символов равной 65535. Тип BLOB (binary large object - большой двоичный объект) предназначен для хранения двоичных данных, в том числе изображений и звуковых последовательностей.</td></tr>
</table>
<br>
<a name="1"></a>
<br>
<h2 class=p1>CREATE DATABASE</h2>
<p class=text>Эта команда создает новую базу данных:</p>
<blockquote><pre>
CREATE DATABASE db_name;
</pre></blockquote>
<p class=text>Здесь <code>db_name</code> является именем создаваемой базы данных. Для того чтобы создать новую базу данных <code>forum</code>, наберите в строке-приглашении клиента <code>MySQL mysql&gt;</code> эту команду и укажите название базы данных:</p>
<blockquote><pre>
mysql&gt; CREATE DATABASE forum;
</pre></blockquote>
<p class=prim><b>Примечание</b></p>
<p class=text><i>Каждый запрос MySQL завершается точкой с запятой.</i></p>
<p class=text>При успешном выполнении команды MySQL выдаст строку, в которой сообщается, что этот запрос выполнен успешно и показано время, затраченное на выполнение запроса:</p>
<blockquote><pre>
Query OK, 1 row affected (0.02 sec)
</pre></blockquote>
<p class=text>Далее в тексте строку MySQL с результатом выполнения команды мы будем приводить непосредственно в соответствующем листинге.</p>
<p class=text>Для того, чтобы убедится, что база данных forum успешно создана, можно выполнить команду <code>SHOW DATABASES</code>, которая покажет, какие базы данных существуют на вашем компьютере:</p>
<blockquote><pre>
mysql&gt; SHOW DATABASES;
</pre></blockquote>
<p class=text>Как видим, среди различных баз данных на компьютере автора присутствует и только что созданная база данных <code>forum:</code></p>
<img src="images/gl12_6.gif" tppabs="http://site/bookphp/images/gl12_6.gif" border="0" alt="">
<p class=prim><b>Замечание</b></p>
<p class=text><i>Команда <code>SHOW DATABASES</code> является внутренней командой MySQL, отсутствующей в стандарте SQL и неподдерживаемой другими базами данных.</i></p>
<p class=prim><b>Замечание</b></p>
<p class=text><i>Изначально, в МуSQL присутствует только две базы данных: <code>test</code> и <code>mysql</code>. В последней хранится системный каталог, описывающий внутреннюю структуру СУБД MySQL.</i></p>
<br>
<a name="2"></a>
<br>
<h2 class=p1>USE</h2>
<p class=text>Для того чтобы начать работу с таблицами, необходимо сообщить MySQL с какой базой данных вы намерены работать. Это осуществляется при помощи команды <code>USE:</code></p>
<blockquote><pre>
USE db_name;
</pre></blockquote>
<p class=text>Здесь <code>db_name</code> - название выбираемой базы данных. Выберем созданную базу <code>forum:</code></p>
<blockquote><pre>
mysql> CREATE DATABASE forum;
Database changed;
</pre></blockquote>
<br>
<a name="3"></a>
<br>
<h2 class=p1>CREATE TABLE</h2>
<p class=text>Команда <code>CREATE TABLE</code> создает новую таблицу в выбранной базе данных и которая в простейшем случае имеет следующий синтаксис:</p>
<blockquote><pre>
CREATE TABLE table_name [(create_definition, ...)]
</pre></blockquote>
<p class=text>Здесь <code>table_name</code> - имя создаваемой таблицы.</p>
<p class=text>Создадим первую таблицу базы данных <code>forum</code>, которая называется authors и содержит
различные данные об зарегистрированных посетителях форума: ник (<code>name</code>), пароль (<code>passw</code>), e-mail (<code>email</code>),
Web-адрес сайта посетителя (<code>url</code>), номер ICQ (<code>iсq</code>), сведения об посетителе (<code>about</code>), строку содержащую путь 
к файлу фотографии посетителя (<code>photo</code>), время добавления запроса (<code>time</code>), последнее время посещения форума (<code>last_time</code>), 
статус посетителя - является ли он модератором, администратором или обычным посетителем (<code>statususer</code>). 
Кроме перечисленных полей в таблице имеется поле <code>id_author</code>, являющийся первичным ключом таблицы.
SQL-запрос, создающий эту таблицу приведен в листинге:
</p>
<blockquote><pre>
mysql> CREATE TABLE authors (
  id_author int(6) NOT NULL auto_increment,
  name text,
  passw text,
  email text,
  url text,
  iсq text,
  about text,
  photo text,
  time datetime default NULL,
  last_time datetime default NULL,
  themes int(10) default NULL,
  statususer int(2) default NULL,
  PRIMARY KEY (id_author)
) TYPE=MyISAM;
</pre></blockquote>
<p class=text>Выполнив SQL-команду <code>SHOW TABLES</code>, можно убедиться, что таблица <code>authors</code> успешно создана</p>
<img src="images/gl12_7.gif" tppabs="http://site/bookphp/images/gl12_7.gif" border="0" alt="">
<p class=text>Давайте теперь аналогичным образом создадим другие таблицы.</p>
<p class=text>Следующей по порядку идет таблица forums, в которой содержатся данные о разделах форума.</p>
<p class=prim><b>Примечание</b></p>
<p class=text><i>Для удобства на форуме может быть создано несколько различных разделов. К примеру, на форуме по языкам программирования для того, чтобы не смешивать темы, относящиеся к различным языкам, имеет смысл создать следующие разделы: С++, PHP, Java и т. д.</i></p>
<p class=text>В таблице <code>forums</code> присутствуют следующие поля: первичный ключ (<code>id_forum</code>), 
название раздела (<code>name</code>), правила форума (<code>rule</code>), краткое описание форума (<code>logo</code>), 
порядковый номер (<code>pos</code>), флаг, принимающий значение 1, если форум скрытый и 0, если общедоступный (<code>hide</code>). </p>
<p class=text>Вот SQL-запрос, создающий таблицу <code>forums</code></p>
<blockquote><pre>
mysql> CREATE TABLE forums (
  id_forum int(6) NOT NULL auto_increment,
  name text,
  rule text,
  logo text,
  pos int(6) default NULL,
  hide int(1) default NULL,
  PRIMARY KEY  (id_forum)
) TYPE=MyISAM;
</pre></blockquote>
<p class=text>Структура форума может быть следующей: имеются список разделов, переход по которым приводит посетителя к списку тем раздела. При переходе по теме посетитель приходит к обсуждению этой темы, состоящих из сообщений других посетителей. Теперь создадим таблицу <code>themes</code>, содержащую темы форума:</p>
<blockquote><pre>
mysql> CREATE TABLE themes (
  id_theme int(11) NOT NULL auto_increment,
  name text,
  author text,
  id_author int(6) default NULL,
  hide int(1) default NULL,
  time datetime default NULL,
  id_forum int(2) default NULL,
  PRIMARY KEY (id_theme)
) TYPE=MyISAM;
</pre></blockquote>
<p class=text>В таблице <code>themes</code> присутствуют следующие поля: первичный ключ (<code>id_theme</code>), название темы (<code>name</code>), 
автор темы (<code>author</code>), внешний ключ к таблице авторов (<code>id_author</code>), флаг, принимающий значение 1, 
если тема отмечена скрытой и 0, если отображается (<code>hide</code>) - это поле необходимо для модерирования, 
время добавления темы (<code>time</code>), внешний ключ к таблице форумов (<code>id_forum</code>), для того чтобы определить 
к какому разделу форума относится данная тема.</p>
<p class=text>В таблице <code>themes</code> нормализация проведена частично, она содержит два внешних ключа: <code>id_author</code>
и <code>id_forum</code> для таблиц посетителей и списка форумов, в тоже время в ней дублируется имя автора <code>author</code>, 
присутствующее также в таблице посетителей <code>authors</code> под именем <code>name</code>. Этот случай является примером 
денормализации предназначенной для того, чтобы не запрашивать каждый раз таблицу авторов при выводе 
списка тем и их авторов, чтобы обеспечить приемлемую скорость работы форума.</p>
<p class=text>Создадим последнюю таблицу <code>posts</code>, в которой хранятся сообщения:</p>
<blockquote><pre>
mysql> CREATE TABLE posts (
  id_post int(11) NOT NULL auto_increment,
  name text,
  url text,
  file text,
  author text,
  id_author int(6) default NULL,
  hide int(1) default NULL,
  time datetime default NULL,
  parent_post int(11) default NULL,
  id_theme int(11) default NULL,
  PRIMARY KEY  (id_post)
) TYPE=MyISAM;
</pre></blockquote>
<p class=text>В таблице <code>posts</code> присутствуют следующие поля: первичный ключ (<code>id_post</code>), 
тело сообщения (<code>name</code>), необязательная ссылка на ресурс, которую автор сообщения может 
ввести при добавлении сообщения (<code>url</code>), путь к файлу прикрепляемому к сообщению  (<code>file</code>), 
имя автора (<code>author</code>), внешний ключ к таблице авторов (<code>id_author</code>), флаг, принимающий 
значение 1, если сообщение отмечено как скрытое и 0, если он отображается (<code>hide</code>) - это 
поле необходимо для модерирования, время добавления сообщения (<code>time</code>), сообщение ответом на 
которое является данное сообщение (<code>parent_post</code>), если это первое сообщение в теме - это поле 
равно 0, внешний ключ к тем (<code>id_theme</code>), для того чтобы определить к какой теме относится сообщение.</p>
<p class=text>Убедимся, что все таблицы успешно созданы, выполнив команду <code>SHOW TABLES</code>.</p>
<img src="images/gl12_8.gif" tppabs="http://site/bookphp/images/gl12_8.gif" border="0" alt="">
<br>
<a name="4"></a>
<br>
<h2 class=p1>DESCRIBE</h2>
<p class=text>Команда <code>DESCRIBE</code> показывает структуру созданных таблиц и имеет следующий синтаксис:</p>
<blockquote><pre>
DESCRIBE tаble_name
</pre></blockquote>
<p class=text>Здесь <code>tаble_name</code> - имя таблицы структура которой запрашивается.</p>
<p class=prim><b>Замечание</b></p>
<p class=text><i>Команда <code>DESCRIBE</code> не входит в стандарт SQL и является внутренней командой СУБД MySQL.</i></p>
<p class=text>Давайте посмотрим, к примеру, структуру таблицы <code>forums</code>, выполнив следующий SQL-запрос:</p>
<blockquote><pre>
mysql> DESCRIBE forums;
</pre></blockquote>
<p class=text>После выполнения этой команды, интерпретатор mysql выведет следующую таблицу</p>
<img src="images/gl12_9.gif" tppabs="http://site/bookphp/images/gl12_9.gif" border="0" alt="">
<br>
<a name="5"></a>
<br>
<h2 class=p1>ALTER TABLE</h2>
<p class=text>Команда <code>ALTER TABLE</code> позволяет изменить структуру таблицы. Эта команда позволяет добавлять 
и удалять столбцы, создавать и уничтожать индексы, переименовывать столбцы и саму таблицу. Команда имеет следующий синтаксис:</p>
<blockquote><pre>
ALTER TABLE table_name alter_spec
</pre></blockquote>
<p class=text>Параметр alter_spec имеет значения, представленные в таблице</p>
<table border CELLSPACING=1 WIDTH=100% width=100%>
<tr><td><p><b>Синтаксис</b></td><td><p><b>Описание команды</b></td></tr>
<tr><td><p>ADD create_definition [FIRST|AFTER column_name]</td><td><p>Добавление нового столбца create_definition. create_definition представляет собой название нового столбца и его тип. Конструкция FIRST добавляет новый столбец перед столбцом column_name. Конструкция AFTER добавляет новый столбец после столбца column_name. Если место добавления не указано, по умолчанию столбец добавляется в конец таблицы.</td></tr>
<tr><td><p>ADD INDEX [index_name] (index_col_name,...)</td><td><p>Добавление индекса index_name для столбца index_col_name. Если имя индекса index_name не указывается, ему присваивается имя совпадающее с именем столбца index_col_name.</td></tr>
<tr><td><p>ADD PRIMARY KEY (index_col_name,...)</td><td><p>Делает столбец index_col_name или группу столбцов первичным ключом таблицы.</td></tr>
<tr><td><p>CHANGE old_col_name new_col_name type</td><td><p>Изменение столбца с именем old_col_name на столбец с именем new_col_name и типом type. </td></tr>
<tr><td><p>DROP col_name</td><td><p>Удаление столбца с именем col_name.</td></tr>
<tr><td><p>DROP PRIMARY KEY</td><td><p>Удаление первичного ключа таблицы.</td></tr>
<tr><td><p>DROP INDEX index_name</td><td><p>Удаление индекса index_name.</td></tr>
</table>
<p class=text>Добавим в таблицу <code>forums</code> новый столбец <code>test</code>, разместив его после столбца <code>name</code>.</p>
<blockquote><pre>
mysql> ALTER TABLE forums ADD test int(10) AFTER name;
</pre></blockquote>
<p class=text>Выполнив команду <code>DESCRIBE forums</code>, можно увидеть, что столбец <code>test</code> успешно добавлен после столбца <code>name</code></p>
<img src="images/gl12_10.gif" tppabs="http://site/bookphp/images/gl12_10.gif" border="0" alt="">
<p class=text>Давайте переименуем созданный столбец <code>test</code> в текстовый столбец <code>new_test</code></p>
<blockquote><pre>
mysql> ALTER TABLE forums CHANGE test new_test text;
</pre></blockquote>
<p class=text>Как видно из рисунка, столбец успешно переименован:</p>
<img src="images/gl12_11.gif" tppabs="http://site/bookphp/images/gl12_11.gif" border="0" alt="">
<p class=text>При изменении только типа столбца, а не его имени, указание имени все-равно необходимо, хотя в этом случае оно будет фактически повторяться.</p>
<blockquote><pre>
mysql> ALTER TABLE forums CHANGE new_test new_test int(5) not null;
</pre></blockquote>
<p class=text>Результат выполнения этого запроса приведен на рисунке:</p>
<img src="images/gl12_12.gif" tppabs="http://site/bookphp/images/gl12_12.gif" border="0" alt="">
<p class=text>Теперь удалим столбец <code>new_test</code>:</p>
<blockquote><pre>
mysql> ALTER TABLE forums DROP new_test;
</pre></blockquote>
<p class=text>Как видно из рисунка, после удаления этого столбца таблица <code>forums</code> приобрела исходную структуру:</p>
<img src="images/gl12_13.gif" tppabs="http://site/bookphp/images/gl12_13.gif" border="0" alt="">
<br>
<a name="6"></a>
<br>
<h2 class=p1>DROP TABLE</h2>
<p class=text>Команда <code>DROP TABLE</code> предназначена для удаления одной или нескольких таблиц:</p>
<blockquote><pre>
DROP TABLE table_name [ ,table_name,...]
</pre></blockquote>
<p class=text>К примеру, для удаления таблицы <code>forums</code> нужно выполнить следующий SQL-запрос:</p>
<blockquote><pre>
mysql> DROP TABLE forums;
</pre></blockquote>
<br>
<a name="7"></a>
<br>
<h2 class=p1>DROP DATABASE</h2>
<p class=text>Команда <code>DROP DATABASE</code> удаляет базу данных со всеми таблицами входящими в её состав:</p>
<blockquote><pre>
DROP DATABASE database_name
</pre></blockquote>
<p class=text>Удалим, например, базу данных <code>forum</code>:</p>
<blockquote><pre>
mysql> DROP DATABASE forum;
</pre></blockquote>
<br>
<a name="8"></a>
<br>
<h2 class=p1>INSERT INTO…VALUES</h2>
<p class=text>Команда <code>INSERT…VALUES</code> вставляет новые записи в существующую таблицу. Синтаксис команды:</p>
<blockquote><pre>
INSERT INTO table_name VALUES (values,…)
</pre></blockquote>
<p class=text>После оператора <code>VALUES</code> в скобках через запятую перечисляются значения соответствующих полей таблицы в соответствии с их типами.</p>
<p class=text>Давайте вставим в базу данных <code>authors</code> несколько записей, в которых расположена информация об зарегистрированных посетителях форума:</p>
<blockquote><pre>
mysql> INSERT INTO authors VALUES (1, 'Maks', '123', ' maks@mail.ru ', 
' www.softtime.ru ', '', 'программист', '', '', '', 0, 0);
mysql> INSERT INTO authors VALUES (2, 'Igor', '123', 'igor@mail.ru',
'http://www.softtime.ru', '', 'Программист', '', '', '', 407, 0);
mysql> INSERT INTO authors VALUES (3, 'Sergey', '212', 'sergey@mail.ru',
'http://www.softtime.ru', '', 'Дизайнер', '', '', '', 408, 0);
</pre></blockquote>
<br>
<a name="9"></a>
<br>
<h2 class=p1>DELETE</h2>
<blockquote><pre>
DELETE FROM table_name [WHERE definition]
</pre></blockquote>
<p class=text>Команда <code>DELETE</code> удаляет из таблицы <code>table_name</code> записи, удовлетворяющие заданным в <code>definition</code> условиям, и возвращает число удаленных записей.</p>
<p class=text>Вот как можно удалить все записи из таблицы <code>authors</code>:</p>
<blockquote><pre>
mysql> DELETE FROM authors;
</pre></blockquote>
<p class=text>Важной частью запросов <code>DELETE</code>, <code>UPDATE</code> и <code>SELECT</code> является оператор <code>WHERE</code>, который 
позволяет задать условия для выбора записей, на которые будут действовать эти команды. 
Следующий запрос удаляет из таблицы посетителя, первичный ключ для которого равен 1:</p>
<blockquote><pre>
mysql> DELETE FROM authors WHERE id_author = 1;
</pre></blockquote>
<p class=text>Условия отбора могут быть значительно сложнее, так в  листинге 13.16 удаляются все авторы с паролем '123' и первичный ключ которых превышает 10:</p>
<blockquote><pre>
mysql> DELETE FROM authors WHERE passw = '123' AND id_author > 10;
</pre></blockquote>
<p class=text>Оператор AND является логическим "и". В запросах можно так же применять логическое или "или".</p>
<br>
<a name="10"></a>
<br>
<h2 class=p1>SELECT</h2>
<p class=text>Команда <code>SELECT</code> предназначена для извлечения строк данных из одной или нескольких таблиц и имеет в общем случае следующий синтаксис:</p>
<blockquote><pre>
SELECT column,...
[FROM table WHERE definition]
[ORDER BY col_name [ASC | DESC], ...]
[LIMIT [offset], rows]
</pre></blockquote>
<p class=text>Здесь <code>column</code> - имя выбираемого столбца. Можно указать несколько столбцов через запятую. 
Если необходимо выбрать все столбцы можно просто указать знак звёздочки *. Ключевое слово <code>FROM</code>
указывает таблицу <code>table</code> из которой извлекаются записи. Ключевое слово <code>WHERE</code> определяет, так же как 
и в операторе <code>DELETE</code> определяет условия отбора строк. Ключевое слово <code>ORDER BY</code> сортирует строки 
запросов по столбцу <code>col_name</code> в прямом (<code>ASC</code>) или обратном порядке (<code>DESC</code>). Ключевое слово <code>LIMIT</code> сообщает 
MySQL об выводе только <code>rows</code> запросов начиная с позиции <code>offset</code>.</p>
<p class=text>Давайте вставим в таблицу <code>forums</code> несколько записей, чтобы потом на их примере выполнять различные варианты команды <code>SELECT</code>.</p>
<blockquote><pre>
mysql> INSERT INTO forums VALUES (1, 'Форум1', '', '', 1, 0);
mysql> INSERT INTO forums VALUES (2, 'Форум2', '', '', 2, 0);
mysql> INSERT INTO forums VALUES (3, 'Форум3', '', '', 3, 0);
mysql> INSERT INTO forums VALUES (4, 'Форум4', '', '', 4, 0);
mysql> INSERT INTO forums VALUES (5, 'Форум5', '', '', 5, 0);
</pre></blockquote>
<p class=text>Для того чтобы посмотреть всю таблицу <code>forums</code> выполняется следующий запрос:</p>
<blockquote><pre>
mysql> SELECT * FROM forums;
</pre></blockquote>
<p class=text>Выбираем все столбцы из таблицы forums без ограничений. Результат показан на рисунке:</p>
<img src="images/gl12_14.gif" tppabs="http://site/bookphp/images/gl12_14.gif" border="0" alt="">
<p class=text>Можно выбрать не все столбцы таблицы, а лишь часть, для этого необходимо явно задать список выбираемых столбцов:</p>
<blockquote><pre>
mysql> SELECT id_forum, name FROM forums;
</pre></blockquote>
<p class=text>В этом случае MySQL выведет лишь два столбца с первичным ключом <code>id_forum</code> и названием форума <code>name</code></p>
<img src="images/gl12_15.gif" tppabs="http://site/bookphp/images/gl12_15.gif" border="0" alt="">
<p class=text>Оператор <code>LIMIT</code> используется для ограничения количества строк, возвращенных командой <code>SELECT</code>. К примеру:</p>
<blockquote><pre>
mysql> SELECT * FROM forums LIMIT 3;
</pre></blockquote>
<p class=text>В результате этого запроса будет выведено только первые 3 записи из 5</p>
<img src="images/gl12_16.gif" tppabs="http://site/bookphp/images/gl12_16.gif" border="0" alt="">
<p class=text>Оператор <code>LIMIT</code> может также принимать два числовых аргумента, которые должны быть целыми числами. 
В этом случае последний аргумент задает максимальное количество возвращаемых строк, а первый сообщает MySQL 
начиная с какой по счёту строки производить отсчёт</p>
<blockquote><pre>
mysql> SELECT * FROM forums LIMIT 1,3;
</pre></blockquote>
<p class=text>В этом случае будут возвращены строки 2, 3 и 4</p>
<img src="images/gl12_17.gif" tppabs="http://site/bookphp/images/gl12_17.gif" border="0" alt="">
<p class=text>Оператор <code>WHERE</code> применяется в команде <code>SELECT</code> точно так же, как и в команде <code>DELETE</code>. Выберем из таблицы
 только те записи, у которых значение <code>id_forum</code> больше 2:</p>
<blockquote><pre>
mysql> SELECT * FROM forums WHERE id_forum > 2;<p class=text></p>
</pre></blockquote>
<p class=text>Результат показан на слудующем рисунке:</p>
<img src="images/gl12_18.gif" tppabs="http://site/bookphp/images/gl12_18.gif" border="0" alt="">
<p class=text>Порядок сортировки выводимых записей можно задавать при помощи оператора <code>ORDER BY:</code></p>
<blockquote><pre>
mysql> SELECT * FROM forums WHERE id_forum > 2 ORDER BY pos;
</pre></blockquote>
<p class=text>В этом запросе выводятся все записи со значением поля <code>id_forum</code> не меньше двух, которые при этом сортируются по значению поля pos. Результат такого запроса показан на рисунке:</p>
<img src="images/gl12_19.gif" tppabs="http://site/bookphp/images/gl12_19.gif" border="0" alt="">
<br>
<a name="11"></a>
<br>
<h2 class=p1>UPDATE</h2>
<blockquote><pre>
UPDATE table
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE definition]
    [LIMIT rows]
</pre></blockquote>
<p class=text>Команда <code>UPDATE</code> обновляет столбцы таблицы <code>table</code> в соответствии с их новыми значениями в строках 
существующей таблицы. В выражении <code>SET</code> указывается, какие именно столбцы следует модифицировать и какие величины 
должны быть в них установлены. В выражении <code>WHERE</code>, если оно присутствует, задается, какие строки подлежат обновлению. 
В остальных случаях обновляются все строки. Ключевое слово <code>LIMIT</code> позволяет ограничить число обновляемых строк.</p>
<p class=text>В следующим листинге разделу форума с первичным ключом 2 устанавливается новое название (PHP) и устанавливается атрибут <code>hide</code> равным 1, делая форум невидимым.</p>
<blockquote><pre>
UPDATE forums SET name='PHP', hide=1 WHERE id_forum=2;
</pre></blockquote>
<br>
<a name="12"></a>
<br>
<h2 class=p1>SHOW</h2>
<p class=text>С этой командой мы уже встречались ранее, когда выполняли запросы вида <code>show databases</code> и <code>show tables</code> для получения списка баз данных и таблиц в выбранной базе данных. Рассмотрим еще несколько вариантов использования этой команды.</p>
<p class=text>Вывести список всех столбцов выбранной таблицы можно при помощи следующего запроса:</p>
<blockquote><pre>
mysql> SHOW FIELDS FROM authors;
</pre></blockquote>
<p class=text>Результат приведен на следующем рисунке:</p>
<img src="images/gl12_20.gif" tppabs="http://site/bookphp/images/gl12_20.gif" border="0" alt="">
<p class=text>Можно также отобразить информацию обо всех индексах конкретной таблицы:</p>
<blockquote><pre>
mysql> SHOW INDEX FROM authors;
</pre></blockquote>
<p class=text>Выполнив команду <code>SHOW PROCESSLIST</code> можно увидеть список всех выполняющихся в системе запросов:</p>
<img src="images/gl12_21.gif" tppabs="http://site/bookphp/images/gl12_21.gif" border="0" alt="">
