Categorías: Todo - operadores - funciones - consultas - conjuntos

por Felipe Ramón hace 7 meses

59

SQL

El lenguaje SQL es fundamental para la gestión de bases de datos relacionales. Permite realizar diversas operaciones mediante sentencias y consultas que ayudan a manipular y recuperar datos.

SQL

REFERENCIAS

CampusMVP. (s.f.). Fundamentos de SQL: Operaciones con conjuntos. Recuperado de https://www.campusmvp.es/recursos/post/Fundamentos-de-SQL-Operaciones-con-conjuntos.aspx Código SQL. (s.f.). Lenguaje SQL Funciones de Agregacion SUM, AVG - CODIGO SQL. Recuperado de https://codigosql.com/sentencias/funciones-de-agregacion-sql/ Código SQL. (s.f.). Sentencias. Recuperado de https://codigosql.com/sentencias/ Código SQL. (s.f.). Ejemplos de consultas en SQL - Uso de JOIN. Recuperado de https://codigosql.com/ejemplos/ejemplos-de-sql-inner-join/ Código SQL. (s.f.). Funciones de agregación SQL. Recuperado de https://codigosql.com/sentencias/funciones-de-agregacion-sql/ IBM. (s.f.). Ejemplos de consultas de subselección. Recuperado de https://www.ibm.com/docs/es/db2woc?topic=subselect-examples-queries Microsoft Learn. (s.f.). Subconsultas (SQL Server). Recuperado de https://learn.microsoft.com/es-es/sql/relational-databases/performance/subqueries?view=sql-server-ver16 Quintana, G. (2014). Aprende SQL. Castelló de la Plana: Universitat Jaume I. Servei de Comunicació i Publicacions. (p12-23) Sánchez, J. (s.f.). SELECT y conjuntos en SQL 2016. Recuperado de https://jorgesanchez.net/manuales/sql/select-conjuntos-sql2016.html Silberschatz, A. (2006). Fundamentos de bases de datos (5a. ed.). Madrid: McGraw-Hill España. (p31-56) SQLBolt. (s.f.). Learn SQL. Recuperado de https://sqlbolt.com/lesson/introduction W3Schools. (s.f.). SQL Operators. Recuperado de https://www.w3schools.com/sql/sql_operators.asp

SQL

SENTECIAS BASICAS

Otras sentencias basicas:
TRUNCATE: Elimina todos los registros de una tabla.

Eliminar todos los registros de la tabla "clientes" TRUNCATE TABLE clientes;

DCL:«Lenguaje de Control de datos» Me permite otorgar permisos a uno o mas roles para determinadas tareas, así como el control de accesos a la base de datos.
- GRANT: Usado para otorgar privilegios de acceso de usuario a la base de datos. - REVOKE: Utilizado para retirar privilegios de acceso otorgados con el comando GRANT.

1. Otorgar el privilegio SELECT (lectura) en la tabla "clientes" a un usuario llamado "usuario1": GRANT SELECT ON clientes TO usuario1; 2. Otorgar los privilegios INSERT (inserción) y UPDATE (actualización) en la tabla "pedidos" a un rol llamado "rol_ventas": GRANT INSERT, UPDATE ON pedidos TO rol_ventas; 3. Revocar el privilegio SELECT en la tabla "clientes" de un usuario llamado "usuario1": REVOKE SELECT ON clientes FROM usuario1; 4. Revocar todos los privilegios en la tabla "pedidos" de un rol llamado "rol_ventas": REVOKE ALL PRIVILEGES ON pedidos FROM rol_ventas;

DML:«Lenguaje de Manipulación de Datos» Me permiten consultar, actualizar, insertar o eliminar los datos o registros de las tablas.
SELECT: Recupera datos de una tabla de base de datos. - INSERT: Inserta un tipo de dato en el atributo de una entidad o tabla de la base de datos. - UPDATE : Modifica registros existentes en una tabla. - DELETE : Elimina registros de una tabla.

1. Seleccionar todos los registros de la tabla "clientes": SELECT * FROM MiBaseDeDatos; 2. Seleccionar el nombre y el correo electrónico de todos los clientes cuyo nombre comience con "A": SELECT nombre, email FROM clientes WHERE nombre like 'A%'; 3. Insertar un nuevo cliente en la tabla "clientes": INSERT INTO clientes (id, nombre, email) values (1, 'Juan', 'juan@example.com'); 4. Actualizar el correo electrónico de un cliente específico en la tabla "clientes": UPDATE clientes SET email = 'nuevo_email@example.com' WHERE id = 1; 5. Eliminar un cliente de la tabla "clientes" por su ID: DELETE FROM clientes WHERE id = 1;

DDL:«Lenguaje de Definición de Datos» Son sentencias que nos permiten definir, alterar, modificar objetos dentro de mi base de datos.
- CREATE : Permite crear objetos dentro de la base de datos, los objetos que podemos crear los listamos a continuación: - Procedimientos almacenados - Tablas - Bases de datos - Desencadenadores - Funciones - Vistas, Índices entre otros. - ALTER: Modifica la estructura de una tabla u otro objeto. - DROP: Elimina una tabla, vista u otro objeto de la base de datos.

1. CREATE Creamos una nueva base de datos: CREATE DATABASE MiBaseDeDatos; Creamos una nueva tabla llamada "Clientes" en una base de datos existente: USE MiBaseDeDatos; CREATE TABLE clientes ( id INT PRIMARY KEY, nombre VARCHAR(50), email VARCHAR(100) ); Crear una nueva vista que muestre los nombres y correos electrónicos de los clientes: CREATE VIEW VistaClientes AS SELECT nombre, email FROM clientes; 2. ALTER Agregamos una columna "Teléfono" a la tabla "Clientes": ALTER TABLE clientes ADD teléfono VARCHAR(15); Modificar el tipo de datos de la columna "Email" en la tabla "Clientes": ALTER TABLE clientes ALTER COLUMN email NVARCHAR(150); 3. DROP Eliminamos la tabla "Clientes" de la base de datos: DROP TABLE clientes; Eliminamos la vista "VistaClientes": DROP VIEW VistaClientes; Eliminar la base de datos completa (ten en cuenta que esto eliminará todo en la base de datos): DROP DATABASE MiBaseDeDatos; - Eliminamos la columna "Teléfono" de la tabla "Clientes": ALTER TABLE clientes DROP COLUMN teléfono;

CONSULTAS A MULTIPLES TABLAS

Subconsultas
Una subconsulta es una consulta anidada dentro de otra consulta principal. La subconsulta se ejecuta primero y su resultado se utiliza en la consulta principal para obtener un resultado más específico

Ejemplo 1: Seleccionar el trabajo (JOB) y los salarios máximo y mínimo (SALARY) de cada grupo de filas con el mismo código de trabajo en la tabla EMPLOYEE SELECT JOB, MAX(SALARY), MIN(SALARY) FROM EMPLOYEE GROUP BY JOB; Ejemplo 2: Una las tablas EMP_ACT y EMPLOYEE, seleccione todas las columnas de la tabla EMP_ACT y añada el apellido del empleado (LASTNAME) de la tabla EMPLOYEE a cada fila del resultado. SELECT EMP_ACT.*, LASTNAME FROM EMP_ACT, EMPLOYEE WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO Ejemplo 3: Una las tablas EMPLOYEE y DEPARTMENT, seleccione el número del empleado (EMPNO), el apellido de empleado (LASTNAME), el número de departamento (WORKDEPT en la tabla EMPLOYEE y DEPTNO en la tabla DEPARTMENT) y el nombre de departamento (DEPTNAME) de todos los empleados que han nacido (BIRTHDATE) con anterioridad a 1955. SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME FROM EMPLOYEE, DEPARTMENT WHERE WORKDEPT = DEPTNO AND YEAR(BIRTHDATE) < 1955 Ejemplo 4: Seleccione el trabajo (JOB) y los salarios máximo y mínimo (SALARY) de cada grupo de filas con el mismo código de trabajo en la tabla EMPLOYEE, pero sólo para los grupos con más de una fila y con un salario máximo mayor o igual que 27000. SELECT JOB, MIN(SALARY), MAX(SALARY) FROM EMPLOYEE GROUP BY JOB HAVING COUNT(*) > 1 AND MAX(SALARY) >= 27000 Ejemplo 5: Seleccionar todas las filas de la tabla EMP_ACT para los empleados (EMPNO) del departamento (WORKDEPT) 'E11'. (Los números del departamento del empleado se muestran en la tabla EMPLOYEE.) SELECT * FROM EMP_ACT WHERE EMPNO IN (SELECT EMPNO FROM EMPLOYEE WHERE WORKDEPT = 'E11') Ejemplo 6: En la tabla EMPLOYEE, seleccione el número de departamento (WORKDEPT) y el salario (SALARY) máximo del departamento para todos los departamentos cuyo salario máximo sea menor que el salario medio de todos los empleados. SELECT WORKDEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE) La subconsulta de la cláusula HAVING sólo se ejecuta una sola vez en este ejemplo. Ejemplo 7: Utilizando la tabla EMPLOYEE, seleccione el número de departamento (WORKDEPT) y el salario (SALARY) máximo del departamento para todos los departamentos cuyo salario máximo sea menor que el salario medio de los demás departamentos. SELECT WORKDEPT, MAX(SALARY) FROM EMPLOYEE EMP_COR GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE WHERE NOT WORKDEPT = EMP_COR.WORKDEPT) A diferencia de lo que sucede en el Ejemplo 6, la subconsulta de la cláusula HAVING se ejecuta para cada grupo. Ejemplo 8: Determine el número de empleado y el salario de los representantes de ventas junto con el salario medio y cuenta punta de sus departamentos. Esta consulta primero debe crear una expresión de tabla anidada (DINFO) para obtener las columnas AVGSALARY y EMPCOUNT y la columna DEPTNO que se utiliza en la cláusula WHERE. SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY, DINFO.AVGSALARY, DINFO.EMPCOUNT FROM EMPLOYEE THIS_EMP, (SELECT OTHERS.WORKDEPT AS DEPTNO, AVG(OTHERS.SALARY) AS AVGSALARY, COUNT(*) AS EMPCOUNT FROM EMPLOYEE OTHERS GROUP BY OTHERS.WORKDEPT ) AS DINFO WHERE THIS_EMP.JOB = 'SALESREP' AND THIS_EMP.WORKDEPT = DINFO.DEPTNO La utilización de una expresión de tabla anidada para este caso ahorra los recursos de proceso que implica la creación de la vista DIFO como una vista normal. Durante la preparación de la sentencia, se evita el acceso al catálogo para la vista y, debido al contexto del resto de la consulta, la vista sólo considera las filas para el departamento de representantes de ventas. Ejemplo 9: Visualice el nivel de formación medio y el salario de 5 grupos de empleados al azar. Esta consulta necesita la utilización de una expresión de tabla anidada para establecer el valor aleatorio de cada empleado para que pueda utilizarse posteriormente en la cláusula GROUP BY. SELECT RANDID , AVG(EDLEVEL), AVG(SALARY) FROM ( SELECT EDLEVEL, SALARY, INTEGER(RAND()*5) AS RANDID FROM EMPLOYEE ) AS EMPRAND GROUP BY RANDID Ejemplo 10: Consultar la tabla EMP_ACT y devolver el número de los proyectos que tengan un empleado cuyo salario se encuentre entre los 10 más altos de todos los empleados. SELECT EMP_ACT.EMPNO,PROJNO FROM EMP_ACT WHERE EMP_ACT.EMPNO IN (SELECT EMPLOYEE.EMPNO FROM EMPLOYEE ORDER BY SALARY DESC FETCH FIRST 10 ROWS ONLY)

Subconsultas correlacionadas

Definición: Una subconsulta correlacionada es una subconsulta que depende de la consulta principal para obtener su resultado. La subconsulta se ejecuta una vez por cada fila de la consulta principal.

Ejemplo: Mostrar el nombre de los empleados donde la comisión sea mayor a la mitad del sueldo SELECT NOMBRE FROM EMPLEADO WHERE COMISION > SUELDO / 2;

OTROS EJEMPLOS DE SUBCONSULTAS CORRELACIONADAS - Subconsulta correlacionada en la cláusula WHERE SELECT columna1, columna2 FROM tabla1 WHERE columna3 = (SELECT columna3 FROM tabla2 WHERE tabla1.id = tabla2.id); Subconsulta correlacionada en la cláusula SELECT SELECT columna1, (SELECT COUNT(*) FROM tabla2 WHERE tabla1.id = tabla2.id) AS total FROM tabla1; Subconsulta correlacionada en la cláusula HAVING SELECT columna1, COUNT(*) AS total FROM tabla1 GROUP BY columna1 HAVING COUNT(*) > (SELECT AVG(total) FROM tabla2);

Las consultas a múltiples tablas se utilizan para combinar información de dos o más tablas relacionadas en una sola consulta.
INNER JOIN Establece la unión entre 2 tablas o conjunto de resultados, donde los valores sean exactos en ambas tablas.

Añada su texto

Paso 4

Resolver mediante Consultas

Detalle de cada una de las ventas (cuantos y que productos fueron registrados en cada venta) Consulta SQL:

ELECT VEN.FACTURAID AS FACTURA, PR.CODIGO AS CODIGO_PRODUCTO, PR.NOMBRE AS NOMBRE_PRODUCTO, DT.CANTIDAD AS CANTIDAD_PRODUCTO FROM VENTAS VEN INNER JOIN VENTAS_DETALLE DT ON (VEN.VentaID=DT.VentaID) INNER JOIN PRODUCTOS PR ON (DT.ProductoID=PR.ProductoID)

Para realizar esta consulta usamos 2 INNER JOIN, el primero para relacionar la tabla VENTAS con la tabla VENTAS_DETALLE al crear esta relación nos aseguramos que por cada factura de la tabla VENTAS exista la misma factura en la tabla VENTAS_DETALLE.

El segundo INNER JOIN lo usamos para relacionar la tabla PRODUCTOS con la tabla VENTAS_DETALLE con esto nos aseguramos que los productos que existan en la tabla VENTAS_DETALLE tienen que existir en mi tabla principal PRODUCTOS, debido a que en esta tabla guardo la toda la información de cada producto.

Total de las ventas diarias por cliente que está generando. Ordenadas por fecha. Mostrar (nombres, DNI, correo) del cliente.

SELECT VEN.FECHA AS FECHA, CLI.NOMBRE AS NOMBRE_CLIENTE, CLI.APELLIDO AS APELLIDO_CLIENTE, CLI.DNI AS DNI_CLIENTE, CLI.CORREO AS CORREO_CLIENTE, SUM(VEN.TOTAL) AS TOTAL_VENTAS FROM VENTAS VEN INNER JOIN CLIENTES CLI ON (VEN.ClienteID = CLI.ClienteID) GROUP BY VEN.Fecha, CLI.NOMBRE, CLI.APELLIDO, CLI.DNI, CLI.CORREO ORDER BY VEN.Fecha

Análisis

Revisando la consulta que hemos escrito nos damos cuenta que usamos la función de agrupación SUM() para obtener el total de las ventas, cuando usamos funciones de agrupación debemos usar en conjunto con la cláusula GROUP BY debido a que estamos agrupando un conjunto de resultados, y además los campos que van listados junto al GROUP BY son todos los campos que están fuera de la función SUM().

Para relacionar las VENTAS realizadas con cada CLIENTE hacemos uso del INNER JOIN, por medio del campo ID de la tabla CLIENTES y el campo ClienteID de la tabla VENTAS.

Paso 3

En segundo lugar nos piden «cuantos y que productos fueron registrados en cada venta», si bien es cierto que podríamos registrar los productos con sus características en la tabla (VENTAS_DETALLE) no sería lo más óptimo, lo ideal es separar cada objeto y relacionarlo a través de un campo. Así que tenemos que crear nuestra tercera tabla (PRODUCTOS).

*El campo (ID) de la tabla PRODUCTOS se convierte en el campo (ProductoID) en la tabla VENTAS_DETALLE para crear la relación entre las 2 tablas

Y por último nos piden saber «a que cliente le vendimos en cada venta» , así que creamos nuestra última tabla (CLIENTES). *El campo (ID) de la tabla CLIENTES se convierte en el campo (ClienteID) en la tabla VENTAS para crear la relación entre las 2 tablas

Paso 2

¿Cómo podemos identificar las 4 tablas?

En primer lugar, porque en el ejercicio nos están pidiendo «registrar la ventas», así que para poder guardar las ventas necesitamos crear nuestra primera tabla (VENTAS).

Adicional a eso nos piden registrar el detalle de cada una de las ventas, muy bien, para registrar el detalle de la ventas debemos crear nuestra segunda tabla (VENTAS_DETALLE), además tenemos que identificar que debemos crear nuestra primera relación entre la tabla VENTAS y VENTAS_DETALLE a través del uso de clave primaria y foránea.

Ejemplo:

De los CLIENTES debemos registrar: Nombres y Apellidos Documento de identidad Correo

De las VENTAS debemos registrar: Al cliente que se le ha hecho la venta Fecha de la venta Cuantas unidades y cuales productos hemos vendido

Paso 1: Análisis Al leer el ejercicio y lo que nos están pidiendo nos damos cuenta que podemos identificar 4 tablas:

CLIENTES PRODUCTOS VENTAS VENTAS_DETALLE

De los PRODUCTOS tenemos que registrar: Código Nombre Descripción Valor de descuento

aaAsdds

¿Qué es?

Es un lenguaje estándar para almacenar, manipular y recuperar datos en bases de datos.
Es un lenguaje de consulta estructurado, que permite consultar, manipular y transformar datos de una base de datos relacional.

Debido a su simplicidad, las bases de datos SQL brindan almacenamiento seguro y escalable para millones de sitios web y aplicaciones móviles.

Existen muchas bases de datos SQL populares, incluidas SQLite, MySQL, Postgres, Oracle y Microsoft SQL Server. Todos ellos admiten el estándar de lenguaje SQL común

FUNCIONES

Funciones de Agregación
Dentro del lenguaje SQL existen muchas funciones que me permiten obtener diferentes resultados en base a las necesidades que tengamos

Estas funciones permiten realizar cálculos u operaciones sobre los registros de una tabla y sobre una o varias columnas.

AVG( ): Esta función me devuelve el valor promedio de la expresión a evaluar, hay que tener en cuenta que dicha expresión debe ser numérica, en caso contrario la consulta me devolverá un mensaje de error.

SELECT AVG(edad) AS EdadPromedio FROM usuarios;

MAX( ): Esta función me permite obtener el máximo valor de una expresión a evaluar

SELECT MAX(precio) AS PrecioMaximo FROM productos

COUNT( ): Cuenta el número de registros o valores no nulos de una columna.

SELECT COUNT(*) AS TotalRegistros FROM tabla;

MIN( ): Esta función me permite obtener el mínimo valor de una expresión a evaluar.

SELECT MIN(precio) AS PrecioMinimo FROM productos;

SUM( ): Esta funcion me devuelve la suma de todos los valores especificados en la expresión, así mismo solo debe usarse con expresiones numéricas, caso contrario nos retornará un mensaje de error en la consulta.

SELECT SUM(ventas) AS TotalVentas FROM productos;

GROUP BY: Cuando hacemos una consulta con varias columnas y usamos funciones de agregación SQL, usamos la sentencia GROUP BY para poder recuperar el resultado de la consulta. Dentro de la sintaxis GROUP BY van a ir todas las columnas que no sean funciones de agregación SQL.

SELECT categoria, COUNT(*) AS TotalProductos FROM productos GROUP BY categoria;

OPERADORES

OPERADORES ARITMETICOS SQL
Operador Descripcion + Añadir - Restar * Multiplicar / Dividir % Modulo

OPERADORES SQL BIT A BIT Operador Descripcion

& Bitwise AND | Bitwise OR ^ Bitwise exclusive OR

OPERADORES COMPUESTOS SQL

Operador Descripcion += Add equals -= Subtract equals *= Multiply equals /= Divide equals %= Modulo equals &= Bitwise AND equals ^-= Bitwise exclusive equals |*= Bitwise OR equals

Operadores Comparación

Operador Description = Equal to > Greater than < Less than >= Greater than or equal to <= Less than or equal to <> Not equal to

OPERADORES DE COMPARACION

OPERADORES LOGICOS SQL Operador Descripcion ALL TRUE if all of the subquery values meet the condition AND TRUE if all the conditions separated by AND is TRUE ANY TRUE if any of the subquery values meet the condition BETWEEN TRUE if the operand is within the range of comparisons EXISTS TRUE if the subquery returns one or more records IN TRUE if the operand is equal to one of a list of expressions LIKE TRUE if the operand matches a pattern NOT Displays a record if the condition(s) is NOT TRUE OR TRUE if any of the conditions separated by OR is TRUE SOME TRUE if any of the subquery values meet the condition

OPERACIONES SOBRE CONJUNTOS
Estas consultas utilizan al menos dos SELECT cuyos resultados que se pueden combinar para formar una única consulta.

Se basan en los operadores matemáticos de conjuntos (unión, intersección y diferencia).

UNION

Combina los resultados de dos consultas en un solo conjunto, eliminando las filas duplicadas. Las columnas devueltas en ambas consultas deben coincidir en número y tipo de columnas

El operador UNION une los resultados de varios SELECT. Pero si hay datos duplicados en ellos, elimina los mismos.

EJEMPLO 2: SELECT nif, nombre,apellido1,apellido2 FROM clientes UNION SELECT nif, nombre,apellido1,apellido2 FROM socios;

EJEMPLO 1: SELECT nombre FROM provincias UNION SELECT nombre FROM comunidades

EXCEPT (o MINUS)

Con MINUS también se combinan dos consultas SELECT de forma que aparecerán los registros del primer SELECT que no estén presentes en el segundo.

EjEMPLO 2 CON EXCEPT: SELECT nombre FROM personas EXCEPT SELECT nombre FROM empleados;

EJEMPLO 1: ; tipos y modelos de piezas que se encuentren el almacén 1 y no en el 2

SELECT tipo,modelo FROM existencias WHERE n_almacen=1 MINUS SELECT tipo,modelo FROM existencias WHERE n_almacen=2;

Intersect

De la misma forma, la palabra INTERSECT permite unir dos consultas SELECT de modo que el resultado serán las filas que estén presentes en ambas consultas.

EJEMPLO: tipos y modelos de piezas que se encuentren sólo en los almacenes 1 y 2:

SELECT tipo,modelo FROM existencias WHERE n_almacen=1 INTERSECT SELECT tipo,modelo FROM existencias WHERE n_almacen=2