Oracle добавить столбец в select
Вы создали свою базу данных и свои таблицы, и после всей этой работы вы заметили, что вам нужно добавить или переименовать столбец. Что ж, вы можете использовать для этого оператор ALTER TABLE.
Просто имейте в виду, что при этом нужно быть очень осторожным. Если в вашей таблице много строк, это может вызвать проблемы с производительностью вашей базы данных.
Примечание. Если приведенный здесь синтаксис не работает, обратитесь к документации по своей СУБД. Большинство вещей работает одинаково, но есть некоторые различия для различных СУБД.
4 ответа
Я не верю, что вы можете добавить столбец где-нибудь, кроме как в конец таблицы, после того, как таблица будет создана. Одним из решений может быть следующее:
Отбросьте таблицу, в которую хотите добавить столбцы:
В этот момент вы можете перестроить существующую таблицу с нуля, добавив столбцы в нужные вам места. Предположим, для этого упражнения вы хотите добавить столбцы с именами «COL2 и COL3».
Теперь вставьте данные обратно в новую таблицу:
Когда данные вставляются в вашу «новую-старую» таблицу, вы можете удалить временную таблицу.
Я часто делаю это, когда хочу добавить столбцы в определенном месте. Очевидно, что если это производственная онлайн-система, то это, вероятно, непрактично, а всего лишь одна потенциальная идея.
Вы (по-прежнему) не можете выбрать положение столбца с помощью ALTER TABLE: его можно добавить только в конец таблицы. Очевидно, вы можете выбирать столбцы в любом порядке, поэтому, если вы не используете SELECT * FROM, порядок столбцов не должен иметь большого значения.
Если вам действительно нужно расположить их в определенном порядке, и вы не можете удалить и воссоздать таблицу, тогда вы можете вместо этого удалить и воссоздать столбцы: -
Сначала скопируйте таблицу
Затем отбросьте столбцы, которые вы хотите разместить после столбца, который вы вставляете
Теперь добавьте новый столбец (два в этом примере) и те, которые вы удалили.
Наконец, добавьте обратно данные для воссозданных столбцов.
Очевидно, что ваше обновление, скорее всего, будет более сложным, и вам придется обрабатывать индексы и ограничения, и вы не сможете использовать это в некоторых случаях (столбцы LOB и т. Д.). К тому же это довольно отвратительный способ сделать это - но таблица всегда будет существовать, и вы получите столбцы в нужном вам порядке. Но действительно ли порядок столбцов так важен?
Хотя это несколько устарело, я хотел бы добавить немного улучшенную версию, которая действительно меняет порядок столбцов. Вот шаги (при условии, что у нас есть таблица TAB1 со столбцами COL1, COL2, COL3):
- Добавить новый столбец в таблицу TAB1:
- «Скопируйте» таблицу во временное имя при изменении порядка столбцов И переименуйте новый столбец:
- удалить существующую таблицу:
- переименуйте временное имя таблицы в только что удаленное имя таблицы:
В 12c вы можете использовать тот факт, что столбцы, для которых установлено значение от невидимого до видимого, отображаются как последний столбец таблицы: Советы и приемы: невидимые столбцы в Oracle Database 12c
Возможно, это та «уловка», о которой @jeffrey-kemp говорил в своем комментарии, но ссылка там больше не работает.
Теперь col_3 будет отображаться первым в операторе SELECT * FROM my_tab .
Примечание. Это не меняет физический порядок столбцов на диске, но в большинстве случаев это не то, что вам нужно. Если вы действительно хотите изменить физический порядок, вы можете использовать пакет DBMS_REDEFINITION.
В этом учебном материале вы узнаете, как использовать оператор INSERT в SQL с синтаксисом и примерами.
Comments
You should use UNION ALL for things like that. A query like this:
gives you what you expect.
select 'Dummy Column Text' as DUMMYCOL, MY_TABLE.* from MY_TABLE where
Ignore my posting. I was reading "column" and understood "row".
select 'Dummy Column Text' as DUMMYCOL, MY_TABLE.* from MY_TABLE where nicely :-)
I haven't come across the MY_TABLE.* syntax before so that's one thing I've learnt today .
Hello,
I'm attempting to add a DUMMY column into my SELECT statement.
This works find in SQL Developer, but when I put it into Apex for my report, I get a
ORA-1403: no data found error.
Here's my code:
Your dummy column name has spaces in it, so you need to use "double quotes" around it - not two 'single quotes'.
With some fonts, it's hard to tell them apart.
Hmm..I don't think that's it. When I change to double quotes instead of single quotes around the Dummy column name, I get this error: Any other ideas?
Message was edited by:
The Fabulous LB
I should have read your question more carefully.
I think your quotes were right the way you had them.
Having the dummy column shouldn't affect whether the query returns any rows.
Does it return any rows if you remove the dummy column from the query in Apex?
I've got it now. Now the question is, how do I order my report so that it returns the rows in the same order as my UNION statements?
If I do ORDER BY COL1, it returns the results in alphabetical order. How do I specify the same order as I have in my query?
Message was edited by:
The Fabulous LB
I know people will think I sounds like a broken record, but, watch out for things like this:
'BETWEEN TO_DATE(substr(:STARTDATE,1,19),''dd-MON-YYYY hh24:mi'') '||
'AND TO_DATE(substr(:STOPDATE,1,19),''dd-MON-YYYY hh24:mi'') '||
'AND switch_id = ''' || :P1_SWITCH_ID || ''' ' || .
There is no need, and it is very bad, to concatenate a bind variable this way. Just put the bind variable inside the quotes, without single quotes around it, like this:
'BETWEEN TO_DATE(substr(:STARTDATE,1,19),''dd-MON-YYYY hh24:mi'') '||
'AND TO_DATE(substr(:STOPDATE,1,19),''dd-MON-YYYY hh24:mi'') '||
'AND switch_id = :P1_SWITCH_ID ' || .
As it is written it is bad for 2 reasons:
1. The database parser will need to parse this for every value of :P1_SWITCH_ID. This is bad for performance.
2. This introduces the possibility of sql injection. When I review an Apex application, I do an export of the application, remove all spaces and search for '||:
If I see that string, I assume there is a problem with the application until someone can prove it isn't a problem.
Изменение порядка сортировки
По умолчанию конструкция ORDER BY предусматривает выполнение сортировки в порядке возрастания. При желании, чтобы сортировка выполнялась по убыванию, нужно указать ключевое слово DESC :
Синтаксис
Синтаксис SQL оператора INSERT при вставке одной записи в таблицу:
Или синтаксис SQL оператора INSERT при вставке нескольких записей в таблицу:
INSERT INTO table
(column1, column2, . )
SELECT expression1, expression2, .
FROM source_tables
[WHERE conditions];
Оператор DELETE
Оператор DELETE служит для удаления строк из таблицы. Его синтаксис, в общем случае, выглядит так:
Например, для удаления пользователя Fay из таблицы employees потребуется использовать такой оператор DELETE :
Если ограничивающее условие WHERE не указано, оператор DELETE удалит все строки из таблицы:
Удалять все строки из таблицы можно также и с помощью команды TRUNCATE , но отменять последствия этой команды нельзя, а отменять действие оператора DELETE можно, воспользовавшись оператором ROLLBACK :
Как добавить новую колонку с помощью ALTER TABLE
Чтобы добавить новый столбец, вам сначала нужно выбрать таблицу с помощью ALTER TABLE имя_таблицы, а затем написать имя нового столбца и его тип данны вместе с операторомо ADD. В совокупности код выглядит так:
Например у нас есть база данных пользователей, как показано ниже:
Настал момент, когда нам нужно сохранить номера документов, удостоверяющих личность наших пользователей, поэтому нам нужно добавить для этого новый столбец.
Чтобы добавить новый столбец в нашу таблицу пользователей, нам нужно выбрать таблицу с ALTER TABLE users, а затем указать имя нового столбца и его тип данных с помощью оператора ADD id_number TEXT. Все вместе выглядит так:
Таблица с новым столбцом будет выглядеть следующим образом:
Вам нужно будет использовать оператор UPDATE, чтобы добавить недостающую информацию для уже существующих пользователей, как только она будет предоставлена.
Фильтрация данных
За счет использования в операторе SELECT , INSERT , DELETE или UPDATE конструкции WHERE можно еще также и фильтровать данные, т.е. ограничивать количество строк, в отношении которых должен выполняться данный оператор. Ниже приведен простой пример:
Как создать новый столбец со значением по умолчанию вместо NULL
Вы также можете создать столбец со значением по умолчанию, используя ключевое слово default, за которым следует используемое значение. Тогда пользователи увидят это значение по умолчанию вместо того, чтобы пропущенные значения были заполнены NULL.
Предположим, что скоро у нас появятся международные пользователи, и мы хотим добавить столбец country. Все наши существующие пользователи из США, поэтому мы можем использовать это значение по умолчанию.
Наша таблица будет выглядеть так:
Будьте осторожны при добавлении новых столбцов в таблицы.
Если в вашей таблице уже много строк - например, если у вас уже много пользователей или много хранимых данных, - добавление нового столбца может потребовать значительных ресурсов. Поэтому обращайтесь с этой операцией осторожно.
Выполнение сортировки по нескольким столбцам
При желании результаты можно сортировать на основе значений более чем одного столбца. Например, ниже приведен запрос, предусматривающий выполнение сортировки на основании значений двух столбцов — salary и dept :
I am trying to create a query that retrieves all columns from a table but also add a dummy column. I am testing the query in SQL Workshop. (The intention is that the results of this query will be used as the source of a PDF output).
select * from MY_TABLE where get one row returned with all columns (as expected).
select 'Dummy Column Text' as DUMMYCOL from MY_TABLE where get one row returned but with only one column (as expected)
What I am trying to do is :
select 'Dummy Column Text' as DUMMYCOL, * from MY_TABLE where expect one row to be returned with all available columns plus an extra column called DUMMYCOL containing the text 'Dummy Column Text'.
This fails with an "ORA-00936: missing expression" error. From my Google searches I believe this syntax is ok? It works if I replace * with a list of column names but I don't really want to have to list them all.
Is there anyway I can get this to work? Is there something wrong with my syntax? Any help gratefully received.
Как переименовать столбец с помощью ALTER TABLE
Вы можете переименовать столбец с помощью приведенного ниже кода. Вы выбираете таблицу с помощью ALTER TABLE имя_таблицы, а затем указываете, какой столбец переименовать и во что переименовать, с помощью RENAME COLUMN old_name TO new_name.
Давайте посмотрим на ту же таблицу, которую мы использовали в предыдущем примере:
Чтобы избежать путаницы между столбцами id и id_number, давайте переименуем первый в user_id.
Сначала мы укажем таблицу с помощью ALTER TABLE users, а затем объявим имя столбца, чтобы оно изменилось на то, что мы хотим изменить, с помощью RENAME COLUMN id TO user_id.
После выполения запроса таблица будет выглядеть так:
Будьте осторожны при переименовании столбца в таблице.
Когда вы переименовываете столбцы с помощью ALTER TABLE, вы рискуете нарушить зависимости базы данных.
Если вы используете инструмент рефакторинга базы данных для изменения имени столбца вместо использования ALTER TABLE, он будет управлять всеми зависимостями и обновлять их с новым именем столбца.
Если у вас небольшая база данных, возможно, вам не о чем беспокоиться, но об этом важно помнить.
У меня есть конкретный сценарий, когда мне нужно вставить два новых столбца в существующую таблицу в Oracle. Я не могу сбросить и воссоздать таблицу. Так можно ли этого добиться любыми способами ??
Оператор UPDATE
Оператор UPDATE применяется для изменения значения (или значений) одного или нескольких столбцов в строке (или строках) внутри таблицы. Выражение, используемое для установки или изменения значения столбца, может представлять собой константную, арифметическую или строковую операцию или же результат выполнения оператора SELECT .
В общем, синтаксис оператора UPDATE выглядит следующим образом (элементы в квадратных скобках являются необязательными):
При желании изменить или модифицировать значения столбца во всех строках таблицы можно использовать оператор UPDATE без конструкции WHERE :
Для модификации только определенных строк нужно обязательно задавать в операторе UPDATE конструкцию WHERE :
Описание
SQL оператор INSERT используется для вставки одной или нескольких записей в таблицу. Существует два синтаксиса для оператора INSERT в зависимости от того, вставляете ли вы одну запись или несколько записей.
Оператор SELECT
Оператор SELECT является наиболее часто используемым оператором SQL (и также называется проекцией — projection). Он позволяет извлекать все или некоторые данные из таблицы на основе определенных критериев.
Проще всего оператор SELECT выглядит, когда применяется для извлечения всех данных таблицы:
Для извлечения только определенных столбцов необходимо указывать имена этих столбцов после ключевого слова SELECT , например:
При желании извлечь только первых десять строк таблицы можно использовать оператор SELECT следующим образом:
Если требуется узнать только о том, какое количество строк содержится в таблице, оператор SELECT применяется так:
Если в таблице присутствуют дубликаты, можно использовать в операторе SELECT конструкцию DISTINCT для исключения дублированных значений, как показано ниже:
С помощью необязательной конструкции WHERE в операторе SELECT можно задавать различные условия и тем самым обеспечивать возврат только определенных строк. В таблице А.1 перечислены некоторые наиболее типичные условия, которые можно указывать в конструкции WHERE .
Символ | Условие |
= | Равно |
> | Больше |
Меньше | |
Меньше или равно | |
>= | Больше или равно |
<> или ! | Не равно |
Ниже приведено несколько примеров применения конструкции WHERE :
Сортировка результатов запроса
Довольно часто бывает необходимо сортировать результаты запроса в каком-нибудь порядке. Конструкция ORDER BY позволяет сортировать данные на основе значения одного или нескольких столбцов. Вместе с ней можно указывать желаемый порядок сортировки (по возрастанию или убыванию), использовать для сортировки псевдонимы столбцов, а также выполнять сортировку по нескольким столбцам. Ниже приведен простой пример:
Оператор INSERT
Оператор INSERT позволяет добавлять в таблицу новые данные, в том числе и дублированные в случае отсутствия требований уникальности со стороны первичного ключа или индекса. В общем, синтаксис оператора INSERT выглядит следующим образом:
Ниже приведен пример применения оператора INSERT :
В этом примере имена столбцов были указаны потому, что заполнить данным требовалось только некоторые из столбцов вставлявшейся строки. Остальные столбцы были оставлены пустыми, что вполне приемлемо при условии, что ни один из них не был определен как не допускающий нулевых значений ( NOT NULL ).
При желании вставить значения во все столбцы таблицы можно использовать более простой оператор INSERT , подобный тому, что показан ниже:
Если требуется вставить все столбцы из одной таблицы в другую, можно использовать такой оператор INSERT :
В случае если окажется, что таблицы b не существует, можно использовать оператор CREATE TABLE имя_таблицы AS SELECT * FROM (CTAS) , как показано ниже:
Примечание
- При вставке записей в таблицу с помощью SQL оператора INSERT, необходимо указать значение для каждого столбца NOT NULL. Вы можете опустить столбец из оператора INSERT, только если столбец допускает значения NULL.
Пример - использование оператора INSERT для вставки одной записи
Самый простой способ использовать оператор INSERT - вставить одну запись в таблицу с помощью ключевого слова VALUES. Давайте рассмотрим пример того, как сделать это в SQL.
В этом примере у нас есть таблица с categories со следующими данными:
category_id | category_name |
---|---|
25 | Deli |
50 | Produce |
75 | Bakery |
100 | General Merchandise |
125 | Technology |
Давайте вставим новую запись в category . Введите следующий SQL оператор:
Для работы с данными в базе данных Oracle используются SQL-операторы, которые могут включать в себя DDL, DML и другие типы операторов. Для начала давайте вспомним, как выглядят базовые операторы SQL.
Условие LIKE
Условие LIKE позволяет ограничивать количество возвращаемых оператором SELECT строк за счет применения операции сопоставления с образцом. Ниже приведен пример использования этого условия:
Образец, с которым должно выполняться сопоставление, должен быть заключен в одинарные кавычки ( '' ). В приведенном выше примере знак процента ( % ) обозначает, что за буквами Fa может идти любая строка символов. То есть знак процента выступает в роли группового символа, способного замещать один или более символов, и, по сути, делает то же самое, что во многих операционных системах делает символ звездочки ( * ). Важно обратить внимание на то, что один символ подчеркивания ( _ ) тоже может выступать групповым символом, но в отличие от знака процента способен замещать только один символ.
Параметры или аргументы
table Таблица, в которую нужно вставить записи. column1 , column2 Это столбцы в table для вставки значений. expression1 , expression2 Эти значения присваиваются столбцам в таблице. Поэтому column1 будет присвоено значение expression1 , column2 будет присвоено значение expression2 и т.д. , source_tables Используется при вставке записей из другой таблицы. Это исходная таблица при выполнении вставки. WHERE conditions Необязательный. Используется при вставке записей из другой таблицы. Это те условия, которые должны быть соблюдены для вставки записей.
Читайте также: