Пишем на PHP
Прежде, чем переходить к следующему классу (utils), я предлагаю вам совершить небольшой экскурс в язык запросов SQL.
Это необходимо по двум причинам. Во-первых, не хочу, чтобы вы смотрели на SQL-фрагменты последующих скриптов как парнокопытные животные на только что построенное заградительное сооружение. А во-вторых, мне хочется донести до вас красоту этого языка, скрытую в его простоте и "человечности".
Что такое база данных? Это хранилище информации. Структурированное хранилище. В базе данных можно хранить любой тип информации: от цифр до видеороликов.
А все запросы к базе данных можно разделить на три основные группы:
Создание/изменение структуры БД
Добавление/изменение информации в БД
Получение отчетов/выборок из БД
Как создаются таблицы мы уже видели. На этом этапе я останавливаться не буду, ибо тут ничего интересного нет. Как и стандартного. В разных БД создание таблиц, функций и индексации может производиться по-разному. Это не так важно.
Мы остановимся на двух других группах.
Добавление, изменение, удаление информации производится почти человеческим языком. Поэтому все команды SQL так легко запомнить.
Предположим, у нас есть таблица books (книги), в которой мы храним информацию о своей домашней библиотеке.
Для этого мы создали таблицу books в следующем виде:
где book_id -- порядковый номер книги (создает автоматически, при добавлении новой записи в таблицу, путем прибавления единицы к внутреннему счетчику), book_name -- автор и название книги, book_date -- дата (и время) приобретения книги. А book_comm -- свободный комментарий до двухсот символов. Например, мы можем в это поле записывать имя человека, взявшего у нас книгу, или интересную подробность, связанную с ее приобретением.
Давайте перейдем непосредственно к добавлению информации.
Нам надо добавить в нашу электронную библиотеку книгу "Алексей Толстой. 'Золотой ключик или приключения Буратино'".
Как бы мы это сделали, если бы база данных управлялась человеческим голосом?
Наверное, что-то вроде: "добавить в таблицу КНИГИ название и дату покупки: А. Толстой. 'Золотой ключик...', 27-е августа 2001 года".
Вот мы так и запишем, а SQL с удовольствием нас поймет. Только по-английски.
insert into books(book_name, book_date) values("А.Толстой. 'Золотой ключик или приключения Буратино'","2001-08-27 00:00:00");
Вот так. Почти по-человечески.
Следующей книгой для контраста добавим "А.Платонов. 'Котлован'", неизвестно когда подаренную нам любимым преподавателем.
insert into books (book_name, book_comm) values("А.Платонов. 'Котлован'", "Подарена Пустоваловым Петром Семеновичем");
Ну и еще одну...
insert into books(book_name) values('Поваренная книга');
Вот так. Теперь у нас в базе есть аж три книги. Попробуем в этом убедиться?
Как мы попросим нашу базу выбрать нам все, что в ней есть, без каких-либо условий?
По-русски это бы могло звучать так: "Выбери все из таблицы книг".
Так и напишем (звездочкой в SQL обозначается любой набор параметров, символов и прочего, как почти во всем компьютерном):
select * from books;
И получаем список наших книг. Я не буду приводить тут полностью ответ MySQL, т.к. слишком широкая табличка получилась.
Мы сейчас это подправим. Попросим выбрать только названия книг:
select book_name from books;
Понятно, не так ли?
А теперь присовокупим их порядковые номера:
select book_id, book_name from books;
Вот так просто.
Теперь давайте попросим нашу понятливую БД выдать нам книгу под номером 2:
select book_id, book_name from books where book_id=2;
Ты смотри, нашел!
А если мы хотим все книги от номера 2 и больше?
select book_id, book_name from books where book_id>1;
Нате!
Ну хорошо, давайте зададим в запросе что-нибудь похитрее. Например, нам нужна книга, которую мы купили на днях, но не помним про нее буквально ничего.
Для этого так и попросим:
select book_id, book_name from books where book_date between subdate(now(), interval 3 day) and now();
Поясню.
Зарезервированное слово between используется тут дословно -- "между".
Функция now() дает текущую дату и время.
Функция subdate уменьшает указанную дату на указанный период времени.
Т.е. по-русски наш запрос звучал: "выбрать номер книги и название из базы книги, где дата книги находится между датой трехдневной давности и текущей датой".
И что же нам выдала база?
select book_id, book_name from books where book_date between subdate(now(), interval 3 day) and now();
Как в сказке!
Еще один примерчик хочу продемонстрировать. Попробуйте понять его сами, без подсказок.
select book_name from books where book_name like "%Толстой%";
Это необходимо по двум причинам. Во-первых, не хочу, чтобы вы смотрели на SQL-фрагменты последующих скриптов как парнокопытные животные на только что построенное заградительное сооружение. А во-вторых, мне хочется донести до вас красоту этого языка, скрытую в его простоте и "человечности".
Что такое база данных? Это хранилище информации. Структурированное хранилище. В базе данных можно хранить любой тип информации: от цифр до видеороликов.
А все запросы к базе данных можно разделить на три основные группы:
Как создаются таблицы мы уже видели. На этом этапе я останавливаться не буду, ибо тут ничего интересного нет. Как и стандартного. В разных БД создание таблиц, функций и индексации может производиться по-разному. Это не так важно.
Мы остановимся на двух других группах.
Добавление, изменение, удаление информации производится почти человеческим языком. Поэтому все команды SQL так легко запомнить.
Предположим, у нас есть таблица books (книги), в которой мы храним информацию о своей домашней библиотеке.
Для этого мы создали таблицу books в следующем виде:
create table books( book_id bigint not null auto_increment primary key, book_name varchar(100) not null default "", book_date datetime not null, book_comm varchar(200) not null default "" );
где book_id -- порядковый номер книги (создает автоматически, при добавлении новой записи в таблицу, путем прибавления единицы к внутреннему счетчику), book_name -- автор и название книги, book_date -- дата (и время) приобретения книги. А book_comm -- свободный комментарий до двухсот символов. Например, мы можем в это поле записывать имя человека, взявшего у нас книгу, или интересную подробность, связанную с ее приобретением.
Давайте перейдем непосредственно к добавлению информации.
По-хорошему, надо было создать как минимум две таблицы: для книг и для авторов. И связать их внешним ключом для целостности. Но сейчас наша задача состоит в ином, поэтому простите мне мой топорный подход.
Нам надо добавить в нашу электронную библиотеку книгу "Алексей Толстой. 'Золотой ключик или приключения Буратино'".
Как бы мы это сделали, если бы база данных управлялась человеческим голосом?
Наверное, что-то вроде: "добавить в таблицу КНИГИ название и дату покупки: А. Толстой. 'Золотой ключик...', 27-е августа 2001 года".
Вот мы так и запишем, а SQL с удовольствием нас поймет. Только по-английски.
insert into books(book_name, book_date) values("А.Толстой. 'Золотой ключик или приключения Буратино'","2001-08-27 00:00:00");
Вот так. Почти по-человечески.
Следующей книгой для контраста добавим "А.Платонов. 'Котлован'", неизвестно когда подаренную нам любимым преподавателем.
insert into books (book_name, book_comm) values("А.Платонов. 'Котлован'", "Подарена Пустоваловым Петром Семеновичем");
Ну и еще одну...
insert into books(book_name) values('Поваренная книга');
Вот так. Теперь у нас в базе есть аж три книги. Попробуем в этом убедиться?
Как мы попросим нашу базу выбрать нам все, что в ней есть, без каких-либо условий?
По-русски это бы могло звучать так: "Выбери все из таблицы книг".
Так и напишем (звездочкой в SQL обозначается любой набор параметров, символов и прочего, как почти во всем компьютерном):
select * from books;
И получаем список наших книг. Я не буду приводить тут полностью ответ MySQL, т.к. слишком широкая табличка получилась.
Мы сейчас это подправим. Попросим выбрать только названия книг:
select book_name from books;
+------------------------------------------------------+ | book_name | +------------------------------------------------------+ | А.Толстой. 'Золотой ключик или приключения Буратино' | | А.Платонов. 'Котлован' | | Поваренная книга | +------------------------------------------------------+ 3 rows in set (0.00 sec)
Понятно, не так ли?
А теперь присовокупим их порядковые номера:
select book_id, book_name from books;
+---------+------------------------------------------------------+ | book_id | book_name | +---------+------------------------------------------------------+ | 1 | А.Толстой. 'Золотой ключик или приключения Буратино' | | 2 | А.Платонов. 'Котлован' | | 3 | Поваренная книга | +---------+------------------------------------------------------+ 3 rows in set (0.01 sec)
Вот так просто.
Теперь давайте попросим нашу понятливую БД выдать нам книгу под номером 2:
select book_id, book_name from books where book_id=2;
+---------+----------------------+ | book_id | book_name | +---------+----------------------+ | 2 | А.Платонов. 'Котлован' | +---------+----------------------+ 1 row in set (0.01 sec)
Ты смотри, нашел!
А если мы хотим все книги от номера 2 и больше?
select book_id, book_name from books where book_id>1;
+---------+------------------------+ | book_id | book_name | +---------+------------------------+ | 2 | А.Платонов. 'Котлован' | | 3 | Поваренная книга | +---------+------------------------+ 2 rows in set (0.00 sec)
Нате!
Ну хорошо, давайте зададим в запросе что-нибудь похитрее. Например, нам нужна книга, которую мы купили на днях, но не помним про нее буквально ничего.
Для этого так и попросим:
select book_id, book_name from books where book_date between subdate(now(), interval 3 day) and now();
Поясню.
Зарезервированное слово between используется тут дословно -- "между".
Функция now() дает текущую дату и время.
Функция subdate уменьшает указанную дату на указанный период времени.
Т.е. по-русски наш запрос звучал: "выбрать номер книги и название из базы книги, где дата книги находится между датой трехдневной давности и текущей датой".
И что же нам выдала база?
select book_id, book_name from books where book_date between subdate(now(), interval 3 day) and now();
+---------+------------------------------------------------------+ | book_id | book_name | +---------+------------------------------------------------------+ | 1 | А.Толстой. 'Золотой ключик или приключения Буратино' | +---------+------------------------------------------------------+ 1 row in set (0.01 sec)
Как в сказке!
Еще один примерчик хочу продемонстрировать. Попробуйте понять его сами, без подсказок.
select book_name from books where book_name like "%Толстой%";
+------------------------------------------------------+ | book_name | +------------------------------------------------------+ | А.Толстой. 'Золотой ключик или приключения Буратино' | +------------------------------------------------------+ 1 row in set (0.01 sec)