|
Программирование >> Программирование баз данных
В столбце MaritalStatus приведено значение (Single- холост), которое уже не соответствует действительности и должно быть заменено более соответствующим истине значением М (Married - состоит в браке): UPDATE е SET MaritalStatus = М FROM HumanResources.Employee e JOIN Person.Contact ce ON e.ContactID = ce.ContactID WHERE ce.FirstName = Jo AND ce.LastName = Brown; ICaK и в случае с использованием оператора INSERT, ответ, полученный от СУБД SQL Server, довольно лаконичен: (1 row(s) affected) Но после повторного выполнения того же оператора SELECT обнаруживается, что заданное значение действительно изменилось: EmployeelD MaritalStatus FirstName LastName 16 S Jo Brown (1 row(s) affected) Следует отметить, что в одном операторе можно внести изменения сразу в несколько полей. Для этого достаточно добавить запятую и предусмотреть дополнительное выражение с указанием столбца. Например, для изменения анкетных данных Jo можно было бы применить также следующий оператор: UPDATE е SET MaritalStatus = М, Title = Shift Manager FROM HumanResources.Employee e JOIN Person.Contact ce ON e.ContactID = ce.ContactID WHERE ce.FirstName = Jo AND ce.LastName = Brown; При желании в конструкции SET вместо явно заданных значений, которые использовались до сих пор, можно привести выражение. Например, если бы потребовалось увеличить продолжительность отпуска Jo на 20% (учитывая то, каких трудовых успехов добился этот сотрудник), то можно было бы выполнить примерно следующее: UPDATE е SET VacationHours = VacationHours * 1.2 FROM HumanResources.Employee e JOIN Person.Contact ce ON e.ContactID = ce.ContactID WHERE ce.FirstName = Jo AND ce.LastName = Brown; Безусловно, СУБД SQL Server предоставляет пользователю настолько большие удобства, что возможно даже обновление значений практически любого столбца (число исключений из этого правила невелико; например, нельзя обновлять столбцы с временными отметками), но при обновлении первичных ключей необходимо соблюдать исключительную осторожность. Обновление ключей связано сочень высоким риском зависания, т.е. потери связи с исходными данными других данных (ссылающихся на те данные, которые подвергаются изменениям). Вполне очевидно, что даже простой оператор UPDATE может оказаться довольно мощным. Но на этом его возможности далеко не исчерпываются. Более сложные варианты обновления рассматриваются в последующих главах. Оператор delete По-видимому, самым простым из всех операторов, рассматриваемых в данной главе, является описанная в этом разделе версия оператора DELETE. В этой версии не предусмотрено использование списка столбцов, а задается только имя таблицы и, как правило, конструкция WHERE. Поэтому трудно представить себе более простой синтаксис: DELETE [ТОР (<expression>) [PERCENT] [FROM ] <table name> [FROM ] <table list/JOIN conditions> [WHERE <search condition>] Наиболее важной отличительной особенностью этого синтаксического определения является то, что в нем конструкция FROM указана дважды (нет, это не опечатка). Первая из этих конструкций может рассматриваться как несколько напоминающая конструкцию FROM оператора обновления, в том смысле, что в ней должно быть указано, применительно к какой таблице должно быть выполнено удаление данных, а вторая в большей степени напоминает конструкцию FROM оператора выборки, поскольку в ней предусмотрены даже условия выполнения соединений (предполагается, что такая форма позволяет проще определить, какие строки должны быть удалены). Конструкция WHERE действует точно так же, как и все конструкции WHERE, рассматривавшиеся до сих пор. Список столбцов задавать не требуется, поскольку удаляется целая строка (например, невозможно удалить половину строки). Так как первая форма оператора DELETE настолько проста, ниже будет приведен лишь краткий пример ее применения. Для этого воспользуемся данными, которые бьши введены в базу данных для проведения экспериментов с операторами соединений в начале этой главы. Для удобства ниже еще раз приведен код, который применялся для создания таблиц и ввода в них данных. Если вы уже подготовили необходимые образцы данных перед выполнением примера с конструкцией FULL JOIN, который рассматривался ранее в этой главе, то можете пропустить этот сценарий создания таблиц и ввода данных, поскольку он идентичен предыдущему. CREATE TABLE Film (FilmlD int PRIMARY KEY, FilmName varchar(20) NOT NULL, YearMade smallint NOT NULL ) ; CREATE TABLE Actors (FilmlD int NOT NULL, FirstName varchar(15) NOT NULL, LastName varchar(15) NOT NULL, CONSTRAINT PKActors PRIMARY KEY(FilmlD, FirstName, LastName) INSERT INTO Film VALUES (1, My Fair Lady, 1964); INSERT INTO Film VALUES (2, Unforgiven, 1992); INSERT INTO Actors VALUES (1, Rex, Harrison); INSERT INTO Actors VALUES (1, Audrey, Hepburn); INSERT INTO Actors VALUES (3, Anthony, Hopkins); Прежде всего осуществим выборку данных из таблицы Film, исключительно для того, чтобы узнать, какие данные в ней содержатся: SELECT * FROM Film; В результате должны быть получены только те две строки, которые были вставлены в базу данных в сценарии подготовки образца: FilmlD FilmName YearMade 1 My Fair Lady 1964 2 Unforgiven 1992 (2 row(s) affected) Предположим, что теперь необходимо удалить из этой таблицы данные, которые относятся к кинофильму Unf orgiven. DELETE Film WHERE FilmName = Unforgiven; После этого еще раз выполним тот же оператор SELECT: FilmlD FilmName YearMade 1 My Fair Lady 1964 (1 row(s) affected) Мы можем констатировать, что достигнут успех. Та строка, о которой шла речь, действительно была удалена. Теперь рассмотрим немного более сложный пример, в котором применяется конструкция JOIN. Предположим, что на этот раз мы должны удалить из таблицы Actors все строки, для которых нет соответствия в таблице Film. Для этого необходимо применить запрос, в котором рассматриваются данные из обеих таблиц (иными словами, требуется такой запрос, в котором предусмотрена конструкция JOIN). Но, кроме того, необходимо учитывать, что с одной стороны соединения согласование должно отсутствовать (поскольку условием удаления данных является то, что в таблице Film отсутствуют данные, согласующиеся с данными о конкретном актере). Напомним, что для получения NULL-значений в данных, соответствующих той стороне соединения, для которой обнаруживается отсутствие согласования, применяется оператор соединения с конструкцией OUTER. Воспользуемся такими результатами для выявления несогласующихся данных, предусмотрев в качестве фактически проверяемого условия проверку на наличие NULL-значений.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |