FEMEPA Partes del SQL El lenguaje SQL está compuesto de varios sub-lenguajes, entre los cuales destacan los tres siguientes: DML. Lenguaje de definición de datos. Todas las sentencias de manipulación de datos Extracción de información Actualización eliminación DDL. Manipulación de la información de la estructura: Crear y eliminar bases de datos y tablas. Definir columnas de una tabla y sus atributos Eliminar o crear índices, etc DCL.. Sentencias específicas para la seguridad de acceso a los datos: Gestión de usuarios Otorgamiento o denegación de los permisos necesarios para operar sobre cada elemento de la base de datos. 1
Lenguaje de definición de datos. Comandos DLL Estos comandos permiten crear y definir nuevas bases de datos, tablas, índices, procedimientos almacenados, vistas, funciones de usuario, etc. Los comandos que componen el DLL son: CREATE. Crea nuevas bases de datos, tablas, índices, SP, funciones de usuario, vistas, etc. ALTER. Permite modificar todos los objetos nombrados anteriormente. DROP. Utilizado para eliminar bases de datos, tablas, índices, etc. Lenguaje de control de datos. Comandos DCL Se utilizan para administrar la seguridad de las bases de datos. Se usan para asignar permisos sobre los objetos de la BD e instrucciones. Los comandos que componen el DCL son: GRANT. Usada para conceder a un usuario permiso sobre un objeto o una instrucción. DENY. Para denegar explícitamente un permiso sobre un objeto o una instrucción. Prevalece sobre cualquier otro permiso que el usuario haya heredado por su pertenencia a una función o grupo. REVOKE. Elimina toda entrada en la tabla de permisos (syspermissions) que le concediera o denegara a un usuario el acceso a un objeto o instrucción. REVOKE se usa para revertir una instrucción GRANT o DENY ejecutada previamente. 2
Lenguaje de control de datos. Comandos DCL Sintaxis para configurar permisos sobre un objeto GRANT permiso ON objeto TO usuario DENY permiso ON objeto TO usuario REVOKE permiso ON objeto TO usuario GRANT SELECT ON Categories TO usuario1 Sintaxis para configurar permisos sobre instrucciones GRANT instrucción TO usuario DENY instrucción TO usuario REVOKE instrucción TO usuario GRANT CREATE TABLE TO usuario1 Lenguaje de manipulación de datos. Comandos DML Estos comando permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos. Los comandos que componen el DML son: SELECT. Utilizado para consultar registros de la base de datos que satisfagan un criterio determinado. INSERT. Utilizado para cargar lotes de datos en la base de datos en una única operación.. UPDATE. Utilizado para modificar los valores de los campos y registros especificados. DELETE. Utilizado para eliminar registros de una tabla de una base de datos. 3
Cláusulas Las cláusulas son condiciones de modificación utilizadas para definir los datos que desea seleccionar o manipular. FROM. Utilizada para especificar la tabla de la cual se van a seleccionar los registros. TOP. Especifica cuantos registros debe devolver la consulta. DISTINCT. Distingue aquellos resultados que son idénticos mostrando solo uno de ellos. WHERE. Utilizada para especificar las condiciones que deben reunir los registros que se van a seleccionar. GROUP BY. Utilizada para separar los registros seleccionados en grupos específicos. HAVING. Utilizada para separar los registros seleccionados en grupos específicos. ORDER BY. Utilizada para ordenar los registros seleccionados de acuerdo con un orden específico. Operadores Lógicos AND. Es el "y" lógico. Evalúa dos condiciones y devuelve un valor de verdad sólo si ambas son ciertas. OR. Es el "o" lógico. Evalúa dos condiciones y devuelve un valor de verdadero si alguna de las dos es cierta. NOT. Negación lógica. Devuelve el valor contrario de la expresión. Operadores de comparación <. Menor que. >. Mayor que. <=. Menor o igual que. >=. Mayor o igual que. =. Igual que. BETWEEN. Utilizado para especificar un intervalo de valores. LIKE. Utilizado en la comparación de un modelo. IN. Determina si un valor dado coincide con algún valor de la subconsulta o lista. 4
La sintaxis básica de SELECT es: SELECT lista_columnas FROM tabla SELECT * FROM Shippers SELECT ShipperID, CompanyName FROM Shippers Uso de SELECT y SET para asignar valores a variables y luego mostrarlas DECLARE @nombre varchar(100), @SegundoNombre varchar(10), @apellido varchar(10) SET @nombre = Maria SELECT @SegundoNombre= Angélica, @apellido= Rojas SELECT @nombre, @segundonombre, @apellido Uso de DISTINCT para eliminar filas duplicadas en un conjunto de resultados SELECT Title FROM Employees SELECT DISTINCT Title FROM Employees ALIAS de columna Los alias de columna se pueden usar para cambiar los nombre predeterminados de las mismas. Cuando la columna es el resultado de un cálculo SQL no asigna nombre a la columna. En algunas ocasiones se repiten los nombres de las columnas (cuando utilizamos varias tablas en una misma consulta). SELECT productname + ( + quantiyperuni + ) AS Producto_con_cantidad, unitsinstock + unisonorder Unidades FROM Products 5
La Cláusula WHERE En la cláusula WHERE se pueden utilizar los operadores LIKE, NOT LIKE, IN, NOT IN, BETWEEN, NOT BETWEEN, <, <=, >, >=, =, <>. -- Devuelve todos los empleados cuyo apellido comienza por b SELECT lastname, firstname FROM Employees WHERE lastname LIKE b% -- Devuelve todos los empleados que no viven en Seattle, Redmond o Tacoma SELECT lastname, firstname, city FROM Employees WHERE city NOT IN ( Seattle, Redmond, Tacoma ) -- Devuelve todos los empleados que fueron contratados entre el 1/1/1993 y el 12/31/1993 SELECT lastname, firstname, hiredate FROM Employees WHERE hiredate BETWEEN 1/1/1993 AND 12/31/1993 -- Devuelve todos los empleados que viven en una ciudad distinta de Londres SELECT lastname, firstname, city FROM Employees WHERE city <> London La Cláusula WHERE Se pueden combinar muchas expresiones mediante los operadores lógicos AND y OR. -- Devuelve todos los empleados cuyo apellido comienza por b -- Y no viven en Seattle, Redmond o Tacoma SELECT lastname, firstname FROM WHERE lastname LIKE b% Employees AND city NOT IN ( Seattle, Redmond, Tacoma ) -- Devuelve todos los empleados que fueron contratados entre el 1/1/1993 y el 12/31/1993 -- O viven en una ciudad distinta de Londres SELECT lastname, firstname, hiredate FROM Employees WHERE hiredate BETWEEN 1/1/1993 AND 12/31/1993 OR city <> London 6
La Cláusula WHERE Uso de IS NULL y IS NOT NULL -- Obtiene la lista de los proveedores para los que le valor de la columna region no sea nulo SELECT companyname, contactname, region FROM Suppliers WHERE region IS NOT NULL -- Obtiene la lista de los proveedores para los que le valor de la columna region sea nulo SELECT companyname, contactname, region FROM Suppliers WHERE region IS NULL Funciones de Agregado Las funciones de agregado se usan dentro de una cláusula SELECT en grupos de registros para devolver un único valor que se aplica a un grupo de registros. AVG. Utilizada para calcular el promedio de los valores de un campo determinado. COUNT. Utilizada para devolver el número de registros de la selección. SUM. Utilizada para devolver la suma de todos los valores de un campo determinado. MAX. Utilizada para devolver el valor más alto de un campo especificado. MIN. Utilizada para devolver el valor más bajo de un campo especificado. 7
La Cláusula GROUP BY y las funciones de agregado -- Devuelve el promedio de la columna unitsinstock SELECT AVG (unitsinstock) FROM Products -- Devuelve la cantidad de filas de la tabla Employees SELECT COUNT(*) FROM Employees -- Devuelve el precio del producto más caro SELECT MAX(unitprice) FROM Products -- Devuelve la fecha de nacimiento del empleado de mayor edad SELECT MIN(birthdate) FROM Employees -- Devuelve la cantidad de productos en existencia SELECT SUM(unisinstock) FROM Products -- Devuelve cuantos títulos distintos hay en la tabla empleados SELECT COUNT(DISTINCT title) FROM Employees La Cláusula GROUP BY y las funciones de agregado Para agrupar las filas de un conjunto de resultados y generar una fila de resumen para cada grupo de datos se usa la cláusula GROUP BY -- Devuelve el promedio de la columna unitsinstock SELECT title, COUNT(*) FROM Employees -- Restringir los grupos generados or GROUP BY SELECT country, COUNT(*) FROM Customers WHERE country IN ( Spain, Venezuela ) GROUP BY country 8
La Cláusula HAVING Es similar a WHERE, con la diferencia que SQL Server evalúa HAVING después de generar los grupos y WHERE se evalúa antes de generarlos, por lo tanto no se puede hacer referencia a las funciones de agregación. -- Se obtiene la cantidad de clientes de aquellos países en los que tenemos más de cinco clientes. SELECT country AS País, COUNT(*) AS [Cantidad de Clientes] FROM Customers GROUP BY country HAVING COUNT(*) > 5 -- Combinación de condiciones en una cláusula HAVING. SELECT country AS País, COUNT(*) AS [Cantidad de Clientes] FROM Customers GROUP BY country HAVING COUNT(*) > 5 AND COUNT(*) < 10 La Cláusula ORDER BY La utilizamos para obtener el conjunto de resultados ordenado por la columna o columnas indicadas y en el orden indicado (el orden por defecto es ascendente). -- Nombre de la compañía y teléfono ordenados por el nombre de la compañía. SELECT companyname, phone FROM Shippers ORDER BY companyname -- Expresiones múltiples. SELECT lastname, firstname FROM Employees ORDER BY lastname ASC, firstname DESC La Cláusula TOP N Se utiliza para limitar los resultados de una consulta. -- Nombre de la compañía y teléfono ordenados por el nombre de la compañía. SELECT TOP 10 prductid, productname, unitprice FROM Products ORDER BY unitprice DESC 9
La instrucción SELECT...INTO SELECT INTO permite crear una tabla sobre la marcha y llenarla mediante una sola instrucción. -- Nombre de la compañía y teléfono ordenados por el nombre de la compañía. SELECT lastname, firstname INTO #tmp FROM Employees WHERE title = sales representative -- Uso de alias de columnas con SELECT INTO SELECT firstname + + lastname AS fullname, country INTO #EmployeeCountry FROM Employees ORDERY BY fullname SELECT * FROM #EmployeeCountry EL operador LIKE Determina si una cadena dada coincide o no con un determinado modelo. % _ [ ] [! ] Usado para indicar una cadena de cualquier longitud (0 o más) Representa cualquier carácter singular Se usa para buscar un carácter dentro de un intervalo o conjunto delimitado por corchetes. [a-z] [abc] Similar al anterior pero se busca un carácter que no esté dentro de cierto intervalo o conjunto 10
El operador LIKE SELECT lastname, firstname FROM Employees WHERE firstname LIKE a% SELECT lastname, firstname FROM Employees WHERE firstname LIKE _anet SELECT lastname, firstname FROM Employees WHERE firstname LIKE [js]% EL operador IN Este operador devuelve los registros cuyo campo indicado coincida con alguno de los valores de la lista. Sintaxis Ejemplo Expresión [NOT ] IN ( valor1, valor2, valor3...) SELECT * FROM Pedidos WHERE Ciudad IN ( Cozumel, Cancún, Playa ) 11
SELECT - Emparejamiento Con la sentencia SELECT podemos seleccionar de dos o más tablas SELECT columnas FROM tabla1, tabla2,... tablan OJO. La SELECT no tiene ni idea de cómo están relacionadas las tablas. Si le decimos que seleccione datos de dos tablas, combinará las dos tablas haciendo un producto cartesiano entre las dos. Por cada fila de la primera tabla se incluyen todas las filas de la segunda tabla. SELECT - Emparejamiento 12
SELECT - Emparejamiento Si existe una relación de 1 a N entre las tablas, lo que nos interesa es que, por cada fila de la tabla del lado N ( PIEZAS ) aparezca la fila relacionada en la tabla del lado 1 ( FABRICANTES ). Queremos que en el resultado sólo aparezcan las filas sombreadas cómo podemos hacer esto? SELECT - Emparejamiento SELECT * FROM Pieza, Fabricantes WHERE Piezas.Fabricante = Fabricantes.Codigo A esto se le llama la condición de emparejamiento de tablas Para hacer un emparejamiento de tablas no es necesario que haya una relación de 1 a N entre ellas. Sin embargo, el emparejamiento de tablas suele hacerse cuando queremos juntar dos o más tablas relacionadas. 13
SELECT - Emparejamiento Al hacer un emparejamiento de tablas, puede ocurrir que no queramos todas las columnas (SELECT *) sino solo unas cuantas de cada tabla. qué ocurre si en las dos tablas hay columnas que tienen el mismo nombre? Solución: Utilizamos prefijos. Antes del nombre de la columna ponemos el nombre de la tabla y un punto. Para que este trabajo no sea demasiado engorroso se pueden utilizar los alias (etiquetas) de tablas para abreviar el nombre de las mimas. SELECT - Emparejamiento 14
INNER JOIN - Emparejamiento Existe otra manera de realizar los emparejamiento. En lugar de utilizar una condición de emparejamiento podemos utilizar la cláusula INNER JOIN. SELECT columnas FROM tabla1 INNER JOIN tabla 2 ON condición_emparejamiento SELECT * FROM Piezas, Fabricantes WHERE Piezas.Fabricante = Fabricantes.Codigo SELECT * FROM Piezas INNER JOIN Fabricantes ON Piezas.Fabricante = Fabricantes.Codigo EQUIVALENTES INNER JOIN - Emparejamiento Existe otra manera de realizar los emparejamiento. En lugar de utilizar una condición de emparejamiento podemos utilizar la cláusula INNER JOIN. SELECT columnas FROM tabla1 INNER JOIN tabla 2 ON condición_emparejamiento SELECT * FROM Piezas, Fabricantes WHERE Piezas.Fabricante = Fabricantes.Codigo SELECT * FROM Piezas INNER JOIN Fabricantes ON Piezas.Fabricante = Fabricantes.Codigo EQUIVALENTES 15
OUTER JOIN - Emparejamiento Supongamos lo siguiente: OUTER JOIN - Emparejamiento Si juntamos las dos tablas de la siguiente manera: SELECT * FROM Piezas, Fabricantes WHERE Piezas.Fabricante = Fabricantes.Codigo El resultado será: dónde está la tuerca? 16
OUTER JOIN - Emparejamiento El registro de la tuerca no aparece porque no cumple la condición de emparejamiento (Fabricante es NULL). Qué hacemos si queremos que aparezcan todos los registros de una tabla, a pesar de que no cumplan la condición de emparejamiento? OUTER JOIN. SELECT columnas FROM tabla1 LEFT OUTER JOIN tabla 2 ON condición_emparejamiento SELECT columnas FROM tabla1 RIGHT OUTER JOIN tabla 2 ON condición_emparejamiento OUTER JOIN - Emparejamiento Si realizamos la siguiente consulta: SELECT * FROM Piezas LEFT OUTER JOIN Fabricantes ON Piezas.Fabricante = Fabricantes.Codigo El resultado será: 17
OUTER JOIN - Emparejamiento La consulta coge todas las filas de la tabla de la izquierda (Piezas) y las junta con la otra tabla. Por cada fila de la tabla izquierda: Si la fila cumple la condición de emparejamiento, las dos filas se juntan como si fuese una INNER JOIN. Si la fila no cumple la condición de emparejamiento, se ponen los datos de la fila correspondiente a la tabla de la izquierda y el resto de los datos se dejan a NULL. La RIGHT OUTER JOIN es igual, pero con la tabla de la derecha. También existe un FULL OUTER JOIN, que coge todas las filas de ambas tablas. OUTER JOIN - Emparejamiento Pueden abreviarse: LEFT OUTER JOIN -> LEFT JOIN RIGHT OUTER JOIN -> RIGHT JOIN FULL OUTER JOIN -> FULL JOIN 18