Для получения полного доступа
зарегистрируйтесь.

Раздел:
Подраздел:
Языки:


samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Задача: выбрать новости с id = [2, 10, 3, 88, 23] соблюдая порядок.

SELECT *
FROM news
WHERE id IN (2, 10, 3, 88, 23)
ORDER BY FIELD (id, 2, 10, 3, 88, 23)
samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Запрос позволяет эффективно выбрать 10 последних комментариев, максимум по одному на пост.

SELECT *
FROM comment c1
LEFT JOIN comment c2 ON c1.id < c2.id AND c1.post_id = c2.post_id
WHERE c2.id IS NULL
ORDER BY c1.id DESC
LIMIT 10
Gravatar image
evgenmil
  • Репутация: 10
  • Сниппеты: 1
  • Ревизии: 0

Находит дублирующие записи в таблице

SELECT * 
FROM `users` 
WHERE CONCAT( `users`.`name` , `users`.`surname` ) 
IN (
    SELECT CONCAT( `users`.`name` , `users`.`surname` ) AS x
    FROM `users`
    GROUP BY x
    HAVING COUNT(x) >1
)
LIMIT 0 , 30 
Gravatar image
graid2030
  • Репутация: 6
  • Сниппеты: 1
  • Ревизии: 0

Конвертация при хранении дат в int'овом формате туда и обратно.

-- Из числа в timestamp (2013-12-15 17:26:25+04)
SELECT to_timestamp(1387113985);
-- Из числа в дату (2013-12-15)
SELECT to_timestamp(1387113985)::date;
-- Из числа в произвольный формат (2013\12\15 17:26:25)
SELECT to_char(to_timestamp(1387113985), 'YYYY\MM\DD HH24:MI:SS');

-- Из timestamp с учетом временной зоны в число (1387128385)
SELECT EXTRACT(EPOCH FROM '2013-12-15 17:26:25+04' at time zone 'Europe/Moscow')::int;
samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Полезно, когда долго не можешь понять, почему же вдруг не срабатывают внешние ограничения. Да и просто полезно.

SELECT TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='my_db_name'
AND TABLE_TYPE='BASE TABLE'
AND ENGINE IN ('MARIA','MyISAM')
jestonedev
  • Репутация: 99
  • Сниппеты: 11
  • Ревизии: 1

Даже если вы не работали с MS SQL Server, для вас не будет неожиданностью тот факт, что план выполнения хранимой процедуры (и не только ее) вычисляется лишь однажды, после чего он кешируется и используется со всеми последующими входными параметрами. Обычно это поведение - это то, чего мы ожидаем. Но иногда такое поведение приводит к тому, что план запроса, являющийся оптимальным для изначальных параметров, может оказаться не оптимальным для другого набора параметров. Как решить подобную проблему?

-- Исходная хранимая процедура
ALTER PROCEDURE [dbo].[usp_contrysearch]
@country varchar(80)
AS
SELECT p.lastname, p.dob, p.sex, c.country
FROM people p join country c
ON p.personid = c.personid
WHERE c.country = @country
GO

-- ------------------
-- 1 вариант: Использование DBCC FREEPROCCACHE
-- Выполнение этой инструкции каждый раз будет очищать кеш планов запросов.
-- Эта инструкция не очищает план нативно-скомпилированных хранимых процедур.
-- Подробнее о синтаксисе можно почитать по ссылке:
-- https://msdn.microsoft.com/en-us/library/ms174283.aspx
DBCC FREEPROCCACHE
GO
EXEC usp_countrysearch 'UK'

-- ------------------
-- 2 вариант: Использование опции WITH RECOMPILE команды EXEC.
-- При каждом запуске хранимой процедуры с данной опцией будет производиться перекомпиляция:
EXEC usp_contrysearch 'UK' WITH RECOMPILE
GO

-- ------------------
-- 3 вариант: Использование опции RECOMPILE при создании хранимой процедуры,
-- после чего все запросы на исполнение будут приводить к ее принудительной перекомпиляции 
-- (даже без указания EXEC WITH RECOMPILE):
ALTER PROCEDURE [dbo].[usp_contrysearch]
@country varchar(80)
AS
SELECT p.lastname, p.dob, p.sex, c.country
FROM people p join country c
ON p.personid = c.personid
WHERE c.country = @country
OPTION (RECOMPILE)
GO

-- ------------------
-- 4 вариант: Строго говоря, этот вариант не относится к принудительной перекомпиляции. 
-- Это вариант предварительной оптимизации, но я о нем все равно упомяну.
-- Если мы имеем известный набор планов для хранимой процедуры
-- и набор значений входных параметров для каждого из них, то мы можем выбрать наиболее оптимальный 
-- и скомпилировать хранимую процедуру так, чтобы всегда использовался этот план:
ALTER PROCEDURE [dbo].[usp_contrysearch]
@country varchar(80)
AS
SELECT p.lastname, p.dob, p.sex, c.country
FROM people p join country c
ON p.personid = c.personid
WHERE c.country = @country
OPTION (OPTIMIZE FOR (@country = 'UK')) 
-- теперь для любых входных параметров будет использоаться план как для @country = 'UK'
GO
bamburillo
  • Репутация: 6
  • Сниппеты: 1
  • Ревизии: 0
SELECT * ,
    DATE_ADD(
        birthday, 
        INTERVAL IF(DAYOFYEAR(birthday) >= DAYOFYEAR(CURDATE()),
            YEAR(CURDATE())-YEAR(birthday),
            YEAR(CURDATE())-YEAR(birthday)+1
        ) YEAR
    ) AS `next_birthday`  
FROM `users` 
WHERE 
    `birthday` IS NOT NULL
ORDER BY DATEDIFF(CURDATE(), `next_birthday`) DESC
Gravatar image
Nepster
  • Репутация: 151
  • Сниппеты: 19
  • Ревизии: 0

SQL запрос осуществляет сортировку по возрастанию и при этом нули будут в конце.

SELECT * FROM `table` ORDER BY CASE WHEN `field_name`=0 THEN 1 ELSE 0 END, `field_name`;
Gravatar image
isxaker
  • Репутация: 8
  • Сниппеты: 4
  • Ревизии: 0

If you need to return just created row fully

INSERT INTO MyTable(ID, Price, Count)
OUTPUT INSERTED.*
VALUES ('777', '1000', '10')
Just a cat
  • Репутация: 62
  • Сниппеты: 15
  • Ревизии: 0
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST ORDER BY `TIME` DESC;