Разработка сайтов, создание сайтов
главная / MySQL / Язык SQL

Язык SQL

Я предлагаю вам совершить небольшой экскурс в язык запросов SQL.

Это необходимо по двум причинам. Во-первых, не хочу, чтобы вы смотрели на 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)



    Источник: kurepin.ru
    текущее:

    НОВОСТИ

    2011 г., «VisMech.ru»