El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar...

10
1 Copyright © Computer Aided Education, S.A. El lenguaje SQL (I) 1. INTRODUCCIÓN E l lenguaje SQL es un lenguaje estándar para el acceso y manipulación de bases de datos relacionales como SQL Server. Esto quiere decir que aprender SQL es algo indispensable para cualquier programador o administrador de bases de datos, ya que se va a encontrar constantemente con la necesidad de consultar o modificar los datos almacenados. SQL Server no es una excepción, aunque dispone de una versión un poco personalizada del lenguaje SQL que acepta. Esta versión se conoce como T-SQL (Transact SQL) y en lo fundamental es compatible con el estándar ANSI SQL-92, que es el que se toma como referencia. Por lo tanto, si no se indica lo contrario, para los siguientes ejemplos será equivalente hablar de SQL que de T-SQL. Por otra parte, el lenguaje T-SQL no sólo nos va a permitir consultar o modificar los datos, sino que también es el lenguaje que podremos utilizar para crear bases de datos, tablas, etc. si no disponemos de una herramienta visual como SQL Server Management Studio. Por ello es tan importante conocerlo. Sin embargo, nosotros nos vamos a centrar en el estudio de T-SQL para realizar consultas, tanto de selección como de actualización. Además, con ello tendremos la oportunidad de comprobar que SQL Server utiliza los índices de las tablas cuando lo necesita. Realizaremos las consultas en el editor de SQL que nos ofrece SQL Server Management Studio. Para ello, haga clic con el botón derecho del ratón en la base de datos que quiera seleccionar del panel de la izquierda y elija Nueva consulta. Para que las consultas produzcan resultados, las tablas ya disponen de algunos datos de ejemplo. L a sentencia SELECT es la más importante del lenguaje SQL. Sirve para crear consultas de selección, es decir, consultas en las que extraemos resultados de la base de datos sin modificarla. La sentencia SELECT puede ser muy sencilla o llegar a ser realmente complicada. 2. LA SENTENCIA SELECT

Transcript of El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar...

Page 1: El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar todos los campos de la tabla o tablas que se indiquen en la cláusula FROM. Una vez

1Copyright © Computer Aided Education, S.A.

El lenguaje SQL (I)

1. INTRODUCCIÓN

El lenguaje SQL es un lenguaje estándar para el acceso y manipulación de bases de datos relacionales como SQL

Server.

Esto quiere decir que aprender SQL es algo indispensable para cualquier programador o administrador de bases de datos, ya que se va a encontrar constantemente con la necesidad de consultar o modificar los datos almacenados.

SQL Server no es una excepción, aunque dispone de una versión un poco personalizada del lenguaje SQL que acepta. Esta versión se conoce como T-SQL (Transact SQL) y en lo fundamental es compatible con el estándar ANSI SQL-92, que es el que se toma como referencia.

Por lo tanto, si no se indica lo contrario, para los siguientes ejemplos será equivalente hablar de SQL que de T-SQL.

Por otra parte, el lenguaje T-SQL no sólo nos va a permitir consultar o modificar los datos, sino que también es el lenguaje que podremos utilizar para crear bases de datos, tablas, etc. si no disponemos de una herramienta visual como SQL Server Management Studio.

Por ello es tan importante conocerlo. Sin embargo, nosotros nos vamos a centrar en el estudio de T-SQL para realizar consultas, tanto de selección como de actualización.

Además, con ello tendremos la oportunidad de comprobar que SQL Server utiliza los índices de las tablas cuando lo necesita.

Realizaremos las consultas en el editor de SQL que nos ofrece SQL Server Management Studio. Para ello, haga clic con el botón derecho del ratón en la base de datos que quiera seleccionar del panel de la izquierda y elija Nueva consulta.

Para que las consultas produzcan resultados, las tablas ya disponen de algunos datos de ejemplo.

La sentencia SELECT es la más importante del lenguaje SQL. Sirve para crear consultas de selección, es decir, consultas en

las que extraemos resultados de la base de datos sin modificarla.

La sentencia SELECT puede ser muy sencilla o llegar a ser realmente complicada.

2. LA SENTENCIA SELECT

Page 2: El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar todos los campos de la tabla o tablas que se indiquen en la cláusula FROM. Una vez

2

El lenguaje SQL (I)

Su objetivo es seleccionar registros de la base de datos que cumplan ciertos criterios. Por ejemplo:

Utilizando el asterisco (*) estamos indicando que queremos recuperar todos los campos de la tabla o tablas que se indiquen en la cláusula FROM.

Una vez escrita la consulta, pulse en el botón Ejecutar de la barra de herramientas del editor de código SQL y obtendrá el resultado de la misma.

La consulta se ejecuta contra la tabla Clientes, proporcionándonos todos los registros que en ella se almacenan con todos sus detalles. Este conjunto de datos se muestra en el panel Resultados de la parte inferior derecha de la ventana.

Normalmente no se desea extraer toda la información de la base de datos, sino sólo algunos campos. Para ello, lo que tiene que hacer es indicar la lista de campos tras la palabra SELECT:

Además, podemos utilizar la cláusula WHERE para establecer los criterios de selección.

Si el nombre del campo

o expresión que utiliza

en el código SQL incluye espacios en

blanco, enton-ces enciérrelo

entre corchetes [ ] o comillas

dobles. En otro caso, esto no es necesario,

pero tampoco es incorrecto.

SELECT *FROM Clientes

SELECT Idcliente, Nombre, TelefonoFROM Clientes

Page 3: El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar todos los campos de la tabla o tablas que se indiquen en la cláusula FROM. Una vez

3Copyright © Computer Aided Education, S.A.

El lenguaje SQL (I)

Por ejemplo, nos gustaría obtener sólo los clientes de la provincia de Valencia...

En esta consulta vemos las tres partes fundamentales:

En la cláusula SELECT se indica el conjunto de campos que queremos extraer.

En la cláusula FROM se indica sobre qué tablas actuará la consulta.

En la cláusula WHERE establecemos los criterios de selección.

Observe cómo se utilizan las comillas simples (') para indicar una cadena de texto. Además, en función de la intercalación utilizada, se distinguirá entre mayúsculas/minúsculas o letras acentuadas.

Por otra parte, si trabaja con cadenas Unicode, recuerde la necesidad de anteponer una N mayúscula a la propia cadena, como N'Valencia'.

En ocasiones, la información que deseamos obtener proviene de más de una tabla. Por ejemplo, queremos conocer aquellos clientes que han comprado alguna vez en nuestra tienda.

Esto no es ni mucho menos descabellado, ya que podríamos tener información sobre clientes que todavía no han comprado, por ejemplo, conseguidos durante campañas promocionales.

Esta consulta es muy interesante, por varios detalles:

Primero: si utiliza más de una tabla en la consulta, es conveniente indicar el nombre de la tabla en la cláusula SELECT, sobre todo si existen campos que se llaman igual en más de una tabla implicada.

Puede escribir las sentencias

SQL con la combinación

de mayúsculas y minúsculas

que desee, aunque en

los ejem-plos siempre

aparecerán en mayúsculas.

SELECT Idcliente, Nombre, TelefonoFROM ClientesWHERE Provincia = 'Valencia'

SELECT Clientes.IdCliente, Clientes.Nombre, Clientes.EmailFROM Clientes, OrdenesWHERE Clientes.IdCliente = Ordenes.IdCliente

Page 4: El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar todos los campos de la tabla o tablas que se indiquen en la cláusula FROM. Una vez

4

El lenguaje SQL (I)

Por ello hemos escrito Clientes.IdCliente para especificar que queremos la información desde la tabla Clientes y no desde la tabla Ordenes, donde también hay un campo que se llama igual.

Si los nombres de las tablas son complejos o muy largos, lo mejor es utilizar alias:

De esta forma estamos indicando que en lugar de escribir Clientes, utilizaremos el alias que consiste en una única c. Lo mismo referente a la tabla Ordenes, que se sustituirá por la letra o.

Segundo: todas las tablas implicadas en la consulta aparecen en la cláusula FROM separadas por comas. Aquí podemos definir los alias utilizados.

Tercero: en la cláusula WHERE se construye el criterio de selección. En este caso, elegimos aquellos registros de Clientes cuyo IdCliente está presente en la tabla Ordenes.

Fíjese que las tablas Clientes y Ordenes poseen un campo llamado IdCliente con el que se estableció una relación 1 a muchos.

Ahora conseguimos aquellos clientes que han realizado algún pedido. Además, pueden aparecen en más de una ocasión porque realmente han realizado más de un pedido.

Si utiliza alias, tiene que ha-cerlo siempre

en la consulta. Es decir, no

puede utilizar el nombre de la tabla unas

veces y el alias en otras.

SELECT c.IdCliente, c.Nombre, c.EmailFROM Clientes c, Ordenes oWHERE c.IdCliente = o.IdCliente

Page 5: El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar todos los campos de la tabla o tablas que se indiquen en la cláusula FROM. Una vez

5Copyright © Computer Aided Education, S.A.

El lenguaje SQL (I)

Podemos solucionar este detalle utilizando la palabra DISTINCT en la cláusula SELECT:

Ahora sólo aparecen una vez, por lo que la consulta es mucho más útil.

Vamos a complicar un poco la consulta, construyendo un criterio de selección más completo. Obtengamos aquellos clientes que han realizado pedidos por un valor superior a las 300 unidades monetarias.

Es conveniente encerrar entre paréntesis los distintos criterios de la cláusula WHERE.

Utilizando los operadores AND, OR, NOT y otros menos conocidos, podremos crear criterios complejos de selección que nos permitan obtener resultados interesantes.

Por ejemplo, podríamos enviar un bono promocional para comprar en la tienda a estos clientes por haber superado las 300 unidades monetarias en sus compras anteriores.

SELECT DISTINCT c.IdCliente, c.Nombre, c.EmailFROM Clientes c, Ordenes oWHERE c.IdCliente = o.IdCliente

SELECT DISTINCT c.IdCliente, c.Nombre, c.EmailFROM Clientes c, Ordenes oWHERE ((c.IdCliente = o.IdCliente) AND (o.Total > 300))

Page 6: El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar todos los campos de la tabla o tablas que se indiquen en la cláusula FROM. Una vez

6

El lenguaje SQL (I)

Continuamos construyendo consultas de selección conociendo otros operadores que podemos utilizar con la sentencia

SELECT.

Por ejemplo, vamos a consultar aquellos productos cuyo precio de venta esté entre 15 y 50 unidades monetarias.

En esta consulta utilizamos un operador nuevo: BETWEEN...AND.

Con este operador podemos seleccionar registros que cumplan que el valor de uno de sus campos se encuentre entre un valor y otro.

Adicionalmente, vemos la cláusula ORDER BY, que permite indicar cómo se ordenará el resultado. En este caso, indicamos que se ordene según el precio de venta del producto.

Este orden puede ser ascendente (por defecto) o descendente si indicamos la palabra DESC.

Compruebe que el precio está en el intervalo de valores indicado.

Otro operador interesante es LIKE. Con este operador podemos buscar cadenas de texto. Por ejemplo, nos interesan los clientes cuyo nombre empieza por E.

3. SELECCIONES COMPLEJAS

SELECT IdProducto, Nombre, PrecioFROM ProductosWHERE Precio BETWEEN 15 AND 50ORDER BY Precio

Si necesita que el resultado

de la consulta esté ordena-do según un

determina-do criterio,

utilice siempre la cláusula ORDER BY, ya que, en

otro caso, es SQL Server el que decide el orden en que

muestra las fi-las del resulta-

do y usted no puede conocer, de antemano,

cuál será.

Page 7: El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar todos los campos de la tabla o tablas que se indiquen en la cláusula FROM. Una vez

7Copyright © Computer Aided Education, S.A.

El lenguaje SQL (I)

Utilizamos el carácter de porcentaje (%) para indicar que después de la E puede aparecer cualquier conjunto de caracteres (incluso ninguno).

También se puede utilizar el carácter _ para especificar un único carácter en cierta posición. Por ejemplo, un criterio como LIKE 'o_a' devolvería valores como ola, osa, etc.

El operador IS NULL permite seleccionar registros que tengan campos nulos. A este respecto es muy importante recordar que el valor NULL es un valor indeterminado, por lo que no se puede comparar con ningún otro.

Por lo tanto, no debe utilizar el operador de igualdad para comparar un valor NULL sino el operador IS NULL.

Fíjese cómo en el resultado de la consulta todos los productos tienen el valor NULL en su campo Peso.

Con la consulta anterior, buscamos los productos de los que no disponemos su peso. Si lo que quisiéramos es justamente lo contrario, podríamos utilizar IS NOT NULL.

SELECT NombreFROM ClientesWHERE Nombre LIKE 'E%'

SELECT IdProducto, Nombre, PesoFROM ProductosWHERE Peso IS NULL

Page 8: El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar todos los campos de la tabla o tablas que se indiquen en la cláusula FROM. Una vez

8

El lenguaje SQL (I)

El lenguaje SQL proporciona una serie de funciones que podemos utilizar para realizar cálculos sobre la base de

datos.

Estas funciones se conocen como funciones agregadas, ya que lo que hacen es realizar alguna operación en una o más columnas sobre un conjunto de filas.

Las funciones agregadas de SQL son:

COUNT: obtiene el número de registros o filas que devuelve una consulta.

AVG: obtiene el valor medio de un conjunto de valores.

MAX: obtiene el valor máximo de un conjunto de valores.

MIN: obtiene el valor mínimo de un conjunto de valores.

SUM: obtiene la suma de un conjunto de valores.

Por ejemplo, podrá calcular el número de filas que devuelve una consulta, el máximo valor en una columna, la suma de determinadas filas, etc.

Veámoslo. Vamos a obtener el número de registros de la tabla Productos:

Cuando se utiliza una función agregada, es conveniente asociar un alias para el resultado de dicha función. Esto se consigue con la palabra AS seguida del nombre que desee dar al campo del resultado de la consulta.

Como en este caso, ese alias tiene espacios en blanco, se incluye dentro de corchetes.

Se nos indica que tenemos 21 registros en la tabla Productos. Observe que el nombre de la columna es el nombre que hemos establecido en el código SQL.

4. FUNCIONES AGREGADAS

SELECT COUNT(*) AS [Numero de Productos]FROM Productos

Page 9: El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar todos los campos de la tabla o tablas que se indiquen en la cláusula FROM. Una vez

9Copyright © Computer Aided Education, S.A.

El lenguaje SQL (I)

Las funciones agregadas son mucho más útiles cuando se puede agrupar el resultado obtenido.

Por ejemplo, podríamos desear conocer el número de veces que se ha vendido cada producto del catálogo de la tienda.

En este caso, el resultado debe ser un valor calculado a partir de una función agregada, pero agrupándolo por los distintos productos. Para agrupar resultados, se utiliza la cláusula GROUP BY.

Debe agrupar los resultados por cada uno de los campos indicados en la cláusula SELECT, excepto por los correspondientes al uso de las funciones agregadas.

En el resultado vemos que sólo aparecen los productos que han tenido ventas, ya que la cláusula WHERE determina este criterio de selección (que estén en la tabla LineasOrden). Para cada producto, obtenemos su nombre, precio y el número de ventas realizado hasta el momento.

También podemos aplicar criterios de selección a los grupos. Por ejemplo, si sólo le interesan aquellos productos vendidos en más de una ocasión, ¿dónde indica este criterio de selección?

No puede hacerlo en la cláusula WHERE, ya que esta cláusula sólo afecta a los registros sin agrupar.

SELECT p.Nombre, p.Precio, COUNT(l.IdProducto) AS VentasFROM Productos p, LineasOrden lWHERE p.IdProducto = l.IdProductoGROUP BY p.Nombre, p.Precio

Page 10: El lenguaje SQL (I)€¦ · Utilizando el asterisco (*) estamos indicando que queremos recuperar todos los campos de la tabla o tablas que se indiquen en la cláusula FROM. Una vez

10

El lenguaje SQL (I)

La cláusula HAVING actúa de la misma forma que WHERE, pero respecto de los valores ya agrupados.

Conociendo la existencia de las funciones agregadas, finalizamos esta lección, pero todavía nos queda por ver muchas cosas del lenguaje SQL.

SELECT p.Nombre, p.Precio, COUNT(l.IdProducto) AS VentasFROM Productos p, LineasOrden lWHERE p.IdProducto = l.IdProductoGROUP BY p.Nombre, p.PrecioHAVING COUNT(l.IdProducto) > 1