Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Otras versiones Personas que lo han encontrado til: 0 de 1 - Valorar este tema Especifica las columnas que debe devolver la consulta.
Sintaxis
SELECT [ ALL | DISTINCT ] TOP (expression) < select_list > < select_list > ::= { * | { table_name | table_alias }.* | { column_name | expression } [ [ AS ] column_alias ] } [ ,...n ]
Argumentos
ALL Especifica que el conjunto de resultados puede incluir filas duplicadas. ALL es el valor predeterminado. DISTINCT Especifica que el conjunto de resultados slo puede incluir filas nicas. Los valores NULL se consideran iguales desde el punto de vista de la palabra clave DISTINCT. TOP (expresin) Indica que se devolver slo un primer conjunto especificado o porcentaje de filas del conjunto de resultados de la consulta. expression puede ser un nmero o un porcentaje de filas. Puede utilizar la clusula TOP en instrucciones SELECT, INSERT, UPDATE y DELETE. Se requieren parntesis para delimitar la expresin de TOP en las instrucciones INSERT, UPDATE y DELETE. Para compatibilidad con versiones anteriores, se admite el uso de la expresin TOP sin parntesis en instrucciones SELECT, pero no lo recomendamos. Para obtener ms informacin, vea TOP (SQL Server Compact). < select_list > Columnas que se deben seleccionar para el conjunto de resultados. La lista de seleccin es una serie de expresiones separadas por comas. *
Especifica que se deben devolver todas las columnas de todas las tablas de la clusula FROM. Las columnas se devuelven por tabla, segn se especifique en la clusula FROM, y en el orden en el que aparecen en ella. table_name| table_alias.* Limita el mbito de * a la tabla especificada. Requiere que se devuelvan todas las columnas de la tabla especificada en la clusula FROM. Las columnas se devuelven en el orden en que aparecen en la tabla. Si una tabla tiene un alias especificado en la clusula FROM, se debe utilizar dicho alias. No se puede usar el nombre de la tabla. column_name Nombre de una columna que se debe devolver. Para impedir que la referencia sea ambigua, como en el caso de que dos de las tablas de la clusula FROM tengan columnas con nombres duplicados, se debe calificar column_name. Por ejemplo, si las tablas 'A' y 'B' de una base de datos contienen una columna denominada 'IdElemento' y ambas tablas se combinan en una consulta, IdElemento se debe especificar en la lista SELECT como 'A.IdElemento' y 'B.IdElemento'. Si se ha incluido un alias de tabla, dicho alias se debe usar para calificar el nombre de la columna. En caso contrario, se debe usar el nombre completo de la tabla. expression Nombre de columna, constante, funcin o cualquier combinacin vlida de nombres de columna, constantes y funciones conectados mediante uno o varios operadores. column_alias Nombre alternativo para sustituir el nombre de la columna en el conjunto de resultados de la consulta. Por ejemplo, se puede especificar un alias como "Cantidad", "Cantidad hasta hoy" o "Cant" para una columna denominada "cantidad". Los alias se emplean tambin para especificar nombres para los resultados de expresiones; por ejemplo: SELECT AVG([Unit Price]) AS [Average Price] FROM [Order Details]
Nota
column_alias se puede utilizar en una clusula ORDER BY, pero no en una clusula WHERE, GROU
insert into ALUMNOS (ID_ALUMNO , NOMBRE , APELLIDOS , F_NACIMIENTO) values (1 , 'Pablo' , 'Hernandaz Mata' , '1995-03-14')
Observe como todo lo que se explic en referencia a los tipos de datos es valido para la instruccin INSERT. Los datos de tipo numrico no se entrecomillan, a diferencia de los datos de tipo cadena y fecha.
Donde cada dato de la lista VALUES se corresponde y se asigna a cada campo de la tabla en el mismo orden de aparicin de la sentencia INSERT. Cabe mencionar que si la clave primaria que identifica el registro que se pretende insertar ya la usa un registro existente el SGBD rechazara la operacin y devolvera un error de clave primaria duplicada. As que cuando usted rellena un formulario en Internet por ejemplo, y los datos son almacenados en una BD, en algn momento del proceso se realizar una instruccin INSERT con los datos que usted a cumplimentado. ***
Update SQL La instruccin UPDATE permite actualizar registros de una tabla. Debemos por lo tanto indicar que registros se quiere actualizar mediante la clusula WHERE, y que campos mediante la clusula SET, adems se deber indicar que nuevo dato va a guardar cada campo. As por ejemplo supongamos que para el curso que careca de profesor finalmente ya se ha decidido quien lo va a impartir, la sintaxis que permite actualizar el profesor que va a impartir un curso sera la siguiente:
Todo lo expuesto sobre lgica booleana es valido para la clausula WHERE de la instruccin UPDATE, en todo caso dicha clusula se comporta igual que en una consulta, solo que ahora en lugar de seleccionar registros para mostrarnos algunos o todos los campos, seleccionar registros para modificar algunos o todos sus campos. Por lo tanto omitir la clusula WHERE en una instruccin UPDATE implica aplicar la actualizacin a todos los registros de la tabla.
La instruccin anterior asignar un 2 en el campo ID_PROFE de la tabla CURSOS en los registros cuyo valor en el campo ID_CURSO sea 5. Como sabemos que el campo ID_CURSO es la clave primaria de la tabla, tan solo se modificar un solo registro si es que existe. Obviamente en este caso, dado que el campo que se pretende actualizar es clave fornea de la tabla PROFESORES, si no existe un registro en dicha tabla con identificador 2 el SGBD devolver un error de clave no encontrada. Veamos otro ejemplo, esta vez se modificarn varios campos y registros con una sola instruccin. Recordemos la tabla EMPLEADOS, en ella se guardan los datos de cada empleado, el sueldo y supongamos que tambin se guarda en el campo PRECIO_HORA el precio de la hora extra que cobra cada empleado en el caso que las trabaje. Bien, con el cambio de ejercicio se deben subir los sueldos y el precio por hora extra trabajada, digamos que un 2% el sueldo y un 1 % el precio de la hora extra. Sin embargo la poltica de empresa congela el salario a directivos que cobran 3000 euros o ms. Qu instruccin actualizara estos importes segn estas premisas? :
CDIGO: SELECCIONAR TODO
update EMPLEADOS set SALARIO = SALARIO * 1.02 PRECIO_HORA = PRECIO_HORA * 1.01 where SALARIO < 3000
Por lo tanto solo se est actualizando el salario y el precio de la hora extra de aquellos empleados que su salario es inferior a 3000 euros. En general la sintaxis de la instruccin UPDATE es la siguiente:
CDIGO: SELECCIONAR TODO
***
Delete SQL La isntruccin DELETE permite eliminar regsitros de una tabla, su sintaxis es simple, puesto que solo debemos indicar que registros deseamos eliminar mediante la clusula WHERE. La siguiente consulta elimina todos los registros de la tabla mascotas que estan de baja:
Al igua que la instruccin que ocurria con la UPDATE, para la instruccin DELETE es vlido todo lo expuesto sobe la clusula WHERE para consultas.
Al eliminar registros de una tabla estos no deben figurar como clave fornea en otra tabla, de lo contrario el SGBD devolver un error de violacin de integridad referencial, puesto que si se permitiese quedaran regsitros huerfanos.
*** Resumen Con las instrucciones INSERT, DELETE y UPDATE el SGBD permite crear eliminar o modificar registros. La clusula WHERE de las instrucciones DELETE y UPDATE se comporta igual que en las consultas y permite descartar o considerar registros mediante condiciones por la instruccin de actualizacin o de borrado. Omitir la clusula WHERE implica aplicar la operacin a todos los registros de la tabla. Al insertar eliminar o actualizar datos, deben respetarse las restricciones. Si estas estn montadas en la BD, cosa por otro lado muy recomendable, podemos tener errores de tres tipos: Clave primaria duplicada (Al insertar o modificar un registro). Violacin de integridad referencial (se pretende dejar hurfanos registros que apuntan al registro padre al intentarlo eliminar o modificar). Clave padre no encontrada (al actualizar o insertar una clave fornea que no existe en la tabla padre a la que apunta)
DELETE (Transact-SQL)
SQL Server 2012 Otras versiones
Personas que lo han encontrado til: 1 de 1 - Valorar este tema Quita una o varias filas de una tabla o vista de SQL Server 2012. Convenciones de sintaxis de Transact-SQL
Sintaxis
Transact-SQL [ WITH <common_table_expression> [ ,...n ] ] DELETE [ TOP ( expression ) [ PERCENT ] ] [ FROM ] { { table_alias | <object> | rowset_function_limited [ WITH ( table_hint_limited [ ...n ] ) ] } | @table_variable } [ <OUTPUT Clause> ] [ FROM table_source [ ,...n ] ] [ WHERE { <search_condition> | { [ CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } } ] [ OPTION ( <Query Hint> [ ,...n ] ) ] [; ] <object> ::= { [ server_name.database_name.schema_name. | database_name. [ schema_name ] .
| schema_name. ] table_or_view_name }
Argumentos
WITH <common_table_expression> Especifica el conjunto de resultados de nombre temporal, tambin conocido como expresin de tabla comn, definido dentro del mbito de la instruccin DELETE. El conjunto de resultados se deriva de una instruccin SELECT. Las expresiones de tabla comunes tambin se pueden utilizar con las instrucciones SELECT, INSERT, UPDATE y CREATE VIEW. Para obtener ms informacin, vea WITH Common. TOP (expression) [ PERCENT ] Especifica el nmero o el porcentaje de filas aleatorias que se van a eliminar. expression puede ser un nmero o un porcentaje de las filas. Las filas a las que se hace referencia en la expresin TOP utilizada con INSERT, UPDATE o DELETE no se ordenan. Para obtener ms informacin, vea TOP (Transact-SQL). FROM Palabra clave opcional que se puede usar entre la palabra clave DELETE y el destino table_or_view_name o rowset_function_limited. table_alias Alias especificado en la clusula FROM table_source que representa la tabla o vista de la que se van a eliminar las filas. server_name Nombre del servidor (un nombre de servidor vinculado o la funcin OPENDATASOURCE como nombre de servidor) en el que se encuentra la tabla o la vista.Si se especifica server_name, son obligatorios database_name y schema_name. database_name El nombre de la base de datos. schema_name Nombre del esquema al que pertenece la tabla o la vista. table_or view_name Nombre de la tabla o vista cuyas filas se van a quitar. En este mbito, se puede utilizar una variable de tabla como origen de tabla de una instruccin DELETE. La vista a la que hace referencia table_or_view_name debe poderse actualizar y debe hacer referencia exactamente a una tabla base de la clusula FROM de la definicin de vista. Para obtener ms informacin acerca de las vistas que se pueden actualizar, vea CREATE VIEW (Transact-SQL). rowset_function_limited
Funcin OPENQUERY u OPENROWSET, dependiendo del proveedor. WITH ( <table_hint_limited> [... n] ) Especifica una o varias sugerencias de tabla que estn permitidas en una tabla de destino. La palabra clave WITH y los parntesis son obligatorios. No se permiten NOLOCK ni READUNCOMMITTED. Para obtener ms informacin acerca de las sugerencias de tabla, vea Sugerencias de tabla (Transact-SQL). <OUTPUT_Clause> Devuelve filas eliminadas, o expresiones basadas en ellas, como parte de la operacin DELETE. La clusula OUTPUT no se admite en instrucciones DML dirigidas a tablas o vistas remotas. Para obtener ms informacin, vea OUTPUT (clusula de Transact-SQL). FROM table_source Especifica una clusula FROM adicional. Esta extensin de Transact-SQL para DELETE permite especificar datos de <table_source> y eliminar las filas correspondientes de la tabla en la primera clusula FROM. Se puede utilizar esta extensin, que especifica una combinacin, en lugar de una subconsulta en la clusula WHERE para identificar las filas que se van a quitar. Para obtener ms informacin, vea FROM (Transact-SQL). WHERE Especifica las condiciones utilizadas para limitar el nmero de filas que se van a eliminar. Si no se proporciona una clusula WHERE, DELETE quita todas las filas de la tabla. Hay dos formas de operaciones de eliminacin, que se basan en las condiciones que se especifiquen en la clusula WHERE: Las eliminaciones por bsqueda especifican una condicin de bsqueda que califica las filas que se van a eliminar. Por ejemplo, WHERE column_name= value. Las eliminaciones por posicin utilizan la clusula CURRENT OF para especificar un cursor. La operacin de eliminacin se produce en la posicin actual del cursor. Este mtodo puede ser ms preciso que una instruccin DELETE por bsqueda que utilice una clusula WHERE search_condition para calificar las filas que se van a eliminar. Una instruccin DELETE por bsqueda elimina varias filas si la condicin de bsqueda no identifica exclusivamente una nica fila. <search_condition> Especifica las condiciones restrictivas de las filas que se van a eliminar. No hay lmite en el nmero de predicados que se pueden incluir en una condicin de bsqueda. Para obtener ms informacin, vea Condiciones de bsqueda (Transact-SQL). CURRENT OF Especifica que la instruccin DELETE se ejecutar en la posicin actual del cursor especificado. GLOBAL Especifica que cursor_name hace referencia a un cursor global. cursor_name Es el nombre del cursor abierto desde el que se realiza la captura. Si hay un cursor global y otro local con el nombre cursor_name, este argumento hace referencia al cursor global si se
especifica GLOBAL; de lo contrario, hace referencia al cursor local. El cursor debe permitir actualizaciones. cursor_variable_name Nombre de una variable de cursor. La variable de cursor debe hacer referencia a un cursor que permita realizar actualizaciones. OPTION ( <query_hint> [ ,... n] ) Palabras clave que indican que se utilizan sugerencias del optimizador para personalizar el procesamiento de la instruccin por parte del Motor de base de datos. Para obtener ms informacin, vea Sugerencias de consulta (Transact-SQL).
Prcticas recomendadas
Para eliminar todas las filas de una tabla, use TRUNCATE TABLE. TRUNCATE TABLE es ms rpido que DELETE y utiliza menos recursos de los registros de transacciones y de sistema. Use la funcin @@ROWCOUNT para devolver el nmero de filas eliminadas a la aplicacin cliente. Para obtener ms informacin, vea @@ROWCOUNT (Transact-SQL).
Tratamiento de errores
Puede implementar el control de errores de la instruccin DELETE especificando la instruccin en una construccin TRYCATCH. La instruccin DELETE puede tener un error si infringe un desencadenador o intenta quitar una fila a la que hacen referencia datos de otra tabla con una restriccin FOREIGN KEY. Si la instruccin DELETE quita varias filas y cualquiera de las filas eliminadas infringe un desencadenador o restriccin, se cancela la instruccin, se devuelve un error y no se elimina ninguna fila. Cuando una instruccin DELETE encuentra un error aritmtico (desbordamiento, divisin entre cero o error de dominio) al evaluar una expresin, el Motor de base de datos trata ese error como si SET ARITHABORT fuese ON. Se cancela el resto del proceso por lotes y se devuelve un mensaje de error.
Interoperabilidad
Es posible utilizar DELETE en el cuerpo de una funcin definida por el usuario si el objeto que se va a modificar es una variable de tabla. Al eliminar una fila que contiene una columna FILESTREAM, tambin elimina los archivos del sistema de archivos subyacentes. El recolector de elementos no utilizados de FILESTREAM quita los archivos subyacentes. Para obtener ms informacin, vea Obtener acceso a datos FILESTREAM con TransactSQL. No se puede especificar la clusula FROM en una instruccin DELETE que haga referencia, directa o indirectamente, a una vista que tiene definido un desencadenador INSTEAD OF. Para obtener ms informacin acerca de los desencadenadores INSTEAD OF, vea CREATE TRIGGER (Transact-SQL).
Limitaciones y restricciones
Cuando se usa TOP con DELETE, las filas a las que hace referencia no estn organizadas de ninguna manera y la clusula ORDER BY no se puede especificar directamente en esta instruccin. Si necesita utilizar TOP para eliminar filas por un orden cronolgico significativo, debe usar TOP junto con una clusula ORDER BY en una instruccin de subseleccin. Vea la seccin Ejemplos que aparece ms adelante en este tema. TOP no se puede usar en una instruccin DELETE con vistas divididas en particiones.
Seguridad
Permisos
Se requieren permisos DELETE en la tabla de destino. Tambin se requieren los permisos para utilizar SELECT si la instruccin contiene una clusula WHERE.
Los permisos para utilizar DELETE corresponden de forma predeterminada a los miembros del rol fijo de servidor sysadmin, de los roles fijos de base de datosdb_owner y db_datawriter y al propietario de la tabla. Los miembros de los roles sysadmin, db_owner y db_securityadmin y el propietario de la tabla pueden transferir permisos a otros usuarios.
Ejemplos
Categora Sintaxis bsica Limitar las filas eliminadas Eliminar filas de una tabla remota
Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerencias Capturar los resultados de la instruccin DELETE
Clusula OUTPUT
Sintaxis bsica
En los ejemplos de esta seccin se muestra la funcionalidad bsica de la instruccin DELETE usando la sintaxis mnima requerida.
En los ejemplos de esta seccin se muestra cmo se limita el nmero de filas que se van a eliminar.
En el siguiente ejemplo se muestra una clusula WHERE ms compleja. La clusula WHERE define dos condiciones que deben cumplirse para determinar las filas que se van a eliminar. El valor de la columna StandardCost debe estar comprendido entre 12.00 y 14.00 y el valor de la columna SellEndDate debe ser NULL. En el ejemplo se imprime tambin el valor desde la funcin @@ROWCOUNT para devolver el nmero de filas eliminadas. Transact-SQL USE AdventureWorks2012; GO DELETE Production.ProductCostHistory WHERE StandardCost BETWEEN 12.00 AND 14.00 AND EndDate IS NULL; PRINT 'Number of rows deleted is ' + CAST(@@ROWCOUNT as char(3));
En el ejemplo siguiente se elimina una fila nica de la tabla EmployeePayHistory mediante un cursor denominado my_cursor. La operacin de eliminacin solo afecta a la nica fila que se captura actualmente del cursor. Transact-SQL USE AdventureWorks2012; GO DECLARE complex_cursor CURSOR FOR SELECT a.BusinessEntityID FROM HumanResources.EmployeePayHistory AS a WHERE RateChangeDate <> (SELECT MAX(RateChangeDate) FROM HumanResources.EmployeePayHistory AS b WHERE a.BusinessEntityID = b.BusinessEntityID) ; OPEN complex_cursor; FETCH FROM complex_cursor; DELETE FROM HumanResources.EmployeePayHistory WHERE CURRENT OF complex_cursor; CLOSE complex_cursor; DEALLOCATE complex_cursor; GO
C.Usar combinaciones y subconsultas en los datos de una tabla para eliminar filas de otra tabla
En los siguientes ejemplos se muestran dos maneras de eliminar filas de una tabla en funcin de los datos de otra tabla. En ambos ejemplos, se eliminan las filas de la tabla SalesPersonQuotaHistory basndose en las ventas del ao hasta la fecha almacenadas en la tabla SalesPerson. La primera instruccin DELETE muestra la solucin de subconsulta compatible con ISO y la segunda instruccin DELETE muestra la extensin de FROM de TransactSQL para unir las dos tablas. Transact-SQL -- SQL-2003 Standard subquery USE AdventureWorks2012; GO
DELETE FROM Sales.SalesPersonQuotaHistory WHERE BusinessEntityID IN (SELECT BusinessEntityID FROM Sales.SalesPerson WHERE SalesYTD > 2500000.00); GO Transact-SQL -- Transact-SQL extension USE AdventureWorks2012; GO DELETE FROM Sales.SalesPersonQuotaHistory FROM Sales.SalesPersonQuotaHistory AS spqh INNER JOIN Sales.SalesPerson AS sp ON spqh.BusinessEntityID = sp.BusinessEntityID WHERE sp.SalesYTD > 2500000.00; GO
En el ejemplo siguiente se eliminan filas de una tabla remota especificando la funcin de conjunto de filas OPENQUERY. En este ejemplo se usa el nombre del servidor vinculado creado en el ejemplo anterior. Transact-SQL DELETE OPENQUERY (MyLinkServer, 'SELECT Name, GroupName FROM AdventureWorks2012.HumanResources.Department WHERE DepartmentID = 18'); GO
En el ejemplo siguiente se eliminan las filas de la tabla ProductProductPhoto segn los criterios de bsqueda definidos en la clusula FROM de la instruccin DELETE.La clusula OUTPUT devuelve columnas de la tabla que se elimina (DELETED.ProductID, DELETED.ProductPhotoID) y de la tabla Product. Esta informacin se utiliza en la clusula FROM para especificar las filas que se deben eliminar. Transact-SQL USE AdventureWorks2012; GO DECLARE @MyTableVar table ( ProductID int NOT NULL, ProductName nvarchar(50)NOT NULL, ProductModelID int NOT NULL, PhotoID int NOT NULL); DELETE Production.ProductProductPhoto OUTPUT DELETED.ProductID, p.Name, p.ProductModelID, DELETED.ProductPhotoID INTO @MyTableVar FROM Production.ProductProductPhoto AS ph JOIN Production.Product as p ON ph.ProductID = p.ProductID WHERE p.ProductModelID BETWEEN 120 and 130; --Display the results of the table variable. SELECT ProductID, ProductName, ProductModelID, PhotoID FROM @MyTableVar ORDER BY ProductModelID;
GO
NSERT (Transact-SQL)
SQL Server 2012 Otras versiones
Personas que lo han encontrado til: 3 de 3 - Valorar este tema Agrega una o varias filas a una tabla o una vista en SQL Server 2012. Para obtener ejemplos, vea Ejemplos. Convenciones de sintaxis de Transact-SQL
Sintaxis
Transact-SQL [ WITH <common_table_expression> [ ,...n ] ] INSERT { [ TOP ( expression ) [ PERCENT ] ] [ INTO ] { <object> | rowset_function_limited [ WITH ( <Table_Hint_Limited> [ ...n ] ) ] } { [ ( column_list ) ] [ <OUTPUT Clause> ] { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n | derived_table | execute_statement | <dml_table_source> | DEFAULT VALUES } } } [;] <object> ::= { [ server_name . database_name . schema_name . | database_name .[ schema_name ] . | schema_name . ] table_or_view_name
} <dml_table_source> ::= SELECT <select_list> FROM ( <dml_statement_with_output_clause> ) [AS] table_alias [ ( column_alias [ ,...n ] ) ] [ WHERE <search_condition> ] [ OPTION ( <query_hint> [ ,...n ] ) ] <column_definition> ::= column_name <data_type> [ COLLATE collation_name ] [ NULL | NOT NULL ] <data type> ::= [ type_schema_name . ] type_name [ ( precision [ , scale ] | max ] -- External tool only syntax INSERT { [BULK] [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] ( <column_definition> ) [ WITH ( [ [ , ] CHECK_CONSTRAINTS ] [ [ , ] FIRE_TRIGGERS ] [ [ , ] KEEP_NULLS ] [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ] [ [ , ] ROWS_PER_BATCH = rows_per_batch ] [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ] [ [ , ] TABLOCK ] ) ] } [; ]
Argumentos
WITH <common_table_expression> Especifica el conjunto de resultados con nombre temporal, denominado tambin expresin de tabla comn, definido en el mbito de la instruccin INSERT. El conjunto de resultados se deriva de una instruccin SELECT. Para obtener ms informacin, vea WITH common_table_expression (Transact-SQL). TOP (expression) [ PERCENT ] Especifica el nmero o el porcentaje de filas aleatorias que se van a insertar. expression puede ser un nmero o un porcentaje de las filas. Para obtener ms informacin, vea TOP (Transact-SQL).
INTO Es una palabra clave opcional que se puede utilizar entre INSERT y la tabla de destino. server_name Es el nombre del servidor vinculado en el que se encuentra la tabla o la vista. server_name puede especificarse como un nombre de servidor vinculado o usando la funcin OPENDATASOURCE. Cuando server_name se especifica como un servidor vinculado, se requieren database_name y schema_name. Cuando server_name se especifica con OPENDATASOURCE, database_name y schema_name pueden no aplicarse a todos los orgenes de datos y estar sujetos a las capacidades del proveedor OLE DB que tiene acceso al objeto remoto. database_name Es el nombre de la base de datos. schema_name Es el nombre del esquema al que pertenece la tabla o la vista. table_or view_name Es el nombre de la tabla o la vista que va a recibir los datos. Se puede utilizar una variable de tabla, en su mbito, como origen de tabla en una instruccin INSERT. La vista a la que hace referencia table_or_view_name debe poder actualizarse y debe hacer referencia exactamente a una tabla base en la clusula FROM de la vista. Por ejemplo, la instruccin INSERT de una vista de varias tablas debe utilizar una column_list que solamente haga referencia a columnas de una tabla base. Para obtener ms informacin acerca de las vistas que se pueden actualizar, vea CREATE VIEW (Transact-SQL). rowset_function_limited Especifica la funcin OPENQUERY u OPENROWSET. El uso de estas funciones est sujeto a las capacidades del proveedor OLE DB que tiene acceso al objeto remoto. WITH ( <table_hint_limited> [... n ] ) Especifica una o varias sugerencias de tabla que estn permitidas en una tabla de destino. La palabra clave WITH y los parntesis son obligatorios. No se permiten READPAST, NOLOCK ni READUNCOMMITTED. Para obtener ms informacin acerca de las sugerencias de tabla, vea Sugerencias de tabla (Transact-SQL).
Importante
La posibilidad de especificar las sugerencias HOLDLOCK, SERIALIZABLE, READCOMMITTED, UPDLOCK en tablas que son destinos de instrucciones INSERT se quitar en una versin futura de S influyen en el rendimiento de las instrucciones INSERT. Evite el uso de dichas sugerencias en los nue en modificar las aplicaciones que las utilizan actualmente.
Especificar la sugerencia TABLOCK en una tabla que es el destino de una instruccin INSERT tiene el mismo efecto que especificar la sugerencia TABLOCKX. Se realiza un bloqueo exclusivo en la tabla. (column_list) Es una lista de una o ms columnas donde se van a insertar los datos. column_list se debe incluir entre parntesis y delimitar con comas. Si la columna no se incluye en column_list, Motor de base de datos debe ser capaz de proporcionar un valor basado en la definicin de la columna; de lo contrario, no se puede cargar la fila. Motor de base de datos proporciona automticamente un valor para la columna si esta: Tiene una propiedad IDENTITY. Se usa el valor de identidad incremental siguiente. Tiene un valor predeterminado. Se usa el valor predeterminado de la columna. Tiene un tipo de datos timestamp. Se utiliza el valor actual de marca de tiempo. Admite valores NULL. Se usa un valor NULL. Es una columna calculada. Se utiliza el valor calculado. Se debe usar column_list al insertar valores explcitos en una columna de identidad. La opcin SET IDENTITY_INSERT debe ser ON para la tabla. Clusula OUTPUT Devuelve las filas insertadas como parte de la operacin de insercin. Los resultados se pueden devolver a la aplicacin de procesamiento o insertarse en una tabla o variable de tabla para su nuevo procesamiento. La clusula OUTPUT no se admite en las instrucciones DML que hacen referencia a vistas locales con particiones, vistas distribuidas con particiones, tablas remotas o instrucciones INSERT que contengan una execute_statement. La clusula OUTPUT INTO no se admite en instrucciones INSERT que contengan una clusula <dml_table_source>. VALUES Presenta la lista o listas de valores de datos que se van a insertar. Debe haber un valor de datos por cada columna en column_list, si se especifica, o en la tabla. La lista de valores debe ir entre parntesis. Si los valores de la lista Value no estn en el mismo orden que las columnas de la tabla o no contienen un valor para cada columna de la tabla, se debe usar column_list para especificar de forma explcita la columna que almacenar cada valor de entrada. Puede utilizar el constructor de filas de Transact-SQL (que tambin se denomina constructor con valores de tabla) para especificar varias filas en una nica instruccin INSERT. El constructor de filas se compone de una nica clusula VALUES con varias listas de valores escritos entre parntesis y separados por una coma. Para obtener ms informacin, vea Constructor con valores de tabla (Transact-SQL). DEFAULT Hace que Motor de base de datos cargue el valor predeterminado definido para una columna. Si no existe ningn valor predeterminado para la columna y esta admite valores NULL, se inserta NULL. Para una columna definida con el tipo de datos timestamp, se inserta el siguiente valor de marca de tiempo.DEFAULT no es un valor vlido para una columna de identidad. expression
Es una constante, variable o expresin. La expresin no puede contener una instruccin EXECUTE. Cuando se hace referencia a los tipos de datos de caracteres Unicode nchar, nvarchar y ntext, debe agregarse como prefijo la letra mayscula 'N' a 'expression'. Si no se especifica 'N', SQL Server convierte la cadena en la pgina de cdigos correspondiente a la intercalacin predeterminada de la base de datos o la columna. Los caracteres que no se encuentren en esta pgina de cdigos se perdern. derived_table Es cualquier instruccin SELECT vlida que devuelva filas con los datos que se van a cargar en la tabla. La instruccin SELECT no puede contener una expresin de tabla comn (CTE). execute_statement Es cualquier instruccin EXECUTE vlida que devuelva datos con instrucciones SELECT o READTEXT. Para obtener ms informacin, vea EXECUTE (Transact-SQL). Las opciones de RESULT SETS de la instruccin EXECUTE no se pueden especificar en una instruccin INSERTEXEC. Si se usa execute_statement con INSERT, cada conjunto de resultados debe ser compatible con las columnas de la tabla o de column_list. execute_statement se puede utilizar para ejecutar procedimientos almacenados en el mismo servidor o en un servidor remoto. Se ejecuta el procedimiento en el servidor remoto, se devuelven los conjuntos de resultados al servidor local y se cargan en la tabla del servidor local. En una transaccin distribuida,execute_statement no se puede emitir en un servidor vinculado de bucle invertido cuando la conexin tiene varios conjuntos de resultados activos mltiples (MARS) habilitados. If execute_statement devuelve datos con la instruccin READTEXT, cada instruccin READTEXT puede devolver un mximo de 1 MB (1024 KB) de datos.execute_statement tambin se puede usar con procedimientos extendidos. execute_statement inserta los datos devueltos por el subproceso principal del procedimiento extendido; no obstante, los resultados de los subprocesos distintos del subproceso principal no se insertan. No puede especificar un parmetro con valores de tabla como el destino de una instruccin INSERT EXEC; sin embargo, se puede especificar como un origen en la cadena o procedimiento almacenado INSERT EXEC. Para obtener ms informacin, vea Usar parmetros con valores de tabla (motor de base de datos). <dml_table_source> Especifica que las filas insertadas en la tabla de destino son las que ha devuelto la clusula OUTPUT de una instruccin INSERT, UPDATE, DELETE o MERGE, filtradas opcionalmente por una clusula WHERE. Si se especifica <dml_table_source>, el destino de la instruccin INSERT externa debe cumplir las restricciones siguientes: Debe ser una tabla base, no una vista. No puede ser una tabla remota. No puede tener definido ningn desencadenador. No puede participar en ninguna relacin clave principal-clave externa. No puede participar en la replicacin de mezcla ni en las suscripciones actualizables para la replicacin transaccional.
El nivel de compatibilidad de la base de datos debe estar establecido en 100 o superior. Para obtener ms informacin, vea OUTPUT (clusula de Transact-SQL). <select_list> Es una lista separada por comas que especifica las columnas devueltas por la clusula OUTPUT que se tienen que insertar. Las columnas de <select_list> deben ser compatibles con las columnas en las que se insertan los valores. <select_list> no puede hacer referencia a funciones de agregado ni a TEXTPTR.
Nota
Las variables enumeradas en la lista SELECT hacen referencia a sus valores originales, sin tener en c en <dml_statement_with_output_clause>.
<dml_statement_with_output_clause> Es una instruccin INSERT, UPDATE, DELETE o MERGE vlida que devuelve las filas afectadas en una clusula OUTPUT. La instruccin no puede contener una clusula WITH y no puede tener como destino tablas remotas o vistas con particiones. Si se especifica UPDATE o DELETE, no puede ser una instruccin UPDATE o DELETE basada en cursores. No se puede hacer referencia a las filas de origen como instrucciones DML anidadas. WHERE <search_condition> Es cualquier clusula WHERE que contiene una condicin <search_condition> vlida que filtra las filas devueltas por <dml_statement_with_output_clause>. Para obtener ms informacin, vea Condiciones de bsqueda (Transact-SQL). Cuando se utiliza en este contexto, <search_condition> no puede contener subconsultas, funciones escalares definidas por el usuario que realicen acceso a datos, funciones de agregado, TEXTPTR ni predicados de bsqueda de texto completo. DEFAULT VALUES Hace que la nueva fila contenga los valores predeterminados definidos para cada columna. BULK La usan las herramientas externas para cargar un flujo de datos binarios. Esta opcin no est diseada para usarse con herramientas tales como SQL Server Management Studio, SQLCMD, OSQL ni interfaces de programacin de aplicaciones de acceso a datos como SQL Server Native Client. FIRE_TRIGGERS Especifica que se ejecutarn todos los desencadenadores de insercin definidos en la tabla de destino durante la operacin de carga de flujos de datos binarios. Para obtener ms informacin, vea BULK INSERT (Transact-SQL). CHECK_CONSTRAINTS Especifica que deben comprobarse todas las restricciones de la tabla o vista de destino durante la operacin de carga de flujos de datos binarios. Para obtener ms informacin, vea BULK INSERT (Transact-SQL). KEEPNULLS
Especifica que las columnas vacas deben conservar un valor nulo durante la operacin de carga de flujos de datos binarios. Para obtener ms informacin, vea Mantener valores NULL o usar valores predeterminados durante la importacin masiva (SQL Server). KILOBYTES_PER_BATCH = kilobytes_per_batch Especifica el nmero aproximado de kilobytes (KB) de datos por lote como kilobytes_per_batch. Para obtener ms informacin, vea BULK INSERT (Transact-SQL). ROWS_PER_BATCH =rows_per_batch Indica el nmero aproximado de filas de datos del flujo de datos binarios. Para obtener ms informacin, vea BULK INSERT (Transact-SQL). Nota Se produce un error de sintaxis si no se proporciona una lista de columnas.
Prcticas recomendadas
Utilice la funcin @@ROWCOUNT para devolver el nmero de filas insertado a la aplicacin cliente. Para obtener ms informacin, vea @@ROWCOUNT (Transact-SQL).
La sugerencia IGNORE_TRIGGERS puede deshabilitar temporalmente la ejecucin de desencadenadores. La sugerencia KEEPDEFAULTS permite la insercin del valor predeterminado de la columna de una tabla, si existe, en lugar de NULL, cuando falta el valor del registro de datos de esa columna. La sugerencia KEEPIDENTITY permite que se usen los valores de identidad en el archivo de datos importado para la columna de identidad en la tabla de destino. Estas optimizaciones son similares a las que estn disponibles con el comando BULK INSERT. Para obtener ms informacin, vea Sugerencias de tabla (Transact-SQL).
Tipos de datos
Al insertar filas, considere el comportamiento de los tipos de datos siguientes: Si se va a cargar un valor en columnas con un tipo de datos char, varchar o varbinary, el relleno o el truncamiento de los espacios en blanco finales (espacios para char y varchar, y ceros para varbinary) se determinan mediante el valor de la opcin SET ANSI_PADDING definida para la columna al crear la tabla. Para obtener ms informacin, vea SET ANSI_PADDING (Transact-SQL). En la siguiente tabla se muestra la operacin predeterminada cuando SET ANSI_PADDING es OFF.
Operacin predeterminada Rellena el valor con espacios hasta el ancho definido de la columna.
Quita los espacios finales hasta el ltimo carcter distinto de espacio o hasta un ca cadenas compuestas solamente de espacios. Quita los ceros finales.
varbinary
Si se carga una cadena vaca (' ') en una columna con un tipo de datos varchar o text, la operacin predeterminada consiste en cargar una cadena de longitud cero. Al insertar un valor NULL en una columna text o image, no se crea un puntero de texto vlido ni se asigna previamente una pgina de texto de 8 KB. En las columnas creadas con el tipo de datos uniqueidentifier se almacenan valores binarios de 16 bytes con formato especial. A diferencia de las columnas de identidad, Motor de base de datos no genera automticamente valores de columnas con el tipo de datos uniqueidentifier. Durante una operacin de insercin, se pueden usar variables con un tipo de datos uniqueidentifier y constantes de cadena con el formato xxxxxxxx-xxxxxxxx-xxxx-xxxxxxxxxxxx (36 caracteres incluidos los guiones, donde x es un dgito hexadecimal de los intervalos 0-9 o a-f) para las columnas uniqueidentifier. Por ejemplo, 6F9619FF-8B86-D011-B42D-00C04FC964FF es un valor vlido para una columna o variable uniqueidentifier. Utilice la funcin NEWID() para obtener un identificador nico global (GUID).
Tratamiento de errores
Puede implementar el tratamiento de errores para la instruccin INSERT especificando la instruccin en una construccin TRYCATCH. Si una instruccin INSERT infringe una restriccin o una regla, o si contiene un valor incompatible con el tipo de datos de la columna, la instruccin no se puede ejecutar y se recibe un mensaje de error. Si INSERT carga varias filas con SELECT o EXECUTE, cualquier infraccin de una regla o restriccin que se produzca en los valores que se cargan provoca que se detenga la instruccin y que no se carguen filas. Cuando una instruccin INSERT detecta un error aritmtico (desbordamiento, divisin entre cero o error de dominio) al evaluar una expresin, Motor de base de datos trata dichos errores como si SET ARITHABORT estuviera establecido en ON. El lote se detiene y se devuelve un mensaje de error. Al evaluar una expresin con SET ARITHABORT y SET ANSI_WARNINGS en OFF, si una instruccin INSERT, DELETE o UPDATE encuentra un error aritmtico, desbordamiento, divisin entre cero o error de dominio, SQL Server inserta o actualiza un valor NULL. Si la columna de destino no acepta valores NULL, no se puede efectuar la accin de insercin o actualizacin y el usuario recibe un error.
Interoperabilidad
Cuando se define un desencadenador INSTEAD OF en las acciones INSERT en una tabla o vista, se ejecuta el desencadenador en lugar de la instruccin INSERT. Para obtener ms informacin acerca de los desencadenadores INSTEAD OF, vea CREATE TRIGGER (Transact-SQL).
Limitaciones y restricciones
Cuando se insertan valores en tablas remotas y no se especifican todos los valores de todas las columnas, debe identificar las columnas en las que se deben insertar los valores especificados. Cuando se utiliza TOP con INSERT las filas a las que hace referencia no estn organizadas de ninguna manera y la clusula ORDER BY no se puede especificar directamente en esta instruccin. Si necesita usar TOP para insertar las filas en un orden cronolgico significativo, debe utilizar TOP junto con una clusula ORDER BY que se especifica en una instruccin de subseleccin. Vea la seccin Ejemplos que aparece ms adelante en este tema.
Seguridad
Durante una conexin de servidores vinculados, el servidor de envo proporciona un nombre de inicio de sesin y una contrasea para conectarse en su nombre al servidor de recepcin. Para que esta conexin funcione, debe crear una asignacin de inicio de sesin entre los servidores vinculados utilizandosp_addlinkedsrvlogin. Cuando utilice OPENROWSET (BULK), es importante que entienda el modo en el que SQL Server controla la suplantacin. Para obtener ms informacin, vea "Consideraciones de seguridad" en Importar de forma masiva datos mediante BULK INSERT u OPENROWSET(BULK...) (SQL Server).
Permisos
El permiso INSERT es obligatorio en la tabla de destino. Los permisos para INSERT se adjudican de forma predeterminada a los miembros del rol fijo de servidor sysadmin, a los roles fijos de base de datos db_owner ydb_datawriter, y al propietario de la tabla. Los miembros de los roles sysadmin, db_owner y db_securityadmin, y el propietario de la tabla pueden transferir permisos a otros usuarios. Para ejecutar INSERT con la opcin BULK de la funcin OPENROWSET, debe ser miembro del rol fijo de servidor sysadmin o bulkadmin.
Ejemplos
Especificar objetos de destino que no sean tablas estndar Insertar filas en una tabla remota
Cargar datos de forma masiva de tablas o archivos de datos Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerencias Capturar los resultados de la instruccin INSERT
Clusula OUTPUT
Sintaxis bsica
Los ejemplos de esta seccin demuestran la funcionalidad bsica de la instruccin INSERT usando la sintaxis mnima requerida.
En el siguiente ejemplo se usa el constructor de valores de tabla para insertar tres filas en la tabla Production.UnitMeasure en una instruccin INSERT. Dado que los valores para todas las columnas se suministran e incluyen en el mismo orden que las columnas de la tabla, no es necesario especificar los nombres de columna en la lista de columnas. Transact-SQL USE AdventureWorks2012; GO INSERT INTO Production.UnitMeasure VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'), (N'Y3', N'Cubic Yards', '20080923'); GO
C.Insertar datos que no estn en el mismo orden que las columnas de la tabla
En el siguiente ejemplo se utiliza una lista de columnas para especificar de forma explcita los valores insertados en cada columna. El orden de las columnas de la tabla Production.UnitMeasure es UnitMeasureCode, Name, ModifiedDate; no obstante, las columnas no se incluyen en dicho orden en column_list. Transact-SQL USE AdventureWorks2012; GO INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode, ModifiedDate) VALUES (N'Square Yards', N'Y2', GETDATE()); GO
Los ejemplos de esta seccin demuestran mtodos para insertar valores en columnas que se definen con una propiedad IDENTITY, un valor DEFAULT o se definen con tipos de datos como uniqueidentifer o columnas de un tipo definido por el usuario.
A.Insertar datos en una tabla con columnas que tienen valores predeterminados
En el ejemplo siguiente se muestra la insercin de filas en una tabla con columnas que generan automticamente un valor o tienen un valor predeterminado. Column_1 es una columna calculada que genera automticamente un valor concatenando una cadena con el valor insertado en column_2. Column_2 se define con una restriccin predeterminada. Si no se especifica un valor para esta columna, se usar el valor predeterminado. Column_3 se define con el tipo de datosrowversion, que genera automticamente un nmero binario nico que se incrementa. Column_4 no genera automticamente ningn valor. Cuando no se especifica un valor para esta columna, se inserta NULL. La instruccin INSERT inserta filas que contienen valores para algunas de las columnas, pero no para todas. En la ltima instruccin INSERT, no se especifica ninguna columna y solamente se insertan los valores predeterminados con la clusula DEFAULT VALUES. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL DROP TABLE dbo.T1; GO CREATE TABLE dbo.T1 ( column_1 AS 'Computed column ' + column_2, column_2 varchar(30) CONSTRAINT default_name DEFAULT ('my column default'), column_3 rowversion, column_4 varchar(40) NULL ); GO INSERT INTO dbo.T1 (column_4) VALUES ('Explicit value'); INSERT INTO dbo.T1 (column_2, column_4) VALUES ('Explicit value', 'Explicit value');
INSERT INTO dbo.T1 (column_2) VALUES ('Explicit value'); INSERT INTO T1 DEFAULT VALUES; GO SELECT column_1, column_2, column_3, column_4 FROM dbo.T1; GO
En el siguiente ejemplo se utiliza la funcin NEWID() para obtener un GUID para column_2. A diferencia de las columnas de identidad, Motor de base de datos no genera automticamente valores de columnas con el tipo de datos uniqueidentifier, segn se muestra en la segunda instruccin INSERT. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL DROP TABLE dbo.T1; GO CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 uniqueidentifier, ); GO
INSERT INTO dbo.T1 (column_2) VALUES (NEWID()); INSERT INTO T1 DEFAULT VALUES; GO SELECT column_1, column_2 FROM dbo.T1; GO
Los ejemplos de esta seccin demuestran mtodos para insertar filas de una tabla en otra.
A.Usar las opciones SELECT y EXECUTE para insertar datos de otras tablas
En el siguiente ejemplo se muestra cmo insertar datos de una tabla en otra mediante INSERTSELECT o INSERTEXECUTE. Cada uno se basa en una instruccin SELECT con varias tablas que contiene una expresin y un valor literal en la lista de columnas. La primera instruccin INSERT usa una instruccin SELECT para derivar los datos de las tablas de origen (Employee, SalesPerson y Person) y almacenar el conjunto de resultados en la tabla EmployeeSales . La segunda instruccin INSERT usa la clusula EXECUTE para llamar a un procedimiento almacenado que contiene la instruccin SELECT y la tercera instruccin INSERT usa la clusula EXECUTE para hacer referencia a la instruccin SELECT como una cadena literal. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL DROP TABLE dbo.EmployeeSales; GO IF OBJECT_ID ('dbo.uspGetEmployeeSales', 'P') IS NOT NULL DROP PROCEDURE uspGetEmployeeSales; GO CREATE TABLE dbo.EmployeeSales ( DataSource varchar(20) NOT NULL, BusinessEntityID varchar(11) NOT NULL, LastName varchar(40) NOT NULL, SalesDollars money NOT NULL ); GO CREATE PROCEDURE dbo.uspGetEmployeeSales AS SET NOCOUNT ON;
SELECT 'PROCEDURE', sp.BusinessEntityID, c.LastName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.BusinessEntityID LIKE '2%' ORDER BY sp.BusinessEntityID, c.LastName; GO --INSERT...SELECT example INSERT INTO dbo.EmployeeSales SELECT 'SELECT', sp.BusinessEntityID, c.LastName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.BusinessEntityID LIKE '2%' ORDER BY sp.BusinessEntityID, c.LastName; GO --INSERT...EXECUTE procedure example INSERT INTO dbo.EmployeeSales EXECUTE dbo.uspGetEmployeeSales; GO --INSERT...EXECUTE('string') example INSERT INTO dbo.EmployeeSales EXECUTE (' SELECT ''EXEC STRING'', sp.BusinessEntityID, c.LastName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.BusinessEntityID LIKE ''2%'' ORDER BY sp.BusinessEntityID, c.LastName '); GO --Show results. SELECT DataSource,BusinessEntityID,LastName,SalesDollars FROM dbo.EmployeeSales; GO
B.Usar la expresin de tabla comn WITH para definir los datos insertados
En el siguiente ejemplo se crea la tabla NewEmployee. Una expresin de tabla comn (EmployeeTemp) define las filas de una o varias tablas que se van a insertar en la tabla NewEmployee. La instruccin INSERT hace referencia a las columnas de la expresin de tabla comn. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL DROP TABLE HumanResources.NewEmployee; GO
CREATE TABLE HumanResources.NewEmployee ( EmployeeID int NOT NULL, LastName nvarchar(50) NOT NULL, FirstName nvarchar(50) NOT NULL, PhoneNumber Phone NULL, AddressLine1 nvarchar(60) NOT NULL, City nvarchar(30) NOT NULL, State nchar(3) NOT NULL, PostalCode nvarchar(15) NOT NULL, CurrentFlag Flag ); GO WITH EmployeeTemp (EmpID, LastName, FirstName, Phone, Address, City, StateProvince, PostalCode, CurrentFlag) AS (SELECT e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber, a.AddressLine1, a.City, sp.StateProvinceCode, a.PostalCode, e.CurrentFlag FROM HumanResources.Employee e INNER JOIN Person.BusinessEntityAddress AS bea ON e.BusinessEntityID = bea.BusinessEntityID INNER JOIN Person.Address AS a ON bea.AddressID = a.AddressID INNER JOIN Person.PersonPhone AS pp ON e.BusinessEntityID = pp.BusinessEntityID INNER JOIN Person.StateProvince AS sp ON a.StateProvinceID = sp.StateProvinceID INNER JOIN Person.Person as c ON e.BusinessEntityID = c.BusinessEntityID ) INSERT INTO HumanResources.NewEmployee SELECT EmpID, LastName, FirstName, Phone, Address, City, StateProvince, PostalCode, CurrentFlag FROM EmployeeTemp; GO
En el siguiente ejemplo se crea la tabla EmployeeSales y se insertan el nombre y los datos de ventas del ao hasta la fecha para los primeros 5 empleados aleatorios de la tabla HumanResources.Employee. La instruccin INSERT elige cualquiera de las 5 filas devueltas por la instruccin SELECT. La clusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales. Observe que la clusula ORDER BY de la instruccin SELECT no se utiliza para determinar los primeros 5 empleados. Transact-SQL USE AdventureWorks2012 ; GO IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL DROP TABLE dbo.EmployeeSales;
GO CREATE TABLE dbo.EmployeeSales ( EmployeeID nvarchar(11) NOT NULL, LastName nvarchar(20) NOT NULL, FirstName nvarchar(20) NOT NULL, YearlySales money NOT NULL ); GO INSERT TOP(5)INTO dbo.EmployeeSales OUTPUT inserted.EmployeeID, inserted.FirstName, inserted.LastName, inserted.YearlySales SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.SalesYTD > 250000.00 ORDER BY sp.SalesYTD DESC; Si necesita usar TOP para insertar las filas en un orden cronolgico significativo, debe utilizar TOP junto con ORDER BY en una instruccin de subseleccin, tal y como se muestra en el siguiente ejemplo. La clusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales. Observe que los primeros 5 empleados se insertan ahora segn los resultados de la clusula ORDER BY en lugar de las filas aleatorias. Transact-SQL INSERT INTO dbo.EmployeeSales OUTPUT inserted.EmployeeID, inserted.FirstName, inserted.LastName, inserted.YearlySales SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.SalesYTD > 250000.00 ORDER BY sp.SalesYTD DESC;
En los ejemplos de esta seccin se muestra cmo insertar filas especificando una variable de tabla o vista. En el siguiente ejemplo se especifica un nombre de vista como objeto de destino; sin embargo, la fila nueva se inserta en la tabla base subyacente. El orden de los valores de la instruccin INSERT debe coincidir con el orden de las columnas de la vista. Para obtener ms informacin, vea Modificar datos mediante una vista. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL DROP TABLE dbo.T1; GO IF OBJECT_ID ('dbo.V1', 'V') IS NOT NULL
DROP VIEW dbo.V1; GO CREATE TABLE T1 ( column_1 int, column_2 varchar(30)); GO CREATE VIEW V1 AS SELECT column_2, column_1 FROM T1; GO INSERT INTO V1 VALUES ('Row 1',1); GO SELECT column_1, column_2 FROM T1; GO SELECT column_1, column_2 FROM V1; GO
En el siguiente ejemplo se especifica una variable de tabla como el objeto de destino. Transact-SQL USE AdventureWorks2012; GO -- Create the table variable. DECLARE @MyTableVar table( LocationID int NOT NULL, CostRate smallmoney NOT NULL, NewCostRate AS CostRate * 1.5, ModifiedDate datetime); -- Insert values into the table variable. INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate) SELECT LocationID, CostRate, GETDATE() FROM Production.Location WHERE CostRate > 0; -- View the table variable result set. SELECT * FROM @MyTableVar; GO
Los ejemplos de esta seccin demuestran cmo insertar filas en una tabla de destino remota mediante un servidor vinculado o una funcin de conjunto de filas para hacer referencia a la tabla remota.
USE master; GO -- Create a link to the remote data source. -- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'. EXEC sp_addlinkedserver @server = N'MyLinkServer', @srvproduct = N' ', @provider = N'SQLNCLI', @datasrc = N'server_name', @catalog = N'AdventureWorks2012'; GO Transact-SQL USE AdventureWorks2012; GO -- Specify the remote data source in the FROM clause using a four-part name -- in the form linked_server.catalog.schema.object. INSERT INTO MyLinkServer.AdventureWorks2012.HumanResources.Department (Name, GroupName) VALUES (N'Public Relations', N'Executive General and Administration'); GO
En el ejemplo siguiente se inserta una fila en una tabla remota especificando la funcin de conjunto de filas OPENQUERY. En este ejemplo se usa el nombre del servidor vinculado creado en el ejemplo anterior. Transact-SQL -- Use the OPENQUERY function to access the remote data source. INSERT OPENQUERY (MyLinkServer, 'SELECT Name, GroupName FROM AdventureWorks2012.HumanResources.Department') VALUES ('Environmental Impact', 'Engineering'); GO
-- Reset the recovery model. ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL; GO
B.Usar la funcin OPENROWSET con BULK para cargar datos de forma masiva en una tabla
En el ejemplo siguiente se insertan filas de un archivo de datos en una tabla especificando la funcin OPENROWSET. La sugerencia de tabla IGNORE_TRIGGERS se especifica para la optimizacin del rendimiento. Para obtener ms ejemplos, vea Importar de forma masiva datos mediante BULK INSERT u OPENROWSET(BULK...) (SQL Server). Transact-SQL -- Use the OPENROWSET function to specify the data source and specifies the IGNORE_TRIGGERS table hint. INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName) SELECT b.Name, b.GroupName FROM OPENROWSET ( BULK 'C:\SQLFiles\DepartmentData.txt', FORMATFILE = 'C:\SQLFiles\BulkloadFormatFile.xml', ROWS_PER_BATCH = 15000)AS b ; GO
Los ejemplos de esta seccin demuestran cmo usar sugerencias de tabla para invalidar de forma temporal el comportamiento predeterminado del optimizador de consultas cuando se procesa la instruccin INSERT.
Advertencia
Como el optimizador de consultas de SQL Server suele seleccionar el mejor plan de ejecucin de una consult los administradores de bases de datos y desarrolladores experimentados utilicen las sugerencias como ltimo
instruccin. Estos resultados se pueden devolver a la aplicacin de procesamiento para que los utilice en mensajes de confirmacin, archivado y otros requisitos similares de una aplicacin.
En el siguiente ejemplo se crea la tabla EmployeeSales y, a continuacin, se insertan varias filas en ella usando una instruccin INSERT con una instruccin SELECT para recuperar los datos de las tablas de origen. La tabla EmployeeSales contiene una columna de identidad (EmployeeID) y una columna calculada (ProjectedSales). Puesto que Motor de base de datos genera estos valores durante la operacin de insercin, ninguna de estas columnas se puede definir en @MyTableVar. Transact-SQL USE AdventureWorks2012 ; GO IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL DROP TABLE dbo.EmployeeSales; GO CREATE TABLE dbo.EmployeeSales ( EmployeeID int IDENTITY (1,5)NOT NULL, LastName nvarchar(20) NOT NULL, FirstName nvarchar(20) NOT NULL, CurrentSales money NOT NULL, ProjectedSales AS CurrentSales * 1.10 ); GO DECLARE @MyTableVar table(
LastName nvarchar(20) NOT NULL, FirstName nvarchar(20) NOT NULL, CurrentSales money NOT NULL ); INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales) OUTPUT INSERTED.LastName, INSERTED.FirstName, INSERTED.CurrentSales INTO @MyTableVar SELECT c.LastName, c.FirstName, sp.SalesYTD FROM Sales.SalesPerson AS sp INNER JOIN Person.Person AS c ON sp.BusinessEntityID = c.BusinessEntityID WHERE sp.BusinessEntityID LIKE '2%' ORDER BY c.LastName, c.FirstName; SELECT LastName, FirstName, CurrentSales FROM @MyTableVar; GO SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales FROM dbo.EmployeeSales; GO
En el ejemplo siguiente se capturan los datos devueltos por la clusula OUTPUT de una instruccin MERGE y se insertan en otra tabla. La instruccin MERGE actualiza diariamente la columna Quantity de la tabla ProductInventory basndose en los pedidos procesados en la tabla SalesOrderDetail. Tambin elimina las filas correspondientes a los productos cuyas existencias se colocan en el valor 0. En el ejemplo se capturan las filas que se eliminan y se insertan en otra tabla,ZeroInventory, que realiza el seguimiento de los productos sin existencias. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID(N'Production.ZeroInventory', N'U') IS NOT NULL DROP TABLE Production.ZeroInventory; GO --Create ZeroInventory table. CREATE TABLE Production.ZeroInventory (DeletedProductID int, RemovedOnDate DateTime); GO INSERT INTO Production.ZeroInventory (DeletedProductID, RemovedOnDate) SELECT ProductID, GETDATE() FROM ( MERGE Production.ProductInventory AS pi USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod JOIN Sales.SalesOrderHeader AS soh ON sod.SalesOrderID = soh.SalesOrderID AND soh.OrderDate = '20070401'
GROUP BY ProductID) AS src (ProductID, OrderQty) ON (pi.ProductID = src.ProductID) WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0 THEN DELETE WHEN MATCHED THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID) WHERE Action = 'DELETE'; IF @@ROWCOUNT = 0 PRINT 'Warning: No rows were inserted'; GO SELECT DeletedProductID, RemovedOnDate FROM Production.ZeroInventory;
UPDATE (Transact-SQL)
SQL Server 2012 Otras versiones
Personas que lo han encontrado til: 5 de 5 - Valorar este tema Cambia los datos de una tabla o vista de SQL Server 2012. Para obtener ejemplos, vea Ejemplos. Convenciones de sintaxis de Transact-SQL
Sintaxis
Transact-SQL [ WITH <common_table_expression> [...n] ] UPDATE [ TOP ( expression ) [ PERCENT ] ] { { table_alias | <object> | rowset_function_limited [ WITH ( <Table_Hint_Limited> [ ...n ] ) ] } | @table_variable } SET { column_name = { expression | DEFAULT | NULL } | { udt_column_name.{ { property_name = expression | field_name = expression } | method_name ( argument [ ,...n ] ) } } | column_name { .WRITE ( expression , @Offset , @Length ) } | @variable = expression | @variable = column = expression | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression } [ ,...n ] [ <OUTPUT Clause> ] [ FROM{ <table_source> } [ ,...n ] ] [ WHERE { <search_condition> | { [ CURRENT OF
{ { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } } ] [ OPTION ( <query_hint> [ ,...n ] ) ] [ ; ] <object> ::= { [ server_name . database_name . schema_name . | database_name .[ schema_name ] . | schema_name . ] table_or_view_name}
Argumentos
WITH <common_table_expression> Especifica la vista o el conjunto de resultados temporal indicado, que tambin se conoce como expresin de tabla comn (CTE), definido en el mbito de la instruccin UPDATE. El conjunto de resultados CTE se deriva de una consulta simple. La instruccin UPDATE hace referencia al conjunto de resultados. Las expresiones de tabla comunes tambin se pueden utilizar con las instrucciones SELECT, INSERT, DELETE y CREATE VIEW. Para obtener ms informacin, vea WITH common_table_expression (Transact-SQL). TOP ( expression) [ PERCENT ] Especifica el nmero o porcentaje de filas que se va a actualizar. expression puede ser un nmero o un porcentaje de las filas. Las filas a las que se hace referencia en la expresin TOP utilizada con INSERT, UPDATE o DELETE no se ordenan. En las instrucciones INSERT, UPDATE y DELETE, se deben utilizar parntesis para delimitar expression en TOP. Para obtener ms informacin, vea TOP (Transact-SQL). table_alias Alias especificado en la clusula FROM que representa la tabla o vista de la que se van a actualizar las filas. server_name Es el nombre del servidor (un nombre de servidor vinculado o la funcin OPENDATASOURCE como nombre de servidor) en el que se encuentra la tabla o la vista. Si se especifica server_name, son obligatorios database_name y schema_name. database_name Es el nombre de la base de datos.
schema_name Es el nombre del esquema al que pertenece la tabla o vista. table_or view_name Es el nombre de la tabla o vista cuyas filas se deben actualizar. La vista a la que hace referencia table_or_view_name debe poder actualizarse y debe hacer referencia exactamente a una tabla base en la clusula FROM de la vista. Para obtener ms informacin acerca de las vistas que se pueden actualizar, veaCREATE VIEW (Transact-SQL). rowset_function_limited Es la funcin OPENQUERY u OPENROWSET, dependiendo de las funciones del proveedor. WITH ( <Table_Hint_Limited> ) Especifica una o varias sugerencias de tabla que estn permitidas en una tabla de destino. La palabra clave WITH y los parntesis son obligatorios. No se permiten NOLOCK ni READUNCOMMITTED. Para obtener ms informacin acerca de las sugerencias de tabla, vea Sugerencias de tabla (Transact-SQL). @table_variable Especifica una variable table como origen de la tabla. SET Especifica la lista de nombres de variable o de columna que se van a actualizar. column_name Es una columna que contiene los datos que se van a cambiar. column_name debe existir en table_or view_name. Las columnas de identidad no se pueden actualizar. expression Es una variable, un valor literal, una expresin o una instruccin de subseleccin entre parntesis que devuelve un solo valor. El valor devuelto por expressionsustituye al valor existente en column_name o @variable.
Nota
Cuando se hace referencia a los tipos de datos de caracteres Unicode nchar, nvarchar y ntext, debe a mayscula 'N' a 'expression'. Si no se especifica 'N', SQL Server convierte la cadena a la pgina de c intercalacin predeterminada de la base de datos o columna. Los caracteres que no se encuentren en e
DEFAULT Especifica que el valor predeterminado definido para la columna debe reemplazar al valor existente en esa columna. Esta operacin tambin puede utilizarse para cambiar la columna a NULL si no tiene asignado ningn valor predeterminado y se ha definido para aceptar valores NULL. { += | -= | *= | /= | %= | &= | ^= | |= } Operador de asignacin compuesta: += Sumar y asignar
-= Restar y asignar *= Multiplicar y asignar /= Dividir y asignar %= Mdulo y asignar &= AND bit a bit y asignar ^= XOR bit a bit y asignar |= OR bit a bit y asignar udt_column_name Es una columna de un tipo definido por el usuario. property_name | field_name Es un miembro de propiedad pblico o un miembro de datos pblico de un tipo definido por el usuario. method_name ( argument [ ,... n] ) Es un mtodo mutador pblico no esttico de udt_column_name que utiliza uno o varios argumentos. .WRITE (expression,@Offset,@Length) Especifica que una seccin del valor de column_name se va a modificar. expression reemplaza las unidades @Length a partir de @Offset de column_name. Con esta clusula solo se pueden especificar columnas de tipo varchar(max), nvarchar(max) o varbinary(max). column_name no puede ser NULL y no se puede calificar con un nombre de tabla o un alias de tabla. expression: es el valor que se usa para incrementar column_name. expression se debe evaluar, o bien se debe poder convertir implcitamente al tipo column_name. Si expression se establece como NULL, se omitir @Length, y se truncar el valor de column_name en el @Offset especificado. @Offset es el punto inicial del valor de column_name en el que se escribe expression. @Offset es una posicin ordinal basada en cero, es de tipo bigint y no puede ser un nmero negativo. Si @Offset es NULL, la operacin de actualizacin anexa expression al final del valor de column_name existente y @Length no se tiene en cuenta. Si @Offset es mayor que la longitud del valor de column_name, el Motor de base de datos devuelve un error. Si la suma de @Offset y@Length excede el final del valor subyacente de la columna, se elimina todo hasta el ltimo carcter del valor. Si la suma de @Offset y LEN(expression) es superior al tamao subyacente declarado, se produce un error. @Length es la longitud de la seccin de la columna, a partir de @Offset, que se reemplaza por expression. @Length es de tipo bigint y no puede ser un nmero negativo. Si @Length en NULL, la operacin de actualizacin quita todos los datos de @Offset hasta el final del valor de column_name. Para obtener ms informacin, vea la seccin Notas. @ variable Es una variable declarada que se establece en el valor devuelto por expression. SET @variable = column = expression establece la variable en el mismo valor que la columna. Esto no es lo mismo que SET @variable = column, column =expression, que establece la variable en el valor previo a la actualizacin de la columna.
<OUTPUT_Clause> Devuelve datos actualizados o expresiones basadas en ellos como parte de la operacin UPDATE. La clusula OUTPUT no se admite en instrucciones DML dirigidas a tablas o vistas remotas. Para obtener ms informacin, vea OUTPUT (clusula de Transact-SQL). FROM <table_source> Especifica que se utiliza un origen de tabla, vista o tabla derivada para proporcionar los criterios de la operacin de actualizacin. Para obtener ms informacin, vea FROM (Transact-SQL). Si el objeto que se actualiza es el que se indica en la clusula FROM y solo hay una referencia al objeto en ella, puede especificarse o no un alias de objeto. Si el objeto que se actualiza aparece ms de una vez en la clusula FROM, una nica referencia al objeto no debe especificar un alias de tabla. Todas las dems referencias al objeto de la clusula FROM deben incluir un alias de objeto. Una vista con un desencadenador INSTEAD OF UPDATE no puede ser el destino de UPDATE con una clusula FROM.
Nota
Las llamadas a OPENDATASOURCE, OPENQUERY u OPENROWSET en la clusula FROM se ev independiente de otras llamadas a estas funciones utilizadas como destino de la actualizacin, incluso idnticos a las dos llamadas. En particular, las condiciones de filtro o combinacin aplicadas en el res tienen ningn efecto en los resultados de la otra llamada.
WHERE Especifica las condiciones que limitan las filas que se actualizan. Hay dos modos de actualizacin, dependiendo del formato de clusula WHERE que se utilice: Las actualizaciones por bsqueda especifican una condicin de bsqueda para calificar las filas que se van a eliminar. Las actualizaciones posicionadas utilizan la clusula CURRENT OF para especificar un cursor. La operacin de actualizacin se produce en la posicin actual del cursor. <search_condition> Especifica la condicin que debe cumplirse para que se actualicen las filas. La condicin de bsqueda tambin puede ser la condicin en la que se basa una combinacin. El nmero de predicados que pueden incluirse en una condicin de bsqueda no tiene lmite. Para obtener ms informacin acerca de los predicados y las condiciones de bsqueda, vea Condiciones de bsqueda (Transact-SQL). CURRENT OF Indica que la actualizacin se realice en la posicin actual del cursor especificado. Una actualizacin posicionada que utiliza una clusula WHERE CURRENT OF actualiza la fila que se encuentra en la posicin actual del cursor. Este mtodo puede ser ms preciso que una actualizacin por bsqueda que utilice una clusula WHERE <search_condition> para calificar las filas que se deben actualizar.Una actualizacin por bsqueda modifica varias filas cuando la condicin de bsqueda no identifica una sola fila de forma exclusiva. GLOBAL
Especifica que cursor_name hace referencia a un cursor global. cursor_name Es el nombre del cursor abierto desde el que se debe realizar la captura. Si hay un cursor global y otro local con el nombre cursor_name, este argumento hace referencia al cursor global si se especifica GLOBAL; de lo contrario, hace referencia al cursor local. El cursor debe permitir actualizaciones. cursor_variable_name Es el nombre de una variable de cursor. cursor_variable_name debe hacer referencia a un cursor que permita realizar actualizaciones. OPTION ( <query_hint> [ ,... n ] ) Especifica que se utilizan las sugerencias del optimizador para personalizar el modo en que el Motor de base de datos procesa la instruccin. Para obtener ms informacin, vea Sugerencias de consulta (Transact-SQL).
Prcticas recomendadas
Utilice la funcin @@ROWCOUNT para devolver el nmero de filas insertado a la aplicacin cliente. Para obtener ms informacin, vea @@ROWCOUNT (Transact-SQL). Es posible utilizar nombres de variables en las instrucciones UPDATE para mostrar los valores nuevos y antiguos afectados, pero solo se recomienda cuando la instruccin UPDATE afecta a un nico registro. Si la instruccin UPDATE afecta a varios registros, para devolver los valores nuevos y antiguos de cada registro utilice la clusula OUTPUT. Acte con precaucin al especificar la clusula FROM para proporcionar los criterios de la operacin de actualizacin. Los resultados de una instruccin UPDATE estn sin definir si la instruccin incluye una clusula FROM que no se especifica de manera que solo haya un valor disponible para cada caso de columna que se actualice, es decir, si la instruccin UPDATE no es determinista. Por ejemplo, en la instruccin UPDATE del siguiente script, las dos filas de Table1 cumplen los requisitos de la clusula FROM de la instruccin UPDATE , pero no se define qu fila de Table1 se utiliza para actualizar la fila de Table2. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL DROP TABLE dbo.Table1; GO IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL DROP TABLE dbo.Table2; GO CREATE TABLE dbo.Table1 (ColA int NOT NULL, ColB decimal(10,3) NOT NULL); GO CREATE TABLE dbo.Table2 (ColA int PRIMARY KEY NOT NULL, ColB decimal(10,3) NOT NULL); GO
INSERT INTO dbo.Table1 VALUES(1, 10.0), (1, 20.0); INSERT INTO dbo.Table2 VALUES(1, 0.0); GO UPDATE dbo.Table2 SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB FROM dbo.Table2 INNER JOIN dbo.Table1 ON (dbo.Table2.ColA = dbo.Table1.ColA); GO SELECT ColA, ColB FROM dbo.Table2; Puede ocurrir el mismo problema cuando se combinan las clusulas FROM y WHERE CURRENT OF. En el ejemplo siguiente, las dos filas de Table2 cumplen los requisitos de la clusula FROM de la instruccin UPDATE. No se ha definido qu fila de Table2 se utilizar para actualizar la fila de Table1. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL DROP TABLE dbo.Table1; GO IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL DROP TABLE dbo.Table2; GO CREATE TABLE dbo.Table1 (c1 int PRIMARY KEY NOT NULL, c2 int NOT NULL); GO CREATE TABLE dbo.Table2 (d1 int PRIMARY KEY NOT NULL, d2 int NOT NULL); GO INSERT INTO dbo.Table1 VALUES (1, 10); INSERT INTO dbo.Table2 VALUES (1, 20), (2, 30); GO DECLARE abc CURSOR LOCAL FOR SELECT c1, c2 FROM dbo.Table1; OPEN abc; FETCH abc; UPDATE dbo.Table1 SET c2 = c2 + d2 FROM dbo.Table2 WHERE CURRENT OF abc; GO SELECT c1, c2 FROM dbo.Table1; GO
Soporte de compatibilidad
En una versin futura de SQL Server se quitar el uso de las sugerencias READUNCOMMITTED y NOLOCK en la clusula FROM que se aplican a la tabla de destino de una instruccin UPDATE o DELETE. Evite usar estas sugerencias en este contexto en el nuevo trabajo de desarrollo y planee modificar las aplicaciones que las usan actualmente.
Tipos de datos
Todas las columnas char y nchar se rellenan a la derecha hasta la longitud definida. Si ANSI_PADDING se establece en OFF, se quitan todos los espacios finales de los datos insertados en las columnas varchar y nvarchar, excepto en las cadenas que contienen solo espacios. Estas cadenas se truncan en una cadena vaca. Si ANSI_PADDING se establece en ON, se insertan espacios al final. El controlador ODBC de Microsoft SQL Server y el proveedor OLE DB para SQL Server establecen automticamente SET ANSI_PADDING en ON para cada conexin. Se puede configurar en orgenes de datos ODBC o mediante atributos o propiedades de conexin. Para obtener ms informacin, vea SET ANSI_PADDING (Transact-SQL).
Importante
Los tipos de datos ntext, text e image se quitarn en una versin futura de Microsoft SQL Server. Evite su u y piense en modificar las aplicaciones que los usan actualmente. Use nvarchar(max), varchar(max) y varbina
No se puede usar la clusula .WRITE para actualizar una columna NULL o establecer el valor de column_name como NULL. @Offset y @Length se especifican en bytes para los tipos de datos varbinary y varchar, y en caracteres para el tipo de datos nvarchar. Se calculan los desplazamientos correspondientes para las intercalaciones del juego de caracteres de doble byte (DBCS). Para que el rendimiento sea ptimo, se recomienda insertar o actualizar los datos en tamaos de fragmento que sean mltiplos de 8.040 bytes. Si la columna modificada por la clusula .WRITE se hace referencia en una clusula OUTPUT, el valor completo de la columna, ya sea la imagen anterior de deleted.column_name o la imagen posterior de inserted.column_name, se vuelve a la columna especificada en la variable de tabla. Vea el ejemplo G a continuacin. Para obtener la misma funcionalidad de .WRITE con otros tipos de datos de carcter o binarios, utilice STUFF (Transact-SQL).
Nota
SQL Server devuelve un error si se invoca un mtodo mutador en un valor NULL de Transact-SQL, o mtodo mutador es NULL.
Modificar el valor de un miembro de propiedad registrado o un miembro de datos pblico del tipo definido por el usuario. La expresin que suministra el valor debe poder convertirse implcitamente al tipo de la propiedad. En el ejemplo siguiente se modifica el valor de la propiedad X del tipo Point definido por el usuario. UPDATE Cities SET Location.X = 23.5 WHERE Name = 'Anchorage'; Para modificar diferentes propiedades de la misma columna de tipo definido por el usuario, emita varias instrucciones UPDATE o invoque un mtodo mutador del tipo.
Win32. Al actualizar un campo FILESTREAM, modifica los datos de BLOB subyacentes en el sistema de archivos. Cuando un campo FILESTREAM est establecido en NULL, se eliminan los datos de BLOB asociados al campo. No puede utilizar .WRITE() para realizar actualizaciones parciales de datos FILESTREAM. Para obtener ms informacin, vea FILESTREAM (SQL Server).
Tratamiento de errores
Si la actualizacin de una fila infringe una restriccin o una regla, infringe la configuracin de valores NULL de la columna o si el nuevo valor es de un tipo de datos incompatible, se cancela la instruccin, se devuelve un error y no se actualiza ningn registro. Cuando una instruccin UPDATE encuentra un error aritmtico (error de desbordamiento, divisin por cero o de dominio) durante la evaluacin de la expresin, la actualizacin no se lleva a cabo. El resto del lote no se ejecuta y se devuelve un mensaje de error. Si la actualizacin de una o varias columnas que participan en un ndice clster hace que el tamao del mismo y de la fila supere 8.060 bytes, la actualizacin no se produce y se devuelve un mensaje de error.
Interoperabilidad
Se pueden utilizar instrucciones UPDATE en el cuerpo de las funciones definidas por el usuario solamente si la tabla que se modifica es una variable de tabla. Cuando se define un desencadenador INSTEAD OF para las acciones UPDATE de una tabla, se ejecuta el desencadenador en lugar de la instruccin UPDATE. En versiones anteriores de SQL Server solo se admite la definicin de desencadenadores AFTER en instrucciones UPDATE y otras instrucciones de modificacin de datos. No se puede especificar la clusula FROM en una instruccin UPDATE que haga referencia, directa o indirectamente, a una vista que tenga definido un desencadenador INSTEAD OF. Para obtener ms informacin acerca de los desencadenadores INSTEAD OF, vea CREATE TRIGGER (Transact-SQL).
Limitaciones y restricciones
No se puede especificar la clusula FROM en una instruccin UPDATE que haga referencia, directa o indirectamente, a una vista que tenga definido un desencadenador INSTEAD OF. Para obtener ms informacin acerca de los desencadenadores INSTEAD OF, vea CREATE TRIGGER (Transact-SQL). Cuando una expresin de tabla comn (CTE) es el destino de una instruccin UPDATE, todas las referencias a la CTE de la instruccin deben coincidir. Por ejemplo, si la CTE tiene asignado un alias en la clusula FROM, el alias se debe utilizar para obtener todas las otras referencias a la CTE. Se requieren referencias CTE inequvocas porque una CTE no tiene un objeto ID, que utiliza SQL Server para reconocer la relacin implcita entre un objeto y su alias. Sin esta relacin, el plan de consulta puede producir un comportamiento de la unin inesperado y resultados imprevistos de la consulta. Los ejemplos siguientes muestran mtodos correctos e incorrectos de especificar una CTE cuando la CTE es el objeto de destino de la operacin de actualizacin. Transact-SQL USE tempdb;
GO -- UPDATE statement with CTE references that are correctly matched. DECLARE @x TABLE (ID int, Value int); DECLARE @y TABLE (ID int, Value int); INSERT @x VALUES (1, 10), (2, 20); INSERT @y VALUES (1, 100),(2, 200); WITH cte AS (SELECT * FROM @x) UPDATE x -- cte is referenced by the alias. SET Value = y.Value FROM cte AS x -- cte is assigned an alias. INNER JOIN @y AS y ON y.ID = x.ID; SELECT * FROM @x; GO El conjunto de resultados es el siguiente. ID Value ------ ----1 100 2 200 (2 row(s) affected) Transact-SQL -- UPDATE statement with CTE references that are incorrectly matched. USE tempdb; GO DECLARE @x TABLE (ID int, Value int); DECLARE @y TABLE (ID int, Value int); INSERT @x VALUES (1, 10), (2, 20); INSERT @y VALUES (1, 100),(2, 200); WITH cte AS (SELECT * FROM @x) UPDATE cte -- cte is not referenced by the alias. SET Value = y.Value FROM cte AS x -- cte is assigned an alias. INNER JOIN @y AS y ON y.ID = x.ID; SELECT * FROM @x; GO El conjunto de resultados es el siguiente. ID Value ------ ----1 100 2 100 (2 row(s) affected)
Una instruccin UPDATE siempre adquiere un bloqueo exclusivo (X) en la tabla que modifica y retiene ese bloqueo hasta que se completa la transaccin. Con un bloqueo exclusivo, ninguna otra
transaccin puede modificar los datos. Puede especificar sugerencias de tabla para invalidar este comportamiento predeterminado durante la ejecucin de la instruccin UPDATE especificando otro mtodo de bloqueo, sin embargo se recomienda que solo los desarrolladores y administradores de bases de datos experimentados usen las sugerencias y nicamente como ltimo recurso. Para obtener ms informacin, vea Sugerencias de tabla (Transact-SQL).
Seguridad
Permisos
Se requieren permisos UPDATE en la tabla de destino. Tambin se requieren permisos SELECT para la tabla que se actualiza si la instruccin UPDATE contiene una clusula WHERE o en el caso de que el argumento expression de la clusula SET utilice una columna de la tabla. Los permisos para utilizar UPDATE corresponden de forma predeterminada a los miembros del rol fijo de servidor sysadmin, de los roles fijos de base de datosdb_owner y db_datawriter y al propietario de la tabla. Los miembros de los roles sysadmin, db_owner y db_securityadmin, y el propietario de la tabla pueden transferir permisos a otros usuarios.
Ejemplos
Especificar objetos de destino que no sean tablas estndar Actualizar los datos basados en datos del resto de las tablas Actualizar las filas de una tabla remota
Actualizar tipos de datos de objetos grandes Actualizar tipos definidos por el usuario Invalidar el comportamiento predeterminado del optimizador de consultas mediante sugerencias Capturar los resultados de la instruccin UPDATE Usar UPDATE en otras instrucciones
Clusula OUTPUT
Procedimientos almacenados
Sintaxis bsica
Los ejemplos de esta seccin demuestran la funcionalidad bsica de la instruccin UPDATE con la sintaxis mnima requerida.
En el siguiente ejemplo se actualizan los valores de las columnas Bonus, CommissionPct y SalesQuota para todas las filas de la tabla SalesPerson. Transact-SQL USE AdventureWorks2012; GO UPDATE Sales.SalesPerson SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL; GO
En los ejemplos de esta seccin se muestran varias formas de limitar el nmero de filas afectadas por la instruccin UPDATE. En el ejemplo siguiente se utiliza la clusula WHERE para especificar las filas que se van a actualizar. La instruccin actualiza el valor de la columna Color de la tablaProduction.Product para todas las filas con un valor existente de 'Red' en la columna Color y con un valor que comience por 'Road-250' en la columna Name. Transact-SQL USE AdventureWorks2012; GO UPDATE Production.Product SET Color = N'Metallic Red'
En los siguientes ejemplos use la clusula TOP para limitar el nmero de filas que se modifican en una instruccin UPDATE. Cuando se usa una clusula TOP (n) con UPDATE, la operacin de actualizacin se realiza en una seleccin aleatoria de un nmero de filas ' n'. En el ejemplo siguiente se actualiza un 25 por ciento la columnaVacationHours en 10 filas aleatorias de la tabla Employee. Transact-SQL USE AdventureWorks2012; GO UPDATE TOP (10) HumanResources.Employee SET VacationHours = VacationHours * 1.25 ; GO Si debe usar TOP para aplicar actualizaciones por orden cronolgico, debe utilizarla junto con ORDER BY en una instruccin de subseleccin. En el siguiente ejemplo se actualizan las horas de vacaciones de los 10 empleados cuyas fechas de alta son ms antiguas. Transact-SQL UPDATE HumanResources.Employee SET VacationHours = VacationHours + 8 FROM (SELECT TOP 10 BusinessEntityID FROM HumanResources.Employee ORDER BY HireDate ASC) AS th WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID; GO
En el siguiente ejemplo se actualiza el valor PerAssemnblyQty para todas las partes y componentes que se utilizan directamente o indirectamente para crear elProductAssemblyID 800. La expresin de tabla comn devuelve una lista jerrquica de partes que se utilizan directamente para generar el ProductAssemblyID 800y las partes que se utilizan para generar esos componentes, etc. Solo se modifican las filas devueltas por la expresin de tabla comn. Transact-SQL USE AdventureWorks2012; GO WITH Parts(AssemblyID, ComponentID, PerAssemblyQty, EndDate, ComponentLevel) AS ( SELECT b.ProductAssemblyID, b.ComponentID, b.PerAssemblyQty, b.EndDate, 0 AS ComponentLevel FROM Production.BillOfMaterials AS b WHERE b.ProductAssemblyID = 800 AND b.EndDate IS NULL UNION ALL SELECT bom.ProductAssemblyID, bom.ComponentID, p.PerAssemblyQty, bom.EndDate, ComponentLevel + 1 FROM Production.BillOfMaterials AS bom INNER JOIN Parts AS p ON bom.ProductAssemblyID = p.ComponentID AND bom.EndDate IS NULL )
UPDATE Production.BillOfMaterials SET PerAssemblyQty = c.PerAssemblyQty * 2 FROM Production.BillOfMaterials AS c JOIN Parts AS d ON c.ProductAssemblyID = d.AssemblyID WHERE d.ComponentLevel = 0;
En el siguiente ejemplo se usa la clusula WHERE CURRENT OF para actualizar solo la fila en la que se coloca el cursor. Cuando un cursor se basa en una combinacin, solo se modifica el table_name especificado en la instruccin UPDATE. Las dems tablas que participan en el cursor no se ven afectadas. Transact-SQL USE AdventureWorks2012; GO DECLARE complex_cursor CURSOR FOR SELECT a.BusinessEntityID FROM HumanResources.EmployeePayHistory AS a WHERE RateChangeDate <> (SELECT MAX(RateChangeDate) FROM HumanResources.EmployeePayHistory AS b WHERE a.BusinessEntityID = b.BusinessEntityID) ; OPEN complex_cursor; FETCH FROM complex_cursor; UPDATE HumanResources.EmployeePayHistory SET PayFrequency = 2 WHERE CURRENT OF complex_cursor; CLOSE complex_cursor; DEALLOCATE complex_cursor; GO
En los ejemplos de esta seccin se muestra la actualizacin de columnas mediante valores calculados, subconsultas y valores DEFAULT. En los siguientes ejemplos se usan valores calculados en una instruccin UPDATE. En el ejemplo se duplica el valor de la columna ListPrice para todas las filas de la tabla Product. Transact-SQL USE AdventureWorks2012 ; GO UPDATE Production.Product SET ListPrice = ListPrice * 2; GO
DECLARE @NewPrice int = 10; UPDATE Production.Product SET ListPrice += @NewPrice WHERE Color = N'Red'; GO En el siguiente ejemplo se usa el operador compuesto += para anexar los datos ' - tool malfunction' al valor existente de la columna Name de las filas que tienen un valor de ScrapReasonID comprendido entre 10 y 12. Transact-SQL USE AdventureWorks2012; GO UPDATE Production.ScrapReason SET Name += ' - tool malfunction' WHERE ScrapReasonID BETWEEN 10 and 12;
En el siguiente ejemplo se establece la columna CostRate en su valor predeterminado (0.00) para todas las filas que tengan un valor de CostRate mayor que 20.00. Transact-SQL USE AdventureWorks2012; GO UPDATE Production.Location SET CostRate = DEFAULT WHERE CostRate > 20.00;
-- Display the results of the UPDATE statement. SELECT EmpID, NewVacationHours, ModifiedDate FROM @MyTableVar ORDER BY EmpID; GO
En el ejemplo siguiente se inserta una fila en una tabla remota especificando la funcin de conjunto de filas OPENDATASOURCE. Especifique un nombre de servidor vlido para el origen de datos con el formato server_name o server_name\instance_name. Quiz deba configurar la instancia de SQL Server para las consultas distribuidas ad hoc. Para obtener ms informacin, vea 5b982015-e19644c3-83b8-275fb9d769b2.cmp.xml (opcin de configuracin del servidor). Transact-SQL
UPDATE OPENQUERY (MyLinkServer, 'SELECT GroupName FROM HumanResources.Department WHERE DepartmentID = 4') SET GroupName = 'Sales and Marketing';
En los ejemplos de esta seccin se muestran los mtodos de actualizacin de los valores de columnas definidos con tipos de datos de objetos grandes (LOB).
A.Usar UPDATE con .WRITE para modificar los datos de una columna de tipo nvarchar(max)
En el ejemplo siguiente se utiliza la clusula .WRITE para actualizar un valor parcial de DocumentSummary, una columna de tipo nvarchar(max) de la tablaProduction.Document . La palabra components se sustituye por la palabra features especificando la palabra sustituta, la ubicacin inicial (desplazamiento) de la palabra que se va a sustituir en los datos existentes y el nmero de caracteres que se va a sustituir (longitud). En el ejemplo tambin se usa la clusula OUTPUT para devolver las imgenes anterior y posterior de la columna DocumentSummary a la variable de tabla @MyTableVar. Transact-SQL USE AdventureWorks2012; GO DECLARE @MyTableVar table ( SummaryBefore nvarchar(max), SummaryAfter nvarchar(max)); UPDATE Production.Document SET DocumentSummary .WRITE (N'features',28,10) OUTPUT deleted.DocumentSummary, inserted.DocumentSummary INTO @MyTableVar WHERE Title = N'Front Reflector Bracket Installation'; SELECT SummaryBefore, SummaryAfter FROM @MyTableVar; GO
B.Usar UPDATE con .WRITE para agregar y quitar datos en una columna de tipo nvarchar(max)
En los ejemplos siguientes se agregan y quitan datos en una columna de tipo nvarchar(max) que tiene un valor establecido actualmente en NULL. Dado que no se puede utilizar la clusula .WRITE para modificar una columna NULL, primero se llena la columna con datos temporales. Despus, estos datos se reemplazan por los datos correctos mediante la clusula .WRITE. En los dems ejemplos se anexan datos al final del valor de la columna, se quitan (truncan) los datos de la columna y, por ltimo, se quitan los datos parciales de la columna. Las instrucciones SELECT muestran la modificacin de datos resultante de cada instruccin UPDATE. Transact-SQL USE AdventureWorks2012; GO -- Replacing NULL value with temporary data. UPDATE Production.Document SET DocumentSummary = N'Replacing NULL value' WHERE Title = N'Crank Arm and Tire Maintenance';
GO SELECT DocumentSummary FROM Production.Document WHERE Title = N'Crank Arm and Tire Maintenance'; GO -- Replacing temporary data with the correct data. Setting @Length to NULL -- truncates all existing data from the @Offset position. UPDATE Production.Document SET DocumentSummary .WRITE(N'Carefully inspect and maintain the tires and crank arms.',0,NULL) WHERE Title = N'Crank Arm and Tire Maintenance'; GO SELECT DocumentSummary FROM Production.Document WHERE Title = N'Crank Arm and Tire Maintenance'; GO -- Appending additional data to the end of the column by setting -- @Offset to NULL. UPDATE Production.Document SET DocumentSummary .WRITE (N' Appending data to the end of the column.', NULL, 0) WHERE Title = N'Crank Arm and Tire Maintenance'; GO SELECT DocumentSummary FROM Production.Document WHERE Title = N'Crank Arm and Tire Maintenance'; GO -- Removing all data from @Offset to the end of the existing value by -- setting expression to NULL. UPDATE Production.Document SET DocumentSummary .WRITE (NULL, 56, 0) WHERE Title = N'Crank Arm and Tire Maintenance'; GO SELECT DocumentSummary FROM Production.Document WHERE Title = N'Crank Arm and Tire Maintenance'; GO -- Removing partial data beginning at position 9 and ending at -- position 21. UPDATE Production.Document SET DocumentSummary .WRITE ('',9, 12) WHERE Title = N'Crank Arm and Tire Maintenance'; GO SELECT DocumentSummary FROM Production.Document WHERE Title = N'Crank Arm and Tire Maintenance'; GO
C.Usar UPDATE con OPENROWSET para modificar una columna de tipo varbinary(max)
En el ejemplo siguiente se sustituye por una imagen nueva una imagen almacenada en una columna de tipo varbinary(max). La funcin OPENROWSET se usa con la opcin BULK para cargar la imagen en la columna. En este ejemplo se da por supuesto que hay un archivo denominado Tires.jpg en la ruta de acceso especificada. Transact-SQL USE AdventureWorks2012; GO UPDATE Production.ProductPhoto SET ThumbNailPhoto = ( SELECT * FROM OPENROWSET(BULK 'c:\Tires.jpg', SINGLE_BLOB) AS x ) WHERE ProductPhotoID = 1; GO
En el siguiente ejemplo se usa la instruccin UPDATE para modificar los datos del archivo del sistema de archivos. No se recomienda este mtodo para transmitir grandes cantidades de datos a un archivo. Use las interfaces de Win32 adecuadas. En el ejemplo siguiente se reemplaza cualquier texto del registro del archivo por el texto Xray 1. Para obtener ms informacin, vea FILESTREAM (SQL Server). Transact-SQL UPDATE Archive.dbo.Records SET [Chart] = CAST('Xray 1' as varbinary(max)) WHERE [SerialNumber] = 2;
En los siguientes ejemplos se modifican valores de columnas de tipo definido por el usuario (UDT) CLR. Se muestran tres mtodos. Para obtener ms informacin acerca de las columnas definidas por el usuario, vea Tipos definidos por el usuario de CLR.
B.Invocar un mtodo
Puede actualizar un UDT invocando un mtodo, marcado como mutador, del tipo definido por el usuario, para realizar la actualizacin. En el ejemplo siguiente se invoca un mtodo mutador de tipo Point denominado SetXY. Esto actualiza el estado de la instancia del tipo. UPDATE dbo.Cities SET Location.SetXY(23.5, 23.5) WHERE Name = 'Anchorage';
En los ejemplos de esta seccin se muestra cmo usar sugerencias de tabla y de consulta para invalidar de forma temporal el comportamiento predeterminado del optimizador de consultas cuando se procesa la instruccin UPDATE.
Advertencia
Como el optimizador de consultas de SQL Server suele seleccionar el mejor plan de ejecucin de una consult los administradores de bases de datos y los desarrolladores experimentados utilicen las sugerencias y como
WHERE ProductNumber LIKE @Product OPTION (OPTIMIZE FOR (@Product = 'BK-%') ); GO -- Execute the stored procedure EXEC Production.uspProductUpdate 'BK-%';
En los ejemplos de esta seccin se muestra cmo usar UPDATE en otras instrucciones.
En el siguiente ejemplo se usa una instruccin UPDATE en un bloque TRYCATCH para administrar los errores de ejecucin que se puedan producir durante una operacin de actualizacin. Transact-SQL USE AdventureWorks2012; GO BEGIN TRANSACTION; BEGIN TRY -- Intentionally generate a constraint violation error. UPDATE HumanResources.Department SET Name = N'MyNewName' WHERE DepartmentID BETWEEN 1 AND 2; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_STATE() AS ErrorState ,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage; IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; END CATCH; IF @@TRANCOUNT > 0 COMMIT TRANSACTION; GO
El INNER JOIN
El INNER JOIN es otro tipo de composicin de tablas, permite emparejar filas de distintas tablas de forma ms eficiente que con el producto cartesiano cuando una de lascolumnas de emparejamiento est indexada. Ya que en vez de hacer el producto cartesiano completo y luego seleccionar la filas que cumplen la condicin de emparejamiento, para cada fila de una de las tablas busca directamente en la otra tabla las filas que cumplen la condicin, con lo cual se emparejan slo las filas que luego aparecen en el resultado.
La sintaxis es la siguiente:
Ejemplo: SELECT * FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no, nombre de consulta guardada), de las tablas cuyos registros se van a combinar. Pueden ser las dos la misma tabla, en este caso es obligatorio definir al menos un alias de tabla. col1, col2 son las columnas de emparejamiento. Observar que dentro de la clusula ON los nombres de columna deben ser nombres cualificados (llevan delante el nombre de la tabla y un punto). Las columnas de emparejamiento deben contener la misma clase de datos, las dos de tipo texto, de tipo fecha etc... los campos numricos deben ser de tipos similares. Por ejemplo, se puede combinar campos AutoNumrico y Long puesto que son tipos similares, sin embargo, no se puede combinar campos de tipo Simple y Doble. Adems las columnas no pueden ser de tipo Memo ni OLE. comp representa cualquier operador de comparacin ( =, <, >, <=, >=, o <> ) y se utiliza para establecer la condicin de emparejamiento. Se pueden definir varias operadores AND y OR poniendo condiciones de emparejamiento unidas por los cada condicin entre parntesis. Ejemplo:
SELECT * FROM pedidos INNER JOIN productos ON (pedidos.fab = productos.idfab) AND (pedidos.producto = productos.idproducto) Se pueden combinar ms de dos tablas En este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN completo. Por ejemplo:
SELECT * FROM (pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie) INNER JOIN empleados ON pedidos.rep = empleados.numemp En vez de tabla1 hemos escrito un INNER JOIN completo, tambin podemos escribir: SELECT * FROM clientes INNER JOIN (pedidos INNER JOIN empleados ON pedidos.rep = empleados.numemp) ON pedidos.clie = clientes.numclie En este caso hemos sustituido tabla2 por un INNER JOIN completo.
Combinacin interna.
La combinacin interna nos permite mostrar los datos de dos o ms tablas a travs de una condicin WHERE. Si recordamos los ejemplos de los capitulos anteriores tenemos una tabla de coches, en la que tenemos referenciada la marca a travs del cdigo de marca. Para realizar la consulta combinada entre estas dos tablas debemos escribir una consulta SELECT en cuya clasula FROM escribiremos el nombre de las dos tablas, separados por comas, y una condicin WHERE que obligue a que el cdigo de marca de la tabla de coches sea igual al cdigo de la tabla de marcas. Lo ms sencillo es ver un ejemplo directamente:
SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROM tCoches, tMarcas WHERE tCoches.marca = tMarcas.codigo
Demonos cuenta que hemos antepuesto el nombre de cada tabla a el nombre del campo, esto no es obligatorio si los nombres de campos no se repiten en las tablas, pero es acondajable para evitar conflictos de nombres entre campos. Por ejemplo, si para referirnos al campo marca no anteponemos el nombre del campo la base de datos no sabe si queremos el campo marca de la tabla tCoches, que contiene el cdigo de la marca, o el campo marca de la tabla tMarcas, que contiene el nombre de la marca. Otra opcin es utilizar la clusula INNER JOIN. Su sintaxis es identica a la de una consulta SELECT habitual, con la particularidad de que n la clusula FROM slo aparece una tabla o vista, aadiendose el resto de tablas a travs de clusulas INNER JOIN .
SELECT [ALL | DISTINCT ] <nombre_campo> [{,<nombre_campo>}] FROM <nombre_tabla> [{INNER JOIN <nombre_tabla> ON <condicion_combinacion>}] [WHERE <condicion> [{ AND|OR <condicion>}]] [GROUP BY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condicion>[{ AND|OR <condicion>}]] [ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC] [{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]
El ejemplo anterior escrito utilizando la clausula INNER JOIN quedaria de la siguiente manera:
SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROM tCoches INNER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
La clusula INNER JOIN permite separar completamente las condiciones de combinacin con otros criterios, cuando tenemos consultas que combinan nueve o diez tablas esto realmente se agradece. Sin embargo muchos programadores no son amigos de la clusula INNER JOIN, la razn es que uno de los principales gestores de bases de datos, ORACLE, no la soportaba. Si nuestro porgrama debia trabajar sobre bases de datos ORACLE no podiamos utilizar INNER JOIN. A partir de la version ORACLE 9i oracle soporta la clusula INNER JOIN.
[arriba]
Combinacin Externa
La combinacin interna es excluyente. Esto quiere decir que si un registro no cumple la condicin de combinacin no se incluye en los resultados. De este modo en el ejemplo anterior si un coche no tiene grabada la marca no se devuelve en mi consulta. Segn la naturaleza de nuestra consulta esto puede ser una ventaja , pero en otros casos significa un serio problema. Para modificar este comportamiento SQL pone a nuestra disposicin la combinacin externa. La combinacin externa no es excluyente. La sintaxis es muy parecida a la combinacin interna,
SELECT [ALL | DISTINCT ] <nombre_campo> [{,<nombre_campo>}] FROM <nombre_tabla> [{LEFT|RIGHT OUTER JOIN <nombre_tabla> ON <condicion_combinacion>}] [WHERE <condicion> [{ AND|OR <condicion>}]] [GROUP BY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condicion>[{ AND|OR <condicion>}]] [ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC] [{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]
La combinacin externa puede ser diestra o siniestra, LEFT OUTER JOIN o RIGHT OUTER JOIN. Con LEFT OUTER JOIN obtenemos todos los registros de en la tabla que situemos a la izquierda de la clausula JOIN, mientras que con RIGHT OUTER JOIN obtenmos el efecto contrario. Como mejor se ve la combinacin externa es con un ejemplo.
SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROM tCoches LEFT OUTER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
Esta consulta devolver todos los registros de la tabla tCoches, independientemente de que tengan marca o no. En el caso de que el coche no tenga marca se devolver el valor null para los campos de la tabla tMarcas. Visualmente (la consulta devuelve los datos en azul) ...
SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROM tCoches RIGHT OUTER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
Esta consulta devolver los registros de la tabla tCoches que tengan marca relacionada y todos los registros de la tabla tMarcas, tengan algn registro en tCoches o no. Visualmente (la consulta devuelve los datos en azul) ...
[arriba]
Union
La clusula UNION permite unir dos o ms conjuntos de resultados en uno detras del otro como si se tratase de una nica tabla. De este modo podemos obtener los registros de mas de una tabla "unidos". La sintaxis corresponde a la de varias SELECT unidas a travs de UNION, como se muestra a continuacin:
<nombre_campo> [{,<nombre_campo>}] FROM <nombre_tabla> [{LEFT|RIGHT OUTER JOIN <nombre_tabla> ON <condicion_combinacion>}] [WHERE <condicion> [{ AND|OR <condicion>}]] [GROUP BY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condicion>[{ AND|OR <condicion>}]] { UNION [ALL | DISTINCT ] SELECT [ALL | DISTINCT ] <nombre_campo> [{,<nombre_campo>}] FROM <nombre_tabla> [{LEFT|RIGHT OUTER JOIN <nombre_tabla> ON <condicion_combinacion>}] [WHERE <condicion> [{ AND|OR <condicion>}]] [GROUP BY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condicion>[{ AND|OR <condicion>}]] } [ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC] [{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]
Para utilizar la clausula UNION debemos cumplir una serie de normas. Las consultas a unir deben tener el mismo nmero campos, y adems los campos deben ser del mismo tipo. Slo puede haber una nica clausula ORDER BY al final de la sentencia SELECT. El siguiente ejemplo muestra el uso de UNION
SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROM tCoches INNER JOIN tMarcas ON tCoches.marca = tMarcas.codigo UNION SELECT tMotos.matricula, tMarcas.marca, tMotos.modelo, tMotos.color, tMotos.numero_kilometros, 0 FROM tMotos INNER JOIN tMarcas ON tMotos.marca = tMarcas.codigo; Puede observarse el uso de la constante cero en la segunda lista de seleccin para hacer coincidir el nmero y tipo de campos que devuelve la consulta UNION.
Si antes se dijo que el SGBD realiza el producto cartesiano entre dos tablas y posteriormente mediante la clusula WHERE ignora aquellos registros que carecen de sentido y muestra los que guardan una relacin, ahora podemos verlo del siguiente modo: el SGBD recorrer la tabla hijo(CURSOS) y para cada uno asociar el registro de la tabla padre(PROFESORES) que satisface la clusula ON. Para asociar el profesor no es necesario realizar, para cada curso, un recorrido secuencial sobre la tabla PROFESORES hasta encontrarlo, puesto que en la clusula ON estamos indicando su clave primaria, por lo que el motor SQL usuar el ndice que la clave lleva implicito para localizar un profesor de forma mucho ms eficiente. Igual que hara usted para localizar un captulo concreto de un libro, usando el ndice.
Algunos puristas afirman que este es el modo correcto de construir las consultas, porque el motor SQL trabaja de un modo ms eficiente, a otros sin embargo les resulta incomodo o simplemente menos atractivo. Lo ideal sera que todo esto fuese transparente al desarrollador. El motor SQL debe interpretar la consulta y devolver el resultado de la forma ms eficiente, obviamente realizando productos cartesianos y posteriormente filtrando los registros no es un mtodo eficiente, pero esto es algo que consideramos en este curso como herramienta de aprendizaje o mtodo de comprensin, y que en realidad los SGBD no hacen a no ser que no les quede ms remedio, ya sea porque se lo pidamos explcitamente omitiendo la clusula WHERE, no se hayan establecido las relaciones, o sean poco "inteligentes". Dicho de otro modo, yo espero de un SGBD que sea eficaz no solo al ejecutar la consulta, sino al interpretarla y al elaborar un plan de ejecucin adecuado y eficaz, y poder usar la sintaxis que ms cmoda me resulte, sin tener que pensar si la consulta es costosa o no para el motor SQL. Desafortunadamente no siempre se podr pasar esto por alto, en ocasiones se deber optimizar la consulta para ayudar al SGBD a ser ms eficiente. En cualquier caso la optimizacin queda fuera del alcance de este curso. Por ahora basta con que usted sepa que es importante crear las claves primarias y forneas debidamente, tanto por una cuestin de eficiencia como de integridad referencial. Veamos otro ejemplo de la leccin anterior usando esta clusula, concretamente del apartado de ejercicios, donde se peda los cursos en que se ha matriculado el alumno con identificador 1:
CDIGO: SELECCIONAR TODO
select C.TITULO CURSO from ALUMNOS_CURSOS AC inner join CURSOS C on AC.ID_CURSO = C.ID_CURSO where AC.ID_ALUMNO = 1
Observe como en la clusula WHERE se establece un filtro propiamente dicho, y en la clusula ON se establece la condicin de reunin que el motor debe aplicar entre las tablas a ambos lados de la clusula INNER JOIN. Veamos un ltimo ejemplo de reunin interna en la que aparezcan tres tablas, para ello tomemos otro ejemplo de la leccin anterior, la reunin de los alumnos con los cursos que cursa cada uno.
Tomando ejemplos equivalentes construidos nicamente con la clusula WHERE se pueden observar mejor las diferencias.
select C.TITULO CURSO , concat(A.APELLIDOS,', ',A.NOMBRE ) ALUMNO from ALUMNOS_CURSOS AC inner join ALUMNOS A on AC.ID_ALUMNO = A.ID_ALUMNO inner join CURSOS C on AC.ID_CURSO = C.ID_CURSO
Si ahora sobre este consulta se quisiera reducir el resultado a un curso o un alumno en concreto, se aadira la pertinente clusula WHERE con el filtro deseado justo antes de la clusula ORDER BY. ***
Reunin externa - left outer join / right outer join La reunin externa puede verse en este caso como una reunin interna donde no es necesario que el registro hijo tenga informada la clave fornea para ser mostrado, por ejemplo, cuando se mostraban los cursos junto a los profesores que los imparten, como uno de los cursos no tiene padre, es decir, no tiene un profesor asignado, o lo que es lo mismo, el campo ID_PROFE de la tabla CURSOS est a nulo, este curso no se muestra dado que no satisface la clusula ON. Bien, este recurso nos ofrece la posibilidad de mostrar estos registros con los campos del registro padre a nulo. La reunin externa siempre se realizaran por la izquierda o por la derecha, una de las dos. De este modo expresamos el deseo de considerar todos los registros de la tabla a la izquierda o a la derecha de la clusula OUTER JOIN, aunque no se hallen coincidencias con la otra tabla segn la clusula ON. Veamos la consulta que muestra los cursos y sus profesores aunque el curso no tenga profesor asignado:
Como en este caso usamos LEFT OUTER JOIN, la tabla que de la izquierda, es decir, la tabla CURSOS, ser considerada por completo aunque no tenga xito la clusula ON, en cuyo caso los campos de la tabla situada a la derecha de la clusula se mostrarn a nulo. Si invertimos el orden de las tablas y usamos RIGHT OUTER JOIN, o simplemente RIGHT JOIN, expresin equivalente simplificada aplicable tambin a LEFT JOIN, el resultado es el mismo.
En la consulta anterior se estn considerando todos los cursos aunque estos no tengan un profesor definido, si ahora usted quisiera obtener esto mismo pero aadiendo un filtro sobre la tabla PROFESORES, por ejemplo que el apellido del profesor contenga una "E", cabe esperar hacerlo en la clusula WHERE, sin embargo tambin es posible aplicar el filtro en la clusula ON. En realidad elegiremos una u otra clusula en funcin de lo que deseemos obtener. Si lo hacemos en la clausula ON de un OUTER JOIN se estarn obteniendo todos los cursos con los campos de la tabla PROFESORES a nulo si la condicion establecida en la clusula ON no tiene xito. Si se hace en la clusula WHERE se estar forzando a que se cumpla dicha clusula y por tanto la reunin externa se rompe. Veamos esto con un ejemplo: Consulta que muestra todos los cursos acompaados del profesor que lo imparte. Si el curso no tiene profesro definido o bien el campo APELLIDOS no contiene una "E", los campos de la tabla PROFESORES se mostrarn a nulo:
select * from PROFESORES P right join CURSOS C on C.ID_PROFE = P.ID_PROFE and P.APELLIDOS like '%E%'
El resultado presenta para el curso 3 los campos de la tabla PROFESORES a nulo porque el campo APELLIDOS del profesor que lo imparte no contiene un "E". Para el curso 5 ocurre lo mismo pero en este caso el motivo es adems que no tiene profesor definido, con que mucho menos podr ser cierta la otra condicin. Ahora aplicamos el filtro del apellido en la clusula WHERE:
select * from PROFESORES P right join CURSOS C on C.ID_PROFE = P.ID_PROFE where P.APELLIDOS like '%E%'
Observamos como la reunin externa se rompe puesto que la clusula WHERE exige que el apellido del profesor contenga una "E", dado que los cursos que no tienen profesor definido la consulta devuelve el apellido a nulo, esta clusula no se satisface por lo que oculta el registro y la reunin externa carece de sentido, o si usted quiere, la clausula WHERE es aplicable a la tabla CURSOS pero no a la tabla PROFESORES, puesto que en este caso no tiene sentido realizar una reunin externa para que luego un filtro en la clusula WHERE la anule. ***
Vamos ahora a ver los recuentos sobre reuniones externas, por ejemplo los alumnos que hay matriculados en cada curso. Esta consulta se present en la leccin anterior, en el apartado de ejercicios, sin embargo los cursos sin alumnos matriculados eran ignorados en lugar de aparecer con un cero como sera de esperar. Esto es debido a que no satisfacen la clausula ON de una reunin interna, por lo que se debe usar la reunin externa para este propsito, pero cuidado, ahora no nos sirve el recuento de registros, puesto que pueden venir cursos sin alumnos, o lo que es lo mismo, cursos con los datos del alumno a nulo, de modo que si contamos registros los datos no sern verdicos, deben contarse alumnos. Revise si lo cree conveniente la leccin 10donde se trataron las particularidades del valor NULO. Alumnos matriculados en cada curso, aunque estos sean cero:
select C.TITULO CURSO, count(AC.ID_ALUMNO) ALUMNOS, count(1) REGISTROS from ALUMNOS_CURSOS AC right join CURSOS C on AC.ID_CURSO = C.ID_CURSO group by C.TITULO
En la anterior consulta se han contado tanto alumnos como registros para poder observar la diferencia. La nica fila en que estos dos valores difieren es para el curso de SQL avanzado. Dado que la reunin externa devuelve la fila con los datos del alumno a nulo para los cursos sin alumnos, al realizar un recuento de registros el valor es uno, el registro existe, pero al realizar el recuento del campo ID_ALUMNO este es ignorado por la funcin COUNT por ser nulo. Observe que en este caso la tabla que interesa tratar por completo mostrando todos sus registros es la tabla padre(CURSOS), y la tabla donde no importa que halla aciertos es la tabla hijos(ALUMNOS_CURSOS). Es decir, la consulta devuelve todos los registros de la tabla CURSOS aunque para ellos no existan hijos en la tabla ALUMNOS_CURSOS. En los ejemplos anteriores a este ltimo, tambin interesaba tratar por completo la tabla CURSOS, pero esta ejerca de hijo y no de padre, y los campos de la tabla PROFESORES podan venir a nulo no porque no existiera el registro en la tabla PROFESORES que tambin, sino como consecuencia de que el campo ID_PROFE de la tabla CURSOS contena un valor nulo.
***
Por ltimo comentar que la reunin externa no es posible hacerla usando nicamente la clusula WHERE, debemos forzosamente usar la clusula OUTER JOIN. Esto es as en MySQL, sin embargo en Oracle, que originalmente solo se podan construir consultas con las sintaxis basada en clusula WHERE, si es posible realizar reuniones externas con esta sintaxis, para ello indicamos el smbolo"(+)" tras los campos de la clausula WHERE pertenecientes a la tabla que devolver los campos a nulo en el caso de no cumplirse la condicin, por ejemplo la consulta anterior en Oracle se construira de la siguiente manera. Consulta Oracle:
select C.TITULO CURSO, count(AC.ID_ALUMNO) ALUMNOS, count(1) REGISTROS from ALUMNOS_CURSOS AC ,CURSOS C where AC.ID_CURSO(+) = C.ID_CURSO group by C.TITULO
Con ello estamos indicando el SGBD Oracle que aunque no encuentre el registro en la tabla ALUMNOS_CURSOS, devuelva el registro de la tabla CURSOS con los datos de la tabla ALUMNOS_CURSOS a nulo, es decir, se esta realizando una reunin externa. Por ejemplo, en la consulta en la que se devolva todos los cursos con el profesor que imparte cada curso y ademas incluamos el filtro de que el apellido del profesor tuviese una "E" se construira de la siguiente manera en Oracle: Consulta Oracle:
select * from PROFESORES P , CURSOS C where C.ID_PROFE = P.ID_PROFE(+) and P.APELLIDOS(+) like '%E%'
En general en una reunin externa debemos tratar siempre la tabla cuyos campos pueden venir a
nulo, si es en Oracle, aunque actualmente es posible usar la sintaxis OUTER JOIN, pondremos el smbolo "(+)" a cada campo de dicha tabla que aparezca en la clusula WHERE. Si usamos OUTER JOIN, pondremos todos los campos que establecen condiciones de dicha tabla en la clusula ON, si lo hacemos en la clusula WHERE como filtro corriente la reunin externa se rompe y carece de sentido. *** Resumen La reunin interna permite reunir registros de tablas relacionadas ignorando los registros que no satisfacen la condicin de reunin especificada en la clusula WHERE o bien en la clusula ON en el caso de usar la sintaxis INNER JOIN. La reunin externa permite reunir registros de tablas relacionadas considerando todos los registros de una primera tablas aunque ninguno de los registros de una segunda tabla presente aciertos contra la primera, obviamente en ese caso los campos de esta ltima tabla vendrn a nulo. Existen dos sintaxis para realizar las operaciones de reunin ya sea externa o interna, dependiendo del SGBD. Basada en clusula WHERE o bien basada en clusula INNER JOIN / OUTER JOIN. Lo ideal sera dejar a criterio del desarrollador el uso de cualquiera de ellas siempre y cuando el SGBD lo soporte. En una reunin externa debemos tratar siempre la tabla cuyos campos pueden venir a nulo poniendo todos los campos que establecen condiciones de dicha tabla en la clusula ON del OUTER JOIN, si lo hacemos en la clusula WHERE como filtro corriente la reunin externa se rompe y carece de sentido. *** Ejercicio 1 Construya una consula que resuelva el nmero de cursos que imparte cada profesor usando la clusula INNER JOIN. Ejercicio 2 Realice una consulta entre las tablas CURSOS, ALUMNOS y ALUMNOS_CURSOS de modo que aparezcan los alumnos matriculados en cada curso pero mostrando todos los cursos aunque no tengan alumnos matriculados.
Demo Database
In this tutorial we will use the well-known Northwind sample database. Below is a selection from the "Customers" table:
CustomerID CustomerName ContactName Address City
Posta
1 2
1220
0502
Antonio Moreno
0502
Thomas Hardy
WA1
Berglunds snabbkp
Christina Berglund
Berguvsvgen 8
Lule
S-95
Try it yourself
Try it yourself
Operator
Description
Equal Not equal. Note: In some versions of SQL this operator may be written as != Greater than Less than Greater than or equal Less than or equal Between an inclusive range Search for a pattern To specify multiple possible values for a column
A modo de apunte diremos, aunque poco tenga que ver con esta leccin, que el SQL nos permite calcular ciertas operaciones matemticas tanto en la clausula SELECT, para obtener resultados, como en la clusula WHERE, para establecer condiciones:
select 3 + 4
A la pregunta: Qu empleados tienen un salario mayor de 1350?, podramos construir la consulta SQL as, sustituyendo 1350 por: 1300 + 50.
Lgica booleana Lo que se pretende abordar en esta leccin principalmente es la lgica booleana, que es la que
nos permite establecer condiciones. Advierto que esta leccin puede resultar un poco dura, si tiene dificultades para entender lo que trataremos, no se preocupe e intente quedarse con la idea de fondo. Cuando usted jugaba al ya clsico juego de quin es quin?,
usted estaba aplicando lgica booleana para descubrir el personaje que su contrincante esconda. Usted lanzaba preguntas con el propsito de saber si una caracterstica del personaje misterioso era cierta o falsa, y si era cierta, descartaba los personajes que no presentaban esa caracterstica. El SGBD hace algo muy parecido, usted establece una caracterstica en la clausula WHERE de la consulta SQL, y el SGBD descarta los registros en que la caracterstica es falsa, mientras que mantiene los que es cierta. Expresiones booleanas Si usted jugando a Quin es quin? preguntaba a su contrincante: tiene barba?, lo que en realidad estaba preguntando era: EL PERSONAJE MISTERIOSO tiene BARBA? pues bien, esto es una expresin booleana donde: "tiene" es el operador, "EL PERSONAJE MISTERIOSO" es un operando variable, que depende del personaje elegido por su contrincante, y "BARBA" es un operando constante. El resultado de aplicar esta expresin a un personaje concreto dar cierto si el personaje tiene barba, y falso en caso contrario. Cuando en la primera consulta de este cuso:
indicbamos en la clausula WHERE: SALARIO > 1350(es SALARIO mayor a 1350?), estbamos estableciendo una expresin booleana donde: ">" es el operador, "SALARIO" es un operando variable, que tomar valores de cada registro de la tabla EMPLEADOS, y "1350" es un operando constante. El resultado de esta expresin depende del valor que tome la variable SALARIO, pero en cualquier caso slo puede dar dos posibles resultados, o cierto o falso. Por lo tanto diremos que una expresin booleana slo tiene dos posibles resultados. El motor SQL evala la expresin booleana de la clausula WHERE para cada registro de la tabla, y el resultado determina si el registro que se est tratando se tomar en consideracin. Lo har si el resultado de evaluar la expresin es cierto, y lo ignorar si el resultado es falso. Ejemplo de expresiones booleanas: "4 > 3" : es cuatro mayor que tres? "3 = 12" : es tres igual a doce?
Fjese que los operandos son del mismo tipo, en este caso tipo INT. Sin embargo el resultado obtenido no es un dato de tipo INT, sino booleano, sus posibles valores son cierto o falso. (4 > 3) = cierto (3 = 12) = falso
Operadores Algunos de los operadores que nos permiten construir expresiones booleanas son: > : "A > B" devuelve cierto si A es estrictamente mayor que B, de lo contrario devuelve falso. < : "A < B" devuelve cierto si A es estrictamente menor que B, de lo contrario devuelve falso. = : "A = B" devuelve cierto si A es igual a B, de lo contrario devuelve falso.
>= : "A >= B" devuelve cierto si A es mayor o igual a B, de lo contrario devuelve falso. <= : "A <= B" devuelve cierto si A es menor o igual a B, de lo contrario devuelve falso. != : "A != B" devuelve cierto si A es distinto a B, de lo contrario devuelve falso.
Al construir expresiones con estos operadores, los dos operandos deben ser del mismo tipo, ya sean nmeros, cadenas o fechas. Ejemplo de expresin booleana con cadenas: ('Aranda, Pedro' < 'Zapata, Mario' ) = cierto, puesto que por orden alfabtico 'Aranda, Pedro' est posicionado antes que 'Zapata, Mario' , por lo tanto es menor el primero que el segundo. Operadores lgicos Los operadores lgicos permiten formar expresiones booleanas tomando como operandos otras expresiones booleanas. Fjese que en las expresiones vistas anteriormente, los operandos deban ser nmeros, cadenas o fechas, ahora sin embargo los operandos deben ser expresiones booleanas, el conjunto forma una nueva expresin booleana que, como toda expresin booleana, dar como resultado cierto o falso. AND : "A and B" devuelve cierto si A y B valen cierto, y falso en cualquier otro caso. OR : "A or B" devuelve cierto si A o B valen cierto, y falso nicamente cuando tanto A como B valen falso. NOT : "not A" devuelve falso si A vale cierto, y cierto si A vale falso.
Veamos una aplicacin en el mundo cotidiano. Supongamos el siguiente anunciado: Mi jefe quiere contratar a una persona para repartir genero, solamente pueden optar a la vacante aquellos candidatos que tengan vehculo propio y licencia de conducir automviles. Como candidatos tenemos a ngela, que tiene licencia pero no tiene vehculo. A Salva, que tiene licencia y vehculo. Y a Teresa, que tiene vehculo pero de momento no tiene licencia. Quines pueden pasar al proceso de seleccin? Convertimos el anunciado en una expresin booleana: Sea C: pasa al proceso de seleccin. Sea A: tiene vehculo propio. Sea B: tiene licencia de conducir automviles.
Entonces para que un candidato satisfaga C, se debe dar A y B: C = A and B Resolvamos la expresin para cada candidato: Aplicado a ngela: C = (A and B) = (falso and cierto) = falso. Luego no pasa al proceso de seleccin. Aplicado a Salva: C = (A and B) = (cierto and cierto) = cierto. Luego pasa al proceso de seleccin. Aplicado a Teresa: C = (A and B) = (cierto and falso) = falso. Luego no pasa al proceso de seleccin. Veamos ahora esto mismo aplicado al SQL: Consideremos ahora la tabla PERSONAS, donde hemos guardado una "S" en el campo RUBIA si la persona es rubia y una "N" en caso contrario, anlogamente se ha aplicado el mismo criterio para ALTA y GAFAS, es decir, para indicar si es alta y si lleva gafas.
El operador AND Como ya hemos dicho el operador AND devuelve cierto si ambas expresiones son ciertas, y falso en cualquier otro caso. Supongamos que queremos saber qu personas son rubias y altas?, para ello construimos la siguiente consulta SQL:
select NOMBRE from PERSONAS where (RUBIA = 'S') and (ALTA = 'S')
Resultado: Evaluar (RUBIA = 'S') da como resultado cierto o falso, al igual que evaluar (ALTA = 'S'), son de echo los dos operandos booleanos del operador AND. Si para un registro ambos son ciertos el
resultado es cierto, y se mostrarn los datos de ese registro que indica la clausula SELECT. En el caso de tener una expresin de la forma: "A and B and D" la expresin se evala por partes por orden de aparicin: primero se evala (A and B) = E y finalmente (E and D) Si todos los operadores de la expresin son AND, entonces todos las expresiones deben valer cierto para que el resultado sea cierto. Veamos un ejemplo de esto mientras jugamos a Quin es quin? Usted pregunta: es rubia? y la respuesta es cierto es alta? y la respuesta es falso lleva gafas? y la respuesta es cierto Por lo tanto debe ser una persona que sea rubia y, no sea alta y, lleve gafas. Quin es el personaje?
CDIGO: SELECCIONAR TODO
select NOMBRE from PERSONAS where (RUBIA = 'S') and (ALTA = 'N') and (GAFAS='S')
Resultado:
Antes de dejar el operador AND, recordar del modo equivalente y ms simplificado que se coment en la leccin 3 en que podemos condicionar un campo a un rango de valores mediante el operador BETWEEN:
que el salario sea mayor o igual a 1300 y menor o igual a 1500 forma equivalente:
CDIGO: SELECCIONAR TODO
que el salario este entre 1300 y 1500 El operador OR Con el operador OR basta que uno de los dos operandos sea cierto para que el resultado sea cierto: Supongamos que queremos saber las personas que son rubias o bien altas, es decir, queremos que si es rubia la considere con independencia de su altura, y a la inversa, tambin queremos que la seleccione si es alta independientemente del color de pelo. La consulta sera la siguiente.
Resultado: Si todos los operadores de la expresin son OR, por ejemplo "A or B or C", entonces todos las expresiones deben valer falso para que el resultado sea falso, con que solo una valga cierto el resultado es cierto. Supongamos que quiere seleccionar tres registros concretos de la tabla EMPLEADOS para ver sus datos, le interesan los registros con identificador 1, 2 y 4. Para esta situacin debe usar el
operador OR, puesto que su consulta debe establecer la condicin: que el identificador sea 1, 2 o 4:
Resultado:
El asterisco presente en la clusula SELECT equivale a indicar todos los campos de la tabla.
Fjese como en la anterior consulta para cualquier registro de la tabla EMPLEADOS que el campo ID_EMPLEADO contenga un valor distinto a 1, 2 o 4, el resultado de evaluar la expresin ser falso, puesto que todos las expresiones booleanas darn falso, pero con que una de ellas valga cierto, el registro sera seleccionado. De hecho si un mismo campo aparece dos o ms veces en expresiones de la clusula WHERE como en el ejemplo anterior, carece de sentido que el operador sea AND: usted puede esperar que una persona sea rubia o morena, pero no puede esperar que sea rubia y morena. Del mismo modo el identificador de un registro nunca podr ser 1 y 2, o es 1 o es 2 o es x. Un modo de simplificar la anterior consulta es mediante la palabra clave IN, donde se establece una lista de valores posibles que debe contener el campo indicado para que el registro sea seleccionado. La palabra clave IN equivale a establecer condiciones sobre un mismo campo conectadas por el operador OR.
Resultado:
El operador NOT Este operador tan solo tiene un operando, el resultado es negar el valor del operando de modo que: "(4 > 3) = cierto" luego "not (4>3) = falso" Si negamos dos veces una expresin booleana es equivalente a la expresin original: "(4 > 3) = cierto" luego "not ( not (4>3) ) = cierto" Cuando descubrimos al personaje misterioso, a la pregunta es alta? la respuesta era falso, luego podramos haber establecido lo siguiente: "not (ALTA = 'S')" en lugar de "(ALTA = 'N')":
CDIGO: SELECCIONAR TODO
select NOMBRE from PERSONAS where (RUBIA = 'S') and not (ALTA = 'S') and (GAFAS='S')
Resultado:
Otro ejemplo: si negamos toda la expresin de la clausula WHERE, estaremos precisamente seleccionando los registros que antes descartbamos, y al revs, descartando los que antes seleccionbamos. Tomemos la anterior consulta y neguemos la clausula WHERE, si antes el resultado era: Carmen, ahora el resultado ha de ser todas las persona menos Carmen. Para hacer esto cerramos entre
parntesis toda la expresin y le colocamos el operador "not" delante, de ese modo primero se resolver lo que esta dentro de los parntesis y finalmente se negar el resultado.
select NOMBRE from PERSONAS where not ((RUBIA = 'S') and not(ALTA = 'S') and (GAFAS= 'S'))
Y aun otro ejemplo de este operador junto la palabra clave IN: tomemos la consulta que seleccionaba tres registros concretos de la tabla EMPLEADOS, y modifiqumosla nicamente incluyendo el operador NOT para que devuelva lo contrario, es decir, todos los registros menos los tres que antes seleccionaba:
Resultado:
El uso de parntesis Los parntesis se comportan como en matemticas, no es lo mismo "5 + 4 / 3" donde primero se calcular la divisin y despus se sumar 5, que "(5 + 4) / 3" donde primero se resolver la suma y el resultado parcial se dividir por 3. Sin parntesis la divisin tiene prioridad sobre la suma, con parntesis forzamos a que la operacin se realice en el orden deseado. Los operadores AND y OR tienen la misma prioridad de modo que se evala la expresin por orden
de aparicin: No es lo mismo: "RUBIA and ALTA or GAFAS" = "(RUBIA and ALTA) or GAFAS" que, "RUBIA and (ALTA or GAFAS)". En primer caso estamos diciendo: "que sea rubia y alta, o bien lleve gafas", y en el segundo "que sea rubia y, sea alta o lleve gafas".
select NOMBRE from PERSONAS where RUBIA = 'S' and ALTA = 'S' or GAFAS= 'S'
Resultado:
select NOMBRE from PERSONAS where RUBIA = 'S' and (ALTA = 'S' or GAFAS= 'S')
Resultado:
*** Resumen En esta leccin se ha descrito como construir expresiones booleanas y como trabajar con ellas para establecer condiciones en la clausula WHERE de una consulta SQL. Las expresiones booleanas con operadores tales como ( > , = , != ...) precisan operandos de tipo nmero, cadena o fecha, y el resultado de evaluar la expresin devuelve siempre cierto o falso. Ejemplo: (SALARIO > 1350)
Las expresiones con operadores tales como (AND , OR , NOT) precisan expresiones booleanas como operandos, el conjunto es una nueva expresin booleana que al evaluarla devolver siempre cierto o falso. Ejemplo: RUBIA = 'S' and ALTA = 'S' El uso de parntesis garantiza que, en una expresin compleja las expresiones simples que la forman se evalen en el orden que usted desea. Ejemplo: not ( (RUBIA = 'S' or ALTA = 'S') and (ALTA ='N' or GAFAS = 'S') ) *** Ejercicio 1 Cree una consulta SQL que devuelva las personas que son altas, o bien son rubias con gafas. Ejercicio 2 Cree una consulta SQL que devuelva los empleados que son mujer y cobran ms de 1300 euros.
En la tabla empleados se guarda una "H" en el campo SEXO para indicar que es hombre, o una "M" para indicar que es mujer.
Ejercicio 3 Usando solo expresiones (ALTA = 'S') , (RUBIA = 'S') , (GAFAS = 'S') combinadas con el operador NOT resuelva: Quin es quin? Lleva gafas y no es alta ni rubia. Ejercicio 4 (optativo) Suponiendo que A vale cierto y B vale falso, evale la siguiente expresin booleana: C= ((A and B) and (A or (A or B))) or A