Вывод своего столбца в SQL Server
Подскажите, пожалуйста, как в SQL можно вывести столбик, включающий в себя заданное количество строк со своим текстом (текст должен быть статическим). Поясню, необходимо чтобы слева от столбца (см. скриншот) появился ещё один столбец в котором были 4 строчки с пояснениями к каждой цифре:
Заранее благодарен! UPD: Надо что-то наподобие как на скрине ниже, только текст в каждой строчке свой. Тут вывел просто через (SELECT ‘Один’), но таким способом не получается вывести более 1 разного текста, т.е. (SELECT (‘Один’, ‘Два’, ‘Три’, ‘Четыре’)) не работает
UPD 2: Вот, то, что должно получиться на выходе — нарисовал в пейнте. Проблема в том, что первый столбец надо сделать на SQL. Текст Один, Два, Три, Четыре должен быть в самом запросе. 
Отслеживать
задан 12 июл 2013 в 9:02
528 2 2 золотых знака 11 11 серебряных знаков 25 25 бронзовых знаков
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Во-первых объясните по-человечески как у вас устроена таблица, желательно в виде SQL. Во-вторых объясните чего вы в конечном итоге хотите добиться, что бы из этой таблицы просто выбирались две строки, это просто:
SELECT column1, clomun2 FROM table LIMIT n;
Если вы хотите, что бы у вас значения выбирались из разных таблиц, в этом тоже нет ничего сложного:
SELECT table1.column, table2.column1 FROM table1, table2
И наконец, если вы хотите просто дописать несколько слов на вывод, зачем тут лепить SQL я не знаю.
Как вывести столбец из таблицы sql
Если строки целиком вам не нужны, достаточно просто перечислить имена нужных столбцов, разделив их запятыми. Например, если вы хотите узнать, когда родились животные, выберите столбцы с именами и датами рождения:
mysql> SELECT name, birth FROM pet; +----------+------------+ | name | birth | +----------+------------+ | Fluffy | 1993-02-04 | | Claws | 1994-03-17 | | Buffy | 1989-05-13 | | Fang | 1990-08-27 | | Bowser | 1989-08-31 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | | Slim | 1996-04-29 | | Puffball | 1999-03-30 | +----------+------------+
Получить имена владельцев животных можно с помощью следующего запроса:
mysql> SELECT owner FROM pet; +--------+ | owner | +--------+ | Harold | | Gwen | | Harold | | Benny | | Diane | | Gwen | | Gwen | | Benny | | Diane | +--------+
Однако этот запрос просто загружает поля с именем владельца из каждой записи, а некоторые имена встречаются более одного раза. Сократить количество выводимых строк можно, воспользовавшись ключевым словом DISTINCT — тогда будут выводиться только уникальные записи:
mysql> SELECT DISTINCT owner FROM pet; +--------+ | owner | +--------+ | Benny | | Diane | | Gwen | | Harold | +--------+
При помощи выражения WHERE можно комбинировать выбор строк и столбцов. Например для того, чтобы загрузить даты рождения только кошек и собак, можно воспользоваться следующим запросом:
mysql> SELECT name, species, birth FROM pet -> WHERE species = "dog" OR species = "cat"; +--------+---------+------------+ | name | species | birth | +--------+---------+------------+ | Fluffy | cat | 1993-02-04 | | Claws | cat | 1994-03-17 | | Buffy | dog | 1989-05-13 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | +--------+---------+------------+
Как вывести столбец из таблицы sql
Настало время перейти от теории к практике. Для дальнейшего изучения SQL Server создадим маленькую БД. Для создания БД Вам необходимо скачать с проект для шага с файлом SQLByStep.sql.
- найти свободное пространство на диске — БД требует примерно 2 МБайта
- создать каталог для размещения БД — по умолчанию используется C:\SQLByStep\data, если желаете выбрать другой путь — отредактируйте файл ( в команде CREATE DATABASE исправьте пути к файлам данных и лога)
- запустить Query Analyzer
- выберите меню File->Open и загрузите файл SQLByStep.sql
- выполните его (нажмите F5)
SELECT snum, sname, city, comm FROM Salespeople
Эта команда просто выводит все данные из таблицы. Вывод для этого запроса приведен ниже:
snum sname city comm ----- -------- ----------- ----- 1001 Иванов Москва 12 1002 Петров Хабаровск 13 1003 Егоров Караганда 10 1004 Сидоров Сочи 11 1007 Шилин Красноярск 15
- SELECT — ключевое слово
- snum, sname — список столбцов из таблицы, которые выбираются запросом. Любые другие столбцы, не указанные в этом списке игнорируются.
- FROM — ключевое слово, после него перечисляются таблицы — источник данных
Если вы хотите видеть все столбцы таблицы используйте специальное сокращение:
SELECT * FROM Salespeople
Выведена информация будет также как и в преыдущем случае.
В общем случае команда SELECT начинается с ключевого слова SELECT, за ним идет список имен столбцов, которые Вы хотите видеть, или *(звездочка) если Вы хотите видеть все столбцы. За тем идет ключевое слово FROM, далее имя таблицы, к которой делается запрос.
Что будет дальше? Дальше предлагается углубится в команду SELECT: сортировка данных, сложные логические выражения и специальные операторы.
Упражнения по SQL
SELECT (обучающий этап) задачи по SQL запросам 120 штук, DML 10 шт. Дистанционное обучение языку баз данных SQL. Интерактивные упражнения и тестирование по операторам SELECT,INSERT,UPDATE,DELETE языка SQL. SQL remote education. SQL statements exercises. Подзапросы, Соединение таблиц, Функции SQL, Введение в SQL, Скачать книги по SQL. Команды SQL,CREATE SEQUENCE,CREATE SYNONYM,CREATE USER,CREATE VIEW,Create Table,DROP,GRANT,INSERT,REVOKE,SET ROLE,SET TRANSACTION,SQL ALTER TABLE,SQL команды.
четверг, 23 февраля 2017 г.
Как выводить в запросе все столбцы кроме одного, не перечисляя их?
Как выводить в запросе все столбцы кроме одного, не перечисляя их?
Другими словами, как исключить столбец с известным именем из результата запроса select * from Table?
Перечислять столбцы также приходится в операторе INSERT, исключая из списка автоинкрементируемые столбцы или столбцы, которым нужно присвоить значение по умолчанию.
Допустим, требуется выбрать все столбцы из таблицы Laptop кроме столбца code. Чтобы вывести все столбцы таблицы, достаточно написать
SELECT * FROM Laptop;
Но чтобы исключить из списка столбец code, мы вынуждены перечислить все остальные столбцы:
SELECT model, speed, ram, hd, price, screen FROM Laptop;
Было бы неплохо, если мы могли написать что-то типа
SELECT *[^code] FROM Laptop;
Подобная возможность позволила бы нам избежать рутинной работы с вероятностью ошибиться при наборе и пригодилась бы при динамическом формировании запроса, когда заранее не известна ни таблица, ни число столбцов в ней.
Но, увы, такой возможности у нас нет. Зато мы можем сформировать список столбцов с помощью вспомогательного скрипта, чтобы в дальнейшем использовать его результаты в запросах. Это мы можем сделать, используя стандартное представление метаданных, которое называется информационной схемой:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Laptop' AND COLUMN_NAME NOT IN ('code');
Предикат NOT IN мы используем для того, чтобы можно было в перспективе исключать не один, а несколько столбцов. Теперь нам нужно получить результат в виде строки символов, представляющей собой разделенный запятыми перечень столбцов. Для этого нам уже придется использовать нестандартные средства.
SQL Server
В частности, для SQL Server мы можем это сделать при помощи конструкции FOR XML PATH, заменив попутно с помощью функции REPLACE пробел между именами столбцов на запятые:
SELECT REPLACE( (SELECT COLUMN_NAME AS 'data()' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Laptop' AND COLUMN_NAME NOT IN ('code') ORDER BY ORDINAL_POSITION FOR XML PATH('')) ,' ',', ');
В принципе, мы в состоянии сформировать требуемый оператор целиком с тем, чтобы его можно было динамически использовать в коде приложения:
SELECT 'SELECT ' +REPLACE( (SELECT COLUMN_NAME AS 'data()' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Laptop' AND COLUMN_NAME NOT IN ('code') ORDER BY ORDINAL_POSITION FOR XML PATH('')) ,' ',', ') + ' FROM Laptop';
MySQL
В случае MySQL мы можем воспользоваться специальной агрегатной функцией GROUP_CONCAT:
SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'computers' AND TABLE_NAME='Laptop' AND COLUMN_NAME NOT IN ('code') ORDER BY ORDINAL_POSITION;
Следует отметить, что в MySQL информационная схема относится не к отдельной базе данных, а ко всему серверу. Поэтому на тот случай, если в разных базах сервера имеются таблицы с одинаковыми именами, в условия отбора нужно добавить предикат с указанием схемы (базы данных): TABLE_SCHEMA=’computers’.
Конкатенация в MySQL выполняется с помощью функции CONCAT. В итоге окончательное решение нашей задачи можно написать так:
SELECT CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='computers' AND TABLE_NAME='Laptop' AND COLUMN_NAME NOT IN ('code') ORDER BY ORDINAL_POSITION ), ' FROM Laptop');
PostgreSQL
В PostgreSQL задачу представления значений столбца в виде текстового списка можно решить при помощи двух встроенных функций: ARRAY и ARRAY_TO_STRING. Первая из них преобразует выборку в массив значений, а вторая преобразует массив в список. При этом вторым параметром функции ARRAY_TO_STRING задается символ, который будет являться разделителем элементов списка. Теперь решение нашей задачи можно записать в виде:
SELECT 'SELECT ' || ARRAY_TO_STRING(ARRAY(SELECT COLUMN_NAME::VARCHAR(50) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='laptop' AND COLUMN_NAME NOT IN ('code') ORDER BY ORDINAL_POSITION ), ', ') || ' FROM Laptop';
Заметим, что для конкатенации строк в PostgreSQL используется стандартный оператор «||«, и отметим необходимость явного приведения типа данных столбца COLUMN_NAME (information_schema.sql_identifier) к типу CHAR/VARCHAR.