Я рекомендую вам начать с изучения некоторых руководств по этой теме. Ваши вопросы не являются редкими вопросами для тех, кто переходит с SQL на начинающий на средний уровень. SQLZoo является отличным ресурсом для изучения SQL, поэтому подумайте о следующем.
В ответ на ваши вопросы:
1) Найти все записи с дубликатом в определенном столбце
Здесь есть два шага: найти дубликаты записей и выбрать эти записи. Чтобы найти дубликаты записей, вы должны делать что-то вроде:
select possible_duplicate_field, count(*)
from table
group by possible_duplicate_field
having count(*) > 1
Здесь мы выбираем все из таблицы, затем группируем ее по полю, которое мы хотим проверить на наличие дубликатов. Затем функция подсчета подсчитывает количество элементов в этой группе. Предложение HAVING указывает, что мы хотим отфильтровать ПОСЛЕ группировки, чтобы показать только группы, которые имеют более одной записи.
Само по себе это хорошо, но не дает реальных записей, в которых есть эти значения. Если бы вы знали повторяющиеся значения, вы бы написали:
select * from table where possible_duplicate_field = 'known_duplicate_value'
Мы можем использовать SELECT внутри выбора, чтобы получить список совпадений:
select *
from table
where possible_duplicate_field in (
select possible_duplicate_field
from table
group by possible_duplicate_field
having count(*) > 1
)
2) Сумма SUM из связанной таблицы в том же запросе
Это простое соединение между двумя таблицами с суммой двух:
select sum(tableA.X + tableB.Y)
from tableA
join tableB on tableA.keyA = tableB.keyB
То, что вы делаете здесь - это объединение двух таблиц, где эти две таблицы связаны ключевым полем. В этом случае это естественное объединение, которое работает так, как вы ожидаете (т.е. получите все из левой таблицы, в которой есть соответствующая запись в правой таблице).
3) Объясните разницу между 4 соединениями; ВЛЕВО, ПРАВО, НАРУЖНЫЙ, ВНУТРЕННИЙ
Рассмотрим две таблицы A и B. Понятия «LEFT» и «RIGHT» в этом случае немного понятнее, если вы читаете SQL слева направо. Итак, когда я говорю:
select x from A join B ...
Левая таблица - «А», а правая - «В». Теперь, когда вы явно говорите «LEFT» в SQL-выражении, вы объявляете, какая из двух таблиц, к которым вы присоединяетесь, является основной. Под этим я подразумеваю следующее: какую таблицу я сначала сканирую? Кстати, если вы опустите LEFT или RIGHT, то SQL неявно использует LEFT.
Для INNER и OUTER вы заявляете, что делать, если совпадений не существует ни в одной из таблиц. INNER заявляет, что вы хотите, чтобы все в первичной таблице (как объявлено с использованием LEFT или RIGHT), где есть соответствующая запись во вторичной таблице. Следовательно, если первичная таблица содержит ключи «X», «Y» и «Z», а вторичная таблица содержит ключи «X» и «Z», то INNER будет возвращать только записи «X» и «Z» из две таблицы.
Когда используется OUTER, мы говорим: дай мне все из первичной таблицы и все, что совпадает со вторичной таблицей. Следовательно, в предыдущем примере мы получили бы записи «X», «Y» и «Z» в наборе выходных записей. Однако в полях должны быть значения NULL, которые должны были быть получены из вторичной таблицы для значения ключа "Y", поскольку он не существует во вторичной таблице.
4) Копировать данные из одной таблицы в другую на основе критериев SELECT и WHERE
Это довольно тривиально, и я удивлен, что вы никогда не сталкивались с этим. Это простой вложенный оператор SELECT в операторе INSERT (это может не поддерживаться вашей базой данных - если нет, попробуйте следующий вариант):
insert into new_table select * from old_table where x = y
Предполагается, что таблицы имеют одинаковую структуру. Если у вас разные структуры, вам нужно указать столбцы:
insert into new_table (list, of, fields)
select list, of, fields from old_table where x = y