0% encontró este documento útil (0 votos)
197 vistas59 páginas

T SQL

Este documento describe el lenguaje Transact-SQL utilizado por Microsoft SQL Server. Explica que Transact-SQL incluye sentencias para consultar, definir, modificar y controlar datos en una base de datos. Además, describe los elementos básicos del lenguaje como identificadores, tipos de datos, funciones, expresiones y comentarios. Finalmente, analiza las instrucciones SELECT, INSERT, UPDATE y DELETE más importantes.

Cargado por

Edgar Villafan
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
197 vistas59 páginas

T SQL

Este documento describe el lenguaje Transact-SQL utilizado por Microsoft SQL Server. Explica que Transact-SQL incluye sentencias para consultar, definir, modificar y controlar datos en una base de datos. Además, describe los elementos básicos del lenguaje como identificadores, tipos de datos, funciones, expresiones y comentarios. Finalmente, analiza las instrucciones SELECT, INSERT, UPDATE y DELETE más importantes.

Cargado por

Edgar Villafan
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 59

TRANSACT-SQL Lenguaje de consulta de datos.

EL LENGUAJE SQL

El SQL (Structured Query Language) es un lenguaje estructurado de consulta y de administración


de bases de datos, fue definido inicialmente por D.D. Chamberlin y otros durante la última parte de
la década de los setenta. Al principio se le denominó SEQUEL y fue desarrollado junto con el
prototipo de bases de datos relacional de IBM: System R.

SQL aparece para sustentar el modelo relacional de bases de datos que fue propuesto por E. F.
Codd en 1970. Sin embargo los productos comerciales no aparecieron en el mercado hasta los
primero años de la década de los ochenta. Pero a medida que transcurre el tiempo numerosas
firmas comerciales han introducido en el mercado productos de bases de datos relacionales
orientados al SQL, entre ellos Transact-SQL, que es el lenguaje SQL de Microsoft SQL Server 2000.

ANSI ha establecido una normativa oficial, que ha permitido que la mayoría de los productos
actuales acepten el SQL, esto permite que un programa de aplicaciones escrito JAVA, C, BASIC u
otro lenguaje de programación estructurada contenga código SQL.

Cuando se necesita recuperar datos de la base de datos, se utiliza el lenguaje SQL para efectuar la
petición. El DBMS procesa la petición SQL, recupera los datos solicitados de la base de datos y los
devuelve. Este proceso de solicitar datos y de escribir los resultados se denomina consulta (Quero)
a la base de datos, de aquí el nombre Structured Query Language.

SQL se utiliza para controlar todas las funciones que un DBMS proporciona a sus usuarios,
incluyendo:
Definición de datos, Recuperación de datos, Manipulación de datos, Control de acceso, Compartición
de datos, Integridad de datos.

Por tanto SQL es un lenguaje completo de control e interacción con un sistema de gestión de bases
de datos, ha emergido como el lenguaje estándar para la utilización de bases de datos relacionales.
SQL es a la vez un potente lenguaje y relativamente fácil de aprender.

SQL juega muchos papeles diferentes: SQL es un lenguaje de consultas interactivas, es un


lenguaje de programación de bases de datos, es un lenguaje de administración de bases de datos,
es un lenguaje cliente/servidor, es un lenguaje de bases de datos distribuidas, es un lenguaje de
pasarela de bases de datos.

TRANASACT-SQL

1
TRANSACT-SQL Lenguaje de consulta de datos.

Es el lenguaje de bases de datos que utiliza Microsoft SQL Server, incluye las siguientes categorías
de sentencias:
 DQL (Data Query Language – Lenguaje de consulta de datos) utilizadas para obtener datos de
la base de datos, el ejemplo es SELECT.

 DDL (Data Definition Language – Lenguaje de definición de datos) utilizadas para crear, alterar
o borrar objetos de una base de datos, tales como esquemas, tablas, columnas, vistas y
secuencias. Como ejemplos característicos tenemos las instrucciones CREATE, ALTER, DROP.

 DML (Data Modification Language – Lenguaje de modificación de datos) utilizadas en la


interrogación y manipulación de datos de esquemas ya existentes. Los ejemplos característicos
son los comandos INSERT, UPADATE y DELETE.

 TCL (Transaction Control Language – Lenguaje de control de transacciones) utilizadas para


confirmar o restaurar transacciones de base de datos, que son unidades de trabajo que realizan
una o más sentencias SQL relacionadas entre si, ejemplo, COMMIT y ROLLBACK.

 DCL (Data Control Language – Lenguaje de control de datos) utilizadas en el control de acceso
a datos en la base de datos, como ejemplos están: GRANT y REVOKE.

 CCL (Cursor Control Language – Lenguaje de control de cursores) utilizadas para operar sobre
filas individuales de una tabla resultado que consta de varios registros, como ejemplos están los
comandos, DECLARE CURSOR, FETCH INTO, UPDATE WHERE CURRENT.

ELEMENTOS BÁSICOS DE TRANASACT-SQL


Cuenta con varios elementos de sintaxis:
Identificadores: son los nombres de objetos como tablas, vistas, columnas, bases de datos y
servidores.

Tipos de datos.

Funciones: son elementos de sintaxis que toman cero, uno o más valores de entrada y devuelven
un valor escalar o un conjunto de valores en forma de tabla. A continuación se presentan las
funciones más importantes de SQL Server clasificadas por categorías.

2
TRANSACT-SQL Lenguaje de consulta de datos.

Expresiones: son unidades de sintaxis que SQL Server puede resolver en valores únicos. Ejemplos
de expresiones son las constantes, las funciones que devuelven un valor único, una referencia a
una columna o a una variable.
Constantes: es un símbolo que representa el valor específico de un dato. El formato de las
constantes depende del tipo de datos del valor que representa. Una forma de clasificar las
constantes es:
 Cadena de caracteres: van entre comillas simples e incluyen caracteres alfanuméricos (a-z, A-Z
y 0-9) y caracteres especiales como el signo de admiración (¡), la arroba (@) y el gatito (#).
Por ejemplo ‘Margaret’. Las cadenas vacías se representan como dos comillas simples sin nada
entre ellas.
 Cadenas Unicode: tienen un formato similar al de las cadenas de caracteres, pero están
precedidas por el identificador N que tiene que ir en mayúscula, por ejemplo: N’maría’
 Cadenas Binarias: tienen el sufijo 0x y son cadenas de números hexadecimales, por ejemplo:
0x12Ef
 Bit: se representan con los números 0 o 1, y si se utiliza un número mayor que uno, se
convierte a uno, no se introducen entre comillas.
 Datetime: se representan mediante valores de fecha en cadenas de caracteres en formatos
concretos, incluidos entre comillas simples, por ejemplo: ‘09/07/05’, ’04:24 PM’
 Integer: cadena de número no incluida entre comillas y que no contiene decimales, por
ejemplo: 1894.
 Decimal: cadena de número no incluida entre comillas y contiene un separador decimal, por
ejemplo: 1894.1204
 Flota y real: se representan con notación científica, ejemplo: 101.5E5, 0.5E-2
 Money: cadena de números con un separador decimal y un símbolo de moneda como prefijo
que no se incluye entre comillas, ejemplo $100.00

Formatos: existen distintos formatos numéricos y de fechas que se pueden utilizar en el lenguaje
Transact SQL, los siguientes cuadros presentan una descripción y ejemplos de los formatos que se
pueden utilizar.

Comentarios: son fragmentos de texto insertado en instrucciones o secuencias de comandos de


Transact-SQL para explicar el objetivo de la instrucción, no son ejecutados por SQL, la utilización de
comentarios hace más fácil el mantenimiento futuro del código, los caracteres que se utilizan para
indicar que es un comentario:
 --(doble guión) cuando el comentario es una sola línea.
 /*…..*/ cuando es un grupo de líneas el comentario se marca el inicio con /* y el final
del bloque con */

3
TRANSACT-SQL Lenguaje de consulta de datos.

Palabras reservadas: son palabras que utiliza SQL y no deben de emplearse como nombres de
objetos de una base de datos.

Operadores: funcionan con una o más expresiones individuales para formar una expresión más
compleja. En la página 18 se muestra la clasificación de los operadores.

Una vez analizados los elementos del lenguaje Transact-SQL, revisaremos los comandos más
importantes del mismo.

INSTRUCCIÓN SELECT

Aunque la instrucción SELECT se utiliza principalmente para recuperar datos específicos,


también se puede utilizar para asignar un valor a una variable local o para llamar a una función.
Hay que intentar construir las instrucciones SELECT de la forma más sencilla posible siempre que
recuperen los resultados necesarios. Por ejemplo, si se necesitan datos de solamente dos columnas
de una tabla, hay que incluir solamente esas dos columnas en la instrucción SELECT para minimizar
la cantidad de datos que se deben devolver.

La sintaxis para la instrucción SELECT consiste en varias cláusulas, la mayoría de las cuales
son opcionales. Una instrucción SELECT debe incluir al menos una cláusula SELECT y una cláusula
FROM. Las dos cláusulas identifican qué columna o columnas de datos recuperar y desde qué tabla
o tablas recuperar los datos, respectivamente. La sintaxis de la instrucción SELECT consta de:

Sintaxis
SELECT [ALL | DISTINCT][TOP entero | TOP entero PERCENT] lista_seleccion
[INTO nueva_tabla]
[FROM tabla_origen [,tabla_origen... ]
[WHERE condición_de_búsqueda ]
[GROUP BY [ALL] expression_de_agrupamiento [,..n ]
[HAVING condición_de_búsqueda ]
[ORDER BY expression_de_ordenamiento [ASC | DESC] [,..n ]
[COMPUTE [AVG |COUNT |MAX |MIN |SUM ] expression [,..n ]
[UNION |UNION ALL |MINUS ] subconsulta

Comencemos examinando las diversas opciones para la instrucción SELECT, se muestran


para cada cláusula ejemplos basados en las bases de datos pubs y Northwind, que se crearon de
forma automática cuando se instaló Microsoft SQL Server 2000.

4
TRANSACT-SQL Lenguaje de consulta de datos.

Cláusula SELECT

La cláusula SELECT consiste en una lista de selección y posiblemente algunos argumentos


opcionales. La lista de selección es la lista de expresiones o columnas que se especifican en la
cláusula SELECT para indicar qué datos hay que devolver.

Argumentos
Se pueden utilizar los siguientes dos argumentos en la instrucción SELECT para controlar que filas
se devuelven:

DISTINCT Devuelve solamente filas únicas. Si la lista de selección contiene varias columnas,
las filas se considerarán únicas si los valores correspondientes en al menos una de las columnas son
diferentes. Para que se dupliquen dos filas deben contener valores idénticos en cada columna.

TOP n [PERCENT] Devuelve solamente las primeras filas del conjunto resultado. Si se
especifica PERCENT, solamente el primer porcentaje de las filas se devuelve. Cuando se utiliza
PERCENT, debe estar entre 0 y 100. Si la consulta incluye una cláusula ORDER BY, las filas se ordenan
primero y posteriormente se devuelve el porcentaje del conjunto resultado ordenado.
EJEMPLOS:

SELECT DISTINCT au_fname, au_lname FROM authors


SELECT TOP 50 PERCENT au fname, au_lname FROM authors
SELECT TOP 5 au_fname, au_lname FROM authors

La lista de selección
Como se ha mencionado, la lista de selección (select list) es la lista de expresiones o
columnas que se especifica en la cláusula SELECT para indicar qué datos se han de devolver. La
expresión puede ser una lista de nombres de columnas, funciones o constantes. La lista de
selección puede incluir varias expresiones o nombres de columnas, separados por comas.

Signo *, o carácter comodín: Se puede utilizar el asterisco (*) o carácter comodín en la lista de
selección para devolver todas las columnas de todas las tablas y vistas llamadas en la cláusula
FROM. Por ejemplo, para devolver todas las columnas de todas las filas de la tabla sales en la base
de datos pubs se puede utilizar la siguiente consulta:

SELECT * FROM sales

Alias de columna: El uso de una columna alias en la lista de selección permite especificar
la cabecera de la columna que se desea que aparezca en el resultado. Se puede utilizar un alias
para clarificar el significado de los datos en una columna de salida, para asignar una cabecera a una
columna que se utiliza en una función y para referirse a una cláusula ORDER BY.

5
TRANSACT-SQL Lenguaje de consulta de datos.

Cuando existen dos o más columnas con el mismo nombre en tablas distintas se puede
querer incluir el nombre de la tabla en la cabecera de la columna de salida para una mayor claridad.
Como ejemplo de utilización de una columna alias se verá la columna lname en la tabla employee
de la base de datos pubs. Se puede realizar la siguiente consulta:

SELECT lname FROM employee

Para mostrar la cabecera «Apellido del empleado» en lugar de la cabecera original lname en
el resultado (para enfatizar el hecho de que el apellido viene de la tabla employee) se utiliza la
palabra clave AS, como se muestra seguidamente:

SELECT lname AS «Employee Last Name» FROM employee

Para asignar un alias de columna que describe la salida de la función hay que utilizar la palabra
clave AS después de la llamada a la función. Si no se utiliza un alias con una función, no habrá
ninguna cabecera de columna. Por ejemplo, la siguiente instrucción asigna la cabecera de columna
«Maximum Job ID» para la salida de la función MAX:

SELECT MAX(job_id)AS «Maximum Job ID» FROM employee

El alias de columna se encierra entre comillas puesto que contiene varias palabras con espacios
entre ellas. Si el alias no tiene espacios no se necesitan las comillas, como se verá en el siguiente
ejemplo.

SELECT SUM(qty) AS Quantity_of_Books,stor_id FROM sales

Se utiliza un alias de columna para asignar una cabecera a una columna por claridad de la salida; el
resultado de la consulta no afecta en manera alguna.

Cláusula FROM

La cláusula FROM contiene los nombres de las tablas y vistas de las cuales se obtienen los datos.
Cada instrucción SELECT requiere una cláusula FROM, excepto cuando la lista de selección no
contiene nombres de columna (solamente constantes, variables y expresiones aritméticas). Se han
visto algunos ejemplos sencillos con la cláusula FROM, pero las cláusulas FROM también pueden
contener tablas derivadas.

6
TRANSACT-SQL Lenguaje de consulta de datos.

Tablas derivadas

Una tabla derivada es el resultado de una instrucción SELECT anidada en la cláusula FROM.
El resultado de la instrucción SELECT anidada se utiliza como una tabla desde la cual la instrucción
SELECT exterior selecciona los datos. La siguiente consulta utiliza una tabla derivada para encontrar
los nombres de cualquier tienda que realiza al menos un tipo de descuento:

SELECT s.stor_name
FROM stores AS s, (SELECT stor_id,COUNT(DISTINCT discounttype)
AS d_count
FROM discounts
GROUP BY stor_id) AS d
WHERE s.stor_id =d.stor_id AND d.d_count >=1

En esta consulta se utilizan abreviaturas para los nombres de las tablas (s para la tabla stores y d
para la tabla discounts).

Cláusula INTO

Permite recuperar datos de una tabla o tablas y ubicar las filas resultado en una nueva
tabla. La nueva tabla se crea automáticamente cuando se ejecuta la instrucción SELECT ... INTO y
se defina según las columnas en la lista de selección. Cada columna en la nueva tabla tiene el
mismo tipo de datos que la columna original y lleva el nombre de la columna especificado en la lista
de selección. El usuario debe tener el permiso CREATE TABLE en la base de datos de destino para
ejecutar SELECT ... INTO.

Se puede utilizar SELECT ... INTO para seleccionar filas en una tabla temporal o en una tabla
permanente. Para una tabla local temporal (que es visible solamente a la conexión actual o usuario)
se debe incluir el símbolo (#) antes del nombre de la tabla. Para una tabla temporal global (que es
visible a cualquier usuario) se deben incluir dos símbolos (##) antes del nombre de la tabla. Una
tabla temporal se borra automáticamente después de que todos los usuarios que están utilizando la
tabla se hayan desconectado de SQL Server. Para seleccionar en una tabla permanente no se
necesita un prefijo para el nuevo nombre de la tabla, pero se debe activar la opción Select
Into/Bulk Copy en la base de datos de destino.

Se puede utilizar el Administrador corporativo SQL Server para activar esta opción:

7
TRANSACT-SQL Lenguaje de consulta de datos.

1. Pulsar el botón derecho del ratón sobre el nombre de la base de datos pubs en el panel del
Administrador corporativo y elegir Propiedades del menú contextual para mostrar la ventana
Propiedades de Pubs.

2. Pulsar la ficha Opciones, seleccionar Registro masivo en la lista desplegable Modelo. Dejar el
resto de otros parámetros como están. Pulsar Aceptar.

La siguiente consulta utiliza SELECT ... INTO para crear una tabla permanente, emp_info,
que incluye los nombres y apellidos de todos los empleados y la descripción de su puesto de trabajo
(de la base de datos pubs):

SELECT employee.fname,employee.lname,jobs.job_desc
INTO emp_info
FROM employee,jobs
WHERE employee.job_id =jobs.job_id

La tabla emp_info contendrá tres columnas (fname, lname y job_desc) que tiene los
mismos tipos de datos que en las columnas definidas en las tablas originales (employee y jobs). Si
se desea que la nueva tabla sea una tabla temporal, la tabla debe tener un símbolo # precedido,
corno en #emp_info; para una tabla temporal global, hay que utilizar el símbolo ## como en
##emp_info.

Cláusula WHERE y condiciones de búsqueda

Se puede utilizar la cláusula WHERE para restringir las filas que se devuelven de una consulta según
las condiciones de búsqueda especificadas.

La condición de búsqueda puede contener un número ilimitado de expresiones combinados


mediante los operadores lógicos AND, OR y NOT.

SELECT * FROM employee WHERE lname ="Latimer"

Nota: De forma predeterminada, SQL Server aceptará tanto comillas simples(‘ ‘) como
comilla dobles (“”) como en 'Latimer' o "Latimer".

SELECT job_desc FROM jobs WHERE job_id <>1

8
TRANSACT-SQL Lenguaje de consulta de datos.

Cláusula GROUP BY

GROUP BY se utiliza después de la cláusula WHERE para indicar que las filas en el resultado deben
estar agrupadas según las columnas de agrupación especificadas.

GROUP BY es muy útil cuando se incluye una función de agregado en la cláusula SELECT. Veamos la
instrucción SELECT que utiliza la cláusula GROUP BY para buscar el número total de ventas de cada
libro:

SELECT title_id, SUM(qty) FROM sales GROUP BY title_id

Para agregar una cabecera a la columna resumen, se puede utilizar la palabra clave AS, como
muestra en el siguiente ejemplo:

SELECT title_id,SUM(qty) AS "Total Sales" FROM sales GROUP BY titie_id

Se pueden anidar grupos que incluyen más de una columna en la cláusula GROUP BY. Anidar
grupos significa que el resultado se agrupará por cada una de las columnas de agrupación en el
orden en el que se especifican las columnas. Por ejemplo, para encontrar el precio medio de los
libros que están agrupados por el tipo y seguidamente por el editor se ha de realizar la siguiente
consulta: Se pueden anidar grupos incluyendo más de una columna en la cláusula GROUP BY.

SELECT type,pub_id,AVG(price) AS "Average Price" FROM titles GROUP BY type,pub_id

GROUP BY proporciona una palabra clave opcional, ALL, que especifica que se tienen que incluir
todos los grupos en el resultado, incluso si no cumplen la condición de búsqueda. Los grupos que no
tienen filas que cumplan la condición de búsqueda contendrán NULL en la columna resumen, de
forma que se pueden identificar fácilmente. Por ejemplo, para mostrar que el precio medio de los
libros que tienen unos derechos de autor de un 12 por ciento (y también mostrar los libros que no,
los cuales tendrán NULL en la columna resumen). Y para agrupar los libros por tipo y
posteriormente por identificador de editor se puede ejecutar la siguiente consulta:

SELECT type,pub_id,AVG(price) AS "Average Price" FROM titles


WHERE royalty =12 GROUP BY ALL type,pub_id

Cláusula HAVING

9
TRANSACT-SQL Lenguaje de consulta de datos.

Se utiliza la cláusula HAVING par especificar una condición de búsqueda para un grupo o función de
agregado. HAVING se utiliza normalmente después de una cláusula GROUP BY para casos en los
cuales se tiene que verificar una condición de búsqueda después de que se agrupen los resultados.
Si se puede aplicar la condición de búsqueda antes de que ocurra el agrupamiento, es más eficiente
ubicar la condición de búsqueda en la cláusula WHERE que agregar una cláusula HAVING. Esta
técnica reduce el número de filas que se tienen que agrupar. Si no hay ninguna cláusula GROUP BY,
se puede utilizar HAVING solamente con una función de agregado en la lista de selección. En este
caso, la cláusula HAVING actúa de la misma forma que la cláusula WHERE. Si no se utiliza HAVING
de alguna de estas formas, SQL Server devolverá un mensaje de error.

Aquí, condición de búsqueda tiene el mismo significado que las condiciones de búsqueda de
la cláusula WHERE. Una diferencia entre la cláusula HAVING y la cláusula WHERE es que la cláusula
HAVING puede incluir una función de agregado en la condición de búsqueda, mientras que la
cláusula WHERE no. Es decir, se pueden utilizar funciones de agregado en la cláusula SELECT y en
la cláusula HAVING, pero no se pueden utilizar en la cláusula WHERE.

La siguiente utiliza una cláusula HAVING para seleccionar los tipos de libros por editor que un precio
medio mayor que 15:

SELECT type,pub_id,AVG(price) AS “Average Price" FROM titles


GROUP BY type,pub_id HAVING AVG(Price) >15.00

También se pueden utilizar operadores lógicos con la cláusula HAVING. En la siguiente consulta se
ha agregado el operador AND:

SELECT type,pub_id,AVG(price) AS "Average Price" FROM titles GROUP BY type,pub_id


HAVING AVG(price) >=15.00 AND AVG(price)<=20.00

Se pueden obtener los mismos resultados utilizando la cláusula BETWEEN en lugar de AND, como
se muestra seguidamente:

SELECT type,pub_id,AVG(price) AS "Average Price" FROM titles GROUP BY type,pub_id


HAVING AVG(price) BETWEEN 15.00 AND 20.00

Para utilizar HAVING sin una cláusula GROUP BY, se debe tener una función de agregado en
la lista de selección y en la cláusula HAVING. Por ejemplo, para seleccionar la suma de los precios
de los libros del tipo mod_cook, solamente si la suma es mayor a 20, se ha de ejecutar la siguiente
consulta:

10
TRANSACT-SQL Lenguaje de consulta de datos.

SELECT SUM(prices) FROM titles WHERE type ="mod_cook" HAVING SUM(price)>20

Si se intenta introducir SUM(price)>20 en la cláusula WHERE, SQL Server devolverá un


mensaje de error (las funciones de agregado no están permitidas en la cláusula WHERE). Hay que
recordar que la única vez que se puede utilizar cláusula HAVING es cuando se agrega una
condición de búsqueda para verificar los grupos resultantes de una cláusula GROUP BY o para
verificar una función de agregado. En otro caso, se debería especificar la condición de búsqueda en
la cláusula WHERE.

Cláusula ORDER BY

Se utiliza la cláusula ORDER BY para especificar el orden en el que se han de ordenar las
filas en un resultado. Se puede especificar tanto en orden ascendente (de menor a mayor) o
descendente (de mayor a menor) mediante el uso de ASC o DESC. Si no se especifica, el orden
predeterminado es el orden ascendente. Se puede especificar más de una columna en la cláusula
ORDER BY. El resultado se ordenará según la primera columna listada. Si la primera columna
contiene valores duplicados, estas filas se ordenarán según la segunda columna y así
sucesivamente. Un ejemplo que utiliza una columna en la cláusula ORDER BY para listar los autores
por su apellido, en orden ascendente:

SELECT au_lname,au,_fname FROM authors ORDER BY au_lname ASC

Si se desea ordenar los resultados según más de una columna, simplemente hay que agregar los
nombres de las columnas, separados por comas, a la cláusula ORDER BY la siguiente columna
selecciona los identificadores de los puestos de trabajo y los nombres y apellidos de los empleados
los muestra ordenados por el identificador del puesto de trabajo, el apellido y el nombre:

SELECT job_id,lname,fname FROM employee ORDER BY job_id,lname,fname

Ahora si queremos usar una cláusula ORDER BY con una cláusula GROUP BY y una función de
agregado:

SELECT type,pub_id,AVG(price) AS "Average Price" FROM titles GROUP BY type,pub_id


ORDER BY type

No se pueden utilizar las funciones de agregado o subconsultas en la cláusula ORDER BY. Sin
embargo, si se había dado un alias a un agregado en la cláusula SELECT se podía utilizar en la
cláusula ORDER BY, como se muestra seguidamente:

11
TRANSACT-SQL Lenguaje de consulta de datos.

SELECT type,pubid,AVG(price) AS "Average Price" FROM titles GROUP BY type,pub_id


ORDER BY "Average Price"

Operador UNION

UNION es considerado como un operador, en lugar de como una cláusula. Se utiliza para
combinar los resultados de dos o más consultas en un resultado. Se deben seguir dos reglas cuando
se utiliza UNION:

 El número de columnas debe ser el mismo en todas las consultas.

 Los tipos de datos para columnas correspondientes deben ser compatibles.

Las columnas listadas en las instrucciones SELECT unidas por UNION se corresponden de la
siguiente manera: la primera columna de la primera instrucción SELECT corresponderá a la primera
columna en cada instrucción SELECT subsiguiente, la segunda columna corresponderá a la segunda
columna en la instrucción SELECT subsiguiente, y así sucesivamente. Por consiguiente, se debe
tener el mismo número de columnas en todas las instrucciones SELECT unidas por UNION para
asegurar una correspondencia uno a uno. Además, las columnas correspondientes deben tener tipos
de datos compatibles, por lo que dos columnas correspondientes deben tener el mismo tipo de
datos o SQL Server debe poder convertir de forma implícita un tipo de datos en otro. El siguiente
ejemplo utiliza UNION para unir los resultados de dos instrucciones SELECT que recuperan las
columnas city y state de las tablas publishers y stores:

SELECT city,state FROM publishers UNION SELECT city,state FROM stores

Las dos columnas, city y state son del mismo tipo de datos (char) en ambas tablas
publishers y stores; por consiguiente no se necesita conversión de los tipos de datos. Las cabeceras
de las columnas para el resultado de UNION se toman de la primera instrucción SELECT. Si se
desea crear un alias para una cabecera, hay que ponerlo en la primera instrucción SELECT, como se
muestra:

SELECT city AS "All Cities", state AS "All States" FROM publishers


UNION SELECT city,state FROM stores

No es necesario utilizar las mismas columnas en ambas cláusulas SELECT en una unión. Por
ejemplo, se podía haber seleccionado city y state de la tabla store y seleccionar city y country de la
tabla publishers como se muestra seguidamente:

12
TRANSACT-SQL Lenguaje de consulta de datos.

SELECT city,country FROM publishers UNION SELECT city,state FROM stores

Se puede utilizar una palabra clave con UNION: ALL. Si se especifica ALL, se incluirán filas
duplicadas en el resultado (en otras palabras, se incluirán todas las filas). Si no se especifica ALL de
forma predeterminada se eliminan las filas duplicadas del resultado.

Se puede utilizar ORDER BY solamente en la última instrucción de una unión, no en cada instrucción
SELECT. Esta limitación asegura que el resultado final estará ordenado una vez para todos los
resultados. Por otra parte, se puede utilizar GROUP BY y HAVING en instrucciones individuales,
puesto que afectarán solamente a los resultados individuales y no al resultado final. La siguiente
unión junta los resultados de dos instrucciones SELECT que tienen una cláusula GROUP BY.

SELECT type,COUNT(title) AS "Number of Titles" FROM titles GROUP BY type


UNION SELECT pub_name,COUNT(titles.title) FROM publishers,titles
WHERE publishers.pub_id =titles.pub_id GROUP BY pub_name

El operador UNION se puede también utilizar con más de dos instrucciones SELECT. Hay
que tener cuidado cuando se crea una unión de asegurar que todas las columnas y tipos de datos
en las consultas se corresponden correctamente.

FUNCIONES DE AGREGADO DE T-SQL

Después de revisar las cláusulas básicas que se pueden utilizar con la instrucción SELECT,
veamos algunas funciones T-SQL que se pueden utilizar en la cláusula SELECT para tener mayor
flexibilidad en la creación de consultas. Estas funciones están agrupadas en varias categorías,
incluyendo funciones de configuración, de cursor, de fecha y hora, de seguridad, de meta archivos,
del sistema, estadísticas del sistema, texto e imagen, matemáticas, conjunto de filas, cadena de
caracteres y de agregados. Estas funciones pueden realizar cálculos, conversiones y otras
operaciones o pueden devolver cierta información.

Algunos ejemplos son:

SELECT COUNT(*) FROM publishers

SELECT MAX(price) - MIN((price) AS "Price Difference" FROM titles

13
TRANSACT-SQL Lenguaje de consulta de datos.

En el siguiente ejemplo se utiliza SUM para encontrar la cantidad total de elementos ordenados por
tienda:

SELECT stores.stor_name,SUM(sales.qty) AS "Total Items Ordered" FROM sales,stores


WHERE sales.stor_id =stores.stor_id GROUP BY stor_name

DEFINICIÓN DE BASES DE DATOS

CREATE DATABASE. Crea una nueva base de datos.

CREATE DATABASE database_name


[ ON
[ < filespec > [ ,...n ] ]
[ , < filegroup > [ ,...n ] ]
]
[ LOG ON { < filespec > [ ,...n ] } ]
[ COLLATE collation_name ]
[ FOR LOAD | FOR ATTACH ]
< filespec > ::=
[ PRIMARY ]
( [ NAME = logical_file_name , ]
FILENAME = 'os_file_name'
[ , SIZE = size ]
[ , MAXSIZE = { max_size | UNLIMITED } ]
[ , FILEGROWTH = growth_increment ] ) [ ,...n ]
< filegroup > ::=
FILEGROUP filegroup_name < filespec > [ ,...n ]

Argumentos
database_name Es el nombre de la base de datos, debe ser único y contener un máximo de 128
caracteres.

ON Nombre y ubicación de los archivos datos para el grupo primario.

LOG ON Especifica que archivos se usan para el registro de transacciones (log) de la base de datos.

FOR LOAD Esta opción se usa por compatibilidad con versiones anteriores. La base de datos se crea
con la opción de dbo use only.

FOR ATTACH Esta opción se usa para crear bases de datos usando archivos de datos ya creados
anteriormente con otra base de datos.

collation_name Especifica el valor por defecto de la tabla de caracteres para la base de datos. Si no se
especifica SQL Server pone el que tenga dicha instancia del servidor de SQL Server.

Ejemplos:

14
TRANSACT-SQL Lenguaje de consulta de datos.

 Crear una base de datos con todas las opciones por defecto

CREATE DATABASE diplomado

 Crear una base de datos con un archivo de datos en el grupo Primario

CREATE DATABASE Productos


ON
( NAME = articulos,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\prods.mdf',
SIZE = 4, MAXSIZE = 10, FILEGROWTH = 1 )

 Crear una base de datos con un archivo de datos y uno de registro

CREATE DATABASE Ventas


ON
( NAME = venta,
FILENAME = 'c:\ Archivos de programa\microsoft sql
server\mssql\data\ventadat.mdf',
SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 )
LOG ON
( NAME = 'venta_log',
FILENAME = 'c:\ Archivos de programa \microsoft sql
server\mssql\data\ventalog.ldf',
SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB )

 Crear una base de datos con varios archivos de datos y varios de registro

CREATE DATABASE Archivos


ON PRIMARY
( NAME = Arch1,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\archdat1.mdf',
SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20),
( NAME = Arch2,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\archdat2.ndf',
SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20),
( NAME = Arch3,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\archdat3.ndf',
SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20)
LOG ON
( NAME = Archlog1,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\archlog1.ldf',
SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20),
( NAME = Archlog2,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\archlog2.ldf',
SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20)

 Crear una base de datos con varios grupos de archivos

15
TRANSACT-SQL Lenguaje de consulta de datos.

CREATE DATABASE Sales


ON PRIMARY
( NAME = SPri1_dat,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\SPri1dat.mdf',
SIZE = 10, MAXSIZE = 50, FILEGROWTH = 15% ),
( NAME = SPri2_dat,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\SPri2dt.ndf',
SIZE = 10, MAXSIZE = 50, FILEGROWTH = 15% ),
FILEGROUP SalesGroup1
( NAME = SGrp1Fi1_dat,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\SG1Fi1dt.ndf',
SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ),
( NAME = SGrp1Fi2_dat,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\SG1Fi2dt.ndf',
SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ),
FILEGROUP SalesGroup2
( NAME = SGrp2Fi1_dat,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\SG2Fi1dt.ndf',
SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ),
( NAME = SGrp2Fi2_dat,
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\SG2Fi2dt.ndf',
SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 )
LOG ON
( NAME = 'Sales_log',
FILENAME = 'c:\Archivos de programa\microsoft sql
server\mssql\data\salelog.ldf',
SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB )

DROP DATABASE. Elimina una o más bases de datos SQL Server.

DROP DATABASE database_name [ ,...n ]

Ejemplos
 Borrar una sola base de datos

DROP DATABASE diplomado

 Borrar varias bases de datos

DROP DATABASE Productos, Ventas

ALTER DATABASE

16
TRANSACT-SQL Lenguaje de consulta de datos.

Añade o elimina archivos o grupos de archivos de una base de datos. Se puede usar también
para modificar las propiedades de los mismos.

ALTER DATABASE database


{ ADD FILE < filespec > [ ,...n ] [ TO FILEGROUP filegroup_name ]
| ADD LOG FILE < filespec > [ ,...n ]
| REMOVE FILE logical_file_name
| ADD FILEGROUP filegroup_name
| REMOVE FILEGROUP filegroup_name
| MODIFY FILE < filespec >
| MODIFY NAME = new_dbname
| MODIFY FILEGROUP filegroup_name {filegroup_property | NAME =
new_filegroup_name }
| SET < optionspec > [ ,...n ] [ WITH < termination > ]
| COLLATE < collation_name >
}

Ejemplos

 Añadir un archivo a la base de datos

CREATE DATABASE Test1 ON


(
NAME = Test1dat1,
FILENAME = 'c:\Archivos de programa\Microsoft SQL
Server\MSSQL\Data\t1dat1.ndf',
SIZE = 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB
)

ALTER DATABASE Test1


ADD FILE
(
NAME = Test1dat2,
FILENAME = 'c:\Archivos de programa\Microsoft SQL
Server\MSSQL\Data\t1dat2.ndf',
SIZE = 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB
)

 Añadir un grupo de archivos a la base de datos

ALTER DATABASE Test1


ADD FILEGROUP Test1FG1

ALTER DATABASE Test1


ADD FILE
( NAME = test1dat3,
FILENAME = 'c:\Archivos de programa\Microsoft SQL
Server\MSSQL\Data\t1dat3.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB),
( NAME = test1dat4,
FILENAME = 'c:\Archivos de programa\Microsoft SQL
Server\MSSQL\Data\t1dat4.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB)

17
TRANSACT-SQL Lenguaje de consulta de datos.

TO FILEGROUP Test1FG1

ALTER DATABASE Test1


MODIFY FILEGROUP Test1FG1 DEFAULT

 Añadir archivos de log a la base de datos

ALTER DATABASE Test1


ADD LOG FILE
( NAME = test1log2,
FILENAME = 'c:\Archivos de programa\Microsoft SQL
Server\MSSQL\Data\test2log.ldf',
SIZE = 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB),
( NAME = test1log3,
FILENAME = 'c:\Archivos de programa\Microsoft SQL
Server\MSSQL\Data\test3log.ldf',
SIZE = 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB)

 Eliminar archivos de la base de datos

ALTER DATABASE Test1


REMOVE FILE test1dat4

 Modificar un archivo

ALTER DATABASE Test1


MODIFY FILE
(NAME = test1dat3,
SIZE = 20MB)

 Convertir un grupo de archivos en grupo por defecto

ALTER DATABASE MyDatabase


MODIFY FILEGROUP [PRIMARY] DEFAULT

USE DATABASE

Cambia la base de datos en uso por la especificada.

USE { database }

18
TRANSACT-SQL Lenguaje de consulta de datos.

CREATE TABLE Permite crear una nueva tabla.

CREATE TABLE
[ database_name.[ owner ] . | owner. ] table_name
( { < column_definition >
| column_name AS computed_column_expression
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
)

[ ON { filegroup | DEFAULT } ]
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]

< column_definition > ::= { column_name data_type }


[ COLLATE < collation_name > ]
[ [ DEFAULT constant_expression ]
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
]
[ ROWGUIDCOL]
[ < column_constraint > ] [ ...n ]

< column_constraint > ::= [ CONSTRAINT constraint_name ]


{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ON {filegroup | DEFAULT} ] ]
]
| [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
| CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}

< table_constraint > ::= [ CONSTRAINT constraint_name ]


{ [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
{ ( column [ ASC | DESC ] [ ,...n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
| FOREIGN KEY
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}

19
TRANSACT-SQL Lenguaje de consulta de datos.

Argumentos

database_name
Es el nombre de la base de datos en la que se crea la tabla. Si no se especifica ninguna base de datos
se crea en la base de datos que esté en uso actualmente.

owner
Es el nombre del usuario propietario de la base de datos, que debe ser un identificador de usuario
valido en la base de datos donde se intenta crear la tabla. Si no se especifica ningún usuario se
utilizará el utilizado para acceder al servidor de base de datos actualmente.

table_name
Es el nombre de la tabla, debe contener un máximo de 128 caractéres.

column_name
Nombre de una columna. El nombre de cada columna debe ser único en la tabla y debe seguir las
normas de identificadores de SQL Server.

computed_column_expression
Se utilizará si los datos almacenados en la columna son el resultado de realizar alguna operación sobre
otra u otras columnas. Una expresión valida puede ser: el nombre de una columna, una constante,
una fucnión una variable o una combinación de las anteriores.

ON {filegroup | DEFAULT}
Especifica el grupo de archivos en el que se almacena la tabla. Si no se especifica ningún grupo de
archivos la tabla se almacenará en el grupo de archivos por defecto.

TEXTIMAGE_ON
Indica el grupo de archivos en el que se almacena las columnas de los tipos text, ntext e image. Si no
hay columnas de estos tipos en las tablas no se puede incluir esta opción. Si no se especifica esta
opción, las columnas de este tipo se guardan en el mismo grupo de archivos que la tabla.

data_type
Especifica el tipo de datos de la columna. Se aceptan tipos de datos del sistema o definidos por el
usuario. Si el tipo de datos es de los definidos por el usuario al crear la tabla no se puede cambiar la
longitud definida al crear el tipo, aunque si se puede cambiar su condición de NULL / NOT NULL.

DEFAULT
Especifica el valor por defecto asignado a esa columna cuando no se indica valor para ella en una
sentencia de Insert.

constant_expression
Puede ser una constante, NULL o una función del sistema.

IDENTITY
Indica que la nueva columna es una columna de tipo Identity (Autonumérico). Esta propiedad se
puede añadir a columnas del tipo tinyint, smallint, int, bigint, decimal(p,0), numeric(p,0). Solo una
columna por tabla puede ser de este tipo. Si una columna tiene esta propiedad se debe especificar el
primer valor de la columna y el incremento entre valores consecutivos. Si no se especifican estos
parámetros se toma por defecto 1 y como incremento 1.

seed
Es el valor para la primera fila de una columna que tenga la propiedad Identity.

20
TRANSACT-SQL Lenguaje de consulta de datos.

increment
Es el incremento con respecto al valor de la fila anterior para una columna con la propiedad Identity.

ROWGUIDCOL
Indica que esta columna es del tipo RowGuidCol. Solo puede haber una por tabla.

collation_name
Especifica la tabla de caracteres para dicha columna. Solo se puede aplicar a columnas de los tipos
char, varchar, text, nchar, nvarchar, ntext. Si no se especifica, a la columna se le asigna la tabla de
caracteres del tipo de datos que tenga la columna, si este es un tipo de datos definido por el usuario,
o la tabla de caracteres de la base de datos donde se encuentre la tabla.

CONSTRAINT
Indica que la columna tiene alguna de las siguientes restricciones: PRIMARY KEY, NOT NULL, UNIQUE,
FOREIGN KEY, CHECK

constraint_name
Nombre de la restricción. El nombre de la restricción debe ser único en la base de datos.

NULL | NOT NULL


Determina si se permiten o no valores nulos en una columna.

PRIMARY KEY
Determina si una columna o columnas son clave primaria. Solo se puede crear una restricción de este
tipo por tabla, y asegura que estas columnas cumplen la regla de restricción de integridad de la
entidad.

UNIQUE
Indica que esta columna forma parte de un índice único, es decir, un índice en el que no se permiten
valores duplicados. Esto asegura que estas columnas cumplen la regla de restricción de integridad de
la entidad.

CLUSTERED | NONCLUSTERED
Indica que las columnas forman parte de un índice agrupado.

FOREIGN KEY...REFERENCES
Indica que esta columna o columnas forman parte de una clave foránea, lo que asegura que estas
columnas cumplen la regla de restricción de integridad referencia.

ref_table
Es el nombre de la tabla referenciada por una restricción de clave primaria.

(ref_column[,...n])
Es el nombre de la columna o columnas referenciadas por una restricción de clave primaria.

ON DELETE {CASCADE | NO ACTION}


Especifica que acción se realiza sobre una fila de esta tabla, si se borra la fila con la que está
relacionada en otra tabla. Por defecto no se realiza ninguna acción.

ON UPDATE {CASCADE | NO ACTION}


Lo mismo que la regla anterior pero para el caso de actualizaciones.

21
TRANSACT-SQL Lenguaje de consulta de datos.

CHECK
Limita los posibles valores que se pueden poner en una columna.

logical_expression
Expresión lógica que tiene que ser verdadera o falsa.

column
Nombre de la columna o columnas usadas en la restricción

[ASC | DESC]
Especifica el orden en que las columnas participan en la restricción de la tabla. El valor por defecto es
ascendente.

Consideraciones

 SQL Server puede incluir hasta 2 billones de tablas en cada base de datos y 1024 columnas en
cada tabla como máximo. El tamaño máximo de cada fila es de 8060 bytes.

 Se puede crear como máximo 1 indice de tipo clustered y 249 índices de tipo nonclustered
incluyéndose en estos los generados por las restricciones de clave primaria y foráneas, y por
restricciones UNIQUE.

 Una tabla sólo puede contener una restricción de clave primaria.

 Todas las columnas que forman parte de la clave primaria deben estar definidas con NOT NULL.

 Cada columna definida con una restricción UNIQUE genera un índice

 Las restricciones de clave foránea solo puede referenciar a tablas situadas en la misma base de
datos del mismo servidor. Estas restricciones también pueden hacer referencias a campos en la
misma tabla (auto-referencia).

 Las restricciones de clave foránea deben referenciar a columnas del mismo tipo que la columna o
columnas que contienen la restricción.

 Una tabla puede contener un máximo de 253 restricciones de clave foránea.

 Cada columna puede tener como máximo un único valor por defecto. No se le puede asignar un
valor por defecto a una columna de tipo timestamp o con la propiedad IDENTITY.

 Una columna puede contener tantas restricciones de tipo CHECK como se quiera y cada una de
estas puede tener una condición lógica tan compleja como sea necesario. Las restricciones se
evaluarán en el orden en el que fueron creadas.

 Las restricciones CHECK a nivel de columna solo pueden referenciar a dicha columna.

22
TRANSACT-SQL Lenguaje de consulta de datos.

Ejemplo:

 Ejercicios en el pintarron

 Definición completa de tablas

/**************************** jobs table ****************************/


CREATE TABLE jobs
(
job_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED,
job_desc varchar(50) NOT NULL DEFAULT 'New Position - title not
formalized yet',
min_lvl tinyint NOT NULL CHECK (min_lvl >= 10),
max_lvl tinyint NOT NULL CHECK (max_lvl <= 250)
)

/************************** employee table **************************/


CREATE TABLE employee
(
emp_id empid
CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED
CONSTRAINT CK_emp_id
CHECK (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
Or emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),
fname varchar(20) NOT NULL,
minit char(1) NULL,
lname varchar(30) NOT NULL,
job_id smallint NOT NULL DEFAULT 1
REFERENCES jobs(job_id), job_lvl tinyint DEFAULT 10,
pub_id char(4) NOT NULL DEFAULT ('9952')
REFERENCES publishers(pub_id),
hire_date datetime NOT NULL DEFAULT (getdate())
)

/************************** publishers table


****************************/
CREATE TABLE publishers
(
pub_id char(4) NOT NULL
CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED
CHECK (pub_id IN ('1389', '0736', '0877',
'1622', '1756')
OR pub_id LIKE '99[0-9][0-9]'),
pub_name varchar(40) NULL,
city varchar(20) NULL,
state char(2) NULL,
country varchar(30) NULL DEFAULT('USA')
)

23
TRANSACT-SQL Lenguaje de consulta de datos.

DROP TABLE

Elimina la definición de una tabla y todos sus datos, índices, disparadores, restricciones y
permisos especificados para esa tabla. Cualquier vista o procedimiento almacenado que referencia
dicha tabla debe ser explícitamente borrado, la instrucción DROP TABLE no lo hace.

DROP TABLE table_name

Consideraciones

 DROP TABLE no borrara una tabla referenciada por una restricción de clave foránea. Primero es
necesario borrar la restricción.

 No se pueden borrar tablas del sistema con la orden DROP TABLE.

 Si se borra una tabla, los elementos que lo referencian dejan de funcionar aunque una tabla con el
mismo nombre sea creada.

Ejemplos

 Borrar una tabla en la base de datos actual

DROP TABLE titles1

 Borrar una tabla en otra base de datos

DROP TABLE pubs.dbo.authors2

ALTER TABLE

Modifica la definición de una tabla alterando, añadiendo o borrando columnas y restricciones o


habilitando o deshabilitando restricciones y disparadores.

ALTER TABLE table


{ [ ALTER COLUMN column_name
{ new_data_type [ ( precision [ , scale ] ) ]
[ COLLATE < collation_name > ]
[ NULL | NOT NULL ]
| {ADD | DROP } ROWGUIDCOL }
]
| ADD
{ [ < column_definition > ]
| column_name AS computed_column_expression
} [ ,...n ]
| [ WITH CHECK | WITH NOCHECK ] ADD
{ < table_constraint > } [ ,...n ]
| DROP
{ [ CONSTRAINT ] constraint_name
| COLUMN column } [ ,...n ]
| { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER

24
TRANSACT-SQL Lenguaje de consulta de datos.

{ ALL | trigger_name [ ,...n ] }


}

< column_definition > ::=


{ column_name data_type }
[ [ DEFAULT constant_expression ] [ WITH VALUES ]
| [ IDENTITY [ (seed , increment ) [ NOT FOR REPLICATION ] ] ]
]
[ ROWGUIDCOL ]
[ COLLATE < collation_name > ]
[ < column_constraint > ] [ ...n ]

< column_constraint > ::=


[ CONSTRAINT constraint_name ]
{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
| [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
| CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}

< table_constraint > ::=


[ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
{ ( column [ ,...n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON {filegroup | DEFAULT } ]
]
| FOREIGN KEY
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| DEFAULT constant_expression
[ FOR column ] [ WITH VALUES ]
| CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}

Argumentos

ALTER COLUMN
Especifica la columna que va a ser cambiada o alterada. Dicha columna no puede ser:

 Una columna con tipo text, image, ntext, o timestamp.

25
TRANSACT-SQL Lenguaje de consulta de datos.

 Una columna definida como ROWGUIDCOL.

 Una columna generada o las columnas que la generan.

 Usada en un índice, a menos que sea del tipo varchar, nvarchar, o varbinary,el tipo de
dato no se cambie y el nuevo tamaño sea igual o superior al antiguo.

 Usada en estadísticas.

 Usada en una restricción de clave primaria (PRIMARY KEY) o de clave ajena (FOREIGN KEY).

 Usada en una restricción CHECK o UNIQUE.

Algunos cambios pueden suponer cambios en el tipo de datos, esos cambios deben tener las
siguientes consideraciones:

 El tipo de datos existente debe ser convertible al nuevo tipo de datos.

 El nuevo tipo de datos no puede ser timestamp.

 Si no se especifica nada las nuevas columnas admiten NULL.

ADD
Especifica que se añade una o más columnas o restricciones.

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }


Especifica que se elimina de la tabla una columna o una restricción.

{ CHECK | NOCHECK} CONSTRAINT


Especifica que una restricción se habilita o se deshabilita.

{ENABLE | DISABLE} TRIGGER


Especifica que el disparador se activa o se desactiva.

Ejemplos

 Añadir una nueva columna a una tabla

CREATE TABLE doc_exa ( column_a INT)


ALTER TABLE doc_exa ADD column_b VARCHAR(20) NULL

 Eliminar una columna de una tabla

CREATE TABLE doc_exb ( column_a INT, column_b VARCHAR(20) NULL)


ALTER TABLE doc_exb DROP COLUMN column_b

 Añadir una nueva columna con una restricción

CREATE TABLE doc_exc ( column_a INT)


ALTER TABLE doc_exc ADD column_b VARCHAR(20) NULL
CONSTRAINT exb_unique UNIQUE

26
TRANSACT-SQL Lenguaje de consulta de datos.

 Añadir varias columnas con restricciones

CREATE TABLE doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE)

ALTER TABLE doc_exe ADD


/* Añadir una columna como clave primaria */
column_b INT IDENTITY CONSTRAINT column_b_pk PRIMARY KEY,

/* Añadir una columna como clave foránea de la misma tabla. */


column_c INT NULL CONSTRAINT column_c_fk REFERENCES doc_exe(column_a),

/* Añadir una columna con una restricción de comprobacion */


column_d VARCHAR(16) NULL CONSTRAINT column_d_chk
CHECK (column_d IS NULL OR
column_d LIKE "[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" OR
column_d LIKE "([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-
9]"),

/* Añadir una columna con valor por defecto */


column_e DECIMAL(3,3) CONSTRAINT column_e_default DEFAULT .081

 Añadir una columna con valor por defecto y NULL

ALTER TABLE MyTable


ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt DEFAULT getdate() WITH VALUES

 Deshabilitar y habilitar una restricción

CREATE TABLE cnst_example


(id INT NOT NULL,
name VARCHAR(10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
)

-- Inserciones validas
INSERT INTO cnst_example VALUES (1,"Joe Brown",65000)
INSERT INTO cnst_example VALUES (2,"Mary Smith",75000)

-- Inserción que viola la restricción


INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)

-- Deshabilitar la restricción
ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)

-- Habilitar la restricción
ALTER TABLE cnst_example CHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (4,"Eric James",110000)

27
TRANSACT-SQL Lenguaje de consulta de datos.

USO DE ÍNDICES

¿QUÉ ES UN ÍNDICE?
Un índice es una estructura auxiliar que permite mejorar el rendimiento de las consultas mediante la
reducción de la actividad de entrada/salida necesaria para recuperar los datos solicitados.

Índices simples
Un índice simple es un índice que se define en una sola columna de la tabla. Se debe hacer referencia
a esta columna en la cláusula WHERE de la instrucción para que se use este índice para cumplir la
instrucción.

Índices compuestos
Un índice compuesto es un índice que se define en más de una columna. Se puede acceder a un
índice compuesto usando una o más claves de índice. Con SQL Server 2000, un índice puede abarcar
hasta 16 columnas y sus columnas clave pueden ser de hasta 900 bytes.

Índices únicos
Un índice único contiene solamente una fila de datos por cada clave del índice (en otras palabras, los
valores de la clave del índice no pueden aparecer en el índice más de una vez). SQL Server crea
índices únicos cuando se crea o una restricción PRIMARY KEY o una restricción UNIQUE en la tabla.

Índices agrupados
Número menor de operaciones de entrada/salida. Cualquier reducción de estas operaciones produce
un mayor rendimiento, para las operaciones individuales y un mejor rendimiento medio para el
sistema.
Otra ventaja de los índices agrupados es que los datos recuperados están ordenados según el orden
del índice. Por ejemplo, si se crea un índice agrupado a partir de las columnas state, country, y city y
una consulta que selecciona todos los valores para los que state es Texas, la salida resultante está
ordenada según country y city en el orden en que se haya definido en el índice. Esta característica se
puede utilizar para evitar operaciones innecesarias de ordenación si la base de datos y la aplicación se
han diseñado cuidadosamente. Por ejemplo, si se sabe que siempre va a ser necesario ordenar los
datos de una cierta forma, el uso de un índice agrupado significa que no se va a tener que realizar la
ordenación una vez se hayan recuperado los datos.

CREACIÓN DE ÍNDICES

28
TRANSACT-SQL Lenguaje de consulta de datos.

Para crear un índice usando T-SQL se debe utilizar el comando CREATE INDEX. La sintaxis de
este comando CREATE INDEX se muestra a continuación:

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]


INDEX nombre_del_índice ON nombre_de_la_tabla
(
nombre_de_columna [,nombre_de_columna ,nombre_de_columna ,...]
)
[WITH opciones]
[ON nombre_del_grupo_de_archivos]

Parámetro Descripción

PAD_INDEX Cuando se usa junto con el parámetro FILL_FACTOR, indica qué


espacio se debe dejar en los nodos rama, en vez de dejarlo en los
nodos hoja.

FILL_FACTOR ?número Especifica cómo de lleno se va a hacer cada nodo hoja; porcentaje
desde 0 a 100.

IGNORE_DUP_KEY Especifica que se ignorará una inserción en un índice único con valores
duplicados y se emitirá un mensaje de aviso. Si no se especifica
IGNORE_DUP_KEY KEY la inserción entera se deshará.

DROP_EXISTING Especifica que los índices existentes con el mismo nombre se deben
eliminar y volver a crear el índice. Este parámetro mejora el
rendimiento cuando se vuelve a crear un índice agrupado en una tabla
que tiene índices no agrupados porque no se requieren pasos
separados para eliminar y volver a crear los índices no agrupados.

STATISTICS_NORECOMPUTE Especifica que los datos estadísticos no deben ser recalculados. Esta
opción no se recomienda porque sus planes de ejecución se basan en
datos que probablemente no serán óptimos. Se usa este parámetro
sólo si se planea actualizar estadísticas manualmente.

RECONSTRUCCIÓN DE LOS ÍNDICES

SQL SERVER guarda estadísticas de cada índice, que describen su unicidad o su selectividad y
la distribución de los valores de la clave del índice. El optimizador de consultas de SQL Server utiliza
estas estadísticas para determinar qué índices se han de utilizar, si se usan, para realizar una consulta
particular de la mejor manera posible. Las estadísticas de los índices se actualizan de forma
predeterminada periódicamente. Sin embargo, los índices se fragmentan algunas veces cuando pasa
un largo periodo de tiempo debido a las divisiones de páginas, que dispersan físicamente el índice por
la base de datos. Como resultado el rendimiento empeora. También se vuelven a crear las estadísticas
del índice cuando se reconstruye este.

29
TRANSACT-SQL Lenguaje de consulta de datos.

Los dos métodos para reconstruir un índice sin tener que borrarlo y volver a crearlo, se
realizan mediante CREATE INDEX ... DROP_EXISTING y DBCC DBREINDEX.
CREATE INDEX ... DROP_EXISTING se usa para reconstruir sólo un índice cada vez en la
tabla.
DBCC DBREINDEX se usa con el nombre de una base de datos y el nombre de una tabla
para reconstruir todos los índices de esa tabla, sin tener que ejecutar comandos separados para cada
índice.

Si no se tiene tiempo o recursos para reconstruir los índices es posible actualizar las
estadísticas de los índices de forma independiente. Aunque esta técnica no es tan eficiente como la
reconstrucción de índice, porque aunque actualicemos las estadísticas el índice puede continuar
fragmentado, es mejor que tener unas estadísticas anticuadas si se ha desactivado la opción de
actualización automática de las estadísticas.

UPDATE STATISTICS nombre_de_la_tabla


[ nombre_del_indice | [nombre_de_estadística [,
nombre_estadistica, ...]]
[ WITH
[ FULLSCAN || SAMPLE número {PERCENT | ROWS]
[ ALL | COLUMNS | INDEX]
[ NORECOMPUTE]
]

nombre_de_indice Especifica el índice al que se han de calcular las estadísticas. De forma


predeterminada, si no se especifica se recalculan las estadísticas de
todos lo índices de la tabla.

nombre_de_estadística Si no se especifica se recalculan todas las estadísticas.

FULLSCAN Especifica que se han de leer todas las filas de la tabla para recalcular
las estadísticas. Es la mejor manera de recalcular estadísticas pero
también la más costosa.

SAMPLE numero ... Especifica el número o porcentaje de columnas en las que se basan las
estadísticas. No se puede utilizar con la opción FULLSCAN.

ALL |COLUMNS|INDEX Especifica si se recalculan todas las estadísticas, solo las de las
columnas o solo las de los índices.

NORECOMPUTE Especifica que las estadísticas no se han de recalcular de forma


automática en el futuro.

CONSEJOS SOBRE EL USO DE ÍNDICES


 Si una consulta accede a más del 20% de las filas de una tabla, un recorrido de tabla es más
efectivo que usar un índice.

30
TRANSACT-SQL Lenguaje de consulta de datos.

 Se debe tratar que los índices tengan la mayor selectividad posible (es decir el número de filas
obtenido por cada valor de la clave del índice). A mayor selectividad del índice mayor probabilidad
de que sea usado por el optimizador de consultas.

 Se deben usar los índices con moderación, es decir, unos pocos índices pueden ser útiles pero
demasiados índices pueden afectar negativamente al rendimiento porque hay que mantenerlos
actualizados cada vez que se realizan operación de inserción, actualización y borrado en los datos.

 No poner índices en tablas pequeñas.

 Utilizar el menor número posible de columnas en el índice (índices estrechos), ya que estos ocupan
menos espacio y necesitan menos sobrecarga de mantenimiento.

USO DE VISTAS

¿QUÉ ES UNA VISTA?


Una vista es una tabla virtual que está definida por una consulta que consiste en una
instrucción SELECT. Esta tabla virtual está creada con datos de una o más tablas reales y, para los
usuarios, una vista parece una tabla real. De hecho, una vista puede ser tratada del mismo modo que
una tabla normal. Los usuarios pueden hacer referencia a estas tablas virtuales con instrucciones
Transact-SQL (T-SQL) del mismo modo que se hace con las tablas. En una vista se pueden realizar las
operaciones SELECT, INSERT UPDATE y DELETE.

Tipos de vistas
Se pueden crear varios tipos de vistas, cada uno de los cuales tienen ventajas en ciertas
situaciones. El tipo de vista que se ha de crear depende completamente de para qué se quiera usar la
vista. Se pueden crear vistas de cualquiera de las siguientes maneras:

 Subconjunto de columnas de una tabla: Una vista puede consistir en una o más columnas de
una tabla. Probablemente es el tipo de vista más común y se puede utilizar para simplificar los
datos o para seguridad.

 Subconjunto de filas de una tabla: Una vista puede contener todas las filas que se deseen.
Este tipo de vista también es útil para la seguridad.

31
TRANSACT-SQL Lenguaje de consulta de datos.

 Unión de dos o más tablas: Se puede crear una vista usando una operación de unión. Las
operaciones de unión complejas se pueden simplificar cuando se usa una vista.
 Información de agregación: Se puede crear una vista que contenga datos de agregación. Este
tipo de vista también se usa para simplificar operaciones complejas.

Ventajas de las vistas


Una ventaja del uso de las vistas es que éstas siempre ofrecen los datos actualizados. La
instrucción SELECT que define una vista sólo se ejecuta cuando se accede a la vista, por tanto, todos
los cambios de la tabla subyacente se reflejan en la vista.
Otra ventaja de usar vistas es que una vista puede tener un nivel diferente de seguridad del
que posea la tabla subyacente. La consulta que define la vista se ejecuta con el nivel de seguridad que
posea el usuario que crea la vista. De esta manera, se puede crear una vista que enmascare los datos
que no se quieran mostrar a ciertas clases de usuarios.

CREACIÓN DE VISTAS

Uso de T-SQL para crear una vista

El comando CREATE VIEW tiene la siguiente sintaxis:

CREATE VIEW nombre_de_la_vista [ ( columna, columna, ... ) ]


[WITH ENCRYPTION]
AS
instrucción SELECT
[WITH CHECK OPTION]

La palabra clave WITH ENCRYPTION especifica que la definición de la vista (la instrucción
SELECT que define la vista) sea cifrada. SQL Server usa el mismo método para cifrar las instrucciones
SQL que para las contraseñas. Esta técnica de seguridad puede ser útil sino se quiere que ciertas
clases de usuarios sepan a qué tablas se está accediendo.

La palabra clave WITH CHECK OPTION especifica que las operaciones de modificación de
datos que se realizan en una vista deben seguir el criterio contenido en la instrucción SELECT que
define la vista. Por ejemplo, supongamos que se define una vista para seleccionar información sobre
todos los empleados del departamento de finanzas. Sino se incluye WITH CHECK OPTION, se puede
modificar el valor de la columna department de finanzas a un valor que indique otro departamento. Si
se especifica esta palabra clave, esta modificación no estaría permitida porque la alteración del valor
de una fila department haría que esta fila no volviese a ser accesible desde la vista. La palabra clave

32
TRANSACT-SQL Lenguaje de consulta de datos.

WITH CHECK OPTION especifica que no se puede hacer inaccesible una fila desde la vista haciendo un
cambio dentro de ésta.

 Subconjunto de columnas
Una vista consistente en un subconjunto de columnas puede ser útil cuando se necesita
proveer de seguridad una tabla que debería ser sólo parcialmente accesible para los usuarios.
Supongamos una base de datos de empleados de una empresa que consiste en una tabla
llamada Employee que contiene columnas de estos datos que son críticos y deberían ser vistos sólo
por ciertos empleados. Sería útil, sin embargo, permitir a todos los empleados ver parte de los datos.
Si se crea una vista que permita a todos los empleados acceder sólo a ciertos datos solucionará esta
cuestión. También se puede utilizar la vista para impedir que haya datos duplicados en otras tablas de
bases de datos.
Para crear una vista de la tabla Employee que solamente permita el acceso a las columnas
name, phone y office se usa la siguiente instrucción T-SQL:

CREATE VIEW emp_vw


AS
SELECT name, phone, office
FROM Employee

Las columnas de esta vista también existen en la tabla subyacente, los usuarios que usen esta
vista para acceder a los datos podrán ver las columnas sólo en la vista. Debido a que una vista puede
tener un nivel de seguridad distinto al de la tabla subyacente, la vista puede permitir el acceso a
cualquier persona mientras que la tabla permanece segura. En otras palabras, se puede restringir el
acceso a la tabla Employee sólo al departamento de recursos humanos, por ejemplo, mientras se
permite a todos los empleados que usen la vista.

 Subconjunto de filas
Se puede utilizar una vista que consista en un subconjunto de filas para restringir el acceso
limitando las vistas disponibles para los usuarios. En este ejemplo, en vez de limitar las columnas, se
restringen las filas especificándolas en una cláusula WHERE, como se muestra aquí:
CREATE VIEW emp_vw2
AS
SELECT *
FROM Employee
WHERE Dept = l

33
TRANSACT-SQL Lenguaje de consulta de datos.

La vista resultante contiene sólo las filas que lista un empleado que trabaje en el
departamento de recursos humanos o departamento 1.

Esta vista puede ser útil cuando los empleados del departamento de recursos humanos deban
acceder a las fichas de los empleados de su área. A una vista subconjunto_de_filas, al igual que la
vista subconjunto_de_columnas, se le puede asignar un nivel de seguridad diferente al de la tabla o
tablas subyacentes.
 Combinaciones
Mediante la definición de uniones en una vista, se puede simplificar las instrucciones T-SQL
que se usan para acceder a los datos cuando las instrucciones contengan una instrucción JOIN.
Supongamos que tenemos dos tablas, Manager y Employee2.
La siguiente instrucción combina las tablas Employee2 y Manager en una única tabla virtual:

CREATE VIEW org_chart


AS
SELECT Employee2.ename, Manager.mname
FROM Employee2,Manager
WHERE Employee2.manager_id =Manager.id
GROUP BY Manager.mname,Employee2.ename

En este ejemplo, las dos tablas se combinan en el valor manager_id. Los datos resultantes, que se
incluyen en la vista org_chart, se agrupan por el nombre del director.

 Agregación
Las vistas de agregación pueden ser útiles de muchas maneras, tales como para recuperación de
porcentajes y sumas de departamentos. Por ejemplo, para propósitos presupuestarios, se puede usar
una vista de agregado para ver la cantidad de dinero que cada departamento de la corporación paga
en salarios.
La siguiente instrucción establece una vista que usa una función (SUM) en la tabla Employee:

CREATE VIEW sal_vw


AS
SELECT dept, SUM(salary)
FROM Employee
GROUP BY dept

En este ejemplo la vista establece una tabla virtual que muestra el total que cada
departamento paga en salarios. Los datos resultantes se agrupan por departamentos.

 División

34
TRANSACT-SQL Lenguaje de consulta de datos.

Para crear una vista dividida, primero se deben crear las tablas divididas. Estas tablas
contendrán la mayor parte de los datos de ventas. Cada tabla guardará los datos de un periodo en
particular, normalmente una semana o un mes. Una vez se han creado estas tablas, se puede usar
una instrucción UNION ALL para crear una vista que contenga todos los datos. Por ejemplo,
supongamos que se tienen cuatro tablas llamadas table_1, table_2, table_3 y table_4.

La siguiente instrucción crea una gran tabla virtual que incluye todos los datos de estas tablas:
CREATE VIEW partview
AS
SELECT * FROM table_1
UNION ALL
SELECT * FROM table_2
UNION ALL
SELECT * FROM table_3
UNION ALL
SELECT * FROM table_4

MODIFICACIÓN Y ELIMINACIÓN DE VISTAS


Se utiliza el comando ALTER VIEW para modificar las vistas mediante T-SQL. Este comando es
similar el comando CREATE VIEW y tiene la siguiente sintaxis:

ALTER VIEW nombre_de_la_vista [(columna, columna, ...)]


[WITH ENCRYPTION]
AS
su instrucción SELECT
[WITH CHECK OPTION]

La única diferencia entre los comandos ALTER VIEW y CREATE VIEW es que el segundo
comando falla si la vista ya existe, mientras que el comando ALTER VIEW falla si la vista nombrada no
existe. (Las palabras clave opcionales WITH ENCRYPTION y WITH CHECK OPTION tienen el
mismo significado que en la creación de la vista). Para ver cómo funciona el comando ALTER VIEW, se
volverá a usar el ejemplo la división. Para eliminar una división vieja y añadir una nueva se puede
modificar la vista como sigue:
ALTER VIEW partview
AS
SELECT * FROM table_2
UNION ALL
SELECT * FROM table_3

35
TRANSACT-SQL Lenguaje de consulta de datos.

UNION ALL
SELECT * FROM table_4
UNION ALL
SELECT * FROM table_5

La vista modificada será similar a la que se hizo con el comando CREATE VIEW, pero ahora se
selecciona un conjunto de datos diferentes. La vista ya no usará table_1, sino que ahora utilizará
table_5.

Para eliminar una vista se usa el comando DROP VIEW. La sintaxis de este comando, que es
muy simple, se muestra a continuación:

DROP VIEW nombre_de_la_vista


SEGURIDAD Y USUARIOS

CREACIÓN Y ADMINISTRACIÓN DE INICIOS DE SESIÓN DE USUARIO

¿Por qué crear inicios de sesión de usuario?


Los inicios de sesión de usuarios permiten proteger los datos contra modificaciones no
autorizadas. Gracias a los inicios de sesión de usuario, SQL Server permite identificar usuarios
individuales autorizados. Cada inicio de sesión de usuario tiene asignado un nombre único y una
contraseña. Cada usuario tiene asignado su propia cuenta de inicio de sesión. Sin los inicios de sesión
de usuario, todas las conexiones a SQL Server usarían el mismo identificador, lo que imposibilitaría
crear diferentes niveles de seguridad basados en quién accede a la base de datos.
Para ver cómo se puede limitar el acceso a datos con inicios de sesión de usuario, se supone
que se tiene una tabla Employee que contiene información sobre empleados, con su nombre, número
de teléfono, número de oficina, nivel académico, salario, bonos, etc. Para evitar que ciertos usuarios
accedan a información confidencial en la tabla, se debería crear primero una vista que contuviera
solamente información no sensible, tal como los nombres de los empleados, números de teléfono y
números de oficina.
Después, implementando inicios de sesión de usuario, se puede restringir el acceso a la tabla
subyacente mientras se permite a todos los usuarios acceder a la vista. Sin embargo, si no se
aprovecharan las posibilidades de los inicios de sesión de usuario, cualquier usuario podría acceder a la
vista o a la tabla, perdiendo así el uso de la vista su intencionalidad.

 Configuración del modo de autenticación


En la configuración del modo de autenticación se siguen estos pasos:

36
TRANSACT-SQL Lenguaje de consulta de datos.

1. Abrir la ventana del Administrador corporativo. En el panel izquierdo, pulsar con el botón
secundario el nombre del servidor que contiene la base de datos para la que se desea establecer
el modo de autenticación y seleccionar Propiedades del menú emergente para mostrar la
ventana de SQL Server. Pulsar en la ficha Seguridad.

2. En esta ficha se puede seleccionar tanto el método de seguridad como la cuenta de inicio del
servicio. En el área de Seguridad, se especifica si debería usar Autenticación SQL Server y
Windows NT/2000 (Modo mixto) o si se debería usar sólo Autenticación Windows NT/2000.
También se puede especificar el nivel de auditoría del inicio de sesión. Esta configuración
determina qué tipo, en caso de existir, que auditoría de inicio de sesión se realiza. El nivel de
auditoria seleccionado dependerá de los requisitos de seguridad. Hay cuatro niveles disponibles
que son los siguientes:

- Ninguno: No realiza ninguna auditoría de inicio de sesión. Es la configuración predeterminada.


- Correcto: Registra todos los intentos válidos de inicios de sesión.
- Error: Registra todos los intentos fallidos de inicio de sesión.
- Todos: Registra todos los intentos de inicio de sesión.

Nota: El nivel de auditoría es una propiedad de la base de datos. De esta manera, se aplica el mismo
nivel de auditoría a todos los inicios de sesión.

3. En el área de la cuenta de inicio de servicio, hay que especificar la cuenta de Windows que se
debería usar al iniciar y ejecutar SQL Server. Se puede usar la cuenta del sistema o especificar una
cuenta, por ejemplo la de Administrador, con su contraseña. Pulsar en Aceptar para confirmar la
configuración establecida.

 Creación de inicios de sesión de SQL Server

Utilización del Administrador corporativo para la creación de inicios de sesión de SQL


Server:

1. En el panel izquierdo de la ventana del Administrador corporativo, expandir el grupo servidor,


expandir el servidor, y luego expandir la carpeta Seguridad.
Pulsar con el botón secundario en Inicios de sesión, y seleccionar Nuevo inicio de sesión del menú
contextual para mostrar la ventana de Propiedades de inicio de sesión de SQL Server.

37
TRANSACT-SQL Lenguaje de consulta de datos.

2. En la ficha General, introducir un nombre de inicio de sesión en el cuadro de texto Nombre. Si se


usa Autenticación de Windows, el nombre debe ser un nombre de cuenta válido en Windows. A
continuación se especifica el dominio de Windows en el cuadro de texto Dominio. En el área
Predeterminado, especificar la base de datos y el idioma predeterminado para este inicio de
sesión. En el área Autenticación hay que especificar si se usará una cuenta de Autenticación de
Windows o de Autenticación de SQL Server. Si se selecciona Autenticación de SQL Server, se usará
el Modo de autenticación mixto.
3. Pulsar con el botón la ficha Funciones del servidor, en esta ficha se puede especificar qué
funciones del servidor se utilizan, seleccionando estas funciones de la lista de funciones
disponibles al usuario. Pulsando Propiedades se puede ver y modificar la función seleccionada.
4. Pulsar la ficha Acceso a base de datos, esta ficha permite especificar qué bases de datos tiene
permiso el usuario para acceder. Se pueden seleccionar varias bases de datos y las funciones que
están disponibles a esas bases de datos. Pulsar Propiedades permite ver y administrar las
propiedades de las funciones de la base de datos.
5. Al finalizar las opciones de especificación, hay que guardar el inicio de sesión pulsando Aceptar.
Para ver listado el nuevo inicio de sesión junto a los demás inicios de sesión hay que pulsar la
carpeta Inicios de sesión en el Administrador corporativo. Los inicios de sesión aparecen listados
en el panel derecho.

Uso del Administrador corporativo en la creación de usuarios

Los usuarios de SQL Server se crean a partir de una carpeta de base de datos específica en
el panel izquierdo del Administrador corporativo. Para crear usuarios que utilicen el Administrador
corporativo, se siguen estos pasos:

1. Pulsar el botón secundario la base de datos en la que se va a crear al usuario, apuntar a Nuevo en
el menú contextual, y luego seleccionar Usuario de base de datos para mostrar la ventana
Propiedades del usuario de la base de datos, introducir un nombre válido de inicio de sesión de
SQL Server en la lista desplegable Nombre de inicio de sesión, e introducir un nuevo nombre de
usuario en el cuadro de texto Nombre de usuario. Luego se especifican las funciones de la base de
datos de las que desea que el nuevo usuario sea miembro seleccionando las casillas de
comprobación apropiadas en el cuadro de lista Miembros de la función de base de datos.

2. Pulsar Propiedades para mostrar la ventana Propiedades de la función de la base de datos. En esta
ventana se puede modificar una función de la base de datos que se haya seleccionado.

38
TRANSACT-SQL Lenguaje de consulta de datos.

3. Cuando se finalice con las opciones de configuración hay que pulsar Aceptar dos veces para crear
el usuario de la base de datos.

ADMINISTRACIÓN DE PERMISOS DE BASES DE DATOS

Permisos de servidor
Los permisos de servidor se asignan a los administradores de la base de datos para permitirles
desarrollar tareas administrativas. Los permisos se definen de acuerdo a determinadas funciones del
servidor. Los inicios de sesión de usuario pueden tener asignadas determinadas funciones del servidor,
pero las funciones no se pueden modificar. Los permisos de servidor comprenden los permisos
SHUTDOWN, CREATE DATABASE, BACKUP DATABASE y CHECKPOINT. Los permisos de servidor se
usan sólo para autorizar al administrador de la base de datos a realizar tareas administrativas y no
tienen por qué ser modificados ni concedidos a usuarios individuales.
Permisos de objetos de base de datos
Los permisos de objetos de base de datos son una clase de permisos que se conceden para
permitir el acceso a objetos de base de datos. Los permisos de objetos son necesarios para acceder a
una tabla o vista utilizando instrucciones SQL tales como SELECT, INSERT UPDATE y DELETE.
Un permiso de objeto también se necesita para usar la instrucción EXECUTE para la ejecución
de un procedimiento almacenado. Se puede utilizar el Administrador corporativo o los comandos T-SQL
para asignar permisos a objetos.

Utilización del Administrador corporativo para asignar permisos de objetos

1. Expandir un grupo servidor, expandir la base de datos a la que se desea asignar permisos y
pulsar la carpeta Usuarios. Los usuarios aparecen listados entonces en el panel derecho. Pulsar con el
botón secundario un nombre de usuario y seleccionar propiedades del menú emergente para mostrar
la ventana Propiedades del usuario de la base de datos.

2. Pulsar el botón Permisos para mostrar la ventana Propiedades del usuario de la base de datos,
en esta ficha se administran los permisos asignados al usuario. Para asignar permisos al usuario para
acceder a objetos dentro de la base de datos, se seleccionan las casillas de comprobación en las
columnas SELECT, INSERT, UPDATE, DELETE, EXEC y DRI del cuadro de lista.
(«DRI » significa «declarative referential integrity», «integridad referencial declarativa). Los
objetos se listan en la columna Objeto. Se pueden usar los botones opcionales de la parte superior

39
TRANSACT-SQL Lenguaje de consulta de datos.

de la ventana para enumerar todos los objetos o sólo los objetos que tienen permiso de acceso
para este usuario.

 Utilización de T-SQL para asignar permisos de objeto


Para usar T-SQL en la asignación de permisos de objeto a un usuario, se ejecuta la instrucción
GRANT. La instrucción GRANT tiene la sintaxis siguiente:

GRANT {ALL | permisos }


[ columna ON { tabla | vista} ]
[ ON tabla (columna) ] |
[ ON vista (columna) ] |
[ ON procedimiento_almacenado |rocedimiento_extendido ]
TO cuenta_de_seguridad
[ WITH GRANT OPTION ]
[ AS { grupo | función } ]

El parámetro cuenta_de_seguridad tiene que tener el tipo de cuenta siguiente:


 Usuario SQL Server.
 Función SQL Server.
 Usuario Windows.
 Grupo Windows.
La utilización de la palabra clave GRANT OPTION permite al usuario o usuarios especificados
en la instrucción conceder el permiso especificado a otros usuarios. Esto puede ser útil cuando se
conceden permisos a otros administradores de la base de datos. Sin embargo, la opción GRANT se
deberá usar con cuidado.

La opción AS especifica cuál es la autoridad con la que se ejecuta la instrucción GRANT. Para
ejecutar la instrucción GRANT, el usuario o la función tienen que tener una autoridad especial
concedida a tal efecto.

Un ejemplo de uso de la instrucción GRANT:

GRANT SELECT, INSERT, UPDATE


ON Customers
TO MaríaW
WITH GRANT OPTION
AS Accounting

40
TRANSACT-SQL Lenguaje de consulta de datos.

La opción AS Accounting se usa porque la función Accounting tiene derecho a conceder


permisos en la tabla Customers. La palabra clave GRANT OPTION permite a MaríaW conceder
permisos a otros usuarios.

Más información: Para ver una lista de los permisos que se pueden especificar en la instrucción
GRANT busca «GRANT descrita(GRANT)» en el índice de Libros en pantalla.

 Uso de T-SQL para revocar permisos de objeto

Se puede usar el comando REVOKE de T-SQL para revocar los permisos de objeto a un
usuario.

La instrucción REVOKE tiene la sintaxis siguiente:

REVOKE [ GRANT OPTION FOR ]


{ ALL [ PRIVILEGES ] | permisos }
[ columna ON { tabla | vista } ] |
[ ON tabla (columna) ] |
[ ON vista (columna) ] |
[ ON{procedimíento_almacenado|procedimiento_extendido } ]
{ TO | FROM } cuenta_de_seguridad
[ CASCADE ]
[ AS { grupo | función }

Un ejemplo de uso de la instrucción REVOKE es el siguiente:

REVOKE ALL
ON Customers
FROM MaríaW

La instrucción REVOKE ALL elimina todos los permisos que el usuario tiene en la tabla Customers.

 Permisos de instrucción de base de datos


Además de asignar permisos de objeto de base de datos, se pueden asignar permisos de
instrucción. Los permisos de objeto capacitan a los usuarios para acceder a los objetos dentro de la
base de datos, mientras que los permisos de instrucción les autorizan a crear objetos de base de
datos, inclusive bases de datos y tablas. Los permisos de instrucción se listan a continuación:

 BACKUP DATABASE: Permite al usuario ejecutar el comando BACKUP DATABASE.


 BACKUP LOG: Permite al usuario ejecutar el comando BACKUP LOG.
 CREATE DATABASE: Permite al usuario crear nuevas bases de datos.

41
TRANSACT-SQL Lenguaje de consulta de datos.

 CREATE DEFAULT: Permite al usuario crear valores predeterminados que pueden ser vinculados
a las columnas.
 CREATE PROCEDURE: Permite al usuario crear procedimientos almacenados.
 CREATE RULE: Permite al usuario crear funciones.
 CREATE TABLE: Permite al usuario crear nuevas tablas.
 CREATE VIEW: Permite al usuario crear nuevas vistas. Se pueden asignar permisos de
instrucción por medio del Administrador corporativo o por T-SQL.

 Utilización del Administrador corporativo para asignar permisos de instrucción

1. Expandir un grupo servidor, expandir un servidor y luego expandir la carpeta Base de datos.
Pulsar con el botón secundario el nombre de la base de datos a la que se desea asignar
permisos y seleccionar Propiedades del menú emergente para mostrar la ventana Propiedades
de la base de datos.

2. Pulsar la ficha permisos. Aquí se pueden asignar permisos de instrucción a los usuarios y
funciones que tengan acceso a la base de datos. Las columnas que contienen casillas de
comprobación definen los permisos de instrucción que se pueden asignar y la columna
Usuario o Función lista los usuarios y las funciones que tienen acceso a esta base de datos.
 Utilización de T-SQL para asignar permisos de instrucciones

Para asignar permisos de instrucción a un usuario utilizando T-SQL, se usa la instrucción


GRANT. La instrucción GRANT tiene la sintaxis siguiente:

GRANT { ALL | instrucción }


TO cuenta_de_seguridad

Los permisos de instrucción que se pueden asignar a un usuario son CREATE DATABASE,
CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TABLE, CREATE VIEW, DROP TABLE,
DROP VIEW, BACKUP DATABASE y BACKUP LOG, según se dijo anteriormente. Por ejemplo, para
agregar los permisos de instrucción CREATE DATABASE y CREATE TABLE a la cuenta de usuario JackR,
se usa el comando siguiente:

GRANT CREATE DATABASE, CREATE TABLE


TO 'JackR’

Como se puede ver, agregar permisos de instrucción a una cuenta de usuario no es un


proceso nada complicado.

42
TRANSACT-SQL Lenguaje de consulta de datos.

 Utilización de T-SQL para revocar permisos de instrucción

Puede usar la instrucción T-SQL, REVOKE para eliminar permisos de instrucción de una cuenta
de usuario. La instrucción REVOKE tiene la sintaxis siguiente:

REVOKE { ALL | instrucción }


FROM cuenta_de_seguridad

Por ejemplo, para eliminar sólo el permiso de instrucción CREATE DATABASE de la cuenta de
usuario JackR, se usa el comando siguiente:

REVOKE CREATE DATABASE


FROM 'JackR'

ADMINISTRACIÓN DE FUNCIONES DE BASES DE DATOS

Se puede simplificar la tarea de administrar muchos permisos a muchos usuarios usando las
funciones de base de datos. Las funciones de base de datos se diseñan para permitir a grupos de
usuarios recibir los mismos permisos de base de datos sin tener que recibir los permisos
individualmente. En lugar de asignar permisos individuales a usuarios individuales, se puede crear una
función que represente los permisos utilizados por un grupo de usuarios y después asignarlos al grupo.

Se cumple con la tarea de crear y modificar funciones de base de datos usando las mismas
herramientas que se usan para realizar la mayoría de las tareas relacionadas con la administración de
base de datos:

 Crear una función de base de datos.


 Asignar permisos a la función.
 Asignar usuarios a la función

 Utilización del Administrador corporativo para administrar funciones

1. Expandir un grupo servidor, expandir un servidor y luego expandir la carpeta Bases de datos.
Pulsar con el botón secundario la base de datos en la que se desea crear la función (se utiliza

43
TRANSACT-SQL Lenguaje de consulta de datos.

Northwind para este ejemplo), apuntar a Nuevo en el menú contextual y luego seleccionar Función
de base de datos. Como alternativa, se puede expandir la base de datos, pulsar Funciones con el
botón secundario y seleccionar Nueva función de base de datos del menú contextual. En cualquier
caso, aparece la ventana Propiedades de la función de la base de datos.
2. Asignar un nombre descriptivo a la función introduciendo el nombre en el cuadro de texto Nombre
-seleccionar un nombre que ayude a recordar el papel de la función.
3. Para asignar usuarios a la función, pulsar Agregar. Aparece una lista de cuentas de usuario que
tienen acceso a la base de datos. Seleccionar los usuarios que se desee asignar a esta función.
Para cancelar una selección, se pulsa otra vez el nombre del usuario apropiado. Al finalizar la
modificación de los miembros de la función, se pulsa Aceptar y se crea la función.
4. Para asignar permisos a la función, primero hay que abrir la ventana Propiedades de la función de
la base de datos expandiendo la carpeta Funciones, pulsar con el botón secundario el nombre de la
función y seleccionar Propiedades del menú emergente. Luego se pulsa Permisos para mostrar la
ventana Propiedades de la función de la base de datos: Northwind.

 Uso de funciones fijas de servidor

Cierto número de funciones predefinidas que se aplican en torno al servidor se crean en el


momento de la instalación de SQL Server en el servidor. Estas funciones fijas del servidor se usan para
conceder permisos a los administradores de la base de datos y pueden contener tanto permisos de
servidor como permisos de objeto y de instrucción, no se pueden eliminar.

Las funciones se listan a continuación:


 Bulkadmin: Puede realizar inserciones masivas.
 Dbcreator: Puede crear y alterar bases de datos.
 Diskadmin: Puede administrar archivos en disco.
 Processadmin: Puede administrar procesos de SQL Server.
 Securityadmin: Puede administrar inicios de sesión y crear permisos de base de datos.
 Serveradmin: Puede establecer cualquier opción del servidor y puede cerrar la base de datos.
 Setupadmin: Puede administrar servidores enlazados y arrancar procedimientos.
 Sysadmin: Puede realizar actividades del servidor.

 Asignación de usuarios a una función fija de servidor

1. En el Administrador corporativo, expandir grupo servidor, expandir un servidor, expandir la carpeta


Seguridad y luego pulsar Funciones del servidor. Pulsar con el botón secundario la función fija del

44
TRANSACT-SQL Lenguaje de consulta de datos.

servidor que desea agregar al usuario y seleccionar Propiedades del menú contextual. Lo que
invoca la ventana Propiedades de la función del servidor.
2. Para agregar una cuenta de usuario a la función, se pulsa primero Agregar. Lo que invoca el
cuadro de diálogo Agregar miembros, en la que se seleccionan nuevos miembros de la función.
3. Después de que hayan seleccionado los usuarios que se deseaba agregar a la función fija del
servidor se pulsa Aceptar. lo que devolverá a la ventana Propiedades de la función del servidor.
Pulsar Aceptar para agregar el usuario a la función de seguridad.

ACTUALIZACIÓN DE TABLAS

Las sentencias del lenguaje de modificación de datos (DML), se utilizan para realizar actualizaciones en
las bases de datos, las mas importantes son: INSERT, UPDATE y DELETE.

 SENTENCIA INSERT, agrega una o más filas nuevas a una tabla. Su sintaxis es la siguiente:

INSERT [INTO] tabla_o_vista


VALUES (lista de valores_de_datos)
[ SELECT { parámetros_select } ]

Ejemplos:
INSERT INTO Dept
VALUES ( 50, ‘PRODUCCION’, ‘SAN FRANCISCO’);

INSERT INTO emp(empno, ename, job, sal, comm, deptno)


VALUES ( 7890, ‘JINKS’, ‘CLERK’, 1.2E3, NULL, 40);

INSET INTO bonus


SELECT ename, job, sal, comm FROM emp
WHERE comm> 0.25*sal OR job IN(‘PRESIDENT’, ‘MANAGER’);

 SENTENCIA DELETE, quita una o más filas de una tabla o vista. Su sintaxis es la siguiente:

DELETE FROM tabla_o_vista


WHERE (condición)

Ejemplos:
DELETE FROM emp4;

45
TRANSACT-SQL Lenguaje de consulta de datos.

DELETE FROM emp


WHERE job=’SALESMAN’ AND comm<100;

DELETE FROM pedidos


WHERE rep=(SELECT num_emp1 FROM repventas
WHERE nombre= ‘Sue Smith’;

 SENTENCIA TRUNCATE TABLE, es un método rápido para eliminar todas las filas de una
tabla, es más rápido que una instrucción DELETE sin condiciones, porque DELETE registra
cada eliminación de fila y TRUNCATE TABLE registra sólo la cancelación de la asignación
completa de páginas de datos, libera inmediatamente todo el espacio ocupado por los datos e
índices de esa tabla. También se liberan las páginas de distribución de todos los índices. La
sintaxis es la siguiente:
TRUNCATE TABLE tabla_o_vista

Ejemplo:
TRUNCATE TABLE emp4;

 SENTENCIA UPDATE, puede cambiar los valores de filas individuales, grupos de filas o todas
las filas de una tabla o vista. Su sintaxis es la siguiente:

UPDATE [usuario] tabla [alias]


SET {columna = expresión [,columna = expresión]…|
(columna [, columna]…)=(subconsulta)}
[ WHERE condición ];

Ejemplos:
UPDATE emp
SET comm=null
WHERE job=’TRAINEE’;

UPDATE emp
SET job= ‘MANAGER, sal= sal+1000, deptno=20
WHERE ename=’JONES’;

46
TRANSACT-SQL Lenguaje de consulta de datos.

UPDATE repventas
SET cuota= 1.05*cuota;

UPDATE clientes
SET limite_credito = limite_credito+5000
WHERE num_clie IN (SELECT DISTINCT clie FROM pedidos
WHERE importe > 25000);

Ejercicio:

1. Construir mediante lenguaje Transact-SQL todas las tablas de la base


de datos ESTUDIANTES y realizar la inserción de sus registros. Las
tablas se crearán sobre la base de datos PRUEBA para no interferir con
la información ya existente en ESTUDIANTES. Para resolver este
ejercicio, es crucial observar el diseño completo de la base
ESTUDIANTES.

2. Añadir como nuevo vendedor en la tabla REPVENTAS a Henry Jacobsen de


36 años, con número de empleado 12, como director de ventas (108) con
contrato fechado el 25 de julio de 1990 y con oficina de representación
número 13.

3. Insertar como nuevo cliente del Sr. Jacobsen la empresa INTERCORP con
número de cliente 2127 con un límite de crédito de 15,000 y con un
número de empleado que atiende al cliente 112. Insertar un nuevo pedido
para el Sr. Jacobsen por importe de 2,340, del fabricante ACI, con
número de producto 41004, compuesto por 20 unidades y pedido en la
fecha actual con número de pedido 113070.

4. Copiar el número de pedido, la fecha y el importe de todos los pedidos


remitidos con anterioridad al 1 de enero de 1990, a partir de la tabla
PEDIDOS en otra tabla de nombre ANTPEDIDOS y que previamente debe ser
creada.

5. Supongamos que se desean analizar los patrones de compra de los


clientes examinando qué clientes y qué vendedores son responsables de
los grandes pedidos (los que superan las 15,000 unidades monetarias.
Para ello se crea una tabla de nombre GRANDESPEDIDOS1 que contenga los
campos: importe, empresa, nombre, rend(ventas-cuota), fab, producto y
cant, ya existentes en las tablas CLIENTES, REPVENTAS, PEDIDOS, y
OFICINAS (tablas que alimentarán la nueva tabla a crear.

6. Eliminar de la tabla REPVENTAS toda la información relativa a Henry


Jacobsen. Eliminar también de la tabla PEDIDOS todos los pedidos del
número de cliente 2127 (INTERCORP) y suprimir de esta misma tabla los
pedidos remitidos antes del 15 de noviembre de 1989.

7. Eliminar las filas correspondientes a los clientes atendidos por los


representantes de ventas números 105, 109 y 101. Suprimir también todos
los vendedores contratados antes de julio de 1988 a los que aún no se
le ha asignado una cuota.

47
TRANSACT-SQL Lenguaje de consulta de datos.

8. Suprimir los clientes atendidos por vendedores cuyas ventas son


inferiores al 80% de su cuota.

9. Vaciar la tabla GRANPEDIDOS1 de modo que siga permaneciendo en la base


de datos con sus índices y sus objetos asociados, y sin registrar las
eliminaciones de cada fila individual.

10. Elevar el límite de crédito de la empresa Acme Mfg. A 60,000 y


reasignarla al representante de ventas número 109.

11. Transferir todos los vendedores de la oficina número 12 de Chicago a


la oficina número 11 de Nueva Cork y rebajar sus cuotas un 10%.

12. Reasignar todos los clientes atendidos por los empleados números
105, 106 y 107 al empleado número 102. Asignar también una cuota de
10,000 a todos aquellos vendedores que actualmente no tienen cuota.

13. Reasignar todos los clientes atendidos por vendedores cuyas ventas
son menores que el 80% de sus cuotas.

14. Para todos los registros de la tabla CURSO que tengan un número de
curso que comience con C3, fijar el valor del crédito en 3, incrementar
la tarifa en un 10% y cambiar su descripción a “EL LENGUAJE DB2”.

15. Cambiar la tarifa de curso a 175 para el curso número C66.

16. Actualizar el valor de ESUELDO de todos los miembros del personal


asignados al departamento de matemática. El nuevo salario para todas
estas personas de 4,000.

48
TRANSACT-SQL Lenguaje de consulta de datos.

CONSULTAS MULTITABLA

Permiten recuperar datos de dos tablas o más según las relaciones lógicas entre ellas. Por ejemplo la
siguiente consulta combina las tablas pedidos y clientes:

SELECT num_pedido, importe, empresa, limite_credito


FROM pedidos, clientes
WHERE clie= num_clie;

Cuando en una consulta simple se hace referencia a múltiples tablas, ninguna de las referencias a las
columnas debe ser ambigua, por lo que la consulta anterior podría escribirse como sigue:

SELECT pedidos.num_pedido, pedidos.importe, clientes.empresa,


clientes.limite_credito FROM pedidos, clients WHERE clie= num_clie;

 JOIN DE DOS TABLAS:


Es una composición entre dos tablas basada en la coincidencia exacta de dos columnas, una de cada
tabla. Forma parejas de tablas haciendo coincidir los contenidos de las columnas relacionadas.
Ejemplos: Comparación de columnas de
tablas diferentes

SELECT * FROM cursos, departamento WHERE cdept= dept;

SELECT cnombre, ctarifa, dchfno FROM cursos, departamento


WHERE cdept= dept AND ctarifa>100;

SELECT nombre, ciudad, region FROM repventas, oficinas


WHERE oficina_rep= oficina;

SELECT ciudad, nombre, titulo FROM repventas, oficinas


WHERE dir= num_empl;

SELECT ciudad, nombre, titulo FROM repventas, oficinas


WHERE dir= num_empl AND objetivo<600000;

SELECT enombre, esueldo, ctarifa, ctarifa-esueldo AS [DIFERENCIA]


FROM personal, cursos
WHERE dept=cdept AND (ctarifa-esueldo)=52;

49
TRANSACT-SQL Lenguaje de consulta de datos.

SELECT num_pedido, importe, descripción FROM pedidos, productos


WHERE fab= id_fab AND producto=id_producto;

 JOINS DE TRES O MAS TABLAS:


Se basan en la coincidencia exacta (u otro tipo de comparación) de 3 o más columnas, una de cada
tabal.
Ejemplos:

SELECT num_pedido, importe, empresa, nombre FROM matricula, cursos, clase


WHERE clie=num_clie AND rep=num_empl AND importe>25000;

SELECT clase.cno, clase.sec, cnombre, sno FROM matricula, cursos, clase


WHERE cursos.cno=clase.cno AND clase.cno=matricula.cno
AND matricula.sec=clase.sec AND matricula.sec=’01’;

SELECT num_pedido, importe, empresa, nombre, ciudad


FROM pedidos, clientes, repventas, oficinas
WHERE clie=num_clie AND repclie=num_empl
AND oficina_rep=oficina AND importe>25000;

Hasta aquí hemos visto ejemplos de consultas con JOINS puros, es decir que las columnas de
emparejamiento tienen relación clave primaria/clave foránea. SQL no exige tal cosa, pueden ser 2
columnas cualesquiera como los siguientes casos:

SELECT num_pedido, importe, fecha_pedido, nombre


FROM pedidos, repventas
WHERE fecha_pedido=contrato;

SELECT nombre, cuota, ciudad, objetivo


FROM repventas, oficinas
WHERE cuota>objetivo;

SELECT nombre, cuota, ciudad, objetivo


FROM repventas, oficinas
WHERE cuota-objetivo>0;

 JOIN EXTERNO COMPLETO:

50
TRANSACT-SQL Lenguaje de consulta de datos.

Aplica los siguientes dos puntos:


o Por cada fila de la primera tabla que no haya correspondido a ninguna fila de la
segunda tabla, se añade una fila a los resultados, utilizando los valores de las
columnas de la primera tabla y suponiendo un valor NULL para todas las columnas de
la segunda tabla correspondientes en el emparejamiento.
o Para cada fila de la segunda tabla que no haya correspondido a ninguna fila de la
primera tabla, se añade una fila a los resultados, utilizando los valores de las columnas
de la segunda tabla y suponiendo un valor NULL para todas las columnas de la
primera tabla correspondientes en el emparejamiento.

El JOIN EXTERNO completo utiliza la sintaxis OUTER JOIN en la cláusula FROM de la consulta y la
sintaxis ON en lugar de la cláusula WHERE que precede la condición de búsqueda JOIN. Este tipo de
sintaxis también puede utilizarse para el JOIN normal (INTERNO) cambiando OUTER JOIN por INNER
JOIN.

También se puede tener JOIN EXTERNO de tipo:


o IZQUIERDO (LEFT JOIN) en donde por cada fila de la primera tabla que no haya
correspondido a ninguna fila de la segunda tabla, se añade una fila a los resultados,
utilizando los valores de las columnas de la primera tabla y suponiendo un valor NULL
para todas las columnas de la segunda tabla correspondientes en el emparejamiento.

o DERECHO (RIGHT JOIN) en donde para cada fila de la segunda tabla que no haya
correspondido a ninguna fila de la primera tabla, se añade una fila a los resultados,
utilizando los valores de las columnas de la segunda tabla y suponiendo un valor NULL
para todas las columnas de la primera tabla correspondientes en el emparejamiento.
Ejemplos, ejecutarlos en el analizador de consultas:
 Join interno o normal:
SELECT num_pedido, dir, oficina_rep, nombre, ciudad
FROM repventas, oficinas
WHERE num_empl=dir;

SELECT num_pedido, dir, oficina_rep, nombre, ciudad


FROM repventas INNER JOIN oficinas
ON num_empl=dir;

 Ahora lo aplicamos con las 3 variantes, qué diferencias observas:

51
TRANSACT-SQL Lenguaje de consulta de datos.

SELECT num_pedido, dir, oficina_rep, nombre, ciudad


FROM repventas LEFT JOIN oficinas
ON num_empl=dir;

SELECT nombre, titulo, objetivo, oficina, ciudad, num_empl, dir


FROM repventas RIGHT JOIN oficinas
ON num_empl=dir;

SELECT empresa, num_pedido, importe


FROM clientes INNER JOIN pedidos
ON num_clie=clie AND num_clie=2103;

SELECT empresa, num_pedido, importe


FROM clientes LEFT JOIN pedidos
ON num_clie=clie AND num_clie=2103;

SELECT empresa, num_pedido, importe


FROM clientes RIGHT JOIN pedidos
ON num_clie=clie AND num_clie=2103;

 Con selección simultánea de todos los campos:


SELECT * FROM repventas, oficinas
WHERE oficina_rep=oficina;

SELECT repventas.*, ciudad, region FROM repventas, oficinas


WHERE oficina_rep=oficina;

 Autocomposición, Join de la misma tabla:


SELECT emps.nombre, dirs.nombre FROM repventas emps, repventas dirs
WHERE emps.director=dirs.num_empl;

SELECT repventas.nombre, dirs.nombre FROM repventas, repventas dirs


WHERE repventas.director=dirs.num_empl;

SELECT repventas.nombre, repventas.cuota, dirs.nombre


FROM repventas, repventas dirs
WHERE repventas.director=dirs.num_empl AND repventas.cuota>dirs.cuota;

52
TRANSACT-SQL Lenguaje de consulta de datos.

 CONSULTAS RESUMEN:
Permiten resumir los datos mediante funciones de columna y mediante cláusulas GROUP BY, HAVING
y COMPUTE de la sentencia SELECT. Este tipo de consultas utilizan las funciones de agregado que
aceptan una columna completa de datos como argumento y producen como salida un único dato que
resume la columna.

Ejemplos, ejecutarlos en el analizador de consultas:

SELECT AVG(ctarifa) AS [MEDIA], MAX(ctarifa) AS [MAXIMO],


MIN(ctarifa) AS [MINIMO]
FROM cursos
WHERE cdept=’CIS’ AND ctarifa<>0;

SELECT MIN(cnombre) AS [PRIMER CURSO]


FROM cursos;

SELECT AVG(cuota) AS [CUOTA PROMEDIO], AVG(ventas) AS [VENTAS PROMEDIO],


AVG(100*(VENTAS/CUOTA)) AS [RENDIMIENTO DE CUOTA PROMEDIO]
FROM repventas;

SELECT MAX(100*(VENTAS/CUOTA)) AS [RENDIMIENTO ÓPTIMO DE VENTAS]


FROM repventas;

SELECT SUM(cuota) AS [CUOTA TOTAL], SUM(ventas) AS [VENTAS TOTALES],


MIN(cuota) AS [CUOTA MÍNIMA], MAX(cuota) AS [CUOTA MÁXIMA]
FROM repventas;

SELECT SUM(importe) AS [IMPORTE TOTAL], AVG(importe) AS [IMPORTE MEDIO],


FROM pedidos, repventas
WHERE nombre=’Bill Adams’ AND rep=num_empl;

SELECT AVG(precio) AS [PRECIO PROMEDIO]


FROM productos
WHERE id_fab=’ACI’;

SELECT COUNT(*) AS [VENDEDORES]


FROM repventas

53
TRANSACT-SQL Lenguaje de consulta de datos.

WHERE ventas>cuota;
SELECT COUNT(*) AS [PEDIDOS]
FROM pedidos
WHERE importe>25000;

SELECT COUNT(*) AS [CURSOS], SUM(ctarifa) AS [TARIFA TOTAL]


FROM cursos
WHERE cdept=’PHIL’;

SELECT COUNT(*), COUNT(ventas), COUNT(cuota)


FROM repventas

SELECT dept as [NOMBRE], COUNT(*) AS [MIEMBROS]


FROM personal
GROUP BY dept;

SELECT nombre, dept


FROM personal
WHERE dept IS NOT NULL;

SELECT COUNT(DISTINCT titulo), AS [TITULOS]


FROM repventas;

SELECT COUNT(titulo) as [TITULOS]


FROM repventas;

SELECT COUNT(DISTINCT oficina_rep) AS [VENDEDORE]


FROM repventas
WHERE ventas>cuota;

SELECT empresa, limite_crédito,


FROM clientes
WHERE num_clie=2107;

SELECT cdept AS [DEPARTAMENTO], SUM(cred), AS [CREDITOS]


FORM cursos
GROUP BY cdept;

54
TRANSACT-SQL Lenguaje de consulta de datos.

SELECT cdept AS [DEPARTAMENTO], SUM(ctarifa) AS [TARIFA]


FROM cursos
WHERE cred<>6
GROUP BY cdept;

SELECT rep AS [VENDEDOR], AVG(importe) AS [PEDIDO PROMEDIO]


FROM pedidos
GROUP BY rep;

SELECT oficina_rep AS [OFICINA], COUNT(*) AS [Nº VENDEDORES]


FROM repventas
GROUP BY oficina_rep;

SELECT rep AS [VENDEDOR], clie AS [CLIENTE], SUM(importe) AS [PEDIDO TOTAL]


FROM pedidos
GROUP BY clie, rep
ORDER BY clie, rep;

SELECT num_empl AS [EMPLEADO], nombre, SUM(importe) AS [PEDIDO TOTAL]


FROM pedidos, repventas
WHERE rep=num_empl
GROUP BY num_empl, nombre;

SELECT rep AS [VENDEDOR], AVG(importe) AS [PEDIDO MEDIO]


FROM pedidos
GROUP BY rep
HAVING SUM(importe)>30000;

SELECT ciudad, SUM(cuota) AS [CUOTA], SUM(repventas.ventas) AS [VENTAS]


FROM oficinas, repventas
WHERE oficina= oficina_rep
GROUP BY ciudad
HAVING COUNT(*)>=2;

SELECT rep, AVG(importe) AS [IMPORTE MEDIO]


FROM pedidos
WHERE importe>20000
GROUP BY rep

55
TRANSACT-SQL Lenguaje de consulta de datos.

HAVING SUM(importe)>30000;
SELECT rep, AVG(importe) AS [IMPORTE MEDIO]
FROM pedidos
GROUP BY resp
HAVING SUM(importe)>30000 OR AVG(importe)>6000;

RESUMIR DATOS

 CON CUBE, genera un cubo multidimensional como conjunto de resultados, se especifica en


la cláusula GROUP BY de una insrucción SELECT.

Ejemplo:
SELECT rep, clie, SUM(importe) AS [PEDIDO TOTAL]
FROM pedidos
WHERE rep>105
GROUP BY rep, clie WITH CUBE;

 CON ROLLUP, genera informes que contienen totales y subtotales.

Ejemplo:
SELECT rep, clie, SUM(importe) AS [PEDIDO TOTAL]
FROM pedidos
WHERE rep>105
GROUP BY rep, clie WITH ROLLUP;

SUBCONSULTAS

Es una consulta SELECT que devuelve un valor único y está anidada en una instrucción SELECT,
INSERT, UPDATE o DELETE o dentro de otra subconsulta.

 Con operadores de comparación:


SELECT cno, cnombre, cdept
FROM cursos
WHERE ctarifa= (SELECT MIN(ctarifa) FROM cursos);

56
TRANSACT-SQL Lenguaje de consulta de datos.

SELECT ciudad FROM oficinas


WHERE objetivo> (SELECT SUM(cuota)
FROM repventas
WHERE oficina_rep=oficina);

SELECT nombre, AVG(importe) FROM repventas, pedidos


WHERE num_empl= rep AND fab=’ACI’
Group by nombre
HAVING AVG(importe) > (SELECT AVG(importe) FROM pedidos);

SELECT cno, cnombre, cdept, ctarifa FROM cursos


WHERE ctarifa=( SELECT MAX(ctarifa) FROM cursos WHERE ctarifa<>500);

SELECT enombre, esueldo FROM personal


WHERE esueldo<=( SELECT MAX(ctarifa) FROM cursos );

SELECT * FROM cursos WHERE Dep.=’CIS’ AND


Ctarifa<( SELECT AVG(esueldo) FROM personal WHERE dept=’THEO’);

SELECT nombre FROM repventas WHERE cuota>=(SELECT objetivo FROM oficinas


WHERE ciudad=’Atlanta’);

 Subconsultas con IN:


El resultado con IN( o con NOT IN) es una lista de cero o más valores los cuales utiliza la consulta
externa.
Ejemplos:
SELECT fnombre, fdept, FROM claustro
WHERE fno, NOT IN(SELECT cinstrfno FROM clase);

SELECT nombre FROM repventas


WHERE oficina_rep IN(SELECT oficina FROM oficinas WHERE ventas>objetivo);

SELECT nombre FROM repventas


WHERE oficina_rep NOT IN(SELECT oficina FROM oficinas WHERE dir=108);

SELECT cno, cnombre FROM cursos

57
TRANSACT-SQL Lenguaje de consulta de datos.

WHERE cno IN(SELECT cno FROM matricula WHERE cno=’800’);

 Subconsultas con EXISTS:


Funciona como una prueba de existencia. EXISTS va después de la cláusula WHERE de la consulta
externa que comprueba la existencia de las filas devueltas por la subconsulta.
Ejemplos:
SELECT fnombre, fdept FROM claustro
WHERE EXISTS(SELECT * FROM cursos WHERE cdept=claustro.fdept AND cred=6);

SELECT fnombre, fdept FROM claustro


WHERE NOT EXISTS(SELECT * FROM cursos WHERE cdept=claustro.fdept AND cred=6);

SELECT descripcion FROM productos


WHERE EXISTS(SELECT num_pedido FROM cursos WHERE producto=id_producto
AND fab=id_fab AND importe>25000);

SELECT empresa FROM clientes


WHERE repclie=(SELECT num_empl FROM repventas WHERE nombre=’Sue Smith’) AND
NOT EXISTS(SELECT * FROM pedidos WHERE clie=num_clie AND importe>3000);

SELECT ciudad FROM oficinas


WHERE EXISTS(SELECT * FROM repventas WHERE oficina_rep=oficina
AND cuota>(0.55*objetivo));

 Subconsultas con ANY, SOME y ALL:


Llamadas operadores de comparación modificados, devuelven una lista de cero o más valores, pueden
incluir una cláusula GROUP BY o HAVING. Estas subconsultas se pueden formular con EXISTS.
Ejemplos:
SELECT fnombre, fnumdep FROM claustro
WHERE fnumdep=ANY(SELECT cred FROM cursos );
SELECT nombre FROM repventas
WHERE (0.1*cuota)<ANY(SELECT importe FROM pedidos WHERE rep=num_empl);

SELECT nombre, edad FROM repventas


WHERE NOT(num_empl= ANY(SELECT dir FROM oficinas ));

58
TRANSACT-SQL Lenguaje de consulta de datos.

Ejemplos de consultas de múltiples niveles de anidamiento:

SELECT son, fecha_mat FROM matricula


WHERE cno IN(SELECT cno FROM cursos WHERE cdept
IN(SELECT dept FROM departamento WHERE dedif=’SC’));

SELECT empresa FROM clientes


WHERE repclie IN(SELECT num_empl FROM repventas WHERE oficina_rep
IN(SELECT oficina FROM oficinas WHERE region=’Oeste’));

59

También podría gustarte