Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lect5.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
222.72 Кб
Скачать

Insert into (table name) values ( (value), (value) . . .);

Так, например, чтобы ввести строку в таблицу Продавцов, вы можете использовать следующее выражение:

Insert into Salespeople

Values (1001, 'Peel', 'London', .12);

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

Им таблицы ( в нашем случае - Salespeople (Продавцы)), должно быть предварительно определено, а каждое значение пронумерованное в предложении значений, должно совпадать с типом данных столбца, в который оно вставляется. В ANSI, эти значения не могут составлять выражений, что означает что 3 - это доступно, а выражение 2 + 1 - нет. Значения, конечно же, вводятся в таблицу в поименном порядке, поэтому первое значение с именем, автоматически попадает в столбец 1, второе в столбец 2, на так далее.

Если вам нужно ввести пустое значение(NULL), вы вводите его точно так- же как и обычное значение. Предположим, что еще не имелось поля city для мистера Peel. Вы можете вставить его строку со значением = NULL в это поле, следующим образом:

Insert into Salespeople

Values (1001, 'Peel', null, .12);

Так как значение NULL - это специальный маркер, а не просто символьное значение, он не включается в одиночные кавычки.

Вы можете также указывать столбцы, куда вы хотите вставить значение имени. Это позволяет вам вставлять имена в любом порядке. Предположим, что вы берете значения для таблицы Заказчиков из отчета выводимого на принтер, который помещает их в таком порядке: city, cname, и cnum, и для упрощения, вы хотите ввести значения в том же порядке:

Insert into Customers (city, cnamе, cnum)

Values ('London', 'Honman', 2001);

Обратите внимание, что столбцы rating и snum - отсутствуют. Это значит, что эти строки автоматически установлены в значение - по умолчанию. По умолчанию может быть введено или значение NULL или другое значение определяемое как - "по умолчанию". Если ограничение запрещает использование значения NULL в данном столбце, и этот столбец не установлен как по умолчанию, этот столбец должен быть обеспечен значением для любой команды INSERT, которая относится к таблице.

Вы можете также использовать команду INSERT, чтобы получать или выбирать значения из одной таблицы и помещать их в другую, чтобы использовать их вместе с запросом. Чтобы сделать это, вы просто заменяете предложение VALUES (из предыдущего примера) на соответствующий запрос:

Insert into Londonstaff

SELECT *

FROM Salespeople

WHERE city = 'London';

Здесь выбираются все значения произведенные запросом - то есть все строки из таблицы Продавцов со значениями city = "London" - и помещаются в таблицу называемую Londonstaff. Чтобы это работало, таблица Londonstaff должна отвечать следующим условиям:

  • Она должна уже быть создана командой CREATE TABLE или любыми другими командами СУБД.

  • Она должна иметь четыре столбца которые совпадают с таблицей Продавцов в терминах типа данных; то есть первый, второй, и так далее, столбцы каждой таблицы, должны иметь одинаковый тип данных ( причем они не должны иметь одинаковых имен ).

Вы можете удалять строки из таблицы командой модификации - DELETE. Она может удалять только введенные строки, а не индивидуальные значения полей, так что параметр пол является необязательным или недоступным. Чтобы удалить все содержание таблицы Продавцов, вы можете ввести следующее условие:

DELETE FROM Salespeople;

Теперь когда таблица пуста ее можно окончательно удалить командой DROP TABLE.

Обычно, вам нужно удалить только некоторые определенные строки из таблицы. Чтобы определить какие строки будут удалены, вы используете предикат, так же как вы это делали для запросов. Например, чтобы удалить продавца Axelrod из таблицы, вы можете ввести

DELETE FROM Salespeople

WHERE snum = 1003;

Теперь, когда вы уже можете вводить и удалять строки таблицы, вы должны узнать, как изменять некоторые или все значения в существующей строке. Это выполняется командой UPDATE.

Эта команда содержит предложение UPDATE, в которой указано им используемой таблицы, и предложение SET, указывающе на изменение, которое нужно сделать для определенного столбца. Например, чтобы изменить оценки всех заказчиков на 200, вы можете ввести

UPDATE Customers

SET rating = 200;

Конечно, вы не всегда захотите указывать все строки таблицы для изменения единственного значения, так что UPDATE, наподобие DELETE, может брать предикаты. Вот как например можно выполнить изменение одинаковое для всех заказчиков продавца Peel ( имеющего snum=1001 ):

UPDATE Customers

SET rating = 200

WHERE snum = 1001;

Однако, вы не должны, ограничивать себя модифицированием единственного столбца с помощью команды UPDATE. Предложение SET может назначать любое число столбцов, отделяемых запятыми. Все указанные назначения могут быть сделаны для любой табличной строки, но только для одной в каждый момент времени. Предположим, что продавец Motika ушел на пенсию, и мы хотим переназначить его номер новому продавцу:

UPDATE Salespeople

SET sname = 'Gibson',city = 'Boston',comm = 0.10

WHERE snum = 1004;

Эта команда передаст новому продавцу Gibson, всех текущих заказчиков бывшего продавца Motika и порядки, в том виде, в котором они были скомпонованы для Motika с помощью поля snum. Вы не можете, однако, модифицировать сразу много таблиц в одной команде, частично потому, что вы не можете использовать префиксы таблицы со столбцами измененными предложением SET. Другими словами, вы не можете сказать - "SET Salespeople.sname = Gibson" в команде UPDATE, вы можете сказать только так - "SET sname = Gibson".

Вы можете использовать скалярные выражения в предложении SET команды UPDATE, однако, включив его в выражение пол которое будет изменено. В этом их отличие от предложения VALUES команды INSERT, в котором выражения не могут использоваться; это свойство скалярных выражений - весьма полезная особенность.

Предположим, что вы решили удвоить комиссионные всем вашим продавцам. Вы можете использовать следующее выражение:

UPDATE Salespeople

SET comm = comm * 2;

Всякий раз, когда вы ссылаетесь к указанному значению столбца в предложении SET, произведенное значение может получится из текущей строки, прежде в ней будут сделаны какие-то изменения с помощью команды UPDATE. Естественно, вы можете скомбинировать эти особенности, и сказать, - удвоить комиссию всем продавцам в Лондоне, таким предложением:

UPDATE Salespeople

SET comm = comm * 2

WHERE city = 'London';

Предложение SET - это не предикат. Он может вводить пустые NULL значения также как он вводил значения не используя какого-то специального синтаксиса ( такого например как IS NULL ). Так что, если вы хотите установить все оценки заказчиков в Лондоне в NULL, вы можете ввести следующее предложение:

UPDATE customers

SET rating = NULL

WHERE city = 'London';

что обнулит все оценки заказчиков в Лондоне.

Создание и удаление таблиц

Таблицы создаются командой CREATE TABLE. Эта команда создает пустую таблицу без строк. Значения вводятся с помощью DML команды INSERT. Команда CREATE TABLE в основном определяет имя таблицы, в виде описания набора имен столбцов указанных в определенном порядке. Она также определяет типы данных и размеры столбцов. Каждая таблица должна иметь по крайней мере один столбец.

Синтаксис команды CREATE TABLE:

CREATE TABLE (table-name )

((column name ) (data type)[(size)],

(column name ) (data type) [(size)] ... );

Так как пробелы используются для разделения частей команды SQL, они не могут быть частью имени таблицы ( или любого другого объекта, такого как индекс ). Подчеркивание ( _ ) - обычно используется для разделения слов в именах таблиц.

Значение аргумента размера зависит от типа данных. Если вы его не указываете, ваша система сама будет назначать значение автоматически. Для числовых значений, это - лучший выход, потому что в этом случае, все ваши поля такого типа получат один и тот же размер что освобождает вас от проблем их общей совместимости. Кроме того, использование аргумента размера с некоторыми числовыми наборами, не совсем простой вопрос. Если нужно хранить большие числа, вам несомненно понадобятся гарантии, что поля достаточно велики, чтобы вместить их.

Один тип данных, для которого, в основном, нужно назначать размер - CHAR.

Аргумент размера - это целое число, определяющее максимальное число символов, которое может вместить поле. Фактическое число символов поля может быть от нуля (если поле - NULL ) до этого числа. По умолчанию, аргумент размера = 1 означает, что поле может содержать только одну букву.

Таблицы принадлежат пользователю, который их создал, и имена всех таблиц принадлежащих данному пользователю должны отличаться друга от друга, как и имена всех столбцов внутри данной таблицы. Отдельные таблицы могут использовать одинаковые имена столбцов, даже если они принадлежат одному и тому же пользователю. Примером этому - столбец city в таблице Заказчиков и в таблице Продавцов. Пользователи не являющиеся владельцами таблиц могут ссылаться к этим таблицам с помощью имени владельца этих таблиц сопровождаемого точкой; например, таблица Employees создана Smith будет называться Smith.Employees когда она упоминается каким-то другим пользователем ( мы понимаем что Smith - это Идентификатор Разрешения (ID). (ID) сообщаемый пользователем ( ваш разрешенный ID - это ваше имя в SQL.

Эта команда будет создавать таблицу Продавцов:

CREATE TABLE Saleepeople

( snum integer,

sname char (10),

city char (10),

comm declmal );

Порядок столбцов в таблице определяется порядком в котором они указаны. Им столбца не должно разделяться при переносе строки ( что сделано для удобочитаемости ), но отделяется запятыми.

Команда ALTER TABLE не часть стандарта ANSI; но это - широко доступная, и довольно содержательная форма, хотя ее возможности несколько ограничены. Она используется, чтобы изменить определение существующей таблицы. Обычно, она добавляет столбцы к таблице. Иногда она может удалять столбцы или изменять их размеры, а также в некоторых программах добавлять или удалять ограничения. Типичный синтаксис чтобы добавить столбец к таблице:

ALTER TABLE (имя таблицы) ADD (имя столбца)

(тип данных)(размер);

Столбец будет добавлен со значением NULL для всех строк таблицы. Новый столбец станет последним по порядку столбцом таблицы. Вообще то, можно добавить сразу несколько новых столбцов, отделив их запятыми, в одной команде. Имеется возможность удалять или изменять столбцы. Наиболее часто, изменением столбца может быть просто увеличение его размера, или добавление( удаление ) ограничения.

Ваша система должна убедиться, что любые изменения не противоречат существующим данным - например, при попытке добавить ограничение к столбцу, который уже имел значение, при нарушении которого ограничение будет отклонено. Лучше всего дважды проверить это.

По крайней мере, посмотрите документацию вашей системы, чтобы убедиться, гарантирует ли она что именно это было причиной. Из-за нестандартного характера команды ALTER TABLE, вам все равно необходимо посмотреть тот раздел вашей системной документации, где говорится об особых случаях.

Вы должны быть собственником (т.е. быть создателем) таблицы чтобы иметь возможность удалить ее. Поэтому не волнуйтесь о случайном разрушении ваших данных, SQL сначала потребует, чтобы вы очистили таблицу прежде, чем удалит ее из базы данных. Таблица с находящимися в ней строками, не может быть удалена. Синтаксис для удаления вашей таблицы, если конечно она является пустой, следующая:

DROP TABLE ( имя таблицы );

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

Эта команда фактически не является частью стандарта ANSI, но она, в основном, поддерживаемая и полезна. К счастью, она более проста, и, следовательно, более непротиворечивая, чем ALTER TABLE . ANSI просто не имеет способа для определения разрушенных или неправильных таблиц.

Привилегии

Каждый пользователь в среде SQL, имеет специальное идентификационное имя или номер. Терминология везде разная, но мы выбрали (следу ANSI) ссылку на им или номер как на Идентификатор (ID) доступа. Команда, посланная к базе данных, ассоциируется с определенным пользователем; или иначе, специальным Идентификатором доступа. Поскольку это относится к SQL базе данных, ID разрешения - это имя пользователя, и SQL может использовать специальное ключевое слово USER, которое ссылается к Идентификатору доступа связанному с текущей командой. Команда интерпретируется и разрешается (или запрещается) на основе информации связанной с Идентификатором доступа пользователя подавшего команду.

В системах с многочисленными пользователями, имеется некоторый вид процедуры входа в систему, которую пользователь должен выполнить, чтобы получить доступ к компьютерной системе. Эта процедура определяет какой ID доступа будет связан с текущим пользователем. Обычно, каждый человек использующий базу данных должен иметь свой собственный ID доступа и при регистрации превращается в действительного пользователям. Однако, часто пользователи имеющие много задач могут регистрироваться под раз- личными ID доступа, или наоборот один ID доступа может использоваться несколькими пользователями.

С точки зрения SQL нет никакой разницы между этими двум случаями; он воспринимает пользователя просто как его ID доступа. SQL база данных может использовать собственную процедуру входа в систему, или она может позволить другой программе, типа операционной системы ( основная программа которая работает на вашем компьютере ), обрабатывать файл регистрации и получать ID доступа из этой программы. Тем или другим способом, но SQL будет иметь ID доступа, чтобы связать его с вашими действиями, а для вас будет иметь значение ключевое слово USER.

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

SQL привилегии определенные ANSI - это привилегии объекта. Это означает, что пользователь имеет привилегию, чтобы выполнить данную команду только на определенном объекте в базе данных. Очевидно, что привилегии должны различать эти объекты, но система привилегии, основанная исключительно на привилегиях объекта, не может адресовать все, что нужно SQL, как мы увидим это позже в этой главе. Привилегии объекта связаны одновременно и с пользователями, и с таблица ми. То есть, привилегия дается определенному пользователю в указанной таблице, или базовой таблице или представлении. Вы должны помнить, что пользователь создавший таблицу (любого вида), является владельцем этой таблицы.

Это означает, что пользователь имеет все привилегии в этой таблице и может передавать привилегии другим пользователям в этой таблице. Привилегии, которые можно назначить пользователю:

  • SELECT - Пользователь с этой привилегией может выполнять запросы в таблице.

  • INSERT - Пользователь с этой привилегией может выполнять команду INSERT в таблице.

  • UPDATE - Пользователь с этой привилегией может выполнять команду UPDATE на таблице. Вы можете ограничить эту привилегию для определенных столбцов таблицы.

  • DELETE - Пользователь с этой привилегией может выполнять команду DELETE в таблице.

  • REFERENCES - Пользователь с этой привилегией может определить внешний ключ, который использует один или более столбцов этой таблицы, как родительский ключ. Вы можете ограничить эту привилегию для определенных столбцов.

Если Вы - создатель таблицы, Вы имеете все права на нее, а значит, Вы можете предоставить некоторые права на Вашу таблицу кому-нибудь еще. Команда Grant позволит вам это сделать.

GRANT (список прав)

ON (имя таблицы или перечень названий столбцов из одной таблицы)

TO (список пользователей через запятую)

[WITH GRANT OPTION] -право передавать привилегии по наследству

Также как ANSI предоставляет команду CREATE TABLE, чтобы создать таблицу, а не DROP TABLE чтобы от нее избавиться, так и команда GRANT позволяет вам давать привилегии пользователям, не предоставляя способа чтобы отобрать их обратно. Потребность удалять привилегии сводится к команде REVOKE, фактически стандартному средству с достаточно понятной формой записи.

Синтаксис команды REVOKE - похож на GRANT, но имеет обратный смысл.

REVOKE (список прав)

ON (имя таблицы или перечень названий столбцов из одной таблицы)

FROM (список пользователей через запятую)

Точно так же Вы можете предоставить кому-либо привилегии на представление. В команде Grant укажите не имя таблицы, а имя представления. Существуют и другие привилегии, они называются системными и в основном предоставляются администратором. В качестве аргументов для Grant и Revoke Вы можете использовать ключевые слова ALL и PUBLIC. All-используется вместо списка привилегий, когда Вы хотите предоставить пользователю все права. PUBLIC-используется вместо списка пользователей, если Вы хотите предоставить какие-то права всем пользователям.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]