2022 SQL Para Mancos y Feeders Arismendy Polanco Valdez 3/26/2022 Contents Fundamentos de bases de datos 3 Que es una base de datos 3 Ventajas de las bases de datos 3 Desventajas de las bases de datos 4 Modelos de bases de datos 4 Sistema de gestión de bases de datos (SGBD) 4 Base de datos 5 Tabla 6 Registro y fila 6 Campo y columna 7 Tipo de datos 7 Llave primaria y Llave foránea 7 ¿Qué es SQL? 8 Lenguajes que componen a SQL 9 DDL (Data Definition Language). 9 TCL (Transaction Control Language). 9 DML (Data Manipulation Language). 10 DCL (Data Control Language). 10 Preparación del entorno de trabajo 11 MySQL y MariaDB 11 Modelo Cliente-Servidor 11 Instalación de XAMPP 12 Exportación e Importación de la base de datos 14 Recuperando Datos 18 Palabras reservadas y Clausuras 18 Búsqueda de los datos 18 Eliminar los resultados repetidos 20 Condicionando la búsqueda 21 Aritméticas y búsquedas avanzadas 25 Operadores aritméticos y operaciones matemáticas 25 Alias 25 Valores nulos 26 1 Uso de patrones en búsquedas 27 Ordenando los resultados de la búsqueda 29 Funciones de agregación 31 Agrupar resultados 32 Recuperar datos desde varias tablas 35 Operaciones con dos tablas o mas 35 Inner join 35 Left Join 38 Right Join 39 Cross Join 41 Natural Join 41 Alias en las tablas 42 Self Join 42 Join con más de dos tablas 43 Subquery 44 Unión 45 Manipulación de los datos 47 Insertar registros 47 Modificar registros 48 Eliminar registros 48 Bibliografía 49 2 1. Fundamentos de bases de datos Que es una base de datos Una base de datos es definida por muchos como una colección de elementos los cuales contienen información, estos pueden ser de diferente naturaleza pudiendo contarse entre estos los libros, fotos, récords escolares, etc. En informática una base de datos es una colección de datos relacionados entre sí, que forman una estructura lógica, esta estructura puede ser accedida y utilizada desde un software, aplicación móvil, sitio web u otro programa informático. Esta estructura no sólo contiene los datos en sí, sino la forma en la que se relacionan y se almacenan. Cada base de datos es diseñada con el objetivo de satisfacer las necesidades de administrar los datos de una institución, persona o empresa como pueden ser un banco, una universidad u otra institución, empresa o persona. Antes de los años 70 los sistemas informáticos utilizaban ficheros o archivos para gestionar los datos, esto presentaban algunas desventajas como son: ✔ Almacenar información de forma descentralizada. ✔ Redundancia de datos. ✔ Cada programa utiliza más de un fichero, lo que dificultaba el trabajo y mantener la información actualizada en todos los ficheros. ✔ Falta de independencia de los datos. ✔ Falta de protección de los datos. ✔ Etc. Ventajas de las bases de datos Utilizar bases de datos en los programas informáticos tiene sus ventajas y entre ellas podemos destacar las siguientes ✔ Independencia de los programas y procesos: Los datos son no dependen de los programas que acceden a ellos, sino que pueden ser modificados y generados sin necesidad de modificar el código del programa que los usa. ✔ Menos redundancia: Se reduce la repetición de datos innecesaria. ✔ Integridad de los datos: Se garantiza la coherencia de los datos, y su existencia en el sistema. ✔ Mayor seguridad en los datos: El acceso y los procesos realizados sobre los datos son limitados por usuarios y privilegios. ✔ Documentación de datos: Es posible realizar diagramas relacionales y tener diccionarios de datos. ✔ Fácil acceso a los datos: Al estar organizado es más fácil buscar en los datos. 3 ✔ Todo en un solo lugar: No es necesario lidiar con ficheros, ya que en una base de datos están todas las informaciones almacenadas. Desventajas de las bases de datos Ningún sistema, mecanismo o estructura es perfecta en sí misma, aunque podemos destacar que en cuanto a administrar datos e información las bases de datos son la elección perfecta hay que tener en cuenta ciertos factores como son: ● Costo de instalación. Dependiendo de la base de datos seleccionada, en ocasiones será necesario utilizar hardware costoso y pagar por licencias de sistemas operativos. ● Requiere Experto. Al ser un sistema y poseer un entorno y lenguaje es necesario de alguien que tenga los conocimientos necesarios para trabajar con ella. Modelos de bases de datos El modelo se refiere a cómo se almacenan los datos, como son organizados y cómo se acceden a estos. Existen diferentes modelos de bases de datos, no vamos a profundizar en ellos, sino que solo nos limitaremos a mencionarlos: ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ Bases de datos jerárquicas Base de datos de red Bases de datos transaccionales Bases de datos multidimensionales Bases de datos orientadas a objetos Bases de datos documentales Bases de datos deductivas Bases de datos Relacionales En este curso de SQL utilizaremos el modelo relacional. Este modelo está basado en el álgebra relacional y la teoría de conjuntos, fue originado en los años 70 por Edgar Frank Codd en los laboratorios IBM en California, para este modelo se creó el lenguaje estructurado de consultas SQL y se ha popularizado de manera que hoy en día la mayoría de los Sistemas de gestión de bases de datos lo utilizan. Sistema de gestión de bases de datos (SGBD) El SGBD es el software que permite al administrador de bases de datos gestionar las bases de datos, desde su creación, modificación, consulta a los datos, inserción entre otras tareas. Está dedicado a servir como interfaz entre la base de datos y el administrador de la base datos o usuarios y tiene como propósito manejar de manera clara, sencilla y ordenada un conjunto de datos que posteriormente se convertirán en información relevante para una organización. 4 Existen un sin número de SGBD en el mercado, unos gratuitos y otros de pagos, entre los cuales podemos listar los siguientes: Estos logos y nombre son marcas registradas Base de datos En un sistema de gestión de bases de datos pueden coexistir muchas bases de datos con diferentes nombres y fines, la una puede ser de un sitio web, otra de un sistema de contabilidad, otra de un punto de venta, etc. Sin embargo, cada una de estas se encuentra aislada de la otra de manera que los datos solo pueden ser accedido desde la base de datos seleccionada. Estas bases de datos están compuestas por tablas. En la siguiente imagen podemos ver el entorno de trabajo de phpMyAdmin y a la izquierda una columna que muestra la base de datos llamada librería con su conjunto de tablas que la componen. Base de datos Tablas que componen la base de datos 5 Tabla Una tabla representa la estructura lógica donde se almacenarán los datos, esta contiene las descripciones de los campos, su longitud y tipo de datos que pueden almacenar, las tablas están compuestas por columnas y el grupo de columnas forman registros. Cada tabla es identificada con un nombre único dentro del esquema y servirá como recipiente para almacenar los datos. Las relaciones son visualizadas como tablas donde la primera fila contiene los encabezados de cada columna. En la imagen de la derecha podemos visualizar la estructura de la tabla autores del esquema librería. En la imagen siguiente podemos visualizar una tabla que lleva como nombre clientes donde la información se presenta organizada en filas y columnas. Registro y fila Al conjunto de columnas se le conoce como registro y visualmente se representa como una fila, por lo tanto, al leer cualquiera de estos nombres, debemos entender que nos referimos a él mismo elemento. Las informaciones en las tablas se organizan en registros, cada registro contiene uno o más campos que contienen los valores de ese registro. Un registro podría ser los datos de un producto en específico en una tabla. Id 1 2 3 4 Descripción Auriculares Bocinas Bluetooth Mouse Inalámbrico Teclado Código El-011 El-101 EL-112 El-999 Precio 500.00 1500.00 650.00 150.00 Id, Descripción, Código y precio son las columnas, y al conjunto de columnas registrados componen la fila 6 Campo y columna El campo es la unidad mínima dentro de una tabla, que representa el espacio donde será almacenado o donde está almacenado un dato en específico. También es llamado columna. Id 1 2 3 4 Descripción Auriculares Bocinas Bluetooth Mouse Inalámbrico Teclado Código El-011 El-101 EL-112 El-999 Precio 500.00 1500.00 650.00 150.00 Descripción es la columna o campo y Bocinas Bluetooth es el valor almacenado Hay que tener en claro que, aunque las columnas se pueden tratar individuales siempre formaran parte de una fila. Tipo de datos Las bases de datos almacenan datos, los datos son tratado de forma independientes, y son almacenados dentro de las columnas, estas columnas definen la longitud del valor que recibirán, sin embargo, los datos también tienen tipos y es necesario conocer el tipo o naturaleza de los datos. En el estándar SQL existen diferentes tipos de datos, cada uno con un propósito específico. Los tipos de datos pueden ser agrupados en: Numéricos, caracteres y tiempo (fecha y horas). En el grupo de los numéricos podemos encontrar los siguientes: - Tinyint Smallint Mediumint Int - Bigint Float Double Decimal - Text Blob Enum Set Los caracteres están definidos por los: - Char Varchar Binary Varbinary Para las fechas y horas SQL provee de los siguientes tipos de datos: - Date Datetime Time - Timestamp Year Llave primaria y Llave foránea Una llave primaria es una columna única dentro de una tabla, esto quiere decir que ningún valor debe repetirse en ningún registro dentro de esta tabla, un ejemplo de esto sería la cédula la cual debe ser un valor único para cada persona ya que dos personas no deberían tener la misma cedula, de igual forma un campo definido como llave primaria no permite repeticiones de valores. 7 En el modelo relacional existen diferentes tipos de llaves, está la llave primaria, que identifica una columna como única y define a esta columna como el campo distintivo de cada fila, es utilizada para identificar cada registro de la tabla y también para relacional dos o más tablas y cuando una llave primaria de una tabla se encuentra presente en otra tabla se le conoce como llave foránea. En la siguiente imagen podemos ver como la columna id_pub se encuentra presente en las dos tablas, indicando en la tabla publicadores cuál es la llave primaria, pero en la tabla títulos es la llave foránea, la columna que vincula ambas tablas. ¿Qué es SQL? SQL es el acrónimo de structure languaje query, que en español se traduce como lenguaje estructurado de consultas, es el lenguaje más popular en el mundo de las bases de datos, y el más utilizado por su simpleza en el manejo de los datos. Fue diseñado para administrar, y recuperar información de sistemas de gestión de bases de datos relacionales. Una de sus principales características es el manejo del álgebra y el cálculo relacional para efectuar consultas con el fin de recuperar, de forma sencilla, información de bases de datos, así como realizar cambios en ellas. En 1970 E. F. Codd propone el modelo relacional y asociado a este un sublenguaje de acceso a los datos basado en el cálculo de predicados. Basándose en estas ideas, los laboratorios de IBM definieron el lenguaje SEQUEL (Structured English Query Language) que más tarde fue ampliamente implementado por el sistema de gestión de bases de datos (SGBD) experimental System R, desarrollado en 1977 también por IBM. Sin embargo, fue Oracle quien lo introdujo por primera vez en 1979 en un producto comercial. El SEQUEL terminó siendo el predecesor de SQL, que es una versión evolucionada del primero. SQL pasa a ser el lenguaje por excelencia de los diversos sistemas de gestión de bases de datos relacionales surgidos en los años siguientes y fue por fin estandarizado en 1986 por el ANSI, dando lugar a la primera versión estándar de este lenguaje, "SQL-86" o "SQL1". Al año siguiente este estándar es también adoptado por ISO. Sin embargo, este primer estándar no cubría todas las necesidades de los desarrolladores e incluía funcionalidades de definición de almacenamiento que se consideró suprimirlas. Así que, en 1992, se lanzó un nuevo estándar ampliado y revisado de SQL llamado "SQL-92" o "SQL2". 8 En la actualidad SQL es el estándar de facto de la inmensa mayoría de los SGBD comerciales. Y, aunque la diversidad de añadidos particulares que incluyen las distintas implementaciones comerciales del lenguaje es amplia, el soporte al estándar SQL-92 es general y muy amplio. Es un lenguaje declarativo de acceso a bases de datos relacionales que permiten diversos tipos de operaciones en ellas. Es un lenguaje que permite combinar la manipulación y la definición de los datos, así como también permite expresar diversas operaciones con los datos almacenados en las bases de datos relacionales. Lenguajes que componen a SQL SQL es un lenguaje muy amplio y está compuesto por sublenguajes los cuales tienen propósitos específicos dentro del SQL. Del SQL se derivan sublenguajes los cuales son utilizados para la manipulación, definición y control de la información o estructura de una base de datos relacional. Estos sublenguajes son: DDL (Data Definition Language). Es el sublenguaje que se encarga de la modificación de la estructura de los objetos de la base de datos. Incluye órdenes para modificar, borrar o definir tablas, vistas, base de datos, procedimientos almacenados, funciones o base de datos como tal. Estas sentencias son: ✔ ✔ ✔ ✔ create. alter. drop. truncate. TCL (Transaction Control Language). Es un subconjunto de SQL que se utiliza para controlar el procesamiento de transacciones en una base de datos. Una transacción es una unidad lógica de trabajo que comprende una o más sentencias SQL, por lo general son grupo de sentencias que se encuentran en el sublenguaje DML. Las sentencias que posee este sublenguaje son: ✔ commit ✔ rollback ✔ savepoint. DML (Data Manipulation Language). Es el que permite a los usuarios llevar a cabo las tareas de consulta o manipulación de datos, recoge todas las operaciones de intercambio de datos entre tablas. Las operaciones se dividen en 9 ✔ Consultas. (Recuperación de Información) ✔ Tratamiento de Datos (Insertar, Actualizar y Eliminar). Las sentencias utilizadas en este sublenguaje son. ✔ ✔ ✔ ✔ select insert. update. delete. DCL (Data Control Language). Es un sublenguaje que incluye una serie de comandos que permiten la administración del control de acceso de datos contenidos en la base de datos. Las sentencias incluidas en este sublenguaje son: ✔ grant. ✔ revoke. 10 2. Preparación del entorno de trabajo Para desarrollar este curso de SQL utilizaremos un entorno de trabajo llamado XAMPP (Apache, MariaDB o MySql, PHP y Perl), este entorno de trabajo está especialmente elaborado para programadores web especialmente en el lenguaje de programación PHP, sin embargo, posee herramientas que nos facilitaran poner en ejecución este curso con facilidad. MySQL y MariaDB MySQL es un SGBD que utiliza el modelo relacional, fue desarrollado por la empresa MySQL AB, en el 2008 MySQL AB fue adquirida por sun microsystem, sin embargo, MySql fue adquirida por Oracle Corporation cuando esta compró a sun microsystem en el 2010. Este SGBD es distribuido en varias versiones, una Community, distribuida bajo la Licencia pública general de GNU, versión 2, y también cuenta con versiones Enterprise, las cuales proveen de productos herramientas para mejorar la presentación y monitoreo de datos y también estas incluyen soporte técnico. MariaDB es un fork de MySql creado por Michael Widenius fundador de MySQL. Widenius decidió crear esta variante porque estaba convencido de que el único interés de Oracle en MySQL era eliminar la competencia que MySQL suponía para el mayor proveedor de bases de datos relacionales del mundo, que es Oracle Database. MySQL y MariaDB son utilizados por un gran número de sitios web populares, como lo es la Wikipedia, Google, Facebook, Twitter, Flickr y YouTube. Modelo Cliente-Servidor Servidor: es un equipo que pone a disposición de otros dispositivos denominados clientes uno o más servicios, algunos de estos servicios son file server (servidor de archivo), print server (servidor de impresión), web server (servidor web páginas web), database server (servidor de base de datos), entre otros servicios. Cliente: es aquel dispositivo que demanda o consume los servicios ofrecidos por el servidor, entre estos podemos mencionar un smartphone mediante el cual se accede a un sitio web, una computadora portátil la cual accede a una base de datos en la nube, y cualquier otro dispositivo el cual solicite datos a un servidor. Algunos ejemplos de aplicaciones computacionales que usen el modelo cliente-servidor son el Correo electrónico, un Servidor de impresión y la World Wide Web. MySql y MariaDB son SGBD basados en el modelo cliente – servidor. 11 Instalación de XAMPP Para instalar XAMPP en nuestro sistema necesitaremos un sistema operativo Windows preferiblemente 8.1 o superior, también puede ser instalado en Linux y Mac, aunque en este curso nos limitaremos a explicar cómo instalarlo en Windows. El primer paso es adquirir el instalador de XAMPP, esto lo podemos hacer accediendo a el sitio web oficial https://www.apachefriends.org/es/index.html, descargaremos la versión más reciente de XAMPP la 7.3.5 (esta es la última al momento de elaborar este material) y ejecutaremos el instalador, es fácil instalarlo solo hay que seguir los siguientes paso: 2 1 3 Nota: en el paso numero dos (2) solo es necesario marcar la casilla de apache y MySql, el resto no se utilizará en el este curso y por lo tanto no es necesario. Una vez instalado el entorno de trabajo XAMPP entonces iniciaremos el web server apache y el database server MySql, para lograr esto abriremos el panel de control de XAMPP, ubicado en el menú inicio -> todos los programas -> xampp -> xampp control panel o el icono de acceso directo creado en el escritorio de Windows. Una vez dentro del panel de control de xampp inicializaremos los dos servicios que utilizaremos durante este curso, apache y MySql, presionando los 12 botones start de cada uno, luego para trabajar con MySql presionamos el botón Admin el cual nos abrirá el navegador y entraremos en una interfaz llamada PhpMyAdmin. PhpMyAdmin será la interfaz que nos permitirá administrar a MySql y realizar todas las operaciones y prácticas de este curso en el SGBD MySQL. Exportación e Importación de la base de datos Como definimos anteriormente un SGDB puede albergar una o más bases de datos, en algunas ocasiones será necesario desarrollar la base de datos en un sistema o equipo, pero que luego esa base de datos será implementada en un servidor donde se pondrá a disposición de distintos clientes, en este caso es necesario realizar dos pasos importantes. 1. Exportación: consiste en empaquetar una base de datos existente en un archivo sql con la finalidad de migrar o implementar una base de datos en otro equipo el cual no es en el que se elaboró la base de datos. 2. Importación: este proceso es lo inverso a la exportación, y consiste en desempaquetar el archivo sql generado en la exportación, recreando la base de datos en el equipo de destino. Para exportar una base de datos primero la seleccionamos y luego presionamos el botón exportar tal como lo muestra la siguiente imagen: 13 2 1 Una vez presionado el botón continuar se descargará en nuestro equipo un archivo con el nombre de la base de datos y la extensión sql el cual utilizaremos para importar en otro equipo u otra instalación de MySql. El proceso de importación es igual de fácil solo debemos crear una base de datos nueva y luego presionar importar tal cual se muestra en las siguientes. 14 1 3 2 4 15 El siguiente y último paso consiste en seleccionar el archivo exportado de la base de datos el cual tiene extensión sql y presionar el botón continuar tal y como se muestra en la imagen x.x. 5 6 7 8 16 3. Recuperando Datos El lenguaje SQL es un lenguaje declarativo el cual utiliza palabras claves o también conocidas como palabras reservadas para formar una consulta y como ya mencionamos en la primera unidad es un lenguaje que está conformado por otros sublenguaje. En esta unidad iniciaremos trabajando con el sublenguaje DML e iniciaremos recuperando datos desde la base de datos. Palabras reservadas y Clausuras Las palabras reservadas, palabras claves o como las llamaría todo SGBD, clausuras, son aquellas palabras con las cuales formaremos las sentencia o instrucciones que queremos ejecutar en SQL, tales como insertar datos cuya clausura es INSERT, de igual forma si queremos eliminar algún registro la clausura es DELETE, sin embargo, una sentencia no solo está conformada por una sola clausura, sino que utilizaremos varias clausuras para formar una sentencia. Búsqueda de los datos Para buscar o recuperar datos desde la base de datos necesitaremos hacer uso de la instrucción SELECT, sin embargo, esta instrucción está conformada por varias clausuras, como son: SELECT: es donde se indican cuales columnas se desean mostrar en el resultado de la consulta ejecutada, por ejemplo, nombre, apellido, teléfono, etc. Sin embargo, existe un comodín para mostrar todas las columnas sin necesidad de escribir el nombre de todas las columnas, este comodín es el asterisco (*). FROM: en esta clausura se especifica desde cual tabla se quieren recuperar los datos, por ejemplo, tiendas, títulos, autores, etc. La sintaxis del SELECT es la siguiente: 1. SELECT columnas 2. FROM tabla Las columnas son separadas por comas (,) 1. SELECT columna_1, columna_2, ..., columna_n 2. FROM tabla Si se quieren recuperar todas las columnas se utiliza el asterisco (*) 1. SELECT * 2. FROM tabla Veamos algunos ejemplos. Se requiere un listado mostrando todas las columnas de las categorías que tengo en mi base de datos: 1. SELECT * 2. FROM categoria 17 IdCategoria 1 2 3 4 5 6 7 8 NombreCategoria Bebidas Condimentos Repostería Lácteos Granos/Cereales Carnes Frutas/Verduras Pescado/Marisco Descripcion Gaseosas, café, té, cervezas y maltas Salsas dulces y picantes, delicias, comida para un... Postres, dulces y pan dulce Quesos Pan, galletas, pasta y cereales Carnes preparadas Frutas secas y queso de soja Pescados, mariscos y algas Mostrar solo la columna nombre de las categorías 1. SELECT NombreCategoria 2. FROM categoria NombreCategoria Bebidas Condimentos Repostería Lácteos Granos/Cereales Carnes Frutas/Verduras Pescado/Marisco Desplegar un listado con la ciudad, código y el estado de los almacenes (tomar en cuenta que el orden mostrado en el resultado dependerá del orden en que se coloquen en la sentencia SELECT). 1. SELECT ciudad, codigo, estado 2. FROM almacenes ciudad codigo estado Seattle Seattle Portland Columbus Trenton Seattle Seattle Columbus al-01 al-02 al-03 al-04 al-05 al-06 al-07 al-08 WA WA OR OH NJ WA WA OH 18 Eliminar los resultados repetidos En algunas ocasiones obtendremos resultados que aparentemente se verán repetidos, decimos aparentemente porque la sentencia SELECT recupera las columnas de cada registro de la tabla especificada en el FROM, sin embargo, estos resultados pueden ser el mismo valor para cada uno y puede darse el caso que queramos excluir de los resultados esos valores repetidos, para eso necesitamos agregar una clausura a nuestra sentencia SELECT, la clausura DISTINCT. 1. SELECT DISTINCT campos 2. FROM tabla Veamos algunos ejemplos: Lista de los estados de la tabla tiendas. 1. SELECT estado 2. FROM almacenes estado WA WA OR OH NJ WA WA OH En el resultado podemos notar como se repite el mismo valor según se encuentre registrado en la base de datos. Para excluir los registros repetidos utilizaremos la siguiente sentencia: 1. SELECT DISTINCT estado 2. FROM almacenes estado WA OR OH NJ 19 Condicionando la búsqueda Cuando ejecutamos la sentencia SELECT el SGDB realizará una búsqueda en la tabla seleccionada y traerá como resultado todos los registros de esa tabla, esto no representaría ningún problema si la cantidad de registros fuesen pocos, pero por lo general una tabla no contiene pocos registros, sino que estos van en aumento según pasa el tiempo y según se vallan agregando más registros a la tabla, de manera que si quiero un registro en específico sería complicado buscar ese registro entre mil registros o peor aún entre millones de registros. Para dar solución a esta necesidad la sentencia SELECT provee de una clausura llama WHERE, donde WHERE se utiliza para condicionar los resultados de una búsqueda. La sintaxis de un SELECT con WHERE es la siguiente: 1. SELECT columnas 2. FROM tabla 3. WHERE condición Hay que destacar que una condición es una expresión lógica, es decir es necesario hacer uso de los operadores relacionales y operadores lógicos. Operador = > < >= <= != Between In Significado Igual que Mayor que Menor que Mayor o igual que Menor o igual que Diferente de Rango Valores que Coinciden en una Lista Observaciones: ▪ ▪ ▪ Los operadores <> y != son equivalentes. Cuando la expresión utilice valores de tipo texto es necesario encerrar el texto en comillas. La clausura BETWEEN es utilizada para especificar rangos incluyendo el inicio y el fin del rango Ejemplos: Encontrar los almacenes localizados en el estado Washington 1. SELECT codigo, ciudad, estado 2. FROM almacenes 3. WHERE estado = 'WA' 20 codigo ciudad estado al-01 al-02 al-06 al-07 Seattle Seattle Seattle Seattle WA WA WA WA Encuentre aquellos almacenes cuyos idAlmacen estén entre 2 y 5 1. SELECT * 2. FROM almacenes 3. WHERE idAlmacen BETWEEN 2 AND 5 id 2 3 4 5 codigo al-02 al-03 al-04 al-05 idEmpleadoEncargado 2 3 4 5 ciudad Seattle Portland Columbus Trenton estado WA OR OH NJ Encuentre los almacenes que estén en Ohio ('OH') y Washington ('WA') 1. SELECT codigo, idEmpleadoEncargado, ciudad, estado 2. FROM almacenes 3. WHERE estado in('WA','OH') id codigo idEmpleadoEncargado ciudad estado 1 2 4 6 7 8 al-01 al-02 al-04 al-06 al-07 al-08 1 2 4 6 7 8 Seattle Seattle Columbus Seattle Seattle Columbus WA WA OH WA WA OH Además de los operadores relacionales SQL provee de operadores lógicos los cuales permiten realizar condiciones más complejas, estos operadores son AND (y), OR (o) y NOT (no). El operador AND verifica que dos expresiones sean verdaderas, de ser así entonces la consulta traerá resultados. La siguiente tabla muestra el resultado que puede dar AND cuando sus expresiones evaluadas toman diferentes valores. Operador AND P Q P AND Q V V V V F F F V F F F F 21 Ejemplo de consulta con AND. Listar los productos que tienen un precio mayor a 13 y tienen existencia mayor a 50 1. SELECT NombreProducto, PrecioUnidad, UnidadesEnExistencia 2. FROM producto 3. WHERE PrecioUnidad > 13 4. AND UnidadesEnExistencia > 50 NombreProducto PrecioUnidad UnidadesEnExistencia 22 25 38 21 24 55 28.5 21.05 53 120 86 104 115 79 113 76 Especias Cajun del chef Anton Mermelada de grosellas de la abuela Queso Manchego La Pastora Pan de centeno crujiente estilo Gustaf's Paté chino Raclet de queso Courdavault Sirope de arce Salsa de pimiento picante de Luisiana El operador OR verifica que al menos una de dos expresiones sea verdadera, de ser así entonces la consulta traerá resultados. La siguiente tabla muestra el resultado que puede dar OR cuando sus expresiones evaluadas toman diferentes valores. Operador OR P Q P OR Q V V V V F V F V V F F F Hay que destacar que OR solo será falso cuando ambas expresiones sean falsas. Ejemplo de consulta con OR. 1. SELECT NombreProducto, IdCategoria, Suspendido 2. FROM producto 3. WHERE IdCategoria = 5 4. OR Suspendido = 1 NombreProducto Mezcla Gumbo del chef Anton Buey Mishi Kobe Cordero Alice Springs Pan de centeno crujiente estilo Gustaf's Pan fino Refresco Guaraná Fantástica Col fermentada Rössle Salchicha Thüringer Tallarines de Singapur IdCategoria 2 6 6 5 5 1 7 6 5 Suspendido 1 1 1 0 0 1 1 1 1 22 Cereales para Filo Empanada de carne Gnocchi de la abuela Alicia Raviolis Angelo Bollos de pan de Wimmer 5 6 5 5 5 0 1 0 0 0 EL operador NOT niega o invierte el resultado de cualquier expresión, si el resultado de la expresión es verdadero el operador NOT lo invertirá a falso, y viceversa. La siguiente tabla muestra los posibles valores de NOT. P V F NOT P F V Ejemplo de consulta utilizando NOT Encuentre aquellos almacenes cuyos idAlmacen sean inferiores a 4 y superiores a 6 1. SELECT idAlmacen, codigo, idEmpleadoEncargado, ciudad, estado 2. FROM almacenes 3. WHERE idAlmacen NOT BETWEEN 4 AND 6 idAlmacen codigo 1 2 3 7 8 al-01 al-02 al-03 al-07 al-08 idEmpleadoEncargado 1 2 3 7 8 ciudad estado Seattle Seattle Portland Seattle Columbus WA WA OR WA OH Listar los almacenes que no se encuentren en los estados ‘WA’ y ‘OH’ 1. SELECT codigo, ciudad, estado 2. FROM almacenes 3. WHERE estado NOT IN('WA','OH') codigo ciudad estado al-03 al-05 Portland Trenton OR NJ 23 4. Aritméticas y búsquedas avanzadas Operadores aritméticos y operaciones matemáticas En ocasione existirá la necesidad de realizar cálculos utilizando los valores de algunas columnas, para estos fines el lenguaje SQL permite utilizar operadores aritméticos. Operador + / * Significado Suma Resta División Multiplicación Ejemplos: Mostrar el monto del precio * cantidad en los detalles del pedido donde el idProducto se igual a 11 1. SELECT IdProducto, PrecioUnidad, Cantidad, PrecioUnidad*Cantidad 2. FROM detalles_de_pedido 3. where IdProducto = 11 IdProducto PrecioUnidad Cantidad PrecioUnidad*Cantidad 11 16.8 12 201.59999084472656 11 16.8 50 839.9999618530273 11 16.8 12 201.59999084472656 11 16.8 24 403.1999816894531 11 16.8 30 503.9999771118164 11 16.8 6 100.79999542236328 Alias Un alias es un sobrenombre temporal que se le aplica a una o más columnas en el resultado de un SELECT, es útil en resultados como los cálculos o cuando se desea utilizar un nombre de columna diferente al que ya esté definido en la estructura de la tabla. Nota: el nuevo nombre aplicado por el alias no es más que un apodo temporal y solo será válido en ese resultado, la estructura de la tabla continuará siendo la misma y manteniendo el nombre original de las columnas. Sintaxis 1. SELECT columna as 'nuevo_nombre' 2. FROM tabla 24 Ejemplo SQL con Alias 1. SELECT IdProducto, PrecioUnidad, Cantidad, PrecioUnidad*Cantidad AS 'Total' 2. FROM detalles_de_pedido 3. WHERE IdProducto = 11 IdProducto PrecioUnidad Cantidad Total 11 11 11 11 11 11 11 11 16.8 16.8 16.8 16.8 16.8 16.8 16.8 16.8 12 50 12 24 30 6 30 6 201.59999084472656 839.9999618530273 201.59999084472656 403.1999816894531 503.9999771118164 100.79999542236328 503.9999771118164 100.7999954223 Valores nulos Un Valor nulo es un valor desconocido o simplemente y valor que no existe, esto quiere decir que si una columna tiene un valor nulo entonces debemos asumir que no tiene absolutamente nada. El valor nulo es representado por la palabra NULL y esto no significa cero (0) en caso de que los valores sean de tipo numérico, ni tampoco un espacio en blanco en el caso de que sean caracteres. Otro detalle a tener en cuenta es que no todas las columnas pueden contener valores NULL, sino solo aquellas en las cuales se definió esta característica al momento de crearlas, también podemos verificar si una columna puede contener valores nulos mirando su estructura tal y como lo muestra la siguiente imagen. otra cosa a tener en cuenta es que cuando se quiere establecer una condición en la clausura La fila resaltada muestra las características de la columna idEmpleadoEncargado, su tipo, longitud y también se puede ver como en la columna Nulo el valor es si WHERE en el caso de los valores NULL se debe utilizar el operador is en vez del =. Ejemplo: 1. SELECT * 2. FROM almacenes 25 3. WHERE idEmpleadoEncargado is NULL O si quisiéramos que en vez de tomar en cuenta los valores NULL, sean excluidos podemos combinarlo con el operador NOT. Ejemplo: 1. SELECT * 2. FROM almacenes 3. WHERE idEmpleadoEncargado is NOT NULL Uso de patrones en búsquedas En ocasiones tendremos la necesidad de obtener resultados a partir de valores que es posible que no recordemos con exactitud, sin embargo, puede que tengamos a mano alguna proximidad al valor real, siendo este el caso SQL proporciona un operador llamado LIKE. El operador LIKE trabaja apoyándose de dos comodines: 1. %: este comodín indica que existen caracteres en el lugar del patrón donde se utilice, sin importar cuantos o cuales. 2. _: este comodín especifica que debe haber un carácter por cada _ que se utilice en el patrón. Veamos algunos ejemplos Listar los productos que tengan un único carácter en el código: 1. SELECT idProducto, nombreProducto 2. FROM producto 3. WHERE IdProducto LIKE '_' idProducto 1 2 3 4 5 6 7 8 9 nombreProducto Té Dharamsala Cerveza tibetana Barley Sirope de regaliz Especias Cajun del chef Anton Mezcla Gumbo del chef Anton Mermelada de grosellas de la abuela Peras secas orgánicas del tío Bob Salsa de arándanos Northwoods Buey Mishi Kobe Como podemos ver en el resultado solo se obtuvo una respuesta de 9 productos, sin embargo, en la tabla existen más de 70 producto, ¿porque sucedió esto?, la respuesta está en el patrón, en el patrón que se utilizó se expresa solo un único underscore (_), por lo tanto, solo se tomaran en cuenta aquellos valores que solo tengan un solo digito. Liste todos los productos que su idProducto inicie con 3 pero que solo tengan dos (2) dígitos. 26 1. SELECT idProducto, nombreProducto 2. FROM producto 3. WHERE IdProducto LIKE '3_' idProducto 30 31 32 33 34 35 36 37 38 39 nombreProducto Arenque blanco del noroeste Queso gorgonzola Telino Queso Mascarpone Fabioli Queso de cabra Cerveza Sasquatch Cerveza negra Steeleye Escabeche de arenque Salmón ahumado Gravad Vino Côte de Blaye Licor verde Chartreuse En esta ocasión solo se obtuvieron aquellos productos cuyos idProducto tengan dos dígitos pero que el primero sea el 3. A diferencia del undersecore (_) el símbolo de porcentaje (%) funciona de una manera distinta, el underscore (_) especifica cantidades de caracteres y deben coincidir exactamente, sin embargo, el porcentaje (%) es algo más flexible que el underscore (_), este solo expresa que existen cero o más caracteres en el lugar del patrón donde se coloca el %. Veamos algunos ejemplos. Se requieren conocer todos los productos que inicien con la letra a. 1. SELECT idProducto, nombreProducto 2. FROM producto 3. WHERE NombreProducto LIKE 'a%' idProducto 13 30 44 45 46 nombreProducto Algas Konbu Arenque blanco del noroeste Azúcar negra Malacca Arenque ahumado Arenque salado Se requieren conocer todos los productos que inicien con la letra a. 1. SELECT idProducto, nombreProducto 2. FROM producto 3. WHERE NombreProducto LIKE '%a' idProducto 1 6 nombreProducto Té Dharamsala Mermelada de grosellas de la abuela 27 10 12 16 24 25 33 41 43 44 56 58 65 66 68 Pez espada Queso Manchego La Pastora Postre de merengue Pavlova Refresco Guaraná Fantástica Crema de chocolate y nueces NuNuCa Queso de cabra Crema de almejas estilo Nueva Inglaterra Café de Malasia Azúcar negra Malacca Gnocchi de la abuela Alicia Caracoles de Borgoña Salsa de pimiento picante de Luisiana Especias picantes de Luisiana Barras de pan de Escocia Se requieren conocer todos los productos que contengan en su nombre la palabra queso. 1. SELECT idProducto, nombreProducto 2. FROM producto 3. WHERE NombreProducto LIKE '%queso%' idProducto 11 12 31 32 33 59 69 71 72 74 nombreProducto Queso Cabrales Queso Manchego La Pastora Queso gorgonzola Telino Queso Mascarpone Fabioli Queso de cabra Raclet de queso Courdavault Queso Gudbrandsdals Crema de queso Fløtemys Queso Mozzarella Giovanni Queso de soja Longlife Ordenando los resultados de la búsqueda Cuando ejecutamos una consulta a la base de datos los datos no suelen recuperarse ordenados o al menos no como uno esperaría, sin embargo, en SQL podemos ordenar los resultados de una consulta agregando la clausura ORDER BY al final de una sentencia SELECT. 1. SELECT * 2. FROM tabla 3. ORDER BY columna_1 ASC | DESC, columna_n ASC | DESC 28 O también podría ser 1. 2. 3. 4. SELECT * FROM tabla WHERE expresión_logica ORDER BY columna_1, columna_2, columna_n ASC | DESC Lo importante a tener en cuenta es que la clausura ORDER BY siempre debe ir al final de una consulta. Veamos unos ejemplos Listar el nombre de los productos con idProducto inferior a 10 y ordenarlo de menor a mayor. 1. 2. 3. 4. SELECT IdProducto, NombreProducto FROM producto WHERE idProducto < 10 ORDER BY IdProducto ASC IdProducto 1 2 3 4 5 6 7 8 9 NombreProducto Té Dharamsala Cerveza tibetana Barley Sirope de regaliz Especias Cajun del chef Anton Mezcla Gumbo del chef Anton Mermelada de grosellas de la abuela Peras secas orgánicas del tío Bob Salsa de arándanos Northwoods Buey Mishi Kobe Si en cambio queremos ordenar de mayor a menor entonces tenemos que cambiar la clausura ASC por DESC. 1. 2. 3. 4. SELECT IdProducto, NombreProducto FROM producto WHERE idProducto < 10 ORDER BY IdProducto DESC IdProducto 9 8 7 6 5 4 3 2 1 NombreProducto Buey Mishi Kobe Salsa de arándanos Northwoods Peras secas orgánicas del tío Bob Mermelada de grosellas de la abuela Mezcla Gumbo del chef Anton Especias Cajun del chef Anton Sirope de regaliz Cerveza tibetana Barley Té Dharamsala 29 También el ordenamiento se puede hacer tomando en cuenta más de una columna, se ordenan los resultados por orden de aparición. Listar los nombres de los empleados ordenados primero por nombre y luego por apellido. 1. SELECT Nombre, Apellidos, Ciudad 2. FROM empleado 3. ORDER BY Nombre, Apellidos Nombre Andrew Anne Janet Laura Margaret Michael Nancy Robert Steven 1 Apellidos Fuller Dodsworth Leverling Callahan Peacock Suyama Davolio King Buchanan 2 Ciudad Tacoma Londres Kirkland Seattle Redmond Londres Seattle Londres Londres Nota: cuando no se especifica el tipo de ordenamiento (ASC o DESC) por defecto se aplica el ASC. Funciones de agregación Las funciones de agregación son funciones que reciben como entrada una colección de valores y dan como resultado un solo valor. SQL cuenta con cinco (5) funciones de agregación. ● ● ● ● ● Promedio: AVG Mínimo: MIN Máximo: MAX Total: SUM Conteo: COUNT Las funciones SUM y AVG solo reciben valores numéricos, sin embargo, MAX, MIN y COUNT pueden recibir otros valores no numéricos como cadena de caracteres y fechas. Nota: algo importante a tener en cuenta es que no es posible utilizar las funciones de agregación en la clausura WHERE con finalidad de utilizarlas para condicionar los resultados. Por ejemplo, si se quisiera saber el precio máximo de los productos la consulta sería: 1. SELECT MAX(PrecioUnidad) 2. FROM producto MAX(PrecioUnidad) 263.5 30 Como notaremos el resultado fue solamente un único registro con solo una columna, si agregásemos otras columnas el resultado seguirá siendo un único registro y los valores de las otras columnas no siempre coincide con el de la función de totalización. En este ejemplo de código podemos agregar un alias para mejorar la visualización del resultado. 1. SELECT MAX(PrecioUnidad) AS 'Precio Máximo' 2. FROM producto Precio Máximo 263.5 Si quisiéramos saber cuántos pedidos se realizaron entre julio del 1996 y agosto de 1996: 1. SELECT COUNT(*) AS 'Total Pedido' 2. FROM pedido 3. WHERE FechaPedido BETWEEN '1996-07-01' AND '1996-08-01' Total Pedido 24 Un detalle que tomar en cuenta es que la función de agregación SUM no tiene el mismo funcionamiento que COUNT, la función SUM toma cada valor de la columna pasada como parámetro y el resultado es la suma de todos los valores, en cambio COUNT cuenta el número de registros. Por ejemplo: Se quiere conocer el monto total de los cargos aplicados a todos los pedidos: 1. SELECT SUM(Cargo) AS 'Monto Total' 2. FROM pedido Monto Total 64942.69004831835 6 Agrupar resultados La acción de agrupar resultados en SQL consiste en crear grupos con los valores similares, mostrando únicamente cada grupo sin repetición en el resultado, es posible que se confunda con la clausura DISTINCT, aunque su resultado sea similar en algunos casos, su funcionamiento es diferente. La cláusula GROUP BY divide los datos en grupos. - Usualmente es usada con funciones de totalización en la lista del SELECT. Todos los valores nulos, son tratados como un grupo más. 31 - La cláusula WHERE elimina las filas antes de agruparlas. La cláusula HAVING aplica condiciones a los grupos También es importante mencionar que esta clausura GROUP BY, se utiliza muy a menudo con las funciones de agregación SUM, COUNT, AVG, MAX y MIN. Su sintaxis es la siguiente: 1. 2. 3. 4. 5. SELECT columna(s) FROM tabla WHERE condición GROUP BY columna(s) ORDER BY columna(s) Ejemplos Conocer el número de almacenes por ciudad: 1. SELECT ciudad, COUNT(*) as 'Total' 2. FROM almacenes 3. GROUP BY ciudad ciudad Columbus Portland Seattle Trenton Total 2 1 4 1 Como podremos notar en el resultado de esta consulta, aunque se utilizó funciones de agregación no se obtuvo un único registro o fila, sino que la clausura ORDER BY agrupó los valores iguales y luego se le aplicó a cada grupo la función COUNT contando los valores de cada grupo y mostrando cada resultado de cada grupo individualmente. Anteriormente se realizó una nota donde se especificó que no es posible utilizar las funciones de agregación en la clausura WHERE, sin embargo, la clausura ORDER BY, también puede ser acompañada de otra clausura llama HAVING la cual actúa como una especie de WHERE la cual actúa sobre los resultados de ORDER BY y esta si permite el uso de las funciones de agregación SUM, COUNT, AVG, MAX y MIN. Su sintaxis es: 1. 2. 3. 4. 5. 6. SELECT columna(s) FROM tabla WHERE condición GROUP BY columna(s) HAVING condición ORDER BY columna(s) Hay que destacar que tanto WHERE, HAVING y ORDER BY son opcionales, pero si se piensa en utilizarlas este sería el orden correcto. 32 Ejemplos de LEFT JOIN Listar la cantidad empleados con fecha de contratación mayor o igual al 1994 agrupado por cargo. 1. 2. 3. 4. SELECT cargo, FechaContratación, count(*) AS 'total' FROM empleado GROUP BY FechaContratación, cargo HAVING FechaContratación >= '1994-01-01' cargo Representante de ventas Coordinador ventas interno Representante de ventas FechaContratación 1994-01-02 1994-03-05 1994-11-15 total 1 1 1 33 5. Recuperar datos desde varias tablas El modelo relacional utilizado en SQL permite crear una estructura donde los datos son almacenados en tablas, estas tablas almacenan información de forma relacionada, es decir una tabla puede tener una relación con una o más tablas, esto permite que se pueda obtener datos coherentes desde varias tablas. Para poder llevar esta relación eficientemente en el lenguaje SQL se utilizan llaves o claves (ver unidad 1 llave primaria y foránea), estas llaves permiten llevar a cabo dicha relación, ya que vienen a ser campos comunes en las diferentes tablas y esto permitirá saber cuál fila en una tabla especifica tiene relación con otra(s) fila(s) en otra(s) tabla(s). Operaciones con dos tablas o mas Para realizar recuperación de datos con dos o más tablas hay que tener en cuenta las llaves, y el proceso consiste en una especie de comparación llama JOIN (unión o cruce), del cual existen diferentes tipos de uniones de tablas: ● ● ● ● ● ● INNER JOIN LEFT JOIN RIGHT JOIN CROSS JOIN NATURAL JOIN SELF JOIN Cada tipo de JOIN ofrece su propia ventaja y debe ser utilizado según la necesidad. Inner join Permite recuperar las filas de dos o más tablas donde los valores de las columnas utilizadas en la condición del JOIN coincidan, las filas que no tengan coincidencias son excluidas del resultado. La sintaxis del INNER JOIN es la siguiente: 1. 2. 3. 4. SELECT tabla1.columna(s), tabla2.columna(s) FROM tabla1 INNER JOIN tabla2 ON tabla1.columna = tabla2.columna 34 O agregando las demás clausuras: 1. 2. 3. 4. 5. 6. 7. SELECT tabla1.columna(s), tabla2.columna(s) FROM tabla1 INNER JOIN tabla2 ON tabla1.columna = tabla2.columna WHERE condición GROUP BY tabla1.columna(s) | tabla2.columna(s) ORDER BY tabla1.columna(s) | tabla2.columna(s) Explicación: En el SELECT se especifican las columnas separadas por coma, hasta el momento solo habíamos seleccionado las columnas por sus nombres, pero cuando realizamos un JOIN debemos especificar el nombre de la tabla de donde queremos obtener las columnas seguido por un punto (.) y luego el nombre de la columna, esto se debe a que pueden existir columnas con el mismo nombre en diferentes tablas y si no somos específicos resultara en un error de ambigüedad. En la clausura FROM se sigue especificando la tabla de donde se recuperarán los datos, pero ahora se le agrega la clausura INNER seguida de JOIN y el nombre de la tabla, la clausura ON es parte del JOIN y es la que establece la condición que permitirá determinar cuáles filas serán recuperadas de las tablas involucradas en el JOIN. Luego si deseamos agregar un WHERE para establecer una condición adicional, o si queremos agrupar con GROUP BY, y finalmente podemos ordenar utilizando ORDER BY. Cada una de estas clausuras son opcionales, pero deben especificarse en el orden señalado en la sintaxis. Algunos ejemplos: Conocer el nombre del encargado de cada almacén y la ciudad donde están ubicados. 1. 2. 3. 4. SELECT almacenes.codigo, empleado.Nombre, empleado.ciudad FROM almacenes INNER JOIN empleado ON almacenes.idEmpleadoEncargado = empleado.IdEmpleado codigo al-01 al-02 al-03 al-05 al-06 al-08 Nombre Nancy Andrew Janet Steven Michael Laura ciudad Seattle Tacoma Kirkland Londres Londres Seattle Si observamos las tablas utilizadas en este JOIN podremos notar que ambas tablas poseen una columna que vincula o más bien relaciona ambas tablas. También si observamos los códigos al-02 y al-07 no fueron recuperados en los resultados debido a que específicamente esas filas tienen en su columna idEmpleadoEncargado el 35 valor NULL, y ya sabemos que NULL equivale a nada. Por lo tanto, al no tener un valor asignado no se toman en cuenta en la evaluación efectuada por la clausura ON del INNER JOIN. Tabla Empleado Tabla almacenes Lo ideal es que tenga el mismo nombre, pero puede darse el caso de que no sean de igual nombre, como lo es el ejemplo anterior. 36 Left Join El LEFT JOIN es similar al INNER JOIN, inclusive la sintaxis es la misma, la única diferencia es que en vez de INNER la palabra es cambiada por LEFT. Otra diferencia es su funcionamiento, a diferencia del INNER JOIN donde solo se recuperan las filas que coinciden en valor en la clausura ON, en el LEFT JOIN se recuperan todos los registros de la tabla ubicada en la clausura FROM y solo aquellas filas de la tabla ubicada en el LEFT JOIN que coinciden en valor en la clausura ON. De forma resumida podemos decir que el LEFT JOIN recupera todas las filas de la tabla ubicada en el FROM y solo lo que coincide de la tabla ubicada en el LEFT JOIN. Su sintaxis: 1. 2. 3. 4. SELECT tabla1.columna(s), tabla2.columna(s) FROM tabla1 LEFT JOIN tabla2 ON tabla1.columna = tabla2.columna O podría ser completo: 1. 2. 3. 4. 5. 6. 7. SELECT tabla1.columna(s), tabla2.columna(s) FROM tabla1 LEFT JOIN tabla2 ON tabla1.columna = tabla2.columna WHERE condición GROUP BY tabla1.columna(s) | tabla2.columna(s) ORDER BY tabla1.columna(s) | tabla2.columna(s) Utilizaremos la consulta anterior, pero en esta ocasión cambiaremos la clausura INNER JOIN por LEFT JOIN 1. SELECT almacenes.codigo, empleado.Nombre, empleado.ciudad 2. FROM almacenes 3. LEFT JOIN empleado 37 4. ON almacenes.idEmpleadoEncargado = empleado.IdEmpleado 5. ORDER BY almacenes.codigo codigo al-01 al-02 al-03 al-04 al-05 al-06 al-07 al-08 Nombre Nancy Andrew Janet NULL Steven Michael NULL Laura ciudad Seattle Tacoma Kirkland NULL Londres Londres NULL Seattle En este resultado los códigos al-04 y al-07 fueron excluidos del resultado, sin embargo, en el campo nombre y ciudad que pertenecen a la tabla empleado tiene el valor NULL debido a que el idEmpleadoEncargado de los códigos al-04 y al-07 no tienen un idEmpleado asignado, por lo tanto, es imposible encontrar un valor que coincida con ellos. Right Join El RIGHT JOIN a diferencia del LEFT JOIN solo incluye en el resultado los registros que coinciden con la condición de la clausura ON, sin embargo, se recuperan todos los registros ubicados en la clausura RIGHT JOIN. De forma resumida podemos decir que el RIGHT JOIN recupera todas las filas de la tabla ubicada en el FROM y solo lo que coincide de la tabla ubicada en el LEFT JOIN. Su sintaxis: 1. 2. 3. 4. SELECT tabla1.columna(s), tabla2.columna(s) FROM tabla1 LEFT JOIN tabla2 ON tabla1.columna = tabla2.columna 38 O podría ser completo: 1. 2. 3. 4. 5. 6. 7. SELECT tabla1.columna(s), tabla2.columna(s) FROM tabla1 LEFT JOIN tabla2 ON tabla1.columna = tabla2.columna WHERE condición GROUP BY tabla1.columna(s) | tabla2.columna(s) ORDER BY tabla1.columna(s) | tabla2.columna(s) Utilizaremos la consulta anterior, pero en esta ocasión cambiaremos la clausura left join por right join 1. 2. 3. 4. 5. SELECT almacenes.codigo, empleado.Nombre, empleado.ciudad FROM almacenes RIGHT JOIN empleado ON almacenes.idEmpleadoEncargado = empleado.IdEmpleado ORDER BY almacenes.codigo En el resultado podemos notar que todos los registros de la tabla empleado fueron recuperados, pero no sucedió los mismo con los registros de la tabla almacenes ya que solo se recuperaron los almacenes que tienen valores en el campo idEmpleadoEncargado diferente de NULL y es un valor que existe en el campo idEmpleado en la tabla empleado. codigo NULL NULL NULL al-01 al-02 al-03 al-05 al-06 al-08 Nombre Anne Margaret Robert Nancy Andrew Janet Steven Michael Laura ciudad Londres Redmond Londres Seattle Tacoma Kirkland Londres Londres Seattle 39 Cross Join El CROSS JOIN presenta el producto cartesiano de las filas de las tablas cruzadas. El resultado tendrá todos los registros de la tabla ubicada en el FROM izquierda combinados con cada uno de los registros de la tabla ubicada en CROSS JOIN. Algo que debemos destacar es que no se utiliza la clausura ON para establecer condiciones. 1. SELECT * 2. FROM almacenes CROSS JOIN empleado Natural Join El NATURAL JOIN es una simplificación de INNER JOIN con la característica de que cuando los campos de las tablas que serán utilizadas en el JOIN, dígase los campos por los cuales serán comparados los valores en la clausura on, tienen el mismo nombre se puede omitir el uso de la clausura ON, y el NATURAL JOIN se encargará de comparar las coincidencias y el resultado será el mismo que un INNER JOIN con la clausura ON. Si los campos no tienen el mismo nombre, entonces no se recomienda utilizarlo. Ejemplos: 1. 2. 3. 4. SELECT producto.NombreProducto, categoria.NombreCategoria FROM producto NATURAL JOIN categoria WHERE IdProducto < 10 su equivalente en INNER JOIN sería el siguiente: 6. 7. 8. 9. 10. SELECT producto.NombreProducto, categoria.NombreCategoria FROM producto INNER JOIN categoria ON producto.IdCategoria = categoria.IdCategoria WHERE IdProducto < 10 40 El resultado de ambas consultas será el mismo: NombreProducto Té Dharamsala Cerveza tibetana Barley Sirope de regaliz Especias Cajun del chef Anton Mezcla Gumbo del chef Anton Mermelada de grosellas de la abuela Peras secas orgánicas del tío Bob Salsa de arándanos Northwoods Buey Mishi Kobe NombreCategoria Bebidas Bebidas Condimentos Condimentos Condimentos Condimentos Frutas/Verduras Condimentos Carnes Alias en las tablas En el subtema del alias vimos como renombrar temporalmente el nombre de las columnas, también existe la posibilidad de renombrar el nombre de las tablas, pero a diferencia de las columnas cuyo propósito es una mejor presentación de los datos, cuando se renombra una tabla se hace para realizar consultas con más facilidad. Tomaremos como ejemplo la consulta anterior, pero ahora utilizaremos el alias. 1. 2. 3. 4. 5. 6. SELECT prod.NombreProducto, cat.NombreCategoria, prov.NombreEmpresa FROM producto AS prod INNER JOIN categoria AS cat ON prod.IdCategoria = cat.IdCategoria INNER JOIN proveedor AS prov ON prod.IdProveedor = prov.IdProveedor Si observamos, una vez colocada el alias a la tabla, es posible utilizarla en cualquier parte de la consulta, esto es útil cuando se realizan consultas largas con nombre de tablas largos y se necesitan seleccionar muchos campos. Self Join El self join no es más que hacer un join a una tabla consigo misma. ¿Cuál sería la finalidad?, simple, comparar los datos de una tabla consigo mismo, en los joins se ha mostrado como unir tablas mediante campos relacionado, y recuperar valores por coincidencias, pero cuando se necesita comparar los datos de una tabla con los mismos datos de esta entonces tenemos solo dos (2) opciones: 1- Crear otra tabla y copiar los registros de la primera en la segunda y luego comparar 2- Utilizar self join. Ahora bien, para poder realizar el self join es necesario el uso de alias, la temática es utilizar un alias diferente para la misma tabla, de manera que SQL creerá que son dos tablas distintas. 41 Ejemplos: Listar todos los almacenes que tienen el mismo encargado: 1. 2. 3. 4. 5. 6. SELECT a1.codigo, a1.idEmpleadoEncargado FROM almacen AS a1 INNER JOIN almacen AS a2 ON a1.idAlmacen != a2.idAlmacen AND a1.idEmpleadoEncargado = a2.idEmpleadoEncargado ORDER BY a1.idEmpleadoEncargado Almacen al-10 al-06 al-09 al-08 idEmpleadoEncargado 6 6 8 8 Join con más de dos tablas Cuando se utiliza el modelo relacional de bases de datos junto con el lenguaje SQL es 100% seguro que existan relaciones con mas de dos (2) tabla, es decir existen tablas que tienen mas de una (1) llave foránea, y también una tabla se relaciona con otras tantas según fuese necesario. Entonces los joins no solo deben limitarse a unir o cruzar solo dos (2) tablas, sino que según los requerimientos de la consulta serán los join que estarán en ella. Ejemplo: Listar los nombres de productos con su categoría y proveedor. 1. 2. 3. 4. 5. 6. SELECT producto.NombreProducto, categoria.NombreCategoria, proveedor.NombreEmpresa FROM producto INNER JOIN categoria ON producto.IdCategoria = categoria.IdCategoria INNER JOIN proveedor ON producto.IdProveedor = proveedor.IdProveedor NombreProducto Té Dharamsala Cerveza tibetana Barley Sirope de regaliz Especias Cajun del chef Anton Mezcla Gumbo del chef Anton Mermelada de grosellas de la … Peras secas orgánicas del tío Bob Salsa de arándanos Northwoods Buey Mishi Kobe Pez espada Queso Cabrales NombreCategoria Bebidas Bebidas Condimentos Condimentos Condimentos Condimentos Frutas/Verduras Condimentos Carnes Pescado/Marisco Lácteos NombreEmpresa Exotic Liquids Exotic Liquids Exotic Liquids New Orleans Cajun Delights New Orleans Cajun Delights Grandma Kelly's Homestead Grandma Kelly's Homestead Grandma Kelly's Homestead Tokyo Traders Tokyo Traders Cooperativa de Quesos 'Las Cabras' Queso Manchego La Pastora Lácteos Cooperativa de Quesos 'Las Cabras' Algas Konbu Pescado/Marisco Mayumi's 42 Subquery Los subquery o consultas anidadas, tiene relación con la posibilidad de ocupar cláusulas select dentro de otros select. Estas consultas anidadas, pueden tener uno o más select en su interior. Algunos puntos para tomar en cuenta al momento de realizar un subquery: - Un subquery es una instrucción select, usada como expresión en la clausura where. Puede ser utilizada como parte de otra instrucción select, update, insert o delete. Puede ser utilizada como columna en la instrucción select. El subquery es ejecutado y los resultados son utilizados dentro de la consulta que lo invocó. Si la cláusula where de la consulta principal incluye un nombre de columna, esta debe ser del mismo tipo de dato que la columna retornada por el subquery. Los subqueries, no pueden tener la cláusula order by en su sintaxis. La cláusula distinct no puede ser usada por subqueries que incluyen una cláusula group by. El subquery, puede ir en la cláusula where o having. Los subqueries usados con in o not in pueden retornar cero o más filas. Los subqueries usados con operadores relacionales (=, >, >=, <, <=, !=) deben retornar sólo un valor dígase una fila con una sola columna, sino ocurrirá un error. Ejemplos: Listar los productos que pertenecen a la categoría bebidas: 1. SELECT NombreProducto 2. FROM producto 3. WHERE IdCategoria = (SELECT IdCategoria 4. FROM categoria 5. WHERE nombreCategoria = 'bebidas') NombreProducto Té Dharamsala Cerveza tibetana Barley Refresco Guaraná Fantástica Cerveza Sasquatch Cerveza negra Steeleye Vino Côte de Blaye Licor verde Chartreuse Café de Malasia Cerveza Laughing Lumberjack Cerveza Outback Cerveza Klosterbier Rhönbräu Licor Cloudberry 43 Listar los productos con idProducto inferior a 10 y su categoría: 1. 2. 3. 4. 5. 6. SELECT NombreProducto, (SELECT nombreCategoria FROM categoria WHERE categoria.idCategoria = producto.idCategoria ) AS 'categoria' FROM producto WHERE IdProducto < 10 NombreProducto Té Dharamsala Cerveza tibetana Barley Sirope de regaliz Especias Cajun del chef Anton Mezcla Gumbo del chef Anton Mermelada de grosellas de la abuela Peras secas orgánicas del tío Bob Salsa de arándanos Northwoods Buey Mishi Kobe categoria Bebidas Bebidas Condimentos Condimentos Condimentos Condimentos Frutas/Verduras Condimentos Carnes ¿Cuál es la diferencia de rendimiento entre un subquery y un join? ¿Cuándo es recomendado utilizar uno o el otro? Union - Permite combinar el resultado de más de un select El número de uniones es indefinido o ilimitado. Los select utilizados en las uniones deben tener el mismo número de campos El resultado es ordenado. Se descartan las filas repetidas (a menos que se use union all) Los campos deben ser del mismo tipo de dato. Los nombres de las columnas del resultado se toman del primer select, si se desea cambiar el nombre, entonces utilizar alias en las columnas del primer select. La cláusula group by sólo debe aparecer en las select individuales No se acepta order by en los select individuales, se debe utilizar un solo y debe ir ubicado al final de las uniones. Ejemplo: Listar el nombre, ciudad y país de los empleados, clientes y proveedores: 1. 2. 3. 4. 5. 6. SELECT nombre, ciudad, Pais FROM empleado UNION SELECT nombreempresa, ciudad, pais FROM cliente UNION SELECT nombreempresa, ciudad, pais FROM proveedor ORDER BY nombre 44 El resultado obtenido serán todos los registros de cada tabla, en la siguiente tabla solo se mostrarán los primeros 10. nombre Alfreds Futterkiste Ana Trujillo Emparedados y helados Andrew Anne Antonio Moreno Taquería Around the Horn Aux joyeux ecclésiastiques B's Beverages Berglunds snabbköp Bigfoot Breweries ciudad Berlín México D.F. Tacoma Londres México D.F. Londres París Londres Luleå Bend pais Alemania México EE. UU. Reino Unido México Reino Unido Francia Reino Unido Suecia Estados Unido 45 11. Manipulación de los datos Insertar registros Las bases de datos contienen datos que son utilizadas por aplicaciones, programas y paginas web, pero esos datos proceden de algún lugar, para que existan datos en una base de datos primero hay que introducirlos. Para introducir datos utilizaremos la sentencia INSERT, su sintaxis: 1. INSERT INTO [nombre_tabla]([columna_1, columna_2,columna_n]) 2. VALUES ([valor_columna_1], [valor_columna_2], [valor_columna_n]) Tenemos que tomar en cuenta las siguientes observaciones: - No es necesario que el orden de las columnas coincida con el orden que tiene la estructura de la tabla. El orden de los valores debe coincidir con el orden de las columnas en el INSERT - INSERT INTO almacen( ciudad, estado, idAlmacen, codigo, idEmpleadoEncargado ) VALUES('Los Angeles', 'CA', 11, 'al-11', 5) - No es obligatorio introducir valores en todas las columnas. 1. INSERT INTO `almacen`( 2. ciudad, 3. estado, 4. codigo 5. ) 6. VALUES('Portland', 'OR', 'al-12') En este INSERT se omitieron dos (2) columnas, idAlmacen y idEmpleadoEncargado, la primera es la llave primaria y tiene una configuración para que se auto incremente, esto quiere decir que si introduzco un registro y no le pongo valor al idAlmacen entonces él toma el siguiente valor de la secuencia. En el caso del idEmpleadoEncargado al no introducirle valor este tomara el valor NULL, esto se debe a que en la estructura está definido como que puede recibir NULL. - Si no se especifican columnas en el INSERT, es obligatorio introducir todos los valores de todas las columnas de la tabla en el orden de la estructura. 1. INSERT INTO almacen 2. VALUES(13,'al-13',7,'Portland', 'OR') - Es posible insertar varios registros al mismo tiempo en una sola sentencia INSERT. 1. INSERT INTO almacen(codigo, idEmpleadoEncargado, ciudad, estado) 46 2. 3. 4. 5. 6. 7. VALUES ('al-14',5,'Los Angeles', 'CA'), ('al-15',1,'Seatle', 'WA'), ('al-16',6,'Columbus', 'OH'), ('al-17',3,'Los Angeles', 'CA'), ('al-18',2,'Portland', 'OR') - Si se utiliza un SELECT para introducir los datos, las columnas devueltas por el SELECT deben coincidir en tipo de dato, y el número de columnas debe ser la misma cantidad especificada en el INSERT. 1. INSERT INTO tabla_1 (columna_1, coluna_2, columna_n) 2. SELECT columna_1, columna_2, columna_n 3. FROM tabla_2 Modificar registros La cláusula UPDATE cambia los valores de una o más columnas en una tabla, su sintaxis: 1. 2. 3. 4. 5. 6. UPDATE almacen SET columna_1 = nuevo_valor, columna_2 = nuevo_valor, columna_n = nuevo_valor WHERE condicion No es obligatorio modificar todas las columnas, solo se debe(n) colocar esa(s) columna(s) que queremos hacer cambio en su valor. Asignar un encargado al almacén con código al-04: 1. 2. 3. 4. 5. UPDATE almacen SET idEmpleadoEncargado = 2 WHERE codigo = 'al-04' Eliminar registros Para eliminar registros utilizaremos la sentencia DELETE, esta borra registros de una tabla. Sintaxis: 1. DELETE FROM tabla 2. WHERE columna = valor Eliminar el almacén con el código al-04. 1. DELETE FROM almacen 2. WHERE codigo = 'al-04' 47 12. Bibliografía G. Taylor (2019). SQL for Dummies Guerrero Saldivia (1999). Apuntes de SQL Silberschatz, Korth y Sudarshan (2006). Fundamentos de bases de datos Quinta edición. 48