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

4. Lenguaje SQL 2017

El SQL es un lenguaje estándar para el manejo de bases de datos relacionales, que permite realizar consultas y gestionar datos a través de sentencias clasificadas en DDL y DML. DDL se ocupa de la definición de datos, incluyendo la creación y modificación de tablas, mientras que DML se centra en la manipulación de datos, permitiendo insertar, actualizar y consultar registros. Este documento proporciona un resumen de las sentencias más importantes de SQL, con ejemplos prácticos de su uso.

Cargado por

rolandoolivia
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)
0 vistas20 páginas

4. Lenguaje SQL 2017

El SQL es un lenguaje estándar para el manejo de bases de datos relacionales, que permite realizar consultas y gestionar datos a través de sentencias clasificadas en DDL y DML. DDL se ocupa de la definición de datos, incluyendo la creación y modificación de tablas, mientras que DML se centra en la manipulación de datos, permitiendo insertar, actualizar y consultar registros. Este documento proporciona un resumen de las sentencias más importantes de SQL, con ejemplos prácticos de su uso.

Cargado por

rolandoolivia
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

INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

LENGUAJE SQL

El SQL (Structured Query Language o lenguaje estructurado de consulta), es un


lenguaje surgido de un proyecto de investigación de IBM para el acceso a bases de datos
relacionales. Actualmente se ha convertido en un estándar, y la mayoría de los sistemas
gestores de bases de datos relacionales lo soportan.

El estándar se conoce como ANSI SQL y en tal sentido se lo considera un lenguaje


universal para el manejo de bases de datos. Su primera versión aparece en el año 1986 y
posteriormente esta versión estándar ha experimentado sucesivas modificaciones y
ampliaciones (1989, 1992, 1999, 2003, 2006, 2008).

Por supuesto, a partir del estándar cada gestor de bases de datos ha desarrollado su
propio SQL que puede variar de un gestor a otro, pero con cambios que no suponen
ninguna complicación para alguien que conozca un SQL concreto, o simplemente conozca
el ANSI SQL.

Como su nombre lo indica, el SQL nos permite realizar consultas a la base de datos. Pero
en realidad, permite realizar diversas tareas referidas a la definición, control y gestión de la
base de datos. Las sentencias SQL se clasifican, según su finalidad, en siete categorías
distintas, pero en el presente texto sólo nos concentraremos en dos categorías específicas:

a) DDL (Data Definition Language), lenguaje de definición de datos, incluye comandos


para definir, modificar o borrar las tablas en las que se almacenan los datos y de las
relaciones entre estas. (Es el que generalmente más varía de un gestor a otro)
b) DML (Data Manipulation Language), lenguaje de manipulación de datos, nos permite
recuperar los datos almacenados en la base de datos y también incluye comandos
para permitir al usuario actualizar la base de datos añadiendo nuevos datos,
suprimiendo datos antiguos o modificando datos previamente almacenados.

El SQL es un lenguaje declarativo y no de procedimientos, es decir, especifica qué es lo que


se quiere hacer, pero no cómo hacerlo, por lo que una sentencia SQL no establece
explícitamente un orden de ejecución. Está orientado al manejo de conjuntos de registros y
no a registros individuales. De esta forma una sentencia SQL puede equivaler a varias
sentencias de lenguajes orientados a registros.

Una sentencia SQL es similar a una frase (escrita en inglés) con la que decimos lo
que queremos obtener y de donde obtenerlo. Es decir, describe los resultados que se
quieren obtener, más que los procedimientos para llegar a ellos. Todas las sentencias
empiezan con un verbo (palabra reservada que indica la acción a realizar), seguido
de cláusulas, algunas obligatorias y otras opcionales, que completan la frase.

El presente texto es un resumen de las sentencias DDL y DML más importantes de SQL. En
la mayoría de ellas se ha reducido la sintaxis completa, ajustándolas sólo a lo que se
estudiará en el curso. En general, la sintaxis empleada será la correspondiente al ANSI
SQL, excepto en algunos casos particulares que se indican expresamente. Los ejemplos se
basan en el modelo de datos correspondiente a la práctica de SQL.

1 - El DDL, lenguaje de definición de datos


El DDL (Data Definition Language) lenguaje de definición de datos es la parte del SQL
que más varía de un gestor a otro, ya que esa parte tiene que ver con cómo se organizan
internamente los datos y eso, cada sistema lo hace de una manera u otra.

Página 1 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

1 . 1 – Sentencia CREATE TABLE


La sentencia CREATE TABLE sirve para crear la estructura de una tabla, nos permite definir
los campos que tiene y ciertas restricciones que deben cumplir esos campos.

Su sintaxis general es:

CREATE TABLE NombreTabla


( Campo1 TipoDatos1 [NOT NULL] [RestricciónCampo1]
[,Campo2 TipoDatos2 [NOT NULL] [RestricciónCampo2] ]

[,Restricción1Tabla]
[,Restricción2Tabla] )

La cláusula NOT NULL indica que el campo no podrá contener un valor nulo.

Una restricción (CONSTRAINT) consiste en la definición de una característica adicional


que tiene un campo o un conjunto de campos, suelen ser características como definición de
índice sin duplicados (clave alternativa), definición de clave primaria y definición de clave
externa

A una restricción se le puede asignar opcionalmente un nombre que se utiliza para


identificarla y para poder eliminarla cuando se quiera, sin tener que borrar el campo. Para
ello, hay que anteponer la cláusula CONSTRAINT seguida del nombre que se le da para
definirla.

Una restricción a nivel de campo es una restricción que aparece dentro de la definición
del campo, después del tipo de dato y afecta a un campo (el que se está definiendo):

[CONSTRAINT NombreRestricción]
{PRIMARY KEY | UNIQUE | REFERENCES NombreTablaRef [(Expresión)]}

Una restricción a nivel de tabla es una restricción que se define después de definir todos
los campos de la tabla y afecta a un campo o a un conjunto de campos:

[CONSTRAINT NombreRestricción]
{ PRIMARY KEY Expresión |
UNIQUE Expresión |
FOREIGN KEY Expresión REFERENCES NombreTablaRef [(Expresión)]}

Como restricciones tenemos la de clave primaria (clave principal), la de índice único (clave
alternativa) y la de clave externa:

La cláusula PRIMARY KEY se utiliza para definir un campo o una combinación de campos
como clave primaria de la tabla. Esto supone que el campo no puede contener valores
nulos. En una tabla no puede haber varias claves primarias, por lo que no podemos incluir
la cláusula PRIMARY KEY más de una vez, en caso contrario la sentencia da un error. No
hay que confundir la definición de varias claves primarias con la definición de una clave
primaria compuesta por varios campos, esto último sí está permitido y se define con una
restricción a nivel de tabla.

La cláusula UNIQUE sirve para definir un índice único (clave alternativa) sobre un campo o
un conjunto de campos. Un índice único es un índice que no permite valores duplicados, es
decir que si un campo tiene definido una restricción de UNIQUE no podrá haber dos
registros con el mismo valor en ese campo.

Página 2 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

La última restricción que podemos definir es la de clave externa: es un campo o conjunto de


campos que contiene un valor que hace referencia a un registro de otra tabla. Una
restricción a nivel de campo se puede definir con la cláusula REFERENCES y a
continuación indicamos a qué tabla hace referencia, opcionalmente podemos indicar entre
paréntesis el campo o conjunto de campos donde tiene que buscar el valor de referencia (la
clave primaria de la tabla referenciada). En una restricción a nivel de tabla debemos
empezar por las palabras FOREIGN KEY después indicamos entre paréntesis el campo o
conjunto de campos que forman la clave externa, a continuación la palabra reservada
REFERENCES seguida del nombre de la tabla a la que hace referencia, opcionalmente
podemos indicar entre paréntesis el campo o conjunto de campos donde tiene que buscar el
valor de referencia (la clave primaria de la tabla referenciada).

Es aconsejable utilizar solamente las restricciones a nivel de tabla, porque quedan


expresadas en forma más explícita cuáles son dichas restricciones. En este caso la cláusula
PRIMARY KEY aparece una única vez, y las cláusulas UNIQUE y FOREIGN KEY pueden
aparecer una o más veces (o ninguna). Por lo tanto una sintaxis recomendada es la
siguiente:

CREATE TABLE NombreTabla


( Campo1 TipoDatos1 [NOT NULL]
[,Campo2 TipoDatos2 [NOT NULL] ]

[,CONSTRAINT NomRest] [PRIMARY KEY Expr]
[,CONSTRAINT NomRest] [UNIQUE Expr]
[,CONSTRAINT NomRest] [UNIQUE …]

[,CONSTRAINTNomRest] [FOREIGN KEY Expr REFERENCES NomTabRef [(Expr)]]
[,CONSTRAINT NomRest] [,FOREIGN KEY …]
…)

La sintaxis anterior corresponde al ANSI SQL, sin embargo si la implementamos en VFP o


en Access, van a tener algunas diferencias.

Ejemplos:

1) Creación de la tabla Localidades:

- En Access con restricciones a nivel de tabla

CREATE TABLE Localidades (


CodLoc INTEGER, NomLoc CHAR(20) NOT NULL, CodProv INTEGER NOT NULL,
CONSTRAINT pk PRIMARY KEY (CodLoc),
CONSTRAINT fk1 FOREIGN KEY (CodProv) REFERENCES Provincias )

- En Access con restricciones a nivel de campo

CREATE TABLE Localidades (


CodLoc INTEGER CONSTRAINT pk PRIMARY KEY
NomLoc CHAR(20) NOT NULL,
CodProv INTEGER NOT NULL CONSTRAINT fk1 REFERENCES Provincias )

Página 3 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

- En VFP con restricciones a nivel de tabla

CREATE TABLE Localidades (


CodLoc N(5,0), NomLoc C(20) NOT NULL, CodProv N(2,0) NOT NULL,
PRIMARY KEY CodLoc TAG pk
FOREIGN KEY CodProv TAG fk1 REFERENCES Provincias )

- En VFP con restricciones a nivel de campo

CREATE TABLE Localidades (


CodLoc N(5,0) PRIMARY KEY
NomLoc C(20) NOT NULL,
CodProv N(2,0) NOT NULL REFERENCES Provincias TAG fk1 )

2) Creación de la tabla PediArtic

- En Access con restricciones a nivel de tabla

CREATE TABLE PediArtic (


NroPedido INTEGER, NroArtic INTEGER, Cantidad INTEGER NOT NULL,
CONSTRAINT pk PRIMARY KEY (NroPedido,NroArtic),
CONSTRAINT fk1 FOREIGN KEY NroPedido REFERENCES Pedidos,
CONSTRAINT fk2 FOREIGN KEY NroArtic REFERENCES Articulos )

- En VFP con restricciones a nivel de tabla

CREATE TABLE PediArtic (


NroPedido N(6,0), NroArtic N(5,0), Cantidad N(3,0) NOT NULL,
PRIMARY KEY STR(NroPedido,6,0)+STR(NroArtic,5,0) TAG pk,
FOREIGN KEY STR(NroPedido,6,0) TAG fk1 REFERENCES Pedidos,
FOREIGN KEY STR(NroArtic,5,0) TAG fk2 REFERENCES Articulos )

1 . 2 – Sentencia ALTER TABLE


La sentencia ALTER TABLE sirve para modificar la estructura de una tabla que ya existe.
Mediante esta sentencia podemos añadir nuevos campos o eliminar campos. Cuando
eliminamos un campo se pierden todos los datos almacenados en él.

También nos permite crear nuevas restricciones o borrar algunas existentes. La sintaxis
puede parecer algo complicada pero sabiendo el significado de las palabras reservadas la
sentencia se aclara bastante; ADD (agrega), ALTER (modifica), DROP (elimina), COLUMN
(campo), CONSTRAINT (restricción).

Se pueden agregar campos con valores nulos a una tabla existente, sin alterar los datos
que ya contiene:

ALTER TABLE NombreTabla ADD [COLUMN] Campo TipoDatos

Para cambiar el tipo de datos de un campo ya existente:

ALTER TABLE NombreTabla ALTER [COLUMN] Campo TipoDatos

También podemos eliminar un campo, en este caso se pierden todos los datos
almacenados en él:

ALTER TABLE NombreTabla DROP [COLUMN] Campo

Página 4 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

Para agregar una restricción:

ALTER TABLE NombreTabla ADD [CONSTRAINT NombreRestricción]


{ PRIMARY KEY Expresión |
UNIQUE Expresión |
FOREIGN KEY Expresión REFERENCES NombreTablaRef [(Expresión)]}

Para eliminar una restricción (previamente se le tiene que haber asignado un nombre en la
definición):

ALTER TABLE NombreTabla DROP CONSTRAINT NombreRestricción

Ejemplos:

ALTER TABLE Empleados ADD Email CHAR(20)

ALTER TABLE Empleados DROP Email

1 . 3 – Sentencia DROP TABLE


La sentencia DROP TABLE sirve para eliminar una tabla. No se puede eliminar una tabla si
el borrado infringe las reglas de integridad referencial

La sintaxis es la siguiente:

DROP TABLE NombreTabla

1 . 4 – Sentencia CREATE INDEX (No ANSI SQL)


Esta sentencia no está normalizada y puede ser utilizada en Access. Permite crear índices.
Explicaremos su uso sólo para crear índices que no tengan que ver con las restricciones.

La sintaxis es la siguiente:

CREATE INDEX NombreIndice ON NombreTabla (NombreCampo1, …)

Después del nombre de cada campo podemos indicar cómo queremos que se ordenen los
registros según el índice mediante las cláusulas ASC/DESC, que indican si el índice es
ascendente o descendente. Se asume por defecto que el índice es ascendente.

Ejemplo:

CREATE INDEX Ind1 ON Empleados (Salario DESC)

1 . 5 – Sentencia DROP INDEX (No ANSI SQL)


Esta sentencia no está normalizada y puede ser utilizada en Access para eliminar un
índice de una tabla. Se elimina el índice pero no los campos que lo forman

La sintaxis es la siguiente:

DROP INDEX NombreIndice ON NombreTabla

Ejemplo:

DROP INDEX Ind1 ON Empleados

Página 5 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

2 - El DML, lenguaje de manipulación de datos


El DML (Data Manipulation Language) lenguaje de manipulación de datos es la parte del
SQL que permite tanto actualizar como consultar los datos a nivel de registros y/o campos
en una base de datos.

2 . 1 – Sentencia INSERT INTO


La sentencia INSERT INTO permite agregar registros enteros en una tabla. Los registros se
agregan siempre al final de la tabla.

La sintaxis es la siguiente:

INSERT INTO NombreTabla [( Campo1, Campo2,... )] VALUES ( Valor1, Valor2,... )

A continuación de la palabra VALUES, entre paréntesis se escriben los valores que


queremos almacenar en el registro a añadir. Estos valores se tienen que escribir de acuerdo
al tipo de dato del campo donde se van a insertar y la asignación de valores se realiza por
posición, el primer valor lo asigna al primer campo, el segundo valor al segundo campo, así
sucesivamente.

Cuando no se indica ninguna lista de campos después del nombre de la tabla, se asume por
defecto todos los campos de la tabla, en este caso, los valores se tienen que especificar en
el mismo orden físico en el que están establecidos los campos de la tabla, y se tiene que
utilizar el valor NULL para completar los campos de los cuales no tenemos valores.

Ejemplo:

INSERT INTO Clientes VALUES (6, 'JUAN', 'LOPEZ', 'PELLEGRINI 250', NULL, 2000)
Cuando indicamos los nombres de los campos, éstos no tienen por qué estar en
el orden físico en el que aparecen en la tabla, también se pueden omitir algunos campos, los
campos que no se nombran tendrán por defecto el valor NULL.

El ejemplo anterior se podría escribir de la siguiente forma:

INSERT INTO Clientes (NroCliente, ApeClien, NomClien, DirClien, CodLoc)


VALUES (6, 'LOPEZ', 'JUAN', 'PELLEGRINI 250', 2000)

Observar que ahora hemos variado el orden de los valores y los nombres de campo no
siguen el mismo orden físico que tienen en la tabla, lo importante es poner los valores en el
mismo orden que los campos que enunciamos. Como no enunciamos el campo Telefono,
éste se completará con el valor nulo.

El hecho de colocar una lista de campos podría parecer peor ya que se tiene que escribir
más, pero realmente tiene ventajas sobre todo cuando la sentencia la vamos a almacenar y
reutilizar:
- La ventaja más importante es que se logra la independencia respecto del orden físico, es
decir, si se cambia el orden físico de los campos en la tabla, no habría inconvenientes,
mientras que de la otra forma intentaría asignar los valores a otro campo, esto produciría
errores de 'tipo no corresponde' y lo que es peor podría asignar valores erróneos sin que
nos demos cuenta.
- Además la sentencia queda más fácil de interpretar, ya que leyéndola vemos qué valor
asignamos a qué campo, y de paso nos aseguramos que el valor lo asignamos al campo
que queremos
- Otra ventaja es que si se añade un nuevo campo a la tabla, el primer ejemplo daría error
ya que el número de valores no correspondería con el número de campos de la tabla,

Página 6 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

mientras que el segundo ejemplo no daría error y en el nuevo campo se insertaría el valor
NULL.

Errores que se pueden producir cuando se ejecuta la sentencia INSERT INTO:


- Si en la clave principal intentamos no asignar valor, asignar el valor nulo o un valor que ya
existe en la tabla, no se añade el registro y da un mensaje de error del tipo 'infracciones de
clave'.
- Si tenemos definido un índice único (sin duplicados) e intentamos asignar un valor que ya
existe en la tabla también devuelve el mismo error.
- Si la tabla está relacionada con otra, se seguirán las reglas de integridad referencial.

2 . 2 – Sentencia DELETE
La sentencia DELETE elimina registros de una tabla.

La sintaxis es la siguiente:

DELETE FROM NombreTabla WHERE CondiciónSelección

La cláusula WHERE sirve para especificar qué registros queremos borrar. Se eliminarán de
la tabla únicamente los registros que cumplan la condición especificada. Si no se indica la
cláusula WHERE, se borran TODOS los registros de la tabla.

Ejemplo: Eliminar el detalle de artículos del pedido 1009

DELETE FROM PediArtic WHERE NroPedido = 1009

Si la tabla donde borramos está relacionada con otras tablas se podrán borrar o no los
registros siguiendo las reglas de integridad referencial.

2 . 3 – Sentencia UPDATE
La sentencia UPDATE modifica los valores de uno o más campos en los registros
seleccionados de una tabla.

La sintaxis es la siguiente:

UPDATE NombreTabla SET Campo1 = Expresion1, Campo2 = Expresion2,...


WHERE CondiciónSelección

La cláusula SET especifica qué campos van a modificarse y qué valores asignar a esos
campos.

La expresión en cada asignación debe generar un valor del tipo de dato adecuado para el
campo indicado. La expresión debe ser calculable a partir de los valores del registro que se
está actualizando.

La cláusula WHERE indica qué registros van a ser modificados. Si se omite la cláusula
WHERE se actualizan todos los registros.

Ejemplo: Aumentar un 20% los sueldos de los empleados del departamento 2

UPDATE Empleados SET Salario = Salario * 1.2


WHERE CodDepto = 2

Página 7 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

Si actualizamos un campo definido como clave externa, este campo se podrá actualizar o no
siguiendo las reglas de integridad referencial. El valor que se le asigna debe existir en la
tabla de referencia.

Si actualizamos un campo definido como clave primaria, este campo se podrá actualizar o
no siguiendo las reglas de integridad referencial, integridad de entidades y clave.

2 . 4 – Sentencia SELECT
La sentencia SELECT permite recuperar datos de una o varias tablas. Es considerada la
más potente de las sentencias SQL, porque basándose en las operaciones del álgebra
relacional, se pueden resolver problemas bastante complejos.

Cuando ejecutamos la sentencia el resultado se visualiza en forma de tabla con campos y


registros.

La sintaxis completa es bastante compleja. La que utilizaremos en el presente texto (basada


en el ANSI SQL) es la siguiente:

SELECT [DISTINCT]
[NombreTabla. | Alias.] NombreCampo1 [AS Nombre_Columna1] | Función1
[, [NombreTabla. | Alias.] NombreCampo2 [AS Nombre_Columna2] | Función2 ...]
FROM NombreTabla1 [[AS] Alias1] [, NombreTabla2 [[AS] Alias2 ...]
[WHERE CondiciónReunión1 [AND CondiciónReunión2 ...]
[AND | OR CondiciónSelección1 [AND | OR CondiciónSelección2 ...] ] ]
[GROUP BY NombreCampo1 [,NombreCampo2 ...] ] [HAVING CondiciónSelección]
[ORDER BY NombreCampo1 [ASC | DESC] [,NombreCampo2 [ASC | DESC] ...] ]
[UNION ComandoSELECT]

Empezaremos por ver las consultas más simples, basadas en una sola tabla.
Utilizaremos la siguiente sintaxis simplificada para comenzar:

SELECT NombreCampo1, NombreCampo2, …


FROM NombreTabla
WHERE CondiciónSelección

La tabla origen: la cláusula FROM


Con la cláusula FROM indicamos en qué tabla tiene que buscar la información.

El Alias es como un segundo nombre que asignamos a la tabla, si en una consulta definimos
un alias para la tabla, ésta se deberá nombrar utilizando ese nombre y no su nombre real,
además ese nombre sólo es válido en la consulta donde se define. El alias se suele emplear
en consultas basadas en más de una tabla que veremos más adelante. La palabra AS que
se puede poner delante del nombre de alias es opcional.

Lista de campos
La lista de campos que queremos que aparezcan en el resultado se especifica delante de la
cláusula FROM.

Los campos se pueden especificar mediante su nombre simple (NombreCampo) o


su nombre completo ([NombreTabla. | Alias.] NombreCampo), el nombre del campo
precedido del nombre de la tabla que contiene el campo, separados por un punto.

El nombre completo se puede emplear siempre que queramos y es obligatorio en algunos


casos que veremos más adelante, en especial cuando realicemos consultas donde
intervienen dos o más tablas.

Página 8 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

Ejemplo:

SELECT NroEmple, NomEmple, ApeEmple FROM Empleados

Este ejemplo corresponde a una operación de proyección del álgebra relacional.

Utilización del *: Se utiliza el asterisco (*) en la lista de campos para indicar 'todos los
campos de la tabla'.

Tiene dos ventajas:


- Evitar nombrar los campos uno a uno (es más corto).
- Si añadimos un campo nuevo en la tabla, este nuevo campo se incluirá en el resultado sin
tener que modificar la consulta.

Ejemplo:

SELECT * FROM Empleados

Alias de campo: Cuando se visualiza el resultado de la consulta, normalmente los campos


toman el nombre que tiene el respectivo campo en la tabla, si queremos cambiar ese
nombre lo podemos hacer definiendo un alias de campo mediante la cláusula AS, éste será
el nombre que aparecerá como título del campo.

Ejemplo:

SELECT NroEmple, NomEmple AS Nombre, ApeEmple AS Apellido


FROM Empleados

Campos calculados: Además de los campos que provienen directamente de la tabla origen,
una consulta SQL puede incluir campos calculados cuyos valores se calculan a partir de los
valores de los datos almacenados. En este caso, se especifica en la lista de selección
una expresión en vez de un nombre de campo. La expresión puede contener sumas, restas,
multiplicaciones y divisiones, paréntesis y también funciones predefinidas.

Ejemplo: ¿Qué sueldo cobrarán los empleados si se les aumenta un 20%?

SELECT NroEmple, Salario * 1.2 AS NuevoSalario FROM Empleados

La cláusula WHERE
La cláusula WHERE selecciona únicamente los registros que cumplan la condición de
selección especificada.

En la consulta sólo aparecerán los registros para los cuales la condición es verdadera
(TRUE). La condición de selección puede ser cualquier condición válida o combinación de
condiciones utilizando los operadores NOT (no) AND (y) y OR (ó).

Ejemplos:

SELECT * FROM Empleados WHERE Salario > 2000

SELECT NroEmple, NomEmple, ApeEmple FROM Empleados WHERE Salario > 2000

El primer ejemplo corresponde a una operación de selección del álgebra relacional. En el


segundo ejemplo se le agrega al primero una operación de proyección.

Página 9 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

Operadores especiales
Pertenencia a conjunto (IN)
Examina si el valor de la expresión es uno de los valores incluidos en la lista de valores.

Ejemplo:

SELECT CodLoc, NomLoc FROM Localidades WHERE CodProv IN (2,8,7)

Rango (BETWEEN)
Examina si el valor de la expresión está comprendido entre dos valores definidos.

Ejemplo:

SELECT * FROM Empleados WHERE Salario BETWEEN 2000 AND 5000

Correspondencia con patrón (LIKE)


Se utiliza cuando queremos utilizar caracteres comodines para formar el valor con el cuál
comparar.

Los comodines más usados son los siguientes:


_ representa un carácter cualquiera
% representa cero o más caracteres

Ejemplos:

SELECT * FROM Empleados WHERE ApeEmple LIKE 'L%'

SELECT * FROM Empleados WHERE ApeEmple LIKE '_A%'

Valor nulo (IS NULL)


Una condición de selección puede dar como resultado el valor verdadero (TRUE), falso
(FALSE) o nulo (NULL).

Cuando un campo que interviene en una condición de selección contiene el valor nulo,
el resultado de la condición no es verdadero ni falso, sino nulo. Por eso si queremos
seleccionar los registros que tienen valor en un determinado campo, no podemos comparar
con el valor null, es decir la condición ‘Telefono = null’ devuelve el valor nulo sea cual sea el
valor contenido en el campo Telefono. Si queremos preguntar si un campo contiene el valor
nulo debemos utilizar el operador de valor nulo.

Ejemplos:

SELECT * FROM Clientes WHERE Telefono IS NULL

SELECT * FROM Clientes WHERE Telefono IS NOT NULL

Ordenamiento de los registros: la cláusula ORDER BY


Para ordenar los registros del resultado de la consulta, utilizamos la cláusula ORDER BY.
Con esta cláusula se altera el orden de visualización de los registros de la tabla pero en
ningún caso se modifica el orden de los registros dentro de la tabla. La tabla no se modifica.

Ejemplo:

SELECT * FROM Empleados WHERE Salario > 2000 ORDER BY NroEmple

Página 10 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

Por defecto el orden será ascendente (ASC) (de menor a mayor). Si queremos podemos
alterar ese orden utilizando la cláusula DESC, en este caso el orden será el inverso al ASC.

Ejemplo:

SELECT * FROM Empleados WHERE Salario > 2000 ORDER BY Salario DESC

También podemos ordenar por varios campos, en este caso se indican los campos
separados por comas. Se ordenan los registros por el primer campo de ordenamiento, para
un mismo valor del primer campo, se ordenan por el segundo, y así sucesivamente. La
cláusula DESC o ASC se puede indicar para cada campo y así utilizar un ordenamiento
distinto para cada campo. Por ejemplo ascendente por el primer campo y dentro del primer
campo, descendente por el segundo campo.

Ejemplo:

SELECT * FROM Empleados ORDER BY CodDepto, Salario DESC

La cláusula DISTINCT
Al incluir la cláusula DISTINCT en el SELECT, se eliminan del resultado los registros
repetidos. Si se omite esta cláusula se incluirán todos los registros incluidos los duplicados.
No es necesario colocar DISTINCT si dentro de los campos que se incluyen en el resultado
de la consulta aparece la clave primaria o alguna clave alternativa.

Ejemplo:

SELECT DISTINCT CodDepto FROM Empleados

La cláusula TOP (No ANSI SQL)


La cláusula TOP no está normalizada, pero es aceptada tanto en VFP como en Access.
Permite obtener los n primeros registros de la tabla origen. No elige entre valores iguales, si
solicito los 5 primeros valores pero si el 6 es el mismo valor que el 5, entonces devolverá 6
registros en vez de 5 (o los que sea). Siempre se guía por el campo de ordenamiento que
aparece en la cláusula ORDER BY.

Ejemplo: obtener los dos empleados más antiguos de la empresa.

SELECT TOP 2 NroEmple, ApeEmple, NomEmple, FechaIng


FROM Empleados
ORDER BY FechaIng

El número de registros que queremos obtener se puede expresar con un número entero o
como un porcentaje sobre el número total de registros que se obtendrían sin la cláusula
TOP. En este último caso utilizaremos la cláusula TOP n PERCENT.

Ejemplo:

SELECT TOP 50 PERCENT NroEmple, ApeEmple, NomEmple, FechaIng


FROM Empleados
ORDER BY FechaIng

Asignación del resultado (No ANSI SQL)


La forma de indicar que el resultado de una consulta SELECT debe almacenarse en una
nueva tabla no está totalmente normalizada. En general la sintaxis de la cláusula es:

Página 11 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

INTO [TABLE | CURSOR] NombreTablaDestino

y debe incluirse en el comando SELECT, generalmente antes del FROM. Si la tabla no


existe se crea una nueva, y si existe se sobrescribe.

Ejemplo en Access: (se escribe INTO y luego el nombre de la tabla)

SELECT NroEmple, ApeEmple, NomEmple INTO Vendedores


FROM Empleados
WHERE CodDepto = 2

Ejemplos en VFP: (se escribe INTO, el tipo de tabla y luego el nombre de la tabla)

SELECT NroEmple, ApeEmple, NomEmple INTO TABLE Vendedores


FROM Empleados
WHERE CodDepto = 2

SELECT NroEmple, ApeEmple, NomEmple INTO CURSOR Vendedores


FROM Empleados
WHERE CodDepto = 2

Es importante observar que la nueva tabla no conserva las restricciones de las originales, y
en particular, no posee clave primaria ni claves externas. Si se las quiere definir, debe
hacerse con comandos ALTER TABLE.

Funciones de agregado
En la lista de campos de una consulta pueden aparecer funciones de columna también
denominadas funciones de agregado. Una función de agregado se aplica a un campo o a
una expresión y obtiene un valor que resume el contenido del campo o de la expresión.
Utilizaremos las siguientes funciones:

COUNT(Expresión)
SUM(Expresión)
AVG(Expresión)
MAX(Expresión)
MIN(Expresión)

El argumento de la función indica con qué valores se tiene que operar, por eso
Expresión suele ser un nombre de campo que contiene los valores a resumir, pero también
puede ser cualquier expresión válida que devuelva una lista de valores

La función SUM(Expresión) calcula la suma de los valores indicados en el argumento. Los


datos que se suman deben ser de tipo numérico.

Ejemplo: Obtener el total de sueldos a pagar por la empresa

SELECT SUM(Salario) FROM Empleados

La función AVG(Expresión) calcula el promedio de los valores indicados en el argumento,


también se aplica a datos numéricos.

Ejemplo: Obtener el promedio de sueldos de los empleados asignados al departamento 3

SELECT AVG(Salario) FROM Empleados WHERE CodDepto = 3

Página 12 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

Las funciones MIN(Expresión) y MAX(Expresión) determinan los valores menores y mayores


respectivamente.

Los valores del argumento pueden ser de tipo numérico, carácter o fecha. El resultado de la
función tendrá el mismo tipo de dato que el argumento.

Ejemplo: Obtener la fecha de ingreso del último empleado que ingresó a la empresa

SELECT MAX(FechaIng) FROM Empleados

COUNT(NombreCampo) cuenta el número de valores que hay en el campo, los valores del
campo pueden ser de cualquier tipo, y la función siempre devuelve un número entero. Si el
campo contiene valores nulos esos valores no se cuentan, si en el campo aparece un valor
repetido, lo cuenta varias veces

COUNT(DISTINCT NombreCampo) cuenta el número de valores diferentes que hay en el


campo, Si en el campo aparece un valor repetido, lo cuenta una sola vez. Tampoco cuenta
los valores nulos.

COUNT(*) permite contar registros en vez de valores. Si el campo no contiene ningún valor
nulo, COUNT(NombreCampo) y COUNT(*) devuelven el mismo resultado, mientras que si
hay valores nulos en el campo, COUNT(*) cuenta también esos valores mientras
que COUNT(NombreCampo) no los cuenta.

Ejemplo: ¿Cuántos empleados hay en la empresa?

SELECT COUNT(NroEmple) FROM Empleados

o bien

SELECT COUNT(*) FROM empleados

o bien

SELECT COUNT(DISTINCT NroEmple) FROM Empleados

En este caso las tres consultas devuelven el mismo resultado ya que el campo NroEmple no
contiene valores nulos ni repetidos (es la clave primaria de la tabla Empleados).

Ejemplo: ¿Cuántos empleados están asignados a un departamento?

SELECT COUNT(CodDepto) FROM Empleados

Por el contrario, esta consulta nos devuelve el número de valores no nulos que se
encuentran en el campo CodDepto de la tabla Empleados, por lo tanto nos dice cuántos
empleados están asignados a un departamento.

Ejemplo: ¿Cuántos departamentos tienen asignado al menos un empleado?

SELECT COUNT(DISTINCT CodDepto) FROM Empleados

Esta consulta nos devuelve el número de valores diferentes que se encuentran en el campo
CodDepto de la tabla Empleados.

Página 13 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

Producto cartesiano
Aplicando el producto cartesiano a dos tablas se obtiene una tabla con los campos de
la primera tabla junto a los campos de la segunda tabla, y los registros de la tabla resultante
son todas las posibles combinaciones de registros de la primera tabla con registros de
la segunda tabla.

El producto cartesiano se indica colocando en la cláusula FROM las tablas que queremos
combinar separadas por comas, podemos obtener así el producto cartesiano de dos, tres, o
más tablas.

Ejemplo:

SELECT * FROM Localidades, Provincias

Reuniones
Generalmente cuando queremos obtener datos de dos o más tablas es para asociar a los
registros de una tabla, un registro de la otra tabla, por ejemplo añadir a los pedidos los datos
del cliente correspondiente, o los datos del empleado, esto equivale a un producto
cartesiano con una selección de registros, es decir que al producto cartesiano de dos o más
tablas le agregamos una o más condiciones de reunión

La condición puede ser una igualdad de campos, uno de cada tabla, y en ese caso se habla
de equirreunión. La reunión natural, o sea cuando se elimina uno de los campos superfluos,
no se ejecuta automáticamente y hay que detallar los campos como en una proyección.

Ejemplo:

SELECT * FROM Pedidos AS P, Clientes AS C WHERE [Link] = [Link]

Otra forma de expresar la consulta anterior es utilizando la cláusula INNER JOIN dentro de
la cláusula FROM:

SELECT * FROM Pedidos P INNER JOIN Clientes C ON [Link] = [Link]

Podemos realizar una reunión de más de dos tablas, por ejemplo:

SELECT * FROM Pedidos AS P, Clientes AS C, Empleados AS E


WHERE [Link] = [Link] AND [Link] = [Link]

También podemos agregar a las condiciones de reunión, una o más condiciones de


selección, por ejemplo, si quiero obtener el número y la fecha de los pedidos, y el nombre y
apellido del cliente, de los pedidos efectuados por los clientes de Rosario

SELECT [Link], [Link], [Link], [Link]


FROM Pedidos AS P, Clientes AS C, Localidades AS L
WHERE [Link] = [Link] AND [Link] = [Link]
AND [Link] = 'Rosario'

Para realizar una reunión externa izquierda o derecha se utilizan las cláusulas LEFT JOIN o
RIGHT JOIN.

Ejemplos:

SELECT *
FROM Empleados E LEFT JOIN Departamentos D ON [Link] = [Link]

Página 14 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

SELECT *
FROM Empleados E RIGHT JOIN Departamentos D ON [Link] = [Link]

La cláusula GROUP BY
Hasta ahora las consultas con funciones de agregado que hemos visto producen un único
registro como resultado. Por ejemplo, si queremos obtener el total de sueldos a pagar por el
departamento 1:

SELECT SUM(Salario) FROM Empleados WHERE CodDepto = 1

Pero si quisiéramos hacerlo con todos los departamentos, deberíamos ejecutar una consulta
para cada uno. Para resolver este problema, podemos agrupar los registros en grupos en
los cuales uno o más campos toman el mismo valor. En el caso del ejemplo anterior, sumar
los valores del campo Salario para cada grupo de registros en los cuales el departamento es
el mismo.

SELECT CodDepto, SUM(Salario)


FROM Empleados
GROUP BY CodDepto

De esta manera, se pueden obtener subtotales con la cláusula GROUP BY. Una consulta
con una cláusula GROUP BY se denomina consulta agrupada ya que agrupa los registros
de la tabla origen y produce un único registro resumen por cada grupo formado. Los campos
indicados en el GROUP BY se llaman campos de agrupación.

Juntamente con las funciones de agregado que se utilicen, es obligatorio colocar los campos
de agrupación en la lista de campos que aparecen como resultado de la consulta.

Todos los registros que tienen valor nulo en el campo de agrupación, pasan a formar un
único grupo. Es decir, se considera al valor nulo como un valor cualquiera a los efectos de la
agrupación.

La cláusula HAVING
La cláusula HAVING se utiliza únicamente cuando aparece la cláusula GROUP BY y nos
permite seleccionar registros de la tabla resultante de una consulta de agrupamiento.

Pero existe una restricción, en la condición de selección sólo pueden aparecer:


- valores constantes
- funciones de agregado
- campos de agrupación (campos que aparecen en la cláusula GROUP BY)
- o cualquier expresión basada en las anteriores.

Ejemplo: Obtener los departamentos y el total de sueldos a pagar por cada departamento,
pero solamente de aquellos departamentos con un total a pagar superior a 5000.

SELECT CodDepto, SUM(Salario)


FROM Empleados
GROUP BY CodDepto
HAVING SUM(Salario) > 5000

Para obtener lo que se pide hay que calcular la suma de sueldos de los empleados de cada
departamento, por lo que hay que utilizar la tabla Empleados. Tenemos que agrupar los
empleados por departamento y calcular la suma para cada departamento, por último nos
queda seleccionar del resultado los registros (departamentos) que tengan una suma
superior a 5000.

Página 15 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

Subconsultas
Una subconsulta es una sentencia SELECT que aparece dentro de otra
sentencia SELECT que llamaremos consulta principal.

Se puede encontrar en la cláusula WHERE o en la cláusula HAVING de la consulta


principal. Solamente nos referiremos a las subconsultas que pueden aparecer en la cláusula
WHERE.

Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando
que aparece encerrada entre paréntesis y no puede contener la cláusula ORDER BY.

Ejemplo: Obtener el o los números, nombres y apellidos de los empleados que ganan el
sueldo más alto de la empresa

SELECT NroEmple, NomEmple, ApeEmple FROM Empleados


WHERE Salario = (SELECT MAX(Salario) FROM Empleados)

En una cláusula WHERE tenemos siempre una condición y la subconsulta actúa de


operando dentro de esa condición. En el ejemplo anterior se compara Salario con el
resultado de la subconsulta, que devuelve un valor simple o escalar (el máximo Salario).
Ambos operandos, a izquierda y derecha del operador igual (=), deben pertenecer al mismo
tipo de datos para que la comparación sea válida.

Pero la subconsulta también puede devolver un conjunto de valores (registros), entonces es


necesario utilizar el operador IN.

Ejemplo: ¿Cuáles son los números de pedido y las fechas de entrega de los pedidos en los
que se han solicitado más de 10 unidades del artículo 3070?

SELECT NroPedido, FechaEnt FROM Pedidos


WHERE NroPedido IN (SELECT NroPedido FROM PediArtic
WHERE NroArtic = 3070 AND Cantidad > 10)

En este ejemplo, se examina si el valor del número de pedido es uno de los


valores incluidos en la lista de valores producida por la subconsulta.

En este caso, la subconsulta debe generar un único campo. Si la subconsulta no devuelve


ningún registro, la condición resulta falsa.

También en este caso, el tipo de datos del único campo de la subconsulta debe coincidir con
el tipo de datos del operando a la izquierda del operador IN.

Uso del operador EXISTS en subconsultas


El operador EXISTS permite determinar si la subconsulta devuelve algún registro como
resultado. Si la subconsulta devuelve uno o más registros, la condición adopta el
valor verdadero, si la subconsulta no devuelve ningún registro, la condición toma el valor
falso. Nunca puede tomar el valor nulo.

Con este operador la subconsulta puede tener uno o varios campos, en realidad no importa
ya que el operador no se fija en los campos devueltos, sino en si hay o no hay registros en
la tabla resultado de la subconsulta.

En la mayoría de los casos en que se utiliza el operador EXISTS habrá que utilizar una
referencia externa. Si no se utiliza una referencia externa la subconsulta devuelta siempre
será la misma para todos los registros de la consulta principal y en este caso se seleccionan

Página 16 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

todos los registros de la consulta principal (si la subconsulta genera registros) o ninguno (si
la subconsulta no devuelve ningún registro).

Ejemplo: Obtener el número, nombre y apellido de los clientes que han efectuado al menos
un pedido

SELECT [Link], [Link], [Link]


FROM Clientes C
WHERE EXISTS (SELECT * FROM Pedidos P WHERE [Link] = [Link])

Observe que delante de EXISTS no va ningún nombre de campo. En la subconsulta hemos


utilizado el asterisco (*), dado que no interesan los campos que ésta devuelve.
Hemos colocado una condición en el WHERE de la subconsulta, la de la referencia externa
([Link]) para que el pedido que se compare sea un pedido del cliente.

En caso de que se quiera obtener los clientes que no han efectuado pedidos, debemos
anteponer el operador NOT al operador EXISTS

SELECT [Link], [Link], [Link]


FROM Clientes C
WHERE NOT EXISTS (SELECT * FROM Pedidos P
WHERE [Link] = [Link])

Uniones
Esta operación se utiliza cuando tenemos dos tablas con los mismos campos y queremos
obtener una nueva tabla con los registros de la primera y los registros de la segunda. En
este caso la tabla resultante tiene los mismos campos que la primera tabla (que son los
mismos que los de la segunda tabla).

Cuando hablamos de tablas pueden ser tablas reales almacenadas en la base de


datos o tablas lógicas (resultados de una consulta), esto nos permite utilizar la operación
con más frecuencia ya que pocas veces tenemos en una base de datos tablas idénticas en
cuanto a campos.

Para realizar esta operación utilizamos el operador UNION. Después de la primera consulta
viene la palabra UNION y a continuación la segunda consulta.

Ejemplo: Obtener el número, nombre, apellido y dirección de todos los empleados y clientes
que viven en la ciudad de Rosario

SELECT [Link], [Link], [Link], [Link]


FROM Empleados AS E, Localidades AS L
WHERE [Link] = [Link]
AND [Link] = 'Rosario'
UNION
SELECT [Link], [Link], [Link], [Link]
FROM Clientes AS C, Localidades AS L
WHERE [Link] = [Link]
AND [Link] = 'Rosario'

Las dos consultas deben tener el mismo número de campos pero los campos pueden
llamarse de diferente forma, pero ser del mismo tipo de dato.

Los campos del resultado se llaman como los campos de la primera consulta.

Página 17 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

La unión no incluye registros repetidos, si algún registro está en las dos tablas, sólo aparece
una vez en el resultado.

Se puede unir más de dos tablas, para ello después de la segunda consulta repetimos la
palabra UNION ... y así sucesivamente.

También podemos indicar que queremos el resultado ordenado por algún criterio, en este
caso se incluye la cláusula ORDER BY, que se escribe después de la última consulta, al
final de la sentencia. Para indicar los campos de ordenamiento debemos utilizar los nombres
de campo de la primera consulta ya que son los que se van a utilizar para nombrar los
campos del resultado.

2 . 5 – Sentencia TRANSFORM (No ANSI SQL)


Esta sentencia no está normalizada, pero se puede utilizar en Access.

Cuando queremos representar una consulta resumen con dos campos de agrupación, como
una tabla de doble entrada en la que cada una de los campos de agrupación es una entrada
de la tabla utilizaremos un tipo de consulta que se denomina consulta de tabla de
referencias cruzadas.

Por ejemplo, si queremos obtener la cantidad de pedidos mensuales de nuestros clientes,


tenemos que diseñar una consulta agrupada calculando la cantidad de pedidos agrupando
por cliente y mes del pedido.

La consulta será:

SELECT NroCliente AS Cliente, MONTH(FechaPed) AS Mes, COUNT(*) AS Cantidad


FROM Pedidos
GROUP BY NroCliente, MONTH(FechaPed)

El resultado será la tabla siguiente:

Cliente Mes Cantidad


1 1 2
1 3 1
2 1 1
3 1 1
3 3 2
3 7 1
4 2 1
4 3 2
5 3 1
5 6 1

La consulta quedaría mucho más clara, si presentamos los resultados en un formato más
compacto como el siguiente:

Cliente 1 2 3 6 7
1 2 1
2 1
3 1 2 1
4 1 2
5 1 1

Este último resultado se obtiene mediante una consulta de referencias cruzadas. Observar
que uno de los campos de agrupación (Cliente) sigue definiendo los registros que aparecen
(hay un registro por cada cliente), mientras que el otro campo de agrupación (Mes) ahora
sirve para definir los campos, cada valor de mes define un campo en el resultado, y la celda
en la intersección de un valor de Cliente y un valor de Mes contiene la cantidad de pedidos.

Página 18 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

La sentencia TRANSFORM es la que se utiliza para definir una consulta de referencias


cruzadas.

La sintaxis es la siguiente:

TRANSFORM Resultado
SELECT CampoFijo1, CampoFijo2,… FROM NombreTabla
GROUP BY NombreCampo
PIVOT CampoDinámico [IN (Valores)]

Resultado es la función de agregado que permite obtener el resultado de las celdas.

En el SELECT, el CampoFijo es el campo que define el encabezado de los registros, en la


cláusula FROM indicamos la tabla (o tablas) de donde sacamos los datos, y en la
cláusula GROUP BY ponemos el campo que va a definir los registros del resultado.

SELECT puede contener una cláusula WHERE para seleccionar los registros que se utilizan
para calcular el resultado, por ejemplo para establecer los pedidos mensuales de un año
específico.

En la cláusula PIVOT indicamos el campo cuyos valores van a definir los campos dinámicos
en el resultado, a este campo lo llamaremos pivote.

La cláusula IN permite definir el conjunto de valores que queremos que aparezcan como
campos dinámicos.

Es conveniente que el campo pivote que sirve de encabezado de campo tenga un número
limitado de posibles valores para que no se generen demasiados campos.

En nuestro ejemplo es mejor utilizar el mes como encabezado de campo y no de registro ya


que posibles empleados hay muchos, y además el mes toma valores que conocemos y por
lo tanto podemos utilizar la cláusula IN para que aparezcan todos los meses del año.

En nuestro ejemplo, resultado sería COUNT(*), el campo fijo es NroCliente con un alias para
que salga la palabra Cliente en el encabezado, el origen de datos es la tabla Pedidos
(porque el resultado COUNT(*) se obtiene de Pedidos), el campo del GROUP BY es
NroCliente ya que queremos un registro por cada cliente, el campo dinámico que colocamos
en la cláusula PIVOT sería MONTH(FechaPed).

La sentencia queda de la siguiente forma:

TRANSFORM COUNT(*)
SELECT NroCliente AS Cliente
FROM Pedidos
GROUP BY NroCliente
PIVOT MONTH(FechaPed)

Cuando los posibles valores que puede tomar el campo pivote son conocidos y queremos
definir cuales queremos que aparezcan, en este caso usaremos la cláusula IN, en ella se
ponen entre paréntesis todos los posibles valores, o por lo menos los que queremos que
aparezcan en el resultado. Por ejemplo sólo nos interesan los meses de febrero y junio:

Página 19 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL

TRANSFORM COUNT(*)
SELECT NroCliente AS Cliente
FROM Pedidos
GROUP BY NroCliente
PIVOT MONTH(FechaPed) IN (2,6)

Si no utilizamos la cláusula IN, los meses de abril, mayo, agosto, septiembre, octubre,
noviembre y diciembre no aparecen ya que no hay pedidos realizados durante estos meses,
si utilizamos la cláusula IN y definimos los doces valores posibles, sí aparecen los campos
correspondientes a estos meses y podemos observar que ningún cliente tiene pedidos en
esos meses:

TRANSFORM COUNT(*)
SELECT NroCliente AS Cliente
FROM Pedidos
GROUP BY NroCliente
PIVOT MONTH(FechaPed) IN (1,2,3,4,5,6,7,8,9,10,11,12)

Los campos fijos son los que aparecen delante de los campos dinámicos y son fijos porque
se genera un solo campo en el resultado por cada campo que hayamos indicado en la lista
de campos fijos. Los campos fijos se indican en la lista de selección de la sentencia
SELECT, un campo fijo que siempre debemos incluir es el que sirve de encabezado de
registro para que podamos saber cada registro a qué valor de encabezado de registro
corresponde. Pero además podemos incluir otros campos por ejemplo campos de resumen
de cada registro, sin que se tenga en cuenta la agrupación por el campo pivote.

Por ejemplo queremos saber para cada cliente cuántos pedidos ha hecho en total:

TRANSFORM COUNT(*)
SELECT NroCliente AS Cliente, COUNT(*) as Total
FROM Pedidos
GROUP BY NroCliente
PIVOT MONTH(FechaPed)

Cliente Total 1 2 3 6 7
1 3 2 1
2 1 1
3 4 1 2 1
4 3 1 2
5 2 1 1

Página 20 de 20

También podría gustarte