click fraud protection
В некоторых случаях нам может потребоваться объединить значения из нескольких столбцов, чтобы сформировать одно строковое значение. Например, мы можем объединить значения из столбцов FirstName, MiddleInitial и LastName, чтобы создать столбец, содержащий полные имена.
В этой статье мы рассмотрим различные методы объединения значений из столбцов в одно строковое значение.
Метод 1 – Плюс Оператор
Первый метод объединения значений в SQL Server — использование оператора «плюс». Он берет предоставленные строки и объединяет их, чтобы сформировать один строковый литерал.
Упрощенный пример показан ниже:
ВЫБИРАТЬ «Линукс» + ‘Намекать’ КАК РЕЗУЛЬТАТ ;
Приведенный выше запрос берет первую строку и объединяет ее со второй, чтобы получить одно строковое значение, как показано ниже:
LinuxПодсказка
( 1 РЯД затронутый )
Оператор плюс принимает более двух строковых литералов. Например:
Фрагмент выше должен ВОЗВРАЩАТЬСЯ :
Добро пожаловать: LinuxHint
( 1 РЯД затронутый )
Вы также можете использовать оператор «плюс» для объединения значений столбца. Например, рассмотрим таблицу, в которой у нас есть таблица со столбцами FirstName, MiddleInitial и LastName.

Мы можем использовать оператор «плюс» для создания имен пользователей на основе столбцов MiddleInitial и LastName.
Рассмотрим пример запроса, показанный ниже:
ВЫБИРАТЬ вершина 10 *, ( Второй инициал + ‘.’ + Фамилия ) имена пользователей ОТ Клиенты ГДЕ Второй инициал ЯВЛЯЕТСЯ НЕТ НУЛЕВОЙ ;
Приведенный выше пример запроса возвращает результат в виде:

Используя оператор «плюс», мы объединяем значения различных столбцов, чтобы получить одно строковое значение.
Метод 2 — функция SQL Server Concat()
SQL Server также предоставляет функцию для замены оператора плюс. Concat позволяет объединить две строки или значения столбца, чтобы сформировать один строковый литерал.
Рассмотрим приведенный ниже пример, в котором функция concat используется для замены предыдущей операции.
ВЫБИРАТЬ вершина 10 *, конкат ( Второй инициал , ‘.’ , Фамилия ) имена пользователей ОТ Клиенты ГДЕ Второй инициал ЯВЛЯЕТСЯ НЕТ НУЛЕВОЙ ;
Приведенный выше запрос должен вернуть аналогичный результат:

Закрытие
В этой статье мы рассмотрели два основных способа объединения строковых литералов или значений в столбцах таблицы.
Как объединить несколько столбцов в один sql
Оператор UNION подобно inner join или outer join позволяет соединить две таблицы. Но в отличие от inner/outer join объединения соединяют не столбцы разных таблиц, а два однотипных набора в один. Формальный синтаксис объединения:
Например, пусть в базе данных будут две отдельные таблицы для клиентов банка (таблица Customers) и для сотрудников банка (таблица Employees):
Здесь мы можем заметить, что обе таблицы, несмотря на наличие различных данных, могут характеризоваться двумя общими атрибутами — именем (FirstName) и фамилией (LastName). Выберем сразу всех клиентов банка и его сотрудников из обеих таблиц:
В данном случае из первой таблицы выбираются два значения — имя и фамилия клиента. Из второй таблицы Employees также выбираются два значения — имя и фамилия сотрудников. То есть при объединении количество выбираемых столбцов и их тип совпадают для обеих выборок.

При этом названия столбцов объединенной выборки будут совпадать с названия столбцов первой выборки. И если мы захотим при этом еще произвести сортировку, то в выражениях ORDER BY необходимо ориентироваться именно на названия столбцов первой выборки:
В данном случае каждая выборка имеет по одному столбцу, который представляет объединение имени и фамилии клиента или сотрудника. Но в случае с клиентами столбец будет называться FullName, а в случае с сотрудниками — EmployeeName. Тем не менее для сортировки применяется название столбца из первой выборки и он же будет в результирующей выборке:

Если же в одной выборке больше столбцов, чем в другой, то они не смогут быть объединены. Например, в следующем случае объединение завершится с ошибкой:
Также соответствующие столбцы должны соответствовать по типу. Так, следующий пример завершится с ошибкой из-за не соответствия по типу данных:
В данном случае первый столбец первой выборки имеет тип NVARCHAR, то есть хранит строку. Первый столбец второй выборки — Id имеет тип INT, то есть хранит число.
Если оба объединяемых набора содержат в строках идентичные значения, то при объединении повторяющиеся строки удаляются. Например, в случае с таблицами Customers и Employees сотрудники банка могут быть одновременно его клиентами и содержаться в обеих таблицах. При объединении в примерах выше всех дублирующиеся строки удалялись. Если же необходимо при объединении сохранить все, в том числе повторяющиеся строки, то для этого необходимо использовать оператор ALL :

Объединять выборки можно и из одной и той же таблицы. Например, в зависимости от суммы на счете клиента нам надо начислять ему определенные проценты:
В данном случае если сумма меньше 3000, то начисляются проценты в размере 10% от суммы на счете. Если на счете больше 3000, то проценты увеличиваются до 30%.
SQL углубимся
Продолжим знакомиться с SQL. Здесь я собрал некоторые возможности языка, которые я не стал включать в базовый SQL и оставил на будущее.
сортировка по номеру колонки
Для сортировки мы раньше использовали имена колонок и это в принципе работает и очень даже наглядно, но иногда бывает удобно просто сказать номер колонки – первая, вторая или любая другая. Это можно делать, просто вместо имени колонки в order by указываем порядковый номер колонки:
Я иногда использую это в своих тестах или когда просто нужно выполнить запрос, но при программировании в коде я чаще все же использую нормальные имена. Порядковый номер не самое надежное решение.
limit
В таблице может находиться сразу миллионы записей и если выполнить команду
то в результате просто чтение всех записей займет очень много времени. Если каждая запись занимает 100 байт (это не так много), и мы будем вытаскивать миллион таких записей, то придется скопировать с сервера примерно 100 мегабайт. Примерно, потому что в мегабайте чуть больше миллиона.
Мы можем ограничить количество записей с помощью слова limit, после которого можно указать количество записей:
В данном случае я попросил ограничить результат 5-ю записями. Результат такой:
Если limit указать два числа, то первое число будет указывать на то, сколько записей нужно пропустить, а потом сколько отобразить. То есть чтобы отобразить пять строк, начиная с третей, мы должны указать 2 и 5 – пропустить 2 и потом отобразить 5:
С помощью limit у меня на сайте реализованы страницы. На каждой странице у меня на блоге отображается 10 записей. Чтобы отобразить 5-ю страницу, нужно пропустить 40 строк и отобразить начиная с 41-й по 50-ю. Чтобы сделать это нужно выполнить запрос:
уникальность данных
Иногда бывает удобно отображать уникальные данные. Давайте добавим в таблице две одинаковые записи:
Теперь посмотрим на содержимое таблицы:
Две последних строки практически одинаковы и очень часто это не то, что вы хотите видеть в результате. Допустим, что мы хотим увидеть уникальные записи и избавиться от дубликатов. Для этого существует слово distinct, которое нужно добавить после SELECT, но если просто его добавить, то оно не сработает. Попробуем:
Дело в том, что уникальность ищется по всем отображаемым колонкам, а первая колонка у обоих Майков разная, поэтому от дубликата мы не избавились. А вот если перечислить только колонки имени, фамилии, телефона, то мы получим нужный результат:
У нас теперь только один Mike и на одну строку меньше. А если вы хотите увидеть только уникальные имена:
Результат сократился еще на одну строку, потому что теперь у нас только один Mike и только один John. У Джонов разные фамилии, поэтому в прошлый раз мы видели их обоих.
сложение колонок
К сожалению, у меня нет хороших колонок с числами в таблице телефонов, есть только phoneid и cityid. Это идентификаторы, но они все же числа, поэтому мы можем их сложить математически с помощью + записав это как phoneid + cityid:
Смысла особо в третей колонке нет, это просто числа, но результат все же виден.
Вы можете выполнять и другие математические операции, такие как минус -, умножить * или разделить /.
Намного интереснее было бы объединить Имя и Фамилию в одну колонку. В записимости от базы данных это можно сделать плюсом, как в математике:
Когда все колонки строковые, то SQL Server будет объединять строки в одну. MySQL предпочитает вместо этого функцию CONCAT(колонка1, колонка2. ). В круглых скобках через запятую перечисляются колонки, которые вы захотите объединить. Тут могут быть не только колонки, но и какие-то строки, ведь чтобы объединить имя и фамилию между ними еще нужно добавить пробел concat(FirstName, ‘ ‘, LastName), здесь в скобках у CONCAT три значения – колонка FirstName, пробел, и LastName.
Полный SQL запрос будет выглядеть так:
А результат будет таким:
Всего одна колонка и в ней имя и фамилия разделены пробелом.
псевдонимы
Возможно, вы пока не ощутите всего кайфа от псевдонимов, но уже в следующей части вы увидите, что это действительно необходимо.
Вы можете создавать псевдонимы для колонок. Когда мы объединили имя и фамилию в одну колонку, то была создана как бы виртуальная колонка, которой не существует в базе данных. Какое имя у этой виртуальной колонки? Его нет и поэтому в заголовке мы видим математическую операцию, которую выполняли:
Далеко не самое лучшее имя, поэтому было бы круто иметь возможность задать своё имя и это возможно. После имени можно указать слово as и потом псевдоним, который вы хотите увидеть в заголовке колонки. Так как мы отображаем полное имя, то этой колонке можно дать псевдоним FullName:
Две магические буквы as указывать не обязательно, но рекомендуется, просто с эстетической точки зрения красивее.
Обратите внимание, что изменилось имя в заголовке:
Когда мы перечисляем колонки после слова SELECT, мы просто указывали имена, но если быть боле хе аккуратным, то мы должны указывать перед именем колонки имя таблицы, из которой мы хотим увидеть данные. Так что перед именем колонки мы теоретически должны были бы указывать имя таблица phone:
У нас одна таблица в запросе, поэтому MySQL и любая другая база данных без проблем могут догадаться, что колонки имени и фамилии будут как раз из таблицы phone.
В тех случаях (а мы их рассмотрим скоро), когда мы обязаны указать имя таблицы перед именами колонок мы можем использовать псевдонимы. После имени таблицы в секции FROM можно дать таблице phone псевдоним в виде одной буквы p, и теперь использовать псевдоним и перед именами колонок ставить именно его:
Одна буква – это на много проще, чем писать все имя таблицы.
Всегда ли мы должны использовать именно букву P? Нет, вы можете выбирать любую букву, просто чаще всего берут именно ту, с которой начинается имя таблицы. Для таблицы городов можно было бы выбрать псевдоним – букву С, а можете любую другую.
Как объединить два текстовых столбца в один?
Есть две таблицы, состоящие из столбцов:
id, sDate, title
id,sDate,message
имеющие одинаковые типы данных:
Int, timestamp, text
Если объединять по id или sDate, используя запрос
SELECT sDate as t FROM `tb1`
UNION ALL SELECT sDate as t FROM `tb2`
то все проходит нормально
Если объединять по title,message, используя запрос
SELECT title as t FROM `tb1`
UNION ALL SELECT message as t FROM `tb2`
то выскакивает ошибка «#1271 — Illegal mix of collations for operation ‘UNION'»
Теперь вопрос — как все-таки объединить два текстовых столбца из разных таблиц в один?