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

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

Помечено: , ,

  • В этой теме 0 ответов, 1 участник, последнее обновление 1 год, 5 месяцев назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #5352
      @admin
      StudLance.ru

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

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

      В 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

      StudLance.ru

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