Seguidores

MIS WEBS



SQL

APUNTES SQL
Mi logo para representar pagina sql

APUNTES SQL Y BBDD

INDICE

¿Qué es una Base de datos (BBDD)?

Es un almacén donde podremos guardar una colección de datos de una forma ordenada y estructurada, para posterior mente extraerlos y poderlos tratar en función de nuestras necesidades. Los datos se organizaran en filas y columnas. Un conjunto de filas y columnas forman una tabla y una BBDD se compone de una o varias tablas que pueden estar relacionadas entre sí o no. Para muchos lenguajes de programación una BBDD es un objeto al que podemos conectarnos y una vez hemos generado ese puente manipular los datos con SQL.



Para guardar nuestros datos podríamos utilizar un Excel, Word o incluso el block de notas. Pero esto nos podría acarrear múltiples problemas:

  1. Seguridad: nuestro archivo queda al alcance de cualquiera para copiarlo o borrarlo.
  2. Tamaño: Cuando nuestros archivos crezcan se ralentizaran
  3. Redundancia: Si no existen reglas repetiremos registros.
  4. Análisis: Sera difícil de analizar nuestros datos.


En una BBDD podrá trabajar mucha gente al mismo tiempo, pero el administrador podrá tener un registro de los usuarios y decidir en todo momento:

  1. Quien puede leer los datos
  2. Quien puede borrarlos
  3. Quien puede editarlos
  4. Quien puede crear registros

Una BBDD es un conjunto de reglas que establecemos dependiendo de nuestras necesidades y es muy importante que nos paremos a analizar cuáles son.

¿Qué es SQL?

Las siglas SQL provienen del inglés Structure Query Language que podemos traducir como lenguaje de consulta estructurada. Es un lenguaje declarativo, lanzaremos una sentencia y el SGDB nos regresa un resultado.

Ejm. “Selecciona todos los campos de la tabla cliente donde la campo población sea = a Madrid”

Fue inventado por IBM y en una primera instancia lo llamó SEQUEL pero al final quedo tal y como lo conocemos ahora.

Este lenguaje universal lo utilizaremos para almacenar, modificar y recuperar los registros de nuestras BBDD en remoto. SQL es utilizado por otros lenguajes como HTML, Java, VBA, nativo, Python, .NET, MySQL… para tratamiento y gestión de datos.

¿Qué es un SGDB?

Es un sistema gestor de Bases de datos y existen una gran multitud (Access, SQLServer, ORACLE, MySQL, DB2, MongoDB, PostGreSQL…) Nosotros realizaremos solicitudes con SQL a ese gestor y nos regresará el resultado nuestra consulta.

¿Cómo diseñar una BBDD?

Lo primero necesitaremos crear un esquema en que pongamos las tablas y los campos de estas. A pesar de que una vez creada la BBDD se puede modificar, estos cambios pueden conllevar muchos problemas luego. Es importante que planifiquemos este diseño con tiempo.

Nos tendremos que preguntar:

¿Para qué sirve nuestra BBDD?

Tiene que ser una definición de la utilidad que le daremos, ejm: “Gestionara un registro de clientes y pedidos de nuestra empresa, teniendo en cuenta el estado de pagos y entrega de estos, personal implicado y productos entregados”

Entidades

Una BBDD se compone de tablas y cada tabla será un objeto u entidad de nuestra BBDD. (Cliente, Pedido, Producto, Departamento, Empleado….).

Clave primaria

Es conveniente poner un id a cada tabla que será la primary Key o clave primaria. Sera un identificador único para cada registro. Normalmente suele ser un número autoincremental.

Clave primaria
Id_CLIENTE EMPRESA DIRECCIÓN POBLACIÓN TELÉFONO RESPONSABLE
CT01 BELTRÁN E HIJOS LAS FUENTES 78 MADRID (914) 45- 64- 35 ANGEL MARTÍNEZ

Clave compuesta

Es una clave que se compone de dos o más valores que identifican de forma única a una fila. Imaginemos que en su momento no se estableció un id_cliente porque se pensó que con el cif era suficiente, pero nos encontramos con dos empresas con el mismo cif. Nuestra clave compuesta valorará el cif y empresa.

Clave primaria
cif EMPRESA DIRECCIÓN POBLACIÓN TELÉFONO RESPONSABLE
B50505050 BELTRÁN E HIJOS LAS FUENTES 78 MADRID (914) 45- 64- 35 ANGEL MARTÍNEZ
B50505050 MANOLO E HIJOS LAS FUENTES 78 MADRID (914) 45- 64- 35 ANGEL MARTÍNEZ

RELACIÓN ENTRE LAS TABLAS

Las tablas pueden tener relación entre ellas: Una a varias, varias a varias, uno a uno.

  1. Unos a varias : Un cliente puede tener varios pedidos.
  2. Varios a varios: Un productos pueden tener varios pedidos y a su vez varios pedidos pueden tener el mismo producto.
  3. Uno a uno: Un cliente solo puede tener un DNI y un DNI solo puede pertenecer a un cliente.

NORMALIZACIÓN DE DATOS

Primera formal normal 1NF

Cuando creamos las tablas tenemos que evitar rellenar datos de forma incorrecta. Imagina que una empresa tiene varias direcciones, no deberíamos poner en el mimo registro dos direcciones.

CIF EMPRESA DIRECCIÓN POBLACIÓN TELÉFONO RESPONSABLE
B50505050 palomar SA LAS FUENTES 78 // su casa nº 23 madrid (914) 45- 64- 35 ANGEL MARTÍNEZ

Ni crear una columna para cada dirección

CIF EMPRESA DIRECCIÓN POBLACIÓN TELÉFONO RESPONSABLE dirección2
B50505050 palomar SA LAS FUENTES 78 madrid (914) 45- 64- 35 ANGEL MARTÍNEZ su casa nº 23

La solución sería crear una segunda tabla con las direcciones y generar una relación de uno a varias.

CIF dirección localidad
B50505050 palomar SA MADRID
B50505050 palomar SA MADRID

Segunda norma formal 2NF

Si mi BBDD tiene índices compuestos (la clave principal tiene más de un índice), cualquier campo no clave debería ser dependiente de toda la clave primaria.

En el siguiente ejemplo tenemos dos claves primarias curso y fecha. En la segunda forma normal nos dice que si tenemos índices compuestos no se puede repetir ningún otro dato y en nuestro caso el titulo curso se repetiría. La opción sería crear una tabla de Títulos cursos y una relación uno a varios.

curso fecha titulo curso AULA Nº ALUMNOS
SQL101 30/10/2012 FUNDAMENTOS SQL 1 20
DB202 01/05/2015 java 5 500
SQL101 01/10/2018 FUNDAMENTOS SQL 2500 300

Tercera forma normal 3NF

Ningún campo que no sea clave debe depender de otro campo. Es importante evitar redundancia. Imagina la siguiente tabla de pedidos. Tal y como puedes ver todos los campos cuyo impuesto sea iva el porcentaje será 21%, por lo que repetiremos un dato constantemente.

Id_articuloCantidadprecioTipo impuestoporcentaje
012010Iva 21%
021050Iva21%
03120Ips7%

En este caso creariamos una segunda tabla con dos campos (tipo impuesto y porcentaje). Luego relacionarimos la actual tabla por el tipo impuesto utilizando una relación de varios a uno.

Imagen de una relación de tablas para evitar concurrencia en las BBDD Sql

Concurrencia

En una BBdd se genera concurrencia cuando dos o más usuarios acceden al mismo registro a la vez y modifican datos. Uno de los mayores dilemas que nos encontramos al crear una base de datos es si bloqueamos o no los registros para evitar concurrencia.

Podemos evitar concurrencia de varias formas:

      Bloqueo pesimista

      Daremos por sentado que dos usuarios están accediendo al mismo registro y no permite grabar o actualizar hasta que no lo confirme.

      Bloqueo optimista

      Pensaremos que no existe otro usuario actuando sobre el registro y si el sistema encuentra otro usuario nos manda un mensaje de error y nos indica que carguemos los datos de nuevo.

Comandos SQL

Existen 4 grandes tipos de comandos

      DDL (data definition lenguage): Lo utilizaremos para crear y modificar la estructura de una BBDD. Podemos crear, eliminar y modificar la estructura.

        CREATE(crear)
        ALTER(alterar)
        DROP(eliminar objeto tabla, fila)
        TRUNCATE

      DML(data manipulation lenguage) Lo utilizamos para realizar consultas de selección y acción en una BBDD.

        SELECT(seleccionar)
        INSET(insertar registro)
        UPDATE(actualizar registro)
        DELETE(eliminar registro)

      DCL(data control lenguage) Para generar seguridad a los datos

        GRANT(Otorgar)
        REVOKE(revocar)

      TCL(Transition control lenguage) Se utiliza para la gestión de los cambios en los datos.

        COMMIT(Preparar)
        ROLLBACK(retroceder)
        SAVEPOINT(guardar registro)

Cláusulas SQL

Estas son las Cláusulas principales que tenemos en MySQL.

      WHERE:Especifica los criterios de selección (lo utilizamos para filtrar registros)

      GROUP BY:Agrupar registro por.

      HAVING:Sustituye al Where en las consultas de agrupado

      ORDER BY:Ordenar por

Operadores SQL

Operadores Utilidad
< Menor que
> Mayor que
= Igual que
<= Menor o igual que
>= mayor o igual que
Beetwen Entre ( Entre 12 y 50)
Like Cómo. Para comparar registros en los que se han utilizado caracteres comodín (*,?, %)
In En, lo utilizaremos para especificar registros en un campo
And Y lógico
Or O lógico
Not No es como
all Sub consultas de lista todos los registros
Any Sub consultas de lista alguno de los registros
% Se utiliza como el carácter comodín * de acces
_ o ¿ Sustituye una letra
CURRENT_USER() Nos regresa el usuario actual

¿Qué es una sentencia o instrucción en SQl?

Es una frase con una estructura determinada que utilizaremos para extraer una serie de datos almacenados en una BBDD. Para realizar esta frase utilizaremos una serie de comandos + las clausulas + Operadores + Funciones.

Lo mínimo imprescindible para crear una sentencia es un comando las columnas seleccionadas + una clausula + una tabla.

Orden de una instrucción SQl

comando --> Clausula From --> Cláusula Where --> Cláusula Group by --> Cláusula Having --> Cláusula OrderBy

Ver las BBDD de nuestro gestor

Esta instrucción nos regresará un listado con las BBDD existentes en nuestro gestor de bases de datos.

SHOW DATABASES;

Como crear una Base de Datos
CREATE DATABASE nombre_base;

Selecionar una BBDD

 USE nama_bbdd

Eliminar una BBDD

DROP DATABASE nombre_base ;
        

Como utilizar la cláusula Where

Selecciona todas las filas de la tabla materiales_construcción donde la categoría sea igual a Pintura. Recuerda que los campos tipo texto se ponen entrecomillados.

SELECT * 
FROM `materiales_construcción` 
WHERE  `categoría` = "pintura"
            

Ejemplo de OR

Selecciona todas las filas de la tabla materiales_construcción donde la categoría sea igual a Pintura o electricidad


SELECT * 
FROM `materiales_construcción` 
WHERE  `categoría` = "pintura"
OR  `categoría`   = "ELECTRICIDAD"
        

Si deseamos podemos sustituir el or por la siguiente expresión meteremos los diferentes valores entre paréntesis y los separaremos con comas.

SELECT * 
FROM 'clientes'
WHERE'población' IN ("MADRID", "BARCELONA");

Ejemplo de or y and

Ahora seleccionaremos los artículos de las categorías pintura y electricidad cuyo proveedor sea LEROY MERLIN ALJARAFE

SELECT * 
FROM 'materiales_construcción'
WHERE'categoría' IN ("pintura", "ELECTRICIDAD")
AND'PROVEEDOR' = "LEROY MERLIN ALJARAFE";

Ejemplo de BETWEEN (intervalos)

El operador between lo podemos utilizar para intervalos de fechas o números. Tener en cuenta que las fechas en SQL se estructuran de la siguiente forma mes/dia/año. Si esta consulta se hace con Access tener en cuenta que la fecha se pone #mes-día-año#.

En la siguiente consulta necesitamos saber cuáles son los materiales de la tabla materiales_construcción cuyo precio se comprende entre 9 y 15



SELECT *
FROM  `materiales_construcción` 
WHERE `PRECIO UNITARIO` BETWEEN 9 AND 15 

Intervalo fechas. Consulta para saber todos los registros de la tabla materiales comprendidos entre el 30-07-2018 y 15-08-2018. Recuerda formato fecha m/d/a

SELECT *
FROM  `materiales_construcción` 
WHERE `PRECIO UNITARIO` BETWEEN ‘01/01/2018’ AND ‘12/31/2018’     


Como ordenar registros en una consulta SQL con la cláusula Order By

Esta cláusula la utilizaremos para ordenar los registros obtenidos en una consulta. Por defecto nos lo ordenaría de la A hasta la Z o de menor a mayor. Si deseamos que nos lo ordene de forma descendente tendremos que añadir al final la instrucción DESC.

Podemos ordenar también una consulta por varios niveles ordenar por la fila1, cada grupo ordenado de la fila1 por la fila2….

Consulta para obtener los todos los registros de la categoría de pintura ordenada por el precio unitario:

SELECT *
FROM  `materiales_construcción`  
WHERE `categoría` =  "PINTURA"
ORDER BY `PRECIO UNITARIO` 

Consulta para obtener los todos los registros de la categoría de pintura ordenada por el precio unitario ordenados de forma descendente.

SELECT *
FROM  `materiales_construcción`  
WHERE `categoría` =  "PINTURA"
ORDER BY `MATERIAL` DESC

Consulta para obtener los artículos de la categoría pintura y electricidad ordenando de forma ascendente las categorías y cada categoría ordenada por precio unitario.

SELECT * 
FROM `materiales_construcción` 
WHERE  `categoría`
IN ("PINTURA", "ELECTRICIDAD" )
ORDER BY `categoría` , `PRECIO UNITARIO`
 

Que son las consultas de agrupación o totales

Son aquellas que utilizamos para realizar cálculos sobre una fila. Podemos sumar, contar, obtener la media. Para estos cálculos sobre los registros utilizaremos las funciones de agregado. Para realizarla necesitaremos un campo de agrupación u otro campo de cálculo. Su sintaxis sería la siguiente:


SELECT CAMPO_AGRUPACION,FUNCIÓN_AGREGADO (CAMPO_CALCULO)  
FROM `tabla_consulta` 
GROUP BY CAMPO_AGRUPACION 

¿Cuáles son las funciones de agregado más utilizadas?

FUNCIÓN USO
AVG Promedio
COUNT Contar
SUM Suma
MAX Valor máximo
MIN Valor mínimo
CURRENT_USER() Nos regresa el usuario actual de la aplicación
NOW() Fecha actual del sistema
CURDATE() Fecha actual del sistema en formato mm/dd/aaaa
CURRENT_DATE() Fecha actual del sistema en formato mm/dd/aaaa

Suma el precio unitario de los artículos comprados a cada proveedor y agrúpa los por proveedores.

SELECT `SECCIÓN`, SUM(`PRECIO`) 
FROM `productos` 
GROUP BY `SECCIÓN`
                

Cómo agregar un alias a un campo

Si deseamos ordenar un campo necesitamos renombrar el campo que nos facilita la consulta de totales y para ello y utilizaremos un alias. Para crear un alias pondremos la palabra clave AS

Cuenta los materiales comprados y el resultado lo pones en la fila nombrada como Cuenta_Proveedores_material.

SELECT `MATERIAL` , COUNT( `MATERIAL` ) AS Cuenta_Proveedores_material
FROM `materiales_construcción` 
GROUP BY `MATERIAL`
ORDER BY  Cuenta_Proveedores_material DESC 

En la siguiente consulta contaremos la fila de material a la fila del conteo la llamaremos Cuenta_Proveedores_material ordenaremos el resultado de mayor a menor y filtraremos por puntal 3m. Recuerda que en las consultas de agregado el where se sustituye por having.

SELECT  `MATERIAL` , COUNT( `MATERIAL` ) AS Cuenta_Proveedores_material
FROM `materiales_construcción` 
GROUP BY `MATERIAL` 
HAVING  `MATERIAL` = "puntal 3m"
ORDER BY Cuenta_Proveedores_material DESC 

Consultas de cálculo

Funcion Uso

¿Crear una consulta de cálculo?

En el siguiente ejemplo crearemos un campo que sume 1000 al precio unitario y lo llamaremos PRECIO MAS 1000 para lo que utilizaremos un alias.

    
SELECT 
'categoría', 
'material', 
`PRECIO UNITARIO`, 
`PRECIO UNITARIO` + 10000 AS 'PRECIO MAS 1000'
FROM  `materiales_construcción` 

En el siguiente ejemplo redondearemos el resultado del campo PRECIO MÁS 1000

SELECT 
categoría,
material, 
`PRECIO UNITARIO`,
 ROUND( `PRECIO UNITARIO` + 10000, 2 ) AS 'PRECIO MAS 1000'
FROM `materiales_construcción` 

En el siguiente ejemplo incrementaremos el precio del Iva a un producto y lo redondearemos con 2 decimales.

SELECT 
MATERIAL, `PRECIO UNITARIO` , 
ROUND( `PRECIO UNITARIO` * 1.21, 2 ) AS 'PRECIO CON IVA'
FROM  `materiales_construcción` 
    

DATE_FORMAT( nombre_campo, '%y-%m-%d' ):

La utilizaremos para dar formato a un campo fecha %y será año (year), %m será mes (month), %d será día (day).

Podemos poner mes y año.

DATE_FORMAT( NOMBRE_CAMPO , '%m-%y' )
    

Día y mes

DATE_FORMAT( NOMBRE_CAMPO , '%d-%m' )
    

En el siguiente ejemplo le daremos formato al campo creado con la fecha de hoy:

SELECT  CURDATE( )   AS hoy, `categoría` , `MATERIAL` 
FROM `materiales_construcción` 

CONCAT():

Esta función se utilizará para unir cadenas de texto.
SELECT 
categoría,
MATERIAL, 
CONCAT( `categoría` , " ", `MATERIAL` ) AS EJM_DE_CONCATENAR
FROM `materiales_construcción` 

count()

En este ejemplo vamos a seleccionar los 3 mejores vendedores, para ello le indicaremos en el order by desc limit 3:

    
SELECT
    id_Vendedor,
    Count(id_Vendedor)
FROM
    ventas_sin_aleatorios
GROUP BY
    id_Vendedor
ORDER BY
    Count(id_Vendedor) DESC LIMIT 3

CURDATE()

Si deseamos realizar un intervalo de la ultima semana , ultimo mes, ultimo trimestre:


SELECT
id_Vendedor,
Count(id_Vendedor)
FROM
ventas_sin_aleatorios
WHERE
fecha_Venta  BETWEEN  SUBDATE(CURDATE(), INTERVAL 3 DAY) AND NOW() 
GROUP BY
id_Vendedor
ORDER BY
Count(id_Vendedor) DESC
LIMIT 3

filtrar la ultima semana DISTINCT

Consulta de registros únicos

Utilizaremos la palabra reservada distinct para que no cargue múltiples registros, nos cargarán los registros sin repetir. Imagina que en la tabla id_producto existen mas de un movil, mas de una fibra... Con esta consulta nos cargara uno de cada tipo producto.


SELECT DISTINCT
id_producto
FROM
ventas_sin_aleatorios
    
Resultado
tv_en casa
movil alta gama
movil+fibra
movil
Tableta
fibra
tv_en casa + fibra
iot
juegos online
tv

Consultas de unión

Utilizaremos las consultas de unión cuando necesitamos incluir en una tabla los datos otras.
  • Unión Externa
    • Union
    • Union ALL
    • Except
    • Insetsect
    • Minus
  • Unión interna
    • Inner join
    • Left Join
    • Right Join

UNION

Nos permitirá unir varias tablas pero para poderlo hacer se tienen que cumplir una serie de condiciones:
  • Que ambas tablas tengan el mismo número de campos o columnas.
  • Los campos han de ser compatibles. No puede coincidir un campo de una tabla fecha con otro texto.
  • Los nombres de campos resultantes serán los de la primera tabla que indiquemos.
  • No podremos unir campos OLE.
  • La tabla resultante quitará los duplicados.

En el siguiente ejemplo uniremos dos campos texto de dos tablas diferentes. Seleccionáramos los campos de la primera tabla utilizaremos UNION y seleccionaremos los campos de la segunda tabla.


SELECT `SECCIÓN` , `NOMBRE ARTÍCULO` 
FROM `productos` 
UNION 
SELECT categoría, MATERIAL
FROM materiales_construcción


    

Union ALL

Hace lo mismo que unión pero incluyendo los duplicados genera una tabla con registros múltiples. En caso de duplicidad mostrara el de la primera tabla que le pongamos.
SELECT `SECCIÓN`, `NOMBRE ARTÍCULO` 
FROM `productos`	 
UNION ALL
SELECT categoría, MATERIAL
FROM materiales_construcción	

Inner join

Selecciona los registros comunes de las dos tablas. Relación de varios a varios

SINTAXIS INNER JOIN

SELECT FILAS 
FROM TABLA_1 
INNER JOIN TABLA_2 
ON TABLA_1.FILA_COMPARA = TABLA_2.[FILA_COMPARA];
					
Tabla1
Tabla2

Ejemplo de inner join

SELECT CLIENTES.*
FROM CLIENTES 
INNER JOIN PEDIDOS 
ON CLIENTES.CÓDIGOCLIENTE = PEDIDOS.[CÓDIGO CLIENTE];

Left join

Todos los registros de la primera tabla y solo aquellos de la segunda que sean comunes. Unos a varios
Tabla1
Tabla2
SELECT CLIENTES.*
FROM CLIENTES
 LEFT JOIN PEDIDOS 
ON CLIENTES.CÓDIGOCLIENTE = PEDIDOS.[CÓDIGO CLIENTE];
					
					

Right join

Todos los registros de la segunda tabla y solo aquellos que sean comunes de la primera tabla. Varios a uno.
Tabla1
Tabla2
SELECT CLIENTES.*, PEDIDOS.*, PEDIDOS.[FECHA DE PEDIDO]
FROM CLIENTES 
RIGHT JOIN PEDIDOS 
ON CLIENTES.CÓDIGOCLIENTE = PEDIDOS.[CÓDIGO CLIENTE]
WHERE (((PEDIDOS.[FECHA DE PEDIDO]) 
Between #1/1/2000# And #1/1/2018#));

SUB CONSULTAS

Es una consulta encapsulada dentro de otra consulta y existen de tres tipos:

  • Escalonada
  • De lista
  • Correlacionada
Select...
Select...

Para este tipo de consulta es frecuente utilizar los siguientes operadores:

Any
Para comparar con cualquiera de los registros

All
Para comparar con todos de los registros

In
Los registros son como. Se puede utilizar para filtro de coincidentes.

Not in
Los registros son como. Se puede utilizar para filtro de coincidentes.

Sub-consulta escalonada

La consulta hijo regresa un registro que compara con la consulta padre.

Ejm. Sacaremos la media de precios de los productos y seleccionaremos aquellos cuyo precio sea superior a la media

Primero sacaremos la media con AVG del campo precio


SELECT AVG( precio ) 
AS precio_medio
FROM `productosnuevos`    				
    			

Compararemos el resultado de la consulta hijo con la consulta padre

SELECT * 
FROM `productos` 
WHERE  `PRECIO` > ( SELECT  AVG( precio ) 
AS precio_medio
FROM `productosnuevos` );
 
    			

Si lo deseamos ordenar por sección:


SELECT * 
FROM `productos` 
WHERE `PRECIO` > ( 
SELECT AVG(  ) AS precio_medio
FROM `productosnuevos` 
ORDER BY  `SECCIÓN`) ;
    			

Sub-consulta de lista

Nuestra sub-consulta regresa una lista de campos.

EJM. Regresa todos los artículos cuyo precio sea superior a todos los de cerámica. Primero realizaremos una consulta para saber el precio de los artículos de cerámica.

SELECT `PRECIO`
 FROM `productos` 
 WHERE  `SECCIÓN` = "cerámica"
					

Ahora comparamos la consulta padre con la hija.

SELECT  * 
FROM `productos` 
WHERE  `PRECIO` > ALL 
( SELECT `PRECIO` FROM `productos` 
WHERE `SECCIÓN` = "cerámica")
ORDER BY  `SECCIÓN` DESC 

					

Ejm.

categoría todas las filas de la tabla productos nuevos cuyo precio sea mayor que cualquier registro de la tabla productos nuevos cuya sección empiece por deportes.

Regresamos el precio de los artículos de la tabla podructosnuevos cuya sección empiece por deportes… (deportes de riesgo, deportes , deportes de contacto…).

SELECT `PRECIO` 
FROM `productosnuevos`
 WHERE `SECCIÓN` LIKE ‘ALTA %’
					

Ahora unimos las dos consultas

SELECT * 
FROM  `productosnuevos` 
WHERE `PRECIO`
 > ALL 
 (SELECT `PRECIO` FROM `productosnuevos` WHERE  `SECCIÓN` LIKE 'DEPORTES%');

					

Sub-consulta correlacionada

Se utiliza para consultas entre tablas y utilizaremos los operadores in (consultas de coincidentes) NOT IN (consulta de no coincidentes).

Ejemplo 1

La tabla productos-pedidos contiene los siguientes campos

PRODUCTOS- PEDIDOS
NÚMERO DE PEDIDOCÓDIGO ARTÍCULO UNIDADES
1AR0111
2AR0410
3AR154
4AR2218

La tabla productos tiene lo siguiente

PRODUCTOS
CÓDIGOARTÍCULOSECCIÓNNOMBREARTÍCULOPRECIOFECHAIMPORTADOPAÍSDEORIGENFOTO
AR01FERRETERÍADESTORNILLADOR7 € 22/10/2000NoESPAÑA
AR02CONFECCIÓNTRAJE CABALLERO285 €11/03/2002ITALIA

Ahora nosotros necesitamos genera una consulta que nos regrese todos las filas de la tabla productos que en la tabla productos-pedidos sus artículos tengan menos de 15 unidades.

Para esto primero realizamos una sub consulta para conseguir los artículos de productos-pedidos con mayor de 15 unidades

SELECT [CÓDIGO ARTÍCULO] 
FROM [PRODUCTOS - PEDIDOS]
WHERE [UNIDADES] > 15
Consulta3
CÓDIGO ARTÍCULO
AR22
AR02
AR04
AR06
AR12
AR18
AR19

Ahora ingresamos la sub-consulta en la consulta principal mostrando todos los campos de la tabla productos cuyo CÓDIGOARTÍCULO coincidan con los obtenidos en la sub-consulta realizada sobre la tabla productos-pedidos


SELECT * 
FROM PRODUCTOS
WHERE [CÓDIGOARTÍCULO]
IN (
    SELECT [CÓDIGO ARTÍCULO]
    FROM [PRODUCTOS - PEDIDOS]
    WHERE [UNIDADES] >15
    )
;

             
Consulta3
CÓDIGOARTÍCULO SECCIÓN NOMBREARTÍCULO PRECIO FECHA IMPORTADO PAÍSDEORIGEN FOTO
AR02 CONFECCIÓN TRAJE CABALLERO 285 € 11/03/2002 ITALIA
AR04 DEPORTES RAQUETA TENIS 93 € 20/03/2000 USA
AR06 DEPORTES MANCUERNAS 60 € 13/09/2000 USA
AR10 JUGUETERÍA CONSOLA VIDEO 443 € 24/09/2002 USA

Si deseamos que nos muestre aquellos que no coincidan con la subconsulta creada, utilizaremos en lugar de in (esta en), el condicional not in (no está en)

SELECT * 
FROM PRODUCTOS
WHERE [CÓDIGOARTÍCULO] NOT IN 
(SELECT [CÓDIGO ARTÍCULO]FROM [PRODUCTOS - PEDIDOS]WHERE [UNIDADES] >15);

            
Consulta3
CÓDIGOARTÍCULOSECCIÓNNOMBREARTÍCULOPRECIOFECHAIMPORTADOPAÍSDEORIGENMADRID
AR01FERRETERÍADESTORNILLADOR7 €22/10/2000NoESPAÑAMADRID
AR03JUGUETERÍACOCHE TELEDIRIGIDO159 €26/05/2002MARRUECOSCACERES
AR07CONFECCIÓNSERRUCHO30 €23/03/2001FRANCIAOVIEDO
AR08JUGUETERÍACORREPASILLOS103 €11/04/2000JAPÓNMADRID
AR09CONFECCIÓNPANTALÓN SEÑORA174 €10/01/2020MARRUECOSGALICIA

Ejemplo 2

Vamos a realizar una consulta de aquellos clientes que no han pagado con tarjeta o que no han realizado pedidos. Para ellos utilizaremos la tabla de clientes y la tabla de pedidos.

TABLA CLIENTES
CÓDIGOCLIENTEEMPRESADIRECCIÓNPOBLACIONTELEFONORESPONSABLE
Cl01BELTRÁN E HIJOS LAS FUENTES 78BELTRÁN E HIJOS LAS FUENTES 78MADRID(914) 45- 64- 35 ANGEL MARTÍNEZ
Cl02LA MODERNALA PALOMA 123OVIEDO(985) 32- 34- 34 JUAN GARCÍA
Cl03EL ESPAÑOLITOMOTORES 34BARCELONA(934) 56- 53- 43ANA FERNÁNDEZ
Cl04EXPORTASAVALLECAS 34MADRID(913) 45- 23- 78ELVIRA GÓMEZ
Cl06CONFECCIONES AMPAROLOS MOROS 23GIJÓN(985) 75- 43- 32 LUÍS ÁLVAREZ
Tabla PEDIDOS
NÚMERO DE PEDIDOCÓDIGO CLIENTEFECHA DE PEDIDOFORMA DE PAGODESCUENTOENVIADO
1Cl0111/03/2000TARJETA2,00%
5Cl0518/03/2000APLAZADO6,00%No
8Cl2331/03/2000CONTADO9,00%No
10Cl2512/04/2000CONTADO7,00%No
90Cl0615/04/2000TARJETA2,00%
90Cl0721/04/2000CONTADO4,00%No
5Cl630/04/2000APLAZADO3,00%No

Primero seleccionaremos aquellos clientes cuya forma de pago ha sido tarjeta

SELECT [CÓDIGO CLIENTE] 
FROM PEDIDOS
WHERE [FORMA DE PAGO] = "TARJETA"
          
Resultado
id_cl
CL01
CL06

Ahora realizamos la consulta entera. Selecciona los campos Empresa y dirección de la tabla clientes que tengan pedidos pagados con tarjeta en la tabla de pedidos

SELECT [EMPRESA], CLIENTES.[DIRECCIÓN]
FROM CLIENTES
WHERE 
    CLIENTES.[CÓDIGOCLIENTE]
    IN (
        SELECT [CÓDIGO CLIENTE] 
        FROM PEDIDOS
        WHERE [FORMA DE PAGO] = "TARJETA"
     );

              
Consulta Tarjeta
EmpresaDirección
BELTRÁN E HIJOSLAS FUENTES 78
CONFECIONES AMPAROLOS MOROS 23

Si deseamos saber solo aquellos que realizaron los pagos sin tarjeta (no como) (efectivo, a debito….) en ese caso utilizaremos el not in

               
SELECT [EMPRESA], CLIENTES.[DIRECCIÓN]
FROM CLIENTES
WHERE CLIENTES.[CÓDIGOCLIENTE] 
    NOT IN (
        SELECT [CÓDIGO CLIENTE] 
        FROM PEDIDOS 
        WHERE [FORMA DE PAGO] = "TARJETA"
        )
    ;

           

CONSULTAS DE ACCIÓN

Las consultas de acción son aquellas capaces de modificar la información que tienen las tablas y pueden ser varias:

Comandos DML Y DDL

  • Create
  • Delete
  • Create Table
  • Update
  • Isert Into
  • Select into

Consulta actualización tablas

Actualizará nuestra tabla modificando un campo o una serie de campos según un criterio dado.

SINTAXIS

UPDATE NameTable 
SET 
    campo = newValue
WHERE 
    campo condición = condición
            

En el siguiente ejemplo incrementaremos 5€ todo los productos de la tabla productos cuya sección sea ferretería.

UPDATE PRODUCTOS 
SET PRECIO = PRECIO +5 
WHERE SECCIÓN = "FERRETERÍA";
        

En la siguiente consulta modificaremos los artículos de la sección alta costura y los renombraremos costura:

UPDATE productosnuevos 
SET `SECCIÓN` = "costura" 
WHERE `SECCIÓN` = "ALTA COSTURA"
        

En la siguiente consulta mysql actualizaremos aquellos registros de la tabla productosnuevos cuya sección contenga la palabra costura (costura nueva, alta costura, costura, costura de lana…) y renombraremos la sección a ALTA COSTURA

UPDATE `productosnuevos` 
SET `SECCIÓN` = "ALTA COSTURA" 
WHERE `SECCIÓN` like "%costura";
        

En la siguiente consulta mysql actualizaremos aquellos productos de la tabla productosnuevos cuya sección contenga la palabra costura y actualizaremos el campo sección transformándolo con el mismo valor e incluyéndole 2222 antes del registro actual. Utilizaremos la función concat para concatenar datos.

UPDATE productosnuevos 
SET 
  `SECCIÓN` = CONCAT( "2222", `SECCIÓN` )
WHERE
    `SECCIÓN`
   LIKE 
    "%COSTURA%"  
;
        

Consulta creación tabla create table

La utilizaremos para crear una tabla nueva con los datos obtenidos de una consulta.


            CREATE TABLE name_table 
            (
            fila1 varchar (30),
            fila2 varchar (50),
            fila3 int (),
            fila4 data ()
            );
        

Ver los campos que contine una tabla


            DESCRIBE nombre_tabla;
        

Insertar registros en una tabla ya existente con SQL


            INSERT INTO NOMBRE_TABLA (fila1, fila2, fila3) VALUES
            ("registrof1",  "registrof2",  "registrof3" ), 
            ("registro2f1", "registro2f2", "registro2f3"),
            ("registro3f1", "registro3f2", "registro3f3");

        
,

Eliminar fila de una tabla alter table

            ALTER TABLE name_table
                DROP name_file;
        

Insertar una fila en una tabla

            ALTER TABLE name_table
                ADD COLUMN name_file varchar(20);
        

SINTAXIS ACCES SQL SERVER

SELECT columna_selecionadas 
INTO nombre_tabla_nueva
FROM nombre_tabla_consulta 
WHERE filtros
            

SINTAXIS MYSQL

CREATE TABLE nombre_tabla_nueva 
SELECT columna_seleccionadas 
FROM nombre_tabla_consulta 
WHERE filtros
        

No hay comentarios:

Publicar un comentario

Buscar este blog

Sandisk y Western Digital