SQL — урок 8 Примеры запросов с учетом особенностей MySQL

Программирование Базы данных SQL — урок 8 Примеры запросов с учетом особенностей MySQL

Помечено: , ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 1 месяц, 1 неделя назад.

  • Автор
    Сообщения
  • #5352
    @admin

    О чем поговорим?

    Выборка и вставка

    В MySQL не реализована привычная работа для SELECT INTO, если требуется создать новую таблицу как результат выборки необходимо писать запрос вида:

    CREATE TABLE NewTable SELECT * FROM players

    В MySQL конструкция SELECT INTO отрабатывает как вставка в существующую таблицу:

    CREATE TABLE CreatedTable (id int);
    INSERT INTO CreatedTable (id) select id from players;

    Limit (Ограничение выборки по количеству выдаваемых строк)

    Постраничный режим реализуется через LIMIT
    SELECT id FROM players LIMIT 5, 10;
    где: 5 — количество пропускаемых с начала строк, 10 — количество выбираемых строк
    Приведенный ниже пример вернет первые 5 строк, без пропуска какого-либо количества.
    SELECT id FROM players LIMIT 5;

    Конкатенация строк

    SELECT CONCAT(login,'-', clan_name) FROM players WHERE clan_name <> ''

    Результат:

    Sabio-SistersofMercy
    DEMON31-Sons ofdevil
    Экстра-Confederates
    Legendofgod-Sangrante
    Баргест-Restlesses

    GROUP_CONCAT

    — объединяет в одну несколько значений

    SELECT GROUP_CONCAT(login) from players WHERE id < 10;

    Результат:

    CtrlAltDelete,lolangel,Sabio,Витю Ты НашелЬ,ГоловУ-ТвоЮ-ШотоЛ,Джульета,Кошмар Рождества,смерть2476

    Тоже самое, но без GROUP_CONCAT
    SELECT (login) from players WHERE id < 10;

    Результат:

    CtrlAltDelete
    lolangel
    Sabio
    Витю Ты НашелЬ
    ГоловУ-ТвоЮ-ШотоЛ
    Джульета
    Кошмар Рождества
    смерть2476

    Работа со временем

    SELECT UNIX_TIMESTAMP(NOW()), FROM_UNIXTIME(1460632852)

    где: UNIX_TIMESTAMP — вернет время в виде числа (int), FROM_UNIXTIME — преобразует число в дату
    Результат:

    UNIX_TIMESTAMP FROM_UNIXTIME
    1460811566 14.04.2016 14:20:52

    Вставка в таблицы

    Создание таблицы как и везде:
    CREATE TABLE align (id int UNIQUE, title varchar(25));

    Вставка единичной записи
    INSERT INTO align (id,title) VALUES (10,'dark');

    Одновременная вставка нескольких строк
    INSERT INTO align (id, title) values (20,'light'), (30, 'chaos'), (40, 'neutral');

    Вставка записи, но в случае наличия дубля по ключу обновление записи
    INSERT INTO align (id, title) VALUES (40,'order') ON DUPLICATE KEY UPDATE title = 'order'

    Интересный вариант вставки с IGNORE
    INSERT IGNORE INTO align (id,title) VALUES (10,'dark');

    Использование такого способа вставки устраняет проблему наличия дубликатов во вставляемых данных. При вставке обычным способом и наличии дублей вставка данных будет прекращена, при использовании IGNORE вставка продолжится, дублирующие уникальные данные будут пропущены.

    UPDATE

    Обновить title таблицы tmp значениями из таблицы align где совпадают id (реализация схемы UPDATE FROM SELECT)
    UPDATE tmp AS t INNER JOIN align AS a ON t.id = a.id SET t.title = a.title

    Обновление поля значением вложенного запроса
    UPDATE tmp SET title = (SELECT title FROM align LIMIT 1) WHERE id = 10

    Обновление поля вычисляемым значением из подзапроса
    UPDATE sections AS s INNER JOIN (SELECT COUNT(id) cnt, section_id FROM images_list GROUP BY section_id) AS i ON s.id = i.section_id SET s.amount = i.cnt

    Прочее

    Базовая работа метода Like как и везде:
    SELECT id, login FROM players WHERE login LIKE '%дед%';
    Результат

    id login
    2661 Боевой Дед
    2558 Дед с Веслом

    GROUP BY + HAVING

    Вывести все кланы, где количество людей больше 5
    SELECT clan_name, COUNT(id) FROM players WHERE clan_name <> '' GROUP BY clan_name HAVING COUNT(id) > 5

    Результат:

    clan_name COUNT(id)
    Burning Angels 6
    NiNo 6
    Orden des Kreuzes 6
    Order Angels 7

    LEFT JOIN

    Вывести первые 10 записей (ид, логин, имя склонности) из таблицы персонажей и связанной с ней таблицы склонностей
    SELECT p.id,p.login,a.title FROM players AS p LEFT JOIN align AS a ON p.align = a.id order by login LIMIT 10

    Результат

    id login title
    942 A N Owen chaos
    1513 Ace HooD chaos
    862 Acheront dark
    836 Afone4ka (null)
    914 Agent Smith dark
    757 Agrael (null)
    2691 Air Wick chaos
    842 Aking light
    48 Alice2007 (null)
    908 AllTiger order

    DISTINCT

    Выбрать все уникальные названия кланов из таблицы players:
    SELECT DISTINCT clan_name FROM players p

    Результат:

    SistersofMercy
    Sons ofdevil
    Confederates
    Sangrante
    Restlesses
    TERMITE

Для ответа в этой теме необходимо авторизоваться.