¿Cuáles son los resultados de la ejecución de declaraciones en lenguaje SQL? Operadores SQL básicos. SQL interactivo

Operadores SQL básicos.

SQL (lenguaje de consulta estructurado) es un lenguaje informático universal que se utiliza para crear, modificar y administrar datos en bases de datos relacionales. El lenguaje SQL se basa en álgebra relacional y es una colección de operadores.

Hay 4 grupos de operadores. Consideremos un grupo de operadores de manipulación de datos (Lenguaje de manipulación de datos, DML, SQLDML)

selección de datos

La selección de datos es la operación más común realizada con SQL. La declaración SELECT es una de las declaraciones más importantes en este lenguaje y se utiliza para seleccionar datos. La sintaxis de este operador es la siguiente:

SELECCIONAR columna DE la tabla

Las declaraciones SELECT deben contener las palabras SELECT y FROM; otras palabras clave son opcionales.

La palabra clave SELECT va seguida de información sobre qué campos incluir en el conjunto de datos resultante. Un asterisco (*) indica todos los campos de la tabla, por ejemplo:

Para seleccionar una columna, utilice la siguiente sintaxis:

SELECCIONAR Empresa

Un ejemplo de selección de varias columnas se ve así:

SELECCIONE Empresa, Teléfono, Correo

Para especificar los nombres de las tablas de las que se seleccionan los registros, utilice la palabra clave FROM, por ejemplo:

SELECCIONAR * DE Clientes

Esta consulta devolverá todos los campos de la tabla Clientes.

Puede utilizar una cláusula WHERE (opcional) para filtrar los resultados devueltos por una declaración SELECT

SELECCIONAR * DE Productos DONDE Categoría = 4

Puede utilizar varias expresiones en la cláusula WHERE,

DONDE expresión1 [(Y | O) expresión2 ...]

Por ejemplo:

SELECCIONE * DE Productos DONDE Categoría = 2 Y Postavshik > 10

SELECCIONE Nombre, Precio DE Productos DONDE Categoría= 3 O Precio< 50

Puede utilizar los siguientes operadores:

< Меньше

<= Меньше или равно

<>No igual

> Más

>= Mayor o igual que

La cláusula ORDER BY (opcional) se utiliza para ordenar el conjunto de datos resultante en una o más columnas. Las palabras clave ASC (ascendente) o DESC (descendente) se utilizan para determinar el orden de clasificación. De forma predeterminada, los datos se ordenan en orden ascendente.

Modificación de datos

Además de recuperar datos, SQL se puede utilizar para actualizar y eliminar datos, copiar registros a otras tablas y realizar otras operaciones. A continuación veremos las declaraciones ACTUALIZAR, ELIMINAR e INSERTAR que se utilizan para resolver algunos de estos problemas.

ACTUALIZAR declaración

Para cambiar valores en una o más columnas de una tabla, use la declaración ACTUALIZAR. La sintaxis de este operador es:

ACTUALIZAR tabla SET columna1 = expresión1 DONDE criterios

La expresión de la cláusula SET puede ser una constante o el resultado de un cálculo. Por ejemplo, para aumentar los precios de todos los productos que cuestan menos de $10, puede ejecutar la siguiente consulta:

ACTUALIZAR Productos SET Precio = Precio * 1.1 DONDE Precio< 10

BORRAR declaración

Para eliminar filas de las tablas, debe utilizar el operador DELETE, cuya sintaxis es:

ELIMINAR DE la tabla DONDE criterios

Elimina todos los productos que cuesten menos de 100.

La base del lenguaje SQL son los operadores, divididos condicionalmente en varios grupos según las funciones que realizan.

Se pueden distinguir los siguientes grupos de sentencias (no se enumeran todas las sentencias SQL):

Declaraciones DDL (lenguaje de definición de datos): declaraciones para definir objetos de base de datos

· CREAR ESQUEMA - crear un esquema de base de datos

· DROP SHEMA - eliminar un esquema de base de datos

· CREAR TABLA - crear una tabla

ALTER TABLE - cambiar la tabla

· DROP TABLE - eliminar una tabla

· CREAR DOMINIO - crear un dominio

ALTER DOMINIO - cambiar dominio

· DROP DOMAIN - eliminar un dominio

· CREAR COLECCIÓN - crear una secuencia

· DROP COLLATION - eliminar una secuencia

· CREAR VISTA - crear una vista

· DROP VIEW: eliminar una vista

Operadores DML (lenguaje de manipulación de datos): operadores de manipulación de datos

· SELECCIONAR: seleccionar filas de tablas

· INSERTAR - agregar filas a la tabla

· ACTUALIZACIÓN - cambiar filas en la tabla

· ELIMINAR - eliminar filas en la tabla

· COMMIT - confirmar los cambios realizados

· ROLLBACK - revertir los cambios realizados

Operadores de protección y gestión de datos

· CREAR ASERCIÓN - crear una restricción

· SOLTAR ASERCIÓN: eliminar una restricción

· GRANT: otorga privilegios a un usuario o aplicación para manipular objetos

REVOKE: revocar privilegios de usuario o aplicación

Además, existen grupos de operadores para configurar parámetros de sesión, obtener información sobre la base de datos, operadores de SQL estático y operadores de SQL dinámico.

Las más importantes para el usuario son las declaraciones de manipulación de datos (DML).

Ejemplos de uso de operadores de manipulación de datos

INSERTAR: insertar filas en una tabla

Ejemplo 1. Insertar una fila en una tabla:

VALORES(4, "Ivánov");

ACTUALIZACIÓN: actualización de filas en una tabla

Ejemplo 3. Actualice varias filas en una tabla:

SET PNAME = "Púshnikov"

DONDE P.PNUM = 1;

ELIMINAR: eliminar filas en una tabla

Ejemplo 4. Eliminar varias filas en una tabla:

DONDE P.PNUM = 1;

Ejemplos de uso de la declaración SELECT

La declaración SELECT es en realidad la declaración SQL más compleja y crítica para el usuario. Está destinado a recuperar datos de tablas, es decir. de hecho, implementa uno de los propósitos principales de la base de datos: proporcionar información al usuario.

La sentencia SELECT siempre se ejecuta sobre algunas de las tablas que forman parte de la base de datos.

Comentario. De hecho, las bases de datos pueden contener no sólo tablas almacenadas permanentemente, sino también tablas temporales y las llamadas vistas. Las vistas son simplemente expresiones SELECT almacenadas en la base de datos. Desde el punto de vista del usuario, una vista es una tabla que no se almacena permanentemente en la base de datos, sino que "aparece" cuando se accede a ella. Desde el punto de vista de la instrucción SELECT, tanto las tablas persistentes como las tablas y vistas temporales tienen exactamente el mismo aspecto. Por supuesto, cuando el sistema realmente ejecuta una instrucción SELECT, se tienen en cuenta las diferencias entre las tablas y vistas almacenadas, pero estas diferencias oculto del usuario.


El resultado de una declaración SELECT es siempre una tabla. Por tanto, los resultados de la instrucción SELECT son similares a los operadores del álgebra relacional. Cualquier operador de álgebra relacional se puede expresar mediante una declaración SELECT redactada adecuadamente. La complejidad de la declaración SELECT está determinada por el hecho de que contiene todas las capacidades del álgebra relacional, así como capacidades adicionales que no están presentes en el álgebra relacional.

Orden de ejecución de declaración SELECT

Para comprender cómo se obtiene el resultado de ejecutar una instrucción SELECT, considere el diagrama conceptual de su ejecución. Este esquema es puramente conceptual, porque se garantiza que el resultado será el mismo que si se ejecutara paso a paso según este esquema. De hecho, el resultado real se obtiene mediante algoritmos más sofisticados que "posee" un DBMS en particular.

Etapa 1: Ejecución de una única instrucción SELECT

Si el operador contiene las palabras clave UNION, EXCEPT e INTERSECT, entonces la consulta se divide en varias consultas independientes, cada una de las cuales se ejecuta por separado:

Paso 1 (DESDE). Se calcula el producto cartesiano directo de todas las tablas especificadas en la cláusula FROM requerida. Como resultado del paso 1, obtenemos la tabla A.

Paso 2 (DÓNDE). Si hay una cláusula WHERE en la instrucción SELECT, entonces se escanea la tabla A, obtenida en el paso 1. La expresión condicional dada en la cláusula WHERE se evalúa para cada fila de la tabla A. Sólo aquellas filas para las cuales la expresión condicional devuelve VERDADERO se incluyen en el resultado. Si se omite la cláusula WHERE, vaya directamente al paso 3. Si la expresión condicional implica subconsultas anidadas, se evalúan de acuerdo con este esquema conceptual. Como resultado del paso 2, obtenemos la tabla B.

Paso 3 (AGRUPAR POR). Si hay una cláusula GROUP BY en la instrucción SELECT, entonces las filas de la tabla B obtenidas en el segundo paso se agrupan de acuerdo con la lista de agrupación proporcionada en la cláusula GROUP BY. Si se omite la cláusula GROUP BY, vaya directamente al paso 4. Como resultado del paso 3, obtenemos la tabla C.

Paso 4 (TENER). Si una instrucción SELECT contiene una cláusula HAVING, se excluyen los grupos que no satisfacen la expresión condicional dada en la cláusula HAVING. Si se omite la sección TENER, vaya directamente al paso 5. Como resultado del paso 4, obtenemos la tabla D.

Paso 5 (SELECCIONAR). Cada grupo obtenido en el paso 4 genera una fila de resultados de la siguiente manera. Se evalúan todas las expresiones escalares especificadas en la cláusula SELECT. De acuerdo con las reglas para usar la cláusula GROUP BY, dichas expresiones escalares deben ser las mismas para todas las filas dentro de cada grupo. Para cada grupo, se calculan los valores de las funciones agregadas dadas en la sección SELECT. Si no hay una cláusula GROUP BY, pero hay funciones agregadas en la cláusula SELECT, entonces solo hay un grupo. Si no hay una cláusula GROUP BY ni funciones agregadas, se supone que hay tantos grupos como filas seleccionadas hasta el momento. Como resultado del paso 5, obtenemos la tabla E, que contiene tantas columnas como elementos listados en la sección SELECT y tantas filas como grupos estén seleccionados.

Etapa 2. Realizar operaciones UNION, EXCEPT, INTERSECT

Si la instrucción SELECT contenía las palabras clave UNION, EXCEPT e INTERSECT, entonces las tablas resultantes de la primera etapa se fusionan, restan o intersectan.

Etapa 3. Ordenar el resultado

Si la instrucción SELECT contiene una cláusula ORDER BY, entonces las filas de la tabla obtenidas en los pasos anteriores se ordenan de acuerdo con la lista de orden dada en la cláusula ORDER BY.

SQL (lenguaje de consulta estructurado) es un lenguaje informático universal que se utiliza para crear, modificar y administrar datos en bases de datos relacionales. El lenguaje SQL se basa en álgebra relacional y es una colección de operadores.

Hay 4 grupos de operadores. Consideremos un grupo de operadores de manipulación de datos (Lenguaje de manipulación de datos, DML, SQLDML)

selección de datos

La selección de datos es la operación más común realizada con SQL. La declaración SELECT es una de las declaraciones más importantes en este lenguaje y se utiliza para seleccionar datos. La sintaxis de este operador es la siguiente:

SELECCIONAR columna DE la tabla

Las declaraciones SELECT deben contener las palabras SELECT y FROM; otras palabras clave son opcionales.

La palabra clave SELECT va seguida de información sobre qué campos incluir en el conjunto de datos resultante. Un asterisco (*) indica todos los campos de la tabla, por ejemplo:

Para seleccionar una columna, utilice la siguiente sintaxis:

SELECCIONAR Compañía

Un ejemplo de selección de varias columnas se ve así:

SELECCIONAR Compañía,Teléfono,Correo

Para especificar los nombres de las tablas de las que se seleccionan los registros, utilice la palabra clave FROM, por ejemplo:

SELECCIONAR * DE Clientes

Esta consulta devolverá todos los campos de la tabla Clientes.

Puede utilizar la cláusula WHERE (opcional) para filtrar los resultados devueltos por la instrucción SELECT.

SELECCIONAR * DE Productos DONDE Categoría = 4

Puede utilizar varias expresiones en la cláusula WHERE,

DONDE expresión1 [(Y | O) expresión2 ...]

Por ejemplo:

SELECCIONE * DE Productos DONDE Categoría = 2 Y Postavshik > 10

SELECCIONE Nombre, Precio DE Productos DONDE Categoría= 3 O Precio< 50

Puede utilizar los siguientes operadores:

< Меньше

<= Меньше или равно

<>No igual

> Más

>= Mayor o igual que

La cláusula ORDER BY (opcional) se utiliza para ordenar el conjunto de datos resultante en una o más columnas. Las palabras clave ASC (ascendente) o DESC (descendente) se utilizan para determinar el orden de clasificación. De forma predeterminada, los datos se ordenan en orden ascendente.

Modificación de datos

Además de recuperar datos, SQL se puede utilizar para actualizar y eliminar datos, copiar registros a otras tablas y realizar otras operaciones. A continuación veremos las declaraciones ACTUALIZAR, ELIMINAR e INSERTAR que se utilizan para resolver algunos de estos problemas.

ACTUALIZAR declaración

Para cambiar valores en una o más columnas de una tabla, use la declaración ACTUALIZAR. La sintaxis de este operador es:

ACTUALIZAR tabla SET columna1 = expresión1 DONDE criterios

La expresión de la cláusula SET puede ser una constante o el resultado de un cálculo. Por ejemplo, para aumentar los precios de todos los productos que cuestan menos de $10, puede ejecutar la siguiente consulta:

ACTUALIZAR Productos SET Precio = Precio * 1.1 DONDE Precio< 10

BORRAR declaración

Para eliminar filas de las tablas, debe utilizar el operador DELETE, cuya sintaxis es:

ELIMINAR DE la tabla DONDE criterios

Eliminar todos los productos cuyo coste sea inferior a 100:

BORRAR DE Productos DONDE Precio< 100

OperadorINSERTAR

Para agregar registros a las tablas, debe utilizar la instrucción INSERT, cuya sintaxis es:

INSERTAR EN la tabla ( VALORES (expresión [, ...])

Por ejemplo, para agregar un nuevo cliente a la tabla Clientes, puede utilizar la siguiente consulta:

INSERTAR EN Clientes (ID de cliente, Nombre de empresa) VALORES ('XYZ', 'XYZ Deli')

En la primera parte ya tocamos un poco el lenguaje DML, utilizando casi todo el conjunto de sus comandos, a excepción del comando MERGE.

Hablaré de DML según mi propia secuencia, desarrollada a partir de mi experiencia personal. En el camino, también intentaré hablar sobre los lugares "resbaladizos" en los que vale la pena centrarse; estos lugares "resbaladizos" son similares en muchos dialectos del lenguaje SQL.

Porque el libro de texto está dedicado a una amplia gama de lectores (no solo programadores), entonces la explicación a veces será apropiada, es decir, largo y tedioso. Esta es mi visión del material, que se obtuvo principalmente en la práctica como resultado de la actividad profesional.

El objetivo principal de este tutorial, paso a paso, es desarrollar una comprensión completa de la esencia del lenguaje SQL y enseñarle cómo aplicar correctamente sus construcciones. Los profesionales de este campo también pueden estar interesados ​​en hojear este material, tal vez puedan aprender algo nuevo por sí mismos, o tal vez simplemente les resulte útil leerlo para refrescar la memoria. Espero que todos lo encuentren interesante.

Porque DML en el dialecto de la base de datos MS SQL está muy relacionado con la sintaxis de la construcción SELECT, por lo que comenzaré a hablar de DML con él. En mi opinión, la construcción SELECT es la construcción más importante en el lenguaje DML, porque gracias a él o a sus partes, los datos necesarios se recuperan de la base de datos.

El lenguaje DML contiene las siguientes construcciones:

  • SELECCIONAR – selección de datos
  • INSERTAR – insertar nuevos datos
  • ACTUALIZACIÓN – actualización de datos
  • BORRAR – eliminar datos
  • FUSIONAR – fusión de datos

En esta parte, veremos solo la sintaxis básica del comando SELECT, que se ve así:

SELECCIONE column_list o * DESDE la fuente DONDE filtrar ORDEN POR sort_expression
El tema de la declaración SELECT es muy amplio, por lo que en esta parte me centraré sólo en sus estructuras básicas. Creo que sin conocer bien los conceptos básicos no se puede empezar a estudiar estructuras más complejas, porque entonces todo girará en torno a este diseño básico (subconsultas, uniones, etc.).

Además, como parte de esta parte, también hablaré de la oferta TOP. Intencionalmente no indiqué esta oración en la sintaxis básica, porque... se implementa de manera diferente en diferentes dialectos SQL.

Si el lenguaje DDL es más estático, es decir con su ayuda, se crean estructuras rígidas (tablas, relaciones, etc.), luego el lenguaje DML es de naturaleza dinámica, aquí puede obtener los resultados correctos de diferentes maneras.

El entrenamiento también continuará en modo Paso a Paso, es decir. Al leer, debes intentar inmediatamente completar el ejemplo con tus propias manos. Luego analizas el resultado obtenido e intentas comprenderlo de forma intuitiva. Si algo no queda claro, por ejemplo el significado de una función, busque ayuda en Internet.

Los ejemplos se mostrarán en la base de datos de prueba, que se creó usando DDL+DML en la primera parte.

Para aquellos que no crearon una base de datos en la primera parte (ya que es posible que no todos estén interesados ​​en el lenguaje DDL), pueden usar el siguiente script:

Script de creación de base de datos de prueba

Crear una base de datos CREAR BASE DE DATOS Prueba GO: actualizar la base de datos de prueba USAR Prueba GO: crear tablas de referencia CREAR TABLA Posiciones (ID int IDENTIDAD (1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Name nvarchar(30) NOT NULL) CREATE TABLE Departamentos (ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY KEY, Nombre nvarchar(30) NOT NULL) GO - complete las tablas de referencia con datos SET IDENTITY_INSERT Posiciones ON INSERT Posiciones(ID,Nombre)VALUES (1, N"Contador"), (2,N"Director"), (3,N"Programador"), (4,N"Programador senior") SET IDENTITY_INSERT Posiciones OFF GO SET IDENTITY_INSERT Departamentos ON INSERT Departamentos(ID,Nombre)VALUES (1,N "Administración"), (2,N"Contabilidad"), (3,N"IT") SET IDENTITY_INSERT Departamentos OFF GO - crear una tabla con empleados CREAR TABLA Empleados(ID int NOT NULL, Nombre nvarchar( 30), fecha de cumpleaños, correo electrónico nvarchar (30), posicionId int, departamid int, fecha de contratación no restricción nula df_employees_hiredate sysdateTime (), gerente int, restricción pk_employee clave principal (id), restricción fk_employees_departmentid clave extranjera (departamento) departamentos (departamentos de referencias (departamentos (departamentos de referencias (departamento) (departamentos (departamentos ID), TRAINT FK_Employees_PositionID CLAVE EXTRANJERA (ID de posición) REFERENCIAS Posiciones (ID), RESTRICCIÓN FK_Employees_ManagerID CLAVE EXTRANJERA (ID de administrador) REFERENCIAS Empleados (ID), RESTRICCIÓN UQ_Employees_Email ÚNICA (correo electrónico), RESTRICCIÓN CK_Employees_ID VERIFICAR (ID ENTRE 1000 Y 1999), ÍNDICE IDX_Empleo sí_Nombre (Nombre)) GO - - rellénelo con datos INSERTAR Empleados (ID,Nombre,Cumpleaños,Correo electrónico,ID de posición,ID de departamento,ID de gerente)VALUES (1000,N"Ivanov I.I.","19550219"," [correo electrónico protegido]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [correo electrónico protegido]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [correo electrónico protegido]",1,2,1000), (1003,N"Andreev A.A.","19820417"," [correo electrónico protegido]",4,3,1000)

Eso es todo, ahora estamos listos para comenzar a aprender el lenguaje DML.

SELECT – operador de selección de datos

En primer lugar, para el editor de consultas activo, hagamos la prueba de la base de datos actual seleccionándola en la lista desplegable o usando el comando "UTILIZAR Prueba".

Comencemos con la forma más básica de SELECT:

SELECCIONAR * DE Empleados
En esta consulta, solicitamos devolver todas las columnas (indicadas por un "*") de la tabla Empleados; puede leer esto como "SELECCIONAR todos los campos DE la tabla de empleados". Si hay un índice agrupado, lo más probable es que los datos devueltos se ordenen por él, en este caso por la columna ID (pero esto no es importante, ya que en la mayoría de los casos especificaremos explícitamente la clasificación nosotros mismos usando ORDER BY...) :

IDENTIFICACIÓN Nombre Cumpleaños Correo electrónico ID de posición ID de departamento Fecha de contratación ID del administrador
1000 Ivánov I.I. 1955-02-19 [correo electrónico protegido] 2 1 2015-04-08 NULO
1001 Petrov P.P. 1983-12-03 [correo electrónico protegido] 3 3 2015-04-08 1003
1002 Sidorov S.S. 1976-06-07 [correo electrónico protegido] 1 2 2015-04-08 1000
1003 Andréyev A.A. 1982-04-17 [correo electrónico protegido] 4 3 2015-04-08 1000

En general, vale la pena decir que en el dialecto MS SQL la forma más simple de una consulta SELECT puede no contener un bloque FROM, en cuyo caso puede usarlo para obtener algunos valores:

SELECT 5550/100*15, SYSDATETIME(), - obteniendo la fecha del sistema de base de datos SIN(0)+COS(0)

(Sin nombre de columna) (Sin nombre de columna) (Sin nombre de columna)
825 2015-04-11 12:12:36.0406743 1

Tenga en cuenta que la expresión (5550/100*15) dio como resultado 825, aunque si calculamos en una calculadora el valor será (832,5). El resultado 825 se obtuvo porque en nuestra expresión todos los números son enteros, por lo tanto el resultado es un número entero, es decir (5550/100) nos da 55, no (55,5).

Recuerde que la siguiente lógica funciona en MS SQL:

  • Entero / Entero = Entero (es decir, en este caso se produce una división de enteros)
  • Real / Entero = Real
  • Entero / Real = Real
Aquellos. el resultado se convierte a un tipo mayor, por lo que en los últimos 2 casos obtenemos un número real (piense como en matemáticas: el rango de números reales es mayor que el rango de números enteros, por lo que el resultado se convierte a ese tipo):

SELECCIONE 123/10, -- 12 123./10, -- 12,3 123/10. -- 12.3
Aquí (123.) = (123.0), solo que en este caso se puede descartar 0 y solo queda el punto.

La misma lógica se aplica a otras operaciones aritméticas, pero en el caso de la división este matiz es más relevante.

Por tanto, preste atención al tipo de datos de las columnas numéricas. Si es un número entero y necesita obtener un resultado real, utilice una transformación o simplemente coloque un punto después del número indicado como constante (123.).

Puede utilizar la función CAST o CONVERT para convertir campos. Por ejemplo, usemos el campo ID, es de tipo int:

SELECT ID, ID/100, -- la división entera ocurrirá aquí CAST(ID AS float)/100, -- use la función CAST para convertir al tipo flotante CONVERT(float,ID)/100, -- use la función CONVERT para convertir al tipo float ID/100. -- use la transformación especificando que el denominador es un número real DE Empleados

IDENTIFICACIÓN (Sin nombre de columna) (Sin nombre de columna) (Sin nombre de columna) (Sin nombre de columna)
1000 10 10 10 10.000000
1001 10 10.01 10.01 10.010000
1002 10 10.02 10.02 10.020000
1003 10 10.03 10.03 10.030000

Sólo una nota. En la base de datos ORACLE, la sintaxis sin un bloque FROM es inaceptable, para ello se utiliza la tabla del sistema DUAL, que contiene una línea:

SELECCIONE 5550/100*15, -- y en ORACLE el resultado será igual a 832.5 sysdate, sin(0)+cos(0) FROM DUAL


Nota. El nombre de la tabla en muchos RDB puede ir precedido del nombre del esquema:

SELECCIONAR * DESDE dbo.Employees -- dbo – nombre del esquema

Un esquema es una unidad lógica de una base de datos, que tiene su propio nombre y permite agrupar objetos de la base de datos como tablas, vistas, etc. dentro de sí misma.

La definición de un esquema en diferentes bases de datos puede diferir; en algunos casos, el esquema está directamente relacionado con el usuario de la base de datos, es decir. en este caso, podemos decir que el esquema y el usuario son sinónimos y todos los objetos creados en el esquema son esencialmente objetos de este usuario. En MS SQL, un esquema es una unidad lógica independiente que se puede crear por sí sola (consulte CREAR ESQUEMA).

De forma predeterminada, se crea un esquema en la base de datos MS SQL con el nombre dbo (Propietario de la base de datos) y todos los objetos creados se crean de forma predeterminada en este esquema. En consecuencia, si simplemente especificamos el nombre de una tabla en una consulta, se buscará en el esquema dbo de la base de datos actual. Si queremos crear un objeto en un esquema específico, también tendremos que anteponer el nombre del objeto al nombre del esquema, por ejemplo, "CREATE TABLE nombre_esquema.nombre_tabla(...)".

En el caso de MS SQL, el nombre del esquema también puede ir precedido del nombre de la base de datos en la que se encuentra el esquema:

SELECCIONAR * DE Test.dbo.Employees - nombre_base_datos.nombre_esquema.tabla
Esta aclaración puede resultar útil, por ejemplo, si:

  • en una solicitud accedemos a objetos ubicados en diferentes esquemas o bases de datos
  • necesita transferir datos de un esquema o base de datos a otro
  • Al estar en una base de datos, necesita solicitar datos de otra base de datos.
  • etc.
Un esquema es una herramienta muy conveniente que resulta útil al desarrollar una arquitectura de base de datos, especialmente bases de datos grandes.

Además, no olvide que en el texto de la solicitud podemos utilizar comentarios tanto de una sola línea “-- ...” como de varias líneas “/* ... */”. Si la solicitud es grande y compleja, los comentarios pueden ser de gran ayuda para usted o para otra persona, después de un tiempo, a recordar o comprender su estructura.

Si hay muchas columnas en la tabla, y especialmente si todavía hay muchas filas en la tabla, además si estamos realizando consultas a la base de datos a través de la red, entonces sería preferible seleccionar con un listado directo de los campos que necesitas, separados por comas:

SELECCIONAR ID, Nombre DE Empleados

Aquellos. aquí decimos que solo necesitamos devolver los campos ID y Nombre de la tabla. El resultado será el siguiente (por cierto, el optimizador aquí decidió usar el índice creado por el campo Nombre):

IDENTIFICACIÓN Nombre
1003 Andréyev A.A.
1000 Ivánov I.I.
1001 Petrov P.P.
1002 Sidorov S.S.

Sólo una nota. A veces resulta útil observar cómo se recuperan los datos, por ejemplo, para saber qué índices se utilizan. Esto se puede hacer haciendo clic en el botón "Mostrar plan de ejecución estimado" o configurando "Incluir plan de ejecución real - Incluir el plan de ejecución de consulta real en el resultado" (en este caso, solo podremos ver el plan real, respectivamente). después de ejecutar la solicitud):

El análisis del plan de ejecución es muy útil al optimizar una consulta; le permite descubrir qué índices faltan o qué índices no se utilizan en absoluto y se pueden eliminar.

Si acaba de comenzar a aprender DML, entonces esto ya no es tan importante para usted, simplemente tome nota y podrá olvidarse de ello con seguridad (tal vez nunca lo necesite): nuestro objetivo inicial es aprender los conceptos básicos del lenguaje DML y aprenda a utilizarlos correctamente y la optimización ya es un arte aparte. A veces es más importante que simplemente tenga una consulta escrita correctamente que devuelva el resultado correcto desde el punto de vista del tema y que personas individuales ya la estén optimizando. Primero, debe aprender a escribir consultas correctamente, utilizando cualquier medio para lograr el objetivo. El objetivo principal que debe lograr ahora es que su consulta arroje los resultados correctos.

Configuración de alias de tablas

Al enumerar columnas, pueden ir precedidas del nombre de la tabla ubicada en el bloque FROM:

SELECCIONE Empleados.ID, Empleados.Nombre DE Empleados

Pero esta sintaxis suele ser incómoda de usar, porque el nombre de la tabla puede ser largo. Para estos fines, generalmente se especifican y utilizan nombres más cortos: alias:

SELECCIONE emp.ID,emp.Nombre DE Empleados COMO emp
o

SELECT emp.ID,emp.Name FROM Employees emp: se puede omitir la palabra clave AS (prefiero esta opción)

Aquí emp es un alias para la tabla Empleados que se puede usar en el contexto de esta declaración SELECT. Aquellos. podemos decir que en el contexto de esta declaración SELECT le estamos dando a la tabla un nuevo nombre.

Por supuesto, en este caso, los resultados de la consulta serán exactamente los mismos que para "SELECCIONAR ID, Nombre DE Empleados". Por qué es necesario esto quedará claro más adelante (ni siquiera en esta parte), por ahora solo recordamos que el nombre de la columna puede ir precedido (aclarado) ya sea directamente por el nombre de la tabla o usando un alias. Aquí puedes usar una de dos cosas, es decir. Si establece un alias, deberá usarlo, pero ya no podrá usar el nombre de la tabla.

Sólo una nota. En ORACLE, sólo se permite la opción de especificar un alias de tabla sin la palabra clave AS.

DISTINCT – descartando filas duplicadas

La palabra clave DISTINCT se utiliza para descartar filas duplicadas del resultado de la consulta. En términos generales, imagine primero ejecutar una consulta sin la opción DISTINCT y luego descartar todos los duplicados del resultado. Demostremos esto para mayor claridad usando un ejemplo:

Creemos una tabla temporal para demostración CREATE TABLE #Trash(ID int NOT NULL PRIMARY KEY, Col1 varchar(10), Col2 varchar(10), Col3 varchar(10)) - llene esta tabla con todo tipo de basura INSERT #Trash (ID,Col1, Col2,Col3)VALORES (1,"A","A","A"), (2,"A","B","C"), (3,"C"," A","B "), (4,"A","A","B"), (5,"B","B","B"), (6,"A","A" ,"B") , (7,"A","A","A"), (8,"C","A","B"), (9,"C","A"," B"), ( 10,"A","A","B"), (11,"A",NULL,"B"), (12,"A",NULL,"B") - veamos lo que devuelve la solicitud sin la opción DISTINCT SELECT Col1,Col2,Col3 FROM #Papelera - veamos qué devuelve la consulta con la opción DISTINCT SELECT DISTINCT Col1,Col2,Col3 FROM #Papelera - eliminar la tabla temporal DROP TABLE #Papelera

Visualmente se verá así (todos los duplicados están marcados con el mismo color):

Ahora veamos dónde se puede aplicar esto, usando un ejemplo más práctico: solo devolveremos identificadores de departamento únicos de la tabla Empleados (es decir, descubriremos los ID de los departamentos en los que están registrados los empleados):

SELECCIONAR ID de departamento DISTINTO DE Empleados

Aquí tenemos 4 líneas, porque... No hay combinaciones repetidas (DepartmentID, PositionID) en nuestra tabla.

Volvamos a DDL por un momento.

Dado que estamos empezando a quedarnos sin datos para ejemplos de demostración y queremos hablar de manera más amplia y clara, ampliemos un poco nuestra tabla de Empleados. Además, recordemos un poco de DDL, como dicen, “la repetición es la madre del aprendizaje”, y además, avancemos un poco nuevamente y apliquemos la declaración ACTUALIZAR:

Creamos nuevas columnas ALTER TABLE Employees ADD LastName nvarchar(30), -- apellido FirstName nvarchar(30), -- primer nombre MiddleName nvarchar(30), -- segundo nombre Salario flotante, -- y por supuesto salario en algunas unidades BonusPercent flotante - porcentaje para calcular el bono del salario GO - complételos con datos (algunos datos se omiten intencionalmente) ACTUALIZAR Empleados SET LastName=N"Ivanov", FirstName=N"Ivan", MiddleName=N"Ivanovich", Salario=5000, BonusPercent= 50 DONDE ID=1000 -- Ivanov I.I. ACTUALIZAR Empleados SET Apellido=N"Petrov",Nombre=N"Petr",SegundoNombre=N"Petrovich", Salario=1500, BonusPercent= 15 WHERE ID=1001 -- Petrov P.P. ACTUALIZAR Empleados SET Apellido=N"Sidor",Nombre=N"Sidor",SegundoNombre=NULL, Salario=2500,BonusPercent=NULL WHERE ID=1002 -- Sidorov S.S. ACTUALIZAR Empleados SET Apellido=N"Andreev",Nombre=N"Andrey",SegundoNombre=NULL, Salario=2000,BonusPercent= 30 WHERE ID=1003 -- Andreev A.A.

Asegurémonos de que los datos se hayan actualizado correctamente:

SELECCIONAR * DE Empleados

IDENTIFICACIÓN Nombre Apellido Nombre de pila Segundo nombre Salario BonificaciónPorcentaje
1000 Ivánov I.I. Ivánov Iván Ivánovich 5000 50
1001 Petrov P.P. petrov Pedro Petróvich 1500 15
1002 Sidorov S.S. Sidorov sidor NULO 2500 NULO
1003 Andréyev A.A. andréyev andrés NULO 2000 30

Establecer alias para columnas de consulta

Creo que será más fácil mostrarlo aquí que escribirlo:

SELECCIONAR: proporcione el nombre a la columna calculada. Apellido+" "+Nombre+" "+Segundo nombre AS Nombre completo, - use comillas dobles, porque Se utiliza el espacio HireDate AS "Fecha de admisión", -- uso de corchetes, porque se utiliza espacio Cumpleaños AS [Fecha de nacimiento], -- la palabra AS no es necesaria Salario ZP DE Empleados

nombre completo Fecha de admisión Fecha de nacimiento ZP
Ivanov Ivan Ivanovich 2015-04-08 1955-02-19 5000
Petrov Petr Petrovich 2015-04-08 1983-12-03 1500
NULO 2015-04-08 1976-06-07 2500
NULO 2015-04-08 1982-04-17 2000

Como podemos ver, los alias de columna que especificamos se reflejan en el encabezado de la tabla resultante. En realidad, este es el objetivo principal de los alias de columnas.

Tenga en cuenta, porque los últimos 2 empleados no tenían un segundo nombre especificado (valor NULL), entonces el resultado de la expresión “Apellido+" "+Nombre+" "+Segundo Nombre" también nos devolvió NULL.

Para unir (agregar, concatenar) cadenas en MS SQL, se utiliza el símbolo “+”.

Recuerde que todas las expresiones que involucran NULL (por ejemplo, división por NULL, suma con NULL) devolverán NULL.

Sólo una nota.
En el caso de ORACLE, el operador “||” se utiliza para concatenar cadenas y la concatenación se vería como "Apellido||" "||Nombre||" "||Segundo nombre". Para ORACLE, vale la pena señalar que tiene una excepción para los tipos de cadena, para ellos NULL y la cadena vacía "" son lo mismo, por lo que en ORACLE dicha expresión devolverá para los últimos 2 empleados "Sidorov Sidor" y "Andrey Andréiev”. En el momento de ORACLE 12c, hasta donde yo sé, no hay ninguna opción que cambie este comportamiento (si me equivoco, corríjame). Aquí me resulta difícil juzgar si esto es bueno o malo, porque... En algunos casos, el comportamiento de una cadena NULL es más conveniente, como en MS SQL, y en otros, como en ORACLE.

En ORACLE, todos los alias de columnas enumerados anteriormente también son válidos, excepto [...].


Para no bloquear la construcción usando la función ISNULL, en MS SQL podemos usar la función CONCAT. Consideremos y comparemos 3 opciones:

SELECT LastName+" "+FirstName+" "+SegundoNombre FullName1, -- 2 opciones para reemplazar NULL con cadenas vacías "" (obtenemos el mismo comportamiento que en ORACLE) ISNULL(LastName,"")+" "+ISNULL(FirstName," ")+ " "+ISNULL(SegundoNombre,"") Nombre Completo2, CONCAT(Apellido," ",Nombre," ",Segundo Nombre) Nombre Completo3 DE Empleados

Nombre completo1 Nombre completo2 Nombre completo3
Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich
Petrov Petr Petrovich Petrov Petr Petrovich Petrov Petr Petrovich
NULO Sidorov Sidor Sidorov Sidor
NULO Andreyev Andrey Andreyev Andrey

En MS SQL, los alias también se pueden especificar utilizando el signo igual:

SELECCIONE "Fecha de recepción"=Fechadecontratación, -- además de "..." y […] puede usar "..." [Fecha de nacimiento]=Cumpleaños, ZP=Salario DE Empleados

Usar la palabra clave AS o el signo igual para especificar un alias probablemente sea más una cuestión de gustos. Pero al analizar las solicitudes de otras personas, este conocimiento puede resultar útil.

Finalmente diré que es mejor establecer nombres para alias usando solo caracteres latinos y números, evitando el uso de “…”, “…” y […], es decir, usar las mismas reglas que usamos al nombrar las tablas. . Además, en los ejemplos utilizaré sólo esos nombres y no “…”, “…” y […].

Operadores aritméticos SQL básicos


La prioridad de ejecución de los operadores aritméticos es la misma que en matemáticas. Si es necesario, el orden de aplicación de los operadores se puede cambiar usando paréntesis - (a+b)*(x/(y-z)).

Y repito una vez más que cualquier operación con NULL produce NULL, por ejemplo: 10+NULL, NULL*15/3, 100/NULL - todo esto dará como resultado NULL. Aquellos. En pocas palabras, un valor indefinido no puede producir un resultado definido. Tenga esto en cuenta al redactar su consulta y, si es necesario, maneje valores NULL usando las funciones ISNULL y COALESCE:

SELECT ID,Nombre, Salario/100*BonusPercent AS Result1, -- sin procesar valores NULL Salario/100*ISNULL(BonusPercent,0) AS Result2, -- use la función ISNULL Salario/100*COALESCE(BonusPercent,0) COMO Resultado3 - - use la función FUSIONAR DE Empleados

Les cuento un poco sobre la función COALESCE:

COALESCE (expr1, expr2, ..., exprn): devuelve el primer valor no NULO de una lista de valores.

SELECT COALESCE(f1, f1*f2, f2*f3) val - en este caso se devolverá el tercer valor FROM (SELECT null f1, 2 f2, 3 f3) q

Me centraré principalmente en hablar sobre construcciones DML y, en su mayor parte, no hablaré sobre las funciones que aparecerán en los ejemplos. Si no comprende lo que hace una función en particular, busque su descripción en Internet, incluso puede buscar información por grupo de funciones a la vez, por ejemplo, buscando en Google “funciones de cadena de MS SQL”, “MS SQL funciones matemáticas” o “funciones MS SQL” procesamiento NULL." Hay mucha información sobre funciones y puede encontrarla fácilmente. Por ejemplo, en la biblioteca de MSDN, puede encontrar más información sobre la función COALESCE:

Recorte de MSDN Comparación de COALESCE y CASE

La expresión COALESCE es un atajo sintáctico para la expresión CASE. Esto significa que el optimizador de consultas reescribe COALESCE(expresión1,...n) como la siguiente expresión CASE:

CASO CUANDO (la expresión1 NO ES NULA) ENTONCES expresión1 CUANDO (la expresión2 NO ES NULA) ENTONCES expresión2 ... ELSE expresiónN FINAL

Por ejemplo, veamos cómo se puede utilizar el resto de la división (%). Este operador es muy útil cuando necesitas dividir registros en grupos. Por ejemplo, saquemos todos los empleados que tienen números de personal (ID) pares, es decir, aquellos ID que son divisibles por 2:

SELECCIONE ID, Nombre DE Empleados DONDE ID%2=0 - el resto cuando se divide entre 2 es 0

ORDENAR POR: ordenar el resultado de la consulta

La cláusula ORDER BY se utiliza para ordenar el resultado de una consulta.

SELECCIONE Apellido, Nombre, Salario DE los Empleados ORDEN POR Apellido, Nombre - ordene el resultado por 2 columnas - por Apellido y luego por Nombre

Para una nota. Hay una palabra clave ASC para ordenar en orden ascendente, pero como la ordenación ascendente es la opción predeterminada, puede olvidarse de esta opción (no recuerdo un momento en el que usé esta opción).

Vale la pena señalar que la cláusula ORDER BY también puede usar campos que no figuran en la cláusula SELECT (excepto en el caso en que se usa DISTINCT, que analizaré a continuación). A modo de ejemplo, me adelantaré un poco usando la opción TOP y mostraré cómo, por ejemplo, puedes seleccionar 3 empleados que tengan el salario más alto, teniendo en cuenta que por motivos de confidencialidad no debo mostrar el salario en sí:

SELECCIONE LOS 3 PRINCIPALES: devuelve solo los primeros 3 registros del resultado completo ID,Apellido,Nombre DE los empleados ORDEN POR Salario DESC: ordena el resultado en orden descendente de Salario

IDENTIFICACIÓN Apellido Nombre de pila
1000 Ivánov Iván
1002 Sidorov sidor

Por supuesto, aquí se da el caso de que varios empleados pueden tener el mismo salario y es difícil decir a qué tres empleados devolverá esta solicitud, esto debe resolverse con el director de tarea; Digamos que después de discutir esta tarea con el gerente, estuvo de acuerdo y decidió usar la siguiente opción: realizar una clasificación adicional por campo de fecha de nacimiento (es decir, valoramos a los jóvenes) y si la fecha de nacimiento de varios empleados puede coincidir. (después de todo, esto tampoco está excluido), luego puede realizar una tercera clasificación en orden descendente de valores de ID (los últimos en la muestra serán aquellos con el ID más alto, por ejemplo, los que fueron aceptados en último lugar, digamos los números de personal se emiten secuencialmente):

SELECCIONE LOS 3 PRINCIPALES: devuelva solo los primeros 3 registros del resultado completo ID,Apellido,Nombre DE Empleados ORDEN POR Salario DESC, - 1. ordene el resultado en orden descendente por Cumpleaños del salario, - 2. luego por Fecha de nacimiento ID DESC - 3 y para una claridad total del resultado, agregamos clasificación por ID.

Aquellos. debe intentar que el resultado de la solicitud sea predecible, de modo que en caso de una sesión informativa pueda explicar por qué estas personas en particular fueron incluidas en la “lista negra”, es decir, todo fue elegido honestamente, según las reglas establecidas.

También puedes ordenar usando diferentes expresiones en la cláusula ORDER BY:

SELECCIONE Apellido, Nombre DE Empleados ORDEN POR CONCAT (Apellido,", ", Nombre): use la expresión

También puede utilizar alias especificados para las columnas en ORDER BY:

SELECCIONE CONCAT(Apellido", ",Nombre) fi DE Empleados ORDEN POR fi - use un alias

Vale la pena señalar que cuando se usa la cláusula DISTINCT, solo las columnas enumeradas en el bloque SELECT se pueden usar en la cláusula ORDER BY. Aquellos. Después de aplicar la operación DISTINCT, obtenemos un nuevo conjunto de datos, con un nuevo conjunto de columnas. Por este motivo, el siguiente ejemplo no funcionará:

SELECCIONE DISTINCT Apellido, Nombre, Salario DE Empleados ORDEN POR ID: el ID no está en el conjunto resultante que obtuvimos con DISTINCT

Aquellos. la cláusula ORDER BY se aplica al conjunto resultante antes de que el resultado se devuelva al usuario.

Nota 1. También puede utilizar los números de las columnas enumeradas en SELECT en la cláusula ORDER BY:

SELECCIONE Apellido, Nombre, Salario DE Empleados ORDEN POR - ordenar en orden 3 DESC, - 1. Salario descendente 1, - 2. por Apellido 2 - 3. por Nombre

Para los principiantes parece conveniente y tentador, pero es mejor olvidarlo y nunca utilizar esta opción de clasificación.

Si en este caso (cuando los campos se enumeran explícitamente), esta opción sigue siendo aceptable, entonces, en el caso de utilizar "*", es mejor no utilizar nunca esta opción. Por qué: porque si alguien, por ejemplo, cambia el orden de las columnas en la tabla o elimina columnas (y esta es una situación normal), es posible que su consulta aún funcione, pero incorrectamente, porque La clasificación ya se puede realizar mediante otras columnas, y esto es insidioso porque es posible que este error no se descubra muy pronto.

Si las columnas se enumeraran explícitamente, entonces, en la situación anterior, la consulta continuaría funcionando, pero también correctamente (ya que todo está definido explícitamente), o simplemente arrojaría un error de que esta columna no existe.

Por lo tanto, puede olvidarse con seguridad de ordenar por números de columna.

Nota 2.
En MS SQL, al ordenar en orden ascendente, los valores NULL se mostrarán primero.

SELECCIONE BonusPercent DE Empleados ORDEN POR BonusPercent

En consecuencia, al usar DESC estarán al final.

SELECCIONE BonusPercent DE Empleados ORDEN POR BonusPercent DESC

Si necesita cambiar la lógica para ordenar valores NULL, utilice expresiones, por ejemplo:

SELECCIONE BonusPercent DE Empleados ORDEN POR ISNULL(BonusPercent,100)

ORACLE proporciona dos opciones para este propósito: NULLS FIRST y NULLS LAST (usados ​​por defecto). Por ejemplo:

SELECCIONAR BonusPercent DE Empleados ORDENAR POR BonusPercent DESC NULLS ÚLTIMOS

Preste atención a esto cuando cambie a una base de datos en particular.

ARRIBA: devuelve el número especificado de registros

Extracto de MSDN. SUPERIOR: limita el número de filas devueltas en el conjunto de resultados de la consulta a un número o porcentaje específico. Cuando se utiliza una cláusula TOP junto con una cláusula ORDER BY, el conjunto de resultados se limita a las primeras N filas del resultado ordenado. De lo contrario, las primeras N filas se devuelven en un orden no especificado.

Normalmente, esta expresión se utiliza con una cláusula ORDER BY y ya hemos visto ejemplos en los que era necesario devolver las primeras N filas del conjunto de resultados.

Sin ORDER BY, esta cláusula generalmente se usa cuando solo necesitamos mirar una tabla desconocida para nosotros, que puede tener muchos registros, en este caso podemos, por ejemplo, pedir que se devuelva solo las primeras 10 filas, pero para claridad diremos solo 2:

SELECCIONE TOP 2 * DE Empleados

También puede especificar la palabra PORCENTAJE para devolver el porcentaje correspondiente de filas del conjunto de resultados:

SELECCIONE EL 25 POR CIENTO SUPERIOR * DE Empleados

En mi práctica, el muestreo más utilizado es el número de filas.

También puede usar la opción CON LAZOS con ARRIBA, que ayudará a devolver todas las filas en caso de clasificación ambigua, es decir, esta oración devolverá todas las filas que tienen la misma composición que las filas que caen en la selección TOP N. Como resultado, se pueden seleccionar más de N filas. Agreguemos otro "Programador" con un salario de 1500 para demostración.

INSERTAR Empleados(ID,Nombre,Correo electrónico,ID de puesto,ID de departamento,ID de gerente,Salario) VALORES(1004,N"Nikolaev N.N."," [correo electrónico protegido]",3,3,1003,1500)

Y agreguemos otro empleado sin indicar puesto y departamento con un salario de 2000:

INSERTAR Empleados(ID,Nombre,Correo electrónico,ID de puesto,ID de departamento,ID de gerente,Salario) VALORES(1005,N"Alexandrov A.A."," [correo electrónico protegido]",NULL,NULL,1000,2000)

Ahora seleccionemos, usando la opción CON LAZOS, todos los empleados cuyo salario coincida con el salario de 3 empleados, con el salario más pequeño (espero que quede más claro a qué me refiero):

SELECCIONE LOS 3 PRINCIPALES CON LAZOS ID, Nombre, Salario DE Empleados ORDEN POR Salario

Aquí, aunque se indica TOP 3, la solicitud devolvió 4 registros, porque El valor salarial que arrojó TOP 3 (1500 y 2000) se encontró en 4 empleados. Visualmente funciona algo como esto:

Sólo una nota.
TOP se implementa de diferentes maneras en diferentes bases de datos; en MySQL hay una cláusula LIMIT para esto, en la que además se puede establecer el desplazamiento inicial.

En ORACLE 12c, también introdujeron su propio análogo, combinando la funcionalidad TOP y LIMIT: busque las palabras "ORACLE OFFSET FETCH". Antes de la versión 12c, la pseudocolumna ROWNUM se utilizaba normalmente para este propósito.


¿Qué pasa si aplicas las cláusulas DISTINCT y TOP al mismo tiempo? Estas preguntas pueden responderse fácilmente mediante la realización de experimentos. En general, no tengas miedo y no seas perezoso para experimentar, porque... La mayor parte se aprende a través de la práctica. El orden de las palabras en la declaración SELECT es el siguiente: DISTINCT va primero, seguido de TOP, es decir. Si piensa lógicamente y lee de izquierda a derecha, se aplicará el primero en descartar duplicados y luego se creará TOP en función de este conjunto. Bueno, comprobemos y asegurémonos de que este sea el caso:

SELECCIONAR DISTINTO TOP 2 Salario DE Empleados ORDENAR POR Salario

Salario
1500
2000

Aquellos. Como resultado, recibimos los dos salarios más bajos de todos. Por supuesto, puede darse el caso de que el salario de algunos empleados no esté especificado (NULL), porque El esquema nos permite hacer esto. Por lo tanto, dependiendo de la tarea, decidimos procesar valores NULL en la cláusula ORDER BY, o simplemente descartar todos los registros para los cuales Salario es NULL, y para ello procedemos a estudiar la cláusula WHERE.

DONDE – condición de selección de fila

Esta oración se utiliza para filtrar registros según una condición determinada. Por ejemplo, seleccionemos todos los empleados que trabajan en el departamento de "TI" (su ID=3):

SELECCIONE ID, Apellido, Nombre, Salario DE Empleados DONDE DepartamentoID = 3 - ORDEN POR Apellido, Nombre

IDENTIFICACIÓN Apellido Nombre de pila Salario
1004 NULO NULO 1500
1003 andréyev andrés 2000
1001 petrov Pedro 1500

La cláusula WHERE se escribe antes del comando ORDER BY.

El orden de aplicación de los comandos al conjunto inicial de Empleados es el siguiente:

  1. DÓNDE: si se especifica, el primer paso de todo el conjunto de Empleados es seleccionar solo los registros que cumplan la condición.
  2. DISTINCT: si se especifica, se descartan todos los duplicados
  3. ORDENAR POR: si se especifica, el resultado se ordena
  4. ARRIBA: si se especifica, solo se devuelve el número especificado de registros del resultado ordenado

Veamos un ejemplo para mayor claridad:

SELECCIONE DISTINTO TOP 1 Salario DE Empleados DONDE IDDepartamento=3 ORDEN POR Salario

Visualmente se verá así:

Vale la pena señalar que la verificación de NULL no se realiza con un signo igual, sino utilizando los operadores IS NULL y IS NOT NULL. Solo recuerde que no puede comparar en NULL usando el operador “=" (signo igual), porque el resultado de la expresión también será igual a NULL.

Por ejemplo, seleccionemos todos los empleados que no tienen un departamento especificado (es decir, IDDepartamento ES NULO):

SELECCIONE ID, Nombre DE Empleados DONDE ID de Departamento ES NULO

Ahora, como ejemplo, calculemos la bonificación para todos los empleados que tienen el valor BonusPercent especificado (es decir, BonusPercent NO ES NULO):

SELECCIONE ID, Nombre, Salario/100*BonusPercent COMO Bonificación DE Empleados DONDE BonusPercent NO ES NULO

Sí, por cierto, si lo piensas bien, el valor de BonusPercent puede ser igual a cero (0) y el valor también se puede ingresar con un signo menos, porque no impusimos ninguna restricción en este campo.

Bueno, habiendo hablado del problema, nos dijeron que por ahora consideráramos que si (BonusPercent<=0 или BonusPercent IS NULL), то это означает что у сотрудника так же нет бонуса. Для начала, как нам сказали, так и сделаем, реализуем это при помощи логического оператора OR и NOT:

SELECCIONE ID,Nombre,Salario/100*BonusPercent COMO Bonificación DE Empleados DONDE NO(BonusPercent<=0 OR BonusPercent IS NULL)

Aquellos. Aquí es donde empezamos a aprender sobre los operadores booleanos. La expresión entre paréntesis “(BonusPercent<=0 OR BonusPercent IS NULL)» проверяет на то что у сотрудника нет бонуса, а NOT инвертирует это значение, т.е. говорит «верни всех сотрудников которые не сотрудники у которых нет бонуса».

Esta expresión también se puede reescribir diciendo inmediatamente "devolver todos los empleados que tienen un bono" expresando esto con la expresión (BonusPercent>0 and BonusPercent IS NOT NULL):

SELECCIONE ID, Nombre, Salario/100*BonusPercent COMO Bonificación DE Empleados DONDE BonusPercent>0 Y BonusPercent NO ES NULO

También en el bloque WHERE puede verificar varios tipos de expresiones utilizando operadores y funciones aritméticos. Por ejemplo, se puede realizar una verificación similar usando una expresión con la función ISNULL:

SELECCIONE ID, Nombre, Salario/100*BonusPercent COMO Bonificación DE Empleados DONDE ISNULL(BonusPercent,0)>0

Operadores booleanos y operadores de comparación simples

Sí, aquí no podemos prescindir de las matemáticas, así que hagamos una breve excursión a los operadores booleanos y de comparación simples.

Solo hay 3 operadores booleanos en SQL: Y, O y NO:

Para cada operador booleano, puede proporcionar tablas de verdad que muestren adicionalmente cuál será el resultado cuando las condiciones puedan ser NULL:

Existen los siguientes operadores de comparación simples que se utilizan para formar condiciones:

Además, hay 2 operadores para verificar un valor/expresión para NULL:

ES NULO Prueba de igualdad NULL
NO ES NULO Prueba de desigualdad NULL

Prioridad: 1) Todos los operadores de comparación; 2) NO; 3) Y; 4) O.

Al construir expresiones lógicas complejas, se utilizan paréntesis:

((condición1 Y condición2) O NO (condición3 Y condición4 Y condición5)) O (…)

Además, al utilizar paréntesis, puede cambiar la secuencia estándar de cálculos.

Aquí intenté dar una idea del álgebra de Boole en un volumen suficiente para trabajar. Como puede ver, para escribir condiciones más complejas no puede prescindir de la lógica, pero aquí no hay mucha (Y, O y NO) y fue inventada por la gente, por lo que todo es bastante lógico.

Vayamos al final de la segunda parte.

Como puede ver, incluso podemos hablar durante mucho tiempo sobre la sintaxis básica del operador SELECT, pero para permanecer dentro del alcance del artículo, finalmente mostraré operadores lógicos adicionales: ENTRE, EN y ME GUSTA.

ENTRE: comprobar la inclusión en un rango

Valor_prueba ENTRE valor_inicial Y valor_final

Las expresiones pueden actuar como valores.

Veamos un ejemplo:

SELECCIONE ID, Nombre, Salario DE Empleados DONDE Salario ENTRE 2000 Y 3000 - que tiene un salario en el rango de 2000-3000

En realidad, BETWEEN es una notación simplificada de la forma:

SELECCIONE ID, Nombre, Salario DE Empleados DONDE Salario>=2000 Y Salario<=3000 -- все у кого ЗП в диапозоне 2000-3000

La palabra NOT se puede usar antes de la palabra ENTRE, que verificará si el valor no está dentro del rango especificado:

SELECCIONE ID, Nombre, Salario DE Empleados DONDE Salario NO ENTRE 2000 Y 3000 - similar a NO (Salario>=2000 Y Salario<=3000)

En consecuencia, si usa ENTRE, EN, LIKE, también puede combinarlas con otras condiciones usando AND y OR:

SELECCIONE ID, Nombre, Salario DE Empleados DONDE Salario ENTRE 2000 Y 3000 - que tiene un salario en el rango de 2000-3000 Y ID de Departamento=3 - tome en cuenta a los empleados del departamento 3 únicamente

EN – comprobar la inclusión en la lista de valores

Este operador tiene la siguiente forma:

Valor_prueba IN (valor1, valor2, ...)

Creo que es más fácil demostrarlo con un ejemplo:

SELECCIONE ID, nombre, salario DE los empleados DONDE ID de posición EN (3,4) - cuya posición es 3 o 4

Aquellos. esto es esencialmente lo mismo que la siguiente expresión:

SELECCIONE ID, Nombre, Salario DE Empleados DONDE PosiciónID=3 O PosiciónID=4 - cuya posición es 3 o 4

En el caso de NOT será similar (nos saldrán todos menos los de los departamentos 3 y 4):

SELECCIONE ID, nombre, salario DE los empleados DONDE ID de posición NO EN (3,4) - similar a NO (ID de posición = 3 O ID de posición = 4)

Una consulta con NOT IN también se puede expresar usando AND:

SELECCIONE ID, Nombre, Salario DE Empleados DONDE ID de posición<>3AND ID de posición<>4 - equivalente a PositionID NO EN (3,4)

Tenga en cuenta que la búsqueda de valores NULL utilizando la construcción IN no funcionará porque marcar NULL=NULL también devolverá NULL, no True:

SELECCIONE ID, Nombre, ID de departamento DE Empleados DONDE ID de departamento IN (1,2, NULL): los registros NULL no se incluirán en el resultado

En este caso, divida el cheque en varias condiciones:

SELECCIONE ID, nombre, ID de departamento DE Empleados DONDE ID de departamento EN (1,2) - 1 o 2 O ID de departamento ES NULO - o NULO

O podrías escribir algo como:

SELECCIONE ID,Nombre,IDDepartamento DE Empleados DONDE ISNULL(IDDepartamento,-1) IN(1,2,-1) - si está seguro de que no hay ningún departamento con ID=-1

Creo que la primera opción, en este caso, será más correcta y fiable. Bien, este es sólo un ejemplo para demostrar qué otras estructuras se pueden construir.

También vale la pena mencionar un error aún más insidioso asociado con NULL, que se puede cometer cuando se usa la construcción NOT IN. Por ejemplo, intentemos seleccionar todos los empleados excepto aquellos cuyo departamento es 1 o cuyo departamento no está especificado en absoluto, es decir es igual a NULO. Como solución, se sugiere la siguiente opción:

SELECCIONE ID, Nombre, ID de departamento DE Empleados DONDE ID de departamento NO EN (1, NULO)

Pero después de ejecutar la consulta, no recibiremos ni una sola fila, aunque esperábamos ver lo siguiente:

Nuevamente, la broma aquí la jugó NULL especificado en la lista de valores.

Veamos por qué ocurrió un error lógico en este caso. Ampliemos la consulta usando AND:

SELECCIONE ID, nombre, ID de departamento DE Empleados DONDE ID de departamento<>1 Y ID de departamento<>NULL: el problema se debe a esta verificación NULL; esta condición siempre devolverá NULL

Condición correcta (ID de departamento<>NULL) siempre nos dará incertidumbre aquí, es decir NULO. Ahora recuerde la tabla de verdad para el operador AND, donde (TRUE AND NULL) da NULL. Aquellos. cuando se cumple la condición izquierda (DepartmentID<>1) debido a una condición correcta indefinida, terminaremos con un valor indefinido para toda la expresión (IDDepartamento<>1 Y ID de departamento<>NULL), por lo que la cadena no se incluirá en el resultado.

La condición se puede reescribir correctamente de la siguiente manera:

SELECCIONE ID, nombre, ID de departamento DE Empleados DONDE ID de departamento NO EN (1) - o en este caso solo ID de departamento<>1 Y el ID de departamento NO ES NULO, y verifique por separado NO NULO

IN también se puede utilizar con subconsultas, pero volveremos a este formulario en partes posteriores de este tutorial.

ME GUSTA: verificar una cadena usando un patrón

Hablaré de este operador solo en su forma más simple, que es un estándar y es compatible con la mayoría de los dialectos del lenguaje SQL. Incluso de esta forma, se puede utilizar para resolver muchos problemas que requieren verificar el contenido de una cadena.

Este operador tiene la siguiente forma:

cadena_prueba COMO patrón_cadena

Se pueden utilizar los siguientes caracteres especiales en "pattern_string":

  1. El guión bajo “_” significa que cualquier carácter puede ocupar su lugar.
  2. El signo de porcentaje “%” indica que puede ser reemplazado por cualquier número de caracteres, incluido ninguno.
Veamos ejemplos con el símbolo "%" (en la práctica, por cierto, se usa con más frecuencia):

SELECCIONE ID, Nombre DE Empleados DONDE Nombre COMO "Pet%" - cuyo nombre comienza con las letras "Mascota" SELECCIONE ID, Apellido DE Empleados DONDE Apellido COMO "%ov" - cuyo apellido termina con "ov" SELECCIONE ID, Apellido DE Empleados DONDE Apellido COMO "%re%" - cuyo apellido contiene la combinación "re"

Veamos ejemplos con el símbolo “_”:

SELECCIONE ID, Apellido DE Empleados DONDE Apellido COMO "_etrov" - cuyo apellido consta de cualquier primer carácter y las letras posteriores "etrov" SELECCIONE ID, Apellido DE Empleados DONDE Apellido COMO "____ov" - cuyo apellido consta de cuatro caracteres cualesquiera y letras posteriores "ov"

Usando ESCAPE, puede especificar un carácter de escape que cancele el efecto de verificación de los caracteres especiales "_" y "%". Esta cláusula se utiliza cuando desea verificar directamente si hay un signo de porcentaje o un guión bajo en una cadena.

Para demostrar ESCAPE, pongamos basura en una entrada:

ACTUALIZAR Empleados SET FirstName="Esto es basura que contiene %" WHERE ID=1005

Y veamos qué devuelven las siguientes consultas:

SELECCIONE * DE Empleados DONDE Nombre COMO "%!%%" ESCAPE "!" -- la línea contiene el signo "%" SELECCIONAR * DE Empleados DONDE Nombre COMO "%!_%" ESCAPE "!" -- la línea contiene el signo "_"

Si necesita verificar que una cadena coincida completamente, en lugar de ME GUSTA es mejor simplemente usar el signo "=":

SELECCIONE * DE Empleados DONDE Nombre="Peter"

Sólo una nota.
En MS SQL, en la plantilla del operador LIKE, también puede especificar una búsqueda utilizando expresiones regulares, lea sobre esto en Internet si las capacidades estándar de este operador no son suficientes para usted.

ORACLE usa la función REGEXP_LIKE para buscar usando expresiones regulares.

Un poco sobre cuerdas

En caso de verificar la presencia de caracteres Unicode en una cadena, deberá colocar el carácter N antes de las comillas, es decir NORTE"…". Pero como todos los campos de caracteres de nuestra tabla están en formato Unicode (tipo nvarchar), siempre puedes usar este formato para estos campos. Ejemplo:

SELECCIONE ID, Nombre DE Empleados DONDE Nombre COMO N"Pet%" SELECCIONE ID, Apellido DE Empleados DONDE Apellido=N"Petrov"

Cuando se hace correctamente, al comparar con un campo de tipo varchar (ASCII), debe intentar usar pruebas usando "...", y al comparar un campo de tipo nvarchar (Unicode), debe intentar usar pruebas usando N" ...". Esto se hace para evitar conversiones de tipos implícitas durante la ejecución de la consulta. Usamos la misma regla al insertar (INSERT) valores en un campo o actualizarlos (ACTUALIZAR).

Al comparar cadenas, vale la pena considerar el punto de que, dependiendo de la configuración de la base de datos (intercalación), la comparación de cadenas puede no distinguir entre mayúsculas y minúsculas (cuando "Petrov" = "PETROV") o entre mayúsculas y minúsculas (cuando "Petrov"<>"PETROV").
En el caso de una configuración que distinga entre mayúsculas y minúsculas, si desea realizar una búsqueda que no distinga entre mayúsculas y minúsculas, puede, por ejemplo, convertir previamente las expresiones derecha e izquierda en una sola mayúscula o minúscula:

SELECCIONE ID, Nombre DE Empleados DONDE SUPERIOR (Nombre) COMO SUPERIOR (N"Pet%") - o INFERIOR (Nombre) COMO INFERIOR (N"Pet%") SELECCIONE ID, Apellido DE Empleados DONDE SUPERIOR (Apellido) = SUPERIOR ( N"Petrov") -- o LOWER(Apellido)=LOWER(N"Petrov")

Un poco sobre fechas

Al comprobar una fecha, puede utilizar, al igual que con las cadenas, comillas simples "...".

Independientemente de la configuración regional en MS SQL, puede utilizar la siguiente sintaxis de fecha "AAAAMMDD" (año, mes, día juntos sin espacios). MS SQL siempre entenderá este formato de fecha:

SELECCIONE ID, Nombre, Cumpleaños DE Empleados DONDE Cumpleaños ENTRE "19800101" Y "19891231" - empleados de los años 80 ORDEN POR Cumpleaños

En algunos casos, es más conveniente configurar la fecha usando la función DATEFROMPARTS:

SELECCIONE ID, Nombre, Cumpleaños DE Empleados DONDE Cumpleaños ENTRE FECHA DE PARTES (1980,1,1) Y FECHA DE PARTES (1989,12,31) ORDEN POR Cumpleaños

También hay una función similar DATETIMEFROMPARTS, que se utiliza para configurar la fecha y la hora (para el tipo de fecha y hora).

También puede utilizar la función CONVERTIR si necesita convertir una cadena a un valor de fecha o fecha y hora:

SELECCIONAR CONVERTIR (fecha, "12.03.2015", 104), CONVERTIR (fecha y hora, "2014-11-30 17:20:15", 120)

Los valores 104 y 120 indican qué formato de fecha se utiliza en la cadena. Puede encontrar una descripción de todos los formatos válidos en la biblioteca MSDN buscando "MS SQL CONVERT".

Hay muchas funciones para trabajar con fechas en MS SQL, busque "funciones de ms sql para trabajar con fechas".

Nota. Todos los dialectos del lenguaje SQL tienen su propio conjunto de funciones para trabajar con fechas y aplican su propio enfoque para trabajar con ellas.

Un poco sobre los números y sus transformaciones.

La información de esta sección probablemente será más útil para los especialistas en TI. Si no lo es y su objetivo es simplemente aprender a escribir consultas para obtener la información que necesita de la base de datos, es posible que no necesite tales sutilezas, pero en cualquier caso, puede leer rápidamente el texto y tomar notas. , porque . Si ha comenzado a estudiar SQL, entonces ya se está uniendo a TI.

A diferencia de la función de conversión CAST, la función CONVERT puede especificar un tercer parámetro, que es responsable del estilo (formato) de conversión. Los diferentes tipos de datos pueden tener su propio conjunto de estilos, lo que puede afectar el resultado devuelto. Ya hemos tocado el uso de estilos al considerar la conversión de una cadena usando la función CONVERTIR en los tipos de fecha y fecha y hora.

Puede leer más sobre las funciones y estilos CAST, CONVERT en MSDN - “Funciones CAST y CONVERT (Transact-SQL)”: msdn.microsoft.com/ru-ru/library/ms187928.aspx

Para simplificar los ejemplos, aquí se utilizarán las declaraciones del lenguaje Transact-SQL DECLARE y SET.

Por supuesto, en el caso de convertir un número entero a un número real (que mencioné al comienzo de esta lección para demostrar la diferencia entre división entera y real), el conocimiento de los matices de la conversión no es tan crítico. porque allí hicimos una conversión de entero a real (cuyo rango es mucho mayor que el rango de números enteros):

DECLARAR @min_int int SET @min_int=-2147483648 DECLARAR @max_int int SET @max_int=2147483647 SELECCIONAR -- (-2147483648) @min_int,CAST(@min_int AS float),CONVERTIR(float,@min_int), -- 2147483647 @max_int ,CAST(@max_int AS float),CONVERTIR(float,@max_int), -- numérico(16,6) @min_int/1., -- (-2147483648.000000) @max_int/1. -- 2147483647.000000

Quizás no valía la pena especificar el método de conversión implícita obtenida al dividir por (1.), porque Es recomendable intentar hacer conversiones explícitas para tener un mayor control sobre el tipo de resultado obtenido. Aunque, si queremos obtener un resultado de tipo numérico, con el número especificado de dígitos después del punto decimal, entonces podemos usar un truco en MS SQL para multiplicar un valor entero por (1., 1.0, 1.00, etc.) :

DECLARAR @int int SET @int=123 SELECT @int*1., -- numérico(12, 0) - 0 decimales @int*1.0, -- numérico(13, 1) - 1 decimal @int*1.00, -- numeric(14, 2) - 2 caracteres -- aunque a veces es mejor hacer una conversión explícita CAST(@int AS numeric(20, 0)), -- 123 CAST(@int AS numeric(20, 1) ), -- 123.0 CAST(@int AS numérico(20, 2)) -- 123.00

En algunos casos, los detalles de la conversión pueden ser realmente importantes, porque... afectan la exactitud del resultado obtenido, por ejemplo, en el caso de que se realice una conversión de un valor numérico a una cadena (varchar). Veamos ejemplos de conversión de dinero y valores flotantes a varchar:

Comportamiento al convertir dinero a varchar DECLARE @money money SET @money = 1025.123456789: habrá una conversión implícita a 1025.1235, porque el tipo de dinero almacena solo 4 dígitos después del punto decimal SELECT @money, -- 1025.1235 -- de forma predeterminada, CAST y CONVERT se comportan igual (es decir, en términos generales, se aplica el estilo 0) CAST(@money as varchar(20)) , -- 1025.12 CONVERT(varchar(20), @money), -- 1025.12 CONVERT(varchar(20), @money, 0), -- 1025.12 (estilo 0 - sin separador de milésimas y 2 decimales (formato predeterminado)) CONVERT( varchar(20), @money, 1), -- 1.025.12 (estilo 1 - usa un separador de milésimas y 2 decimales) CONVERT(varchar(20), @money, 2) -- 1025.1235 (estilo 2 - sin separador y 4 números después del punto decimal)

Comportamiento al convertir float a varchar DECLARE @float1 float SET @float1 = 1025.123456789 DECLARE @float2 float SET @float2 = 1231025.123456789 SELECT @float1, -- 1025.123456789 @float2, -- 1231025 .12345679 -- Por defecto , CAST y CONVERT se comportan igual (es decir, en términos generales, se utiliza el estilo 0) -- estilo 0 - No más de 6 dígitos. La notación exponencial se usa por necesidad: aquí suceden cosas realmente aterradoras al convertir a varchar CAST(@float1 as varchar(20)), -- 1025.12 CONVERT(varchar(20), @float1), -- 1025.12 CONVERT(varchar( 20 ), @float1, 0), -- 1025.12 CAST(@float2 como varchar(20)), -- 1.23103e+006 CONVERTIR(varchar(20), @float2), -- 1.23103e+006 CONVERTIR(varchar( 20 ), @float2, 0), -- 1.23103e+006 -- estilo 1 - Siempre 8 dígitos. Siempre se utiliza la notación científica para los números.

-- este estilo para float tampoco es muy preciso CONVERT(varchar(20), @float1, 1), -- 1.0251235e+003 CONVERT(varchar(20), @float2, 1), -- 1.2310251e+006 - - estilo 2 - Siempre 16 bits. Siempre se utiliza la notación científica para los números.

Si necesita controlar explícitamente la precisión hasta un determinado signo, más de 4, a veces es mejor utilizar el tipo decimal/numérico para almacenar datos. Si 4 caracteres son suficientes, entonces puede usar el tipo de dinero; corresponde aproximadamente a numérico(20,4).

Decimal y numérico DECLARAR @money money SET @money = 1025.123456789 -- 1025.1235 DECLARAR @float1 float SET @float1 = 1025.123456789 DECLARAR @float2 float SET @float2 = 1231025.123456789 DECLARAR @numer ic numeric(28,9) SET @ numérico = 1025.123456789 SELECCIONAR CAST ( @numeric como varchar(20)), -- 1025.12345679 CONVERTIR(varchar(20), @numeric), -- 1025.12345679 CAST(@money as numeric(28,9)), -- 1025.123500000 CAST(@float1 como numérico( 28,9)), -- 1025.123456789 CAST(@float2 como numérico(28,9)) -- 1231025.123456789

Nota.
Desde la versión MS SQL 2008, puede utilizar la siguiente construcción:
  • servidor ms sql
  • Agregar etiquetas

    La base del lenguaje SQL son los operadores, divididos condicionalmente en varios grupos según las funciones que realizan. Se pueden distinguir los siguientes grupos de sentencias (no se enumeran todas las sentencias SQL):

    Declaraciones ddl (lenguaje de definición de datos)

    Declaraciones DDL: declaraciones de definición de objetos de base de datos

      CREAR ESQUEMA: crear un esquema de base de datos

      DROP SHEMA: eliminar un esquema de base de datos

      CREAR TABLA - crear una tabla

      ALTER TABLE - cambiar la tabla

      DROP TABLE - eliminar una tabla

      CREAR DOMINIO - crear un dominio

      ALTER DOMINIO - cambiar dominio

      DROP DOMAIN - eliminar un dominio

      CREAR COLABORACIÓN: crear una secuencia

      DROP COLLATION - eliminar una secuencia

      CREAR VISTA - crear una vista

      DROP VIEW: eliminar una vista

    declaraciones dml (lenguaje de manipulación de datos)

    Declaraciones DML: declaraciones de manipulación de datos

      SELECCIONAR: seleccionar filas de tablas

      INSERTAR: agregar filas a la tabla

      ACTUALIZACIÓN: cambiar filas en una tabla

      ELIMINAR: eliminar filas en la tabla

      COMMIT: confirma los cambios realizados

      ROLLBACK: revertir los cambios realizados

    Operadores de protección y gestión de datos

      CREAR ASERCIÓN - crear una restricción

      DROP ASSERTION - eliminar una restricción

      GRANT: otorga privilegios a un usuario o aplicación para manipular objetos

      REVOKE: revocar privilegios de usuario o aplicación

    Además, existen grupos de operadores para configurar parámetros de sesión, obtener información sobre la base de datos, operadores de SQL estático y operadores de SQL dinámico. Las más importantes para el usuario son las declaraciones de manipulación de datos (DML).

    Ejemplos de uso de operadores de manipulación de datos

    INSERTAR: insertar filas en una tabla

    Ejemplo 1 . Insertar una fila en una tabla:

    VALORES(4, "Ivánov");

    Ejemplo 2 . Insertar en una tabla varias filas seleccionadas de otra tabla (los datos sobre proveedores de la tabla P con números mayores que 2 se insertan en la tabla TMP_TABLE):

    TMP_TABLE (PNUM, PNAME)

    SELECCIONAR PNUM, PNOMBRE

    DONDE P.PNUM>2;

    ACTUALIZACIÓN: actualización de filas en una tabla

    Ejemplo 3 . Actualice varias filas en una tabla:

    SET PNAME = "Púshnikov"

    DONDE P.PNUM = 1;

    ELIMINAR: eliminar filas en una tabla

    Ejemplo 4 . Eliminar varias filas en una tabla:

    DONDE P.PNUM = 1;

    Ejemplo 5 . Eliminar todas las filas de una tabla:

    Ejemplos de uso de la declaración SELECT

    La declaración SELECT es en realidad la declaración SQL más compleja y crítica para el usuario. Está destinado a recuperar datos de tablas, es decir. de hecho, implementa uno de los propósitos principales de la base de datos: proporcionar información al usuario.

    La sentencia SELECT siempre se ejecuta sobre algunas de las tablas que forman parte de la base de datos.

    Comentario. De hecho, las bases de datos pueden contener no sólo tablas almacenadas permanentemente, sino también tablas temporales y las llamadas vistas. Las vistas son simplemente expresiones SELECT almacenadas en la base de datos. Desde el punto de vista del usuario, una vista es una tabla que no se almacena permanentemente en la base de datos, sino que "aparece" cuando se accede a ella. Desde el punto de vista de la instrucción SELECT, tanto las tablas persistentes como las tablas y vistas temporales tienen exactamente el mismo aspecto. Por supuesto, cuando el sistema realmente ejecuta una instrucción SELECT, se tienen en cuenta las diferencias entre las tablas y vistas almacenadas, pero estas diferencias oculto del usuario.

    El resultado de una declaración SELECT es siempre una tabla. Por tanto, los resultados de la instrucción SELECT son similares a los operadores del álgebra relacional. Cualquier operador de álgebra relacional se puede expresar mediante una declaración SELECT redactada adecuadamente. La complejidad de la declaración SELECT está determinada por el hecho de que contiene todas las capacidades del álgebra relacional, así como capacidades adicionales que no están presentes en el álgebra relacional.



    
    Arriba