"Comandos SQL (incluyendo oraciones de ejemplo) versión bien organizada (2)"
- Saltar a "Comandos SQL (incluyendo oraciones de ejemplo) versión bien organizada (1)
- 8 funciones
- 9 subconsultas
Saltar a "Comandos SQL (incluyendo oraciones de ejemplo) versión bien organizada (1)
8 funciones
8.1 Funciones de procesamiento de texto
función | ilustrar |
---|---|
IZQUIERDA() | (o use la función de subcadena) devuelve los caracteres a la izquierda de la cadena |
LONGITUD() | (También use DATALENGTH() o LEN()) Devuelve la longitud de la cadena |
MÁS BAJO() | (Access usa LCASE()) para convertir la cadena a minúsculas |
LTRIM() | Eliminar espacios de la izquierda de la cadena. |
BIEN() | (o use la función de subcadena) devuelve los caracteres a la derecha de la cadena |
RTRIM() | Eliminar espacios de la derecha de la cadena. |
SOUNDEX() | Devuelve el valor SOUNDEX de una cadena |
SUPERIOR() | (Access usa UCASE()) para convertir cadenas a mayúsculas |
8.2 Funciones de procesamiento numérico
función | ilustrar |
---|---|
ABDOMINALES() | devuelve el valor absoluto de un número |
COS() | Devuelve el coseno de un ángulo. |
EXP() | Devuelve el valor del exponente de un número. |
PI() | volver pi |
PECADO() | Devuelve el seno de un ángulo. |
SQRT() | Devuelve la raíz cuadrada de un número |
BRONCEARSE() | Devuelve la tangente de un ángulo. |
8.3 Funciones de procesamiento de tiempo
función | ilustrar |
---|---|
ahora() | fecha actual fecha |
curdate() | fecha actual |
horario de atención() | tiempo actual |
Diferencia horaria | DATE_ADD() # Agrega el intervalo de tiempo especificado a la fecha DATE_SUB() # Resta el intervalo de tiempo especificado de la fecha Por ejemplo: DATE_SUB(curdate(), INTERVAL 7 DAY) menos siete días desde la fecha actual |
Función de diferencia horaria timestampdiff |
Sintaxis: timestampdiff(unit, begin, end) begin y end pueden ser de tipo DATE o DATETIME, y los parámetros pueden ser de tipos mixtos. |
8.3.1 Convertir marca de tiempo a formato personalizado from_unixtime
función | ilustrar |
---|---|
Formato | from_unixtime(timestamp(timestamp a convertir),'%Y-%m-%d %h:%i:%s') |
%Y años | 4to lugar, 2023 |
%y | año, 2 dígitos, 23 |
%METRO | nombre del mes |
%metro | mes, valor (00-12) |
%D | dia del mes con prefijo ingles |
%d | Día del mes, valor (00-31) |
%Su | 00:00:00 |
8.3.2 Convertir formato de hora CONVERT()
función | ilustrar |
---|---|
Formato | CONVERT(expr,tipo) expr: el valor a convertir tipo: el tipo de datos a convertir |
FECHA | Convertir expr al formato 'YYYY-MM-DD' |
FECHA Y HORA | Convertir expr al formato 'YYYY-MM-DD HH:MM:SS' |
TIEMPO | Convertir expr al formato 'HH:MM:SS' |
CARBONIZARSE | Convierta el formato expr a CHAR (cadena de caracteres de longitud fija) |
FIRMADO | Convertir expr a formato INT (entero con signo) |
NO FIRMADO | Convertir expr a formato INT (entero sin signo) |
DECIMAL | Convertir expr a formato FLOAT (coma flotante) |
BINARIO | Convertir expr a formato binario |
8.3.3 Obtener la hora del sistema
función | ilustrar |
---|---|
SGBD | función/variable |
Acceso | AHORA() |
DB2 | FECHA ACTUAL |
mysql | FECHA ACTUAL() |
Oráculo | FECHA DEL SISTEMA |
postgresql | FECHA ACTUAL |
servidor SQL | OBTENER LA FECHA() |
SQLite | Fecha('ahora') |
8.4 función agregada (función agregada)
función | ilustrar |
---|---|
PROMEDIO() | devuelve el promedio de una columna |
CONTAR() | Devuelve el número de filas en una columna |
MÁX.() | devuelve el valor máximo de una columna |
MIN() | devuelve el valor mínimo de una columna |
SOL() | Devuelve la suma de los valores de una columna |
Ejemplo: composición de funciones agregadas | SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM Products |
COALESCE
按顺序对其参数求值并返回第一个非NULL值。仅当所有参数均为NULL时结果才为NULL。
为消息中可能不存在的字段提供缺省值。
表达式:COALESCE(Body.Salary,0) ,
如果消息中有SALARY字段,将返回它的值,如果该字段不存在,将返回0.
9 子查询
9.1 子查询
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
9.2 GROUP BY & ORDER BY
例1:SELECT vend_id,count() AS num_prods FROM Products GROUP BY vend_id
例2:SELECT cust_id,count() AS orders FROM Orders GROUP BY cust_id HAVING COUNT() >=2
9.3 分组排序 (row_number()over())
(1)对查询结果进行排序(无分组)
SELECT empno,WORKDEPT,SALARY,Row_Number() OVER (partition by workdept ORDER BY salary desc) rank FROM employee
empno | WORKDEPT | SALARY | Row_Number() |
---|---|---|---|
000010 | A00 | 152750 | 1 |
000110 | A00 | 66500 | 2 |
000120 | A00 | 49250 | 3 |
200010 | A00 | 46500 | 4 |
200120 | A00 | 39250 | 5 |
000020 | B01 | 94250 | 1 |
000030 | C01 | 98250 | 1 |
000130 | C11 | 73800 | 2 |
(2)对查询结果进行排序(无分组)
SELECT empno,WORKDEPT,SALARY,Row_Number() OVER (ORDER BY salary desc) rank FROM employee
empno | WORKDEPT | SALARY | Row_Number() |
---|---|---|---|
000010 | A00 | 152750 | 1 |
000030 | C01 | 98250 | 2 |
000070 | D21 | 96170 | 3 |
000020 | B01 | 94250 | 4 |
000090 | E11 | 89750 | 5 |
000100 | E21 | 86150 | 6 |
000050 | E01 | 80175 | 7 |
000130 | C11 | 73800 | 8 |
000060 | D11 | 72250 | 9 |
小结:row_number() over()和rownum差不多,功能更强一点。(可以在各个分组内从1开始排序)
(3)rank() over() 是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
SELECT WORKDEPT,SALARY,rank() OVER (partition by workdept ORDER BY salary ) as dense_rank_order FROM emp order by workdept
WORKDEPT | SALARY | rank() |
---|---|---|
A00 | 39250 | 1 |
A00 | 46500 | 2 |
A00 | 49250 | 3 |
A00 | 66500 | 4 |
A00 | 152750 | 5 |
B01 | 94250 | 1 |
C01 | 68420 | 1 |
C01 | 68420 | 1 |
C01 | 73800 | 3 |
(4)dense_rank() over() 是连续排序,有两个第二名时仍然跟着第三名。相比之下,row_number是没有重复值的
SELECT WORKDEPT,SALARY,dense_rank() OVER (partition by workdept ORDER BY salary ) as dense_rank_order FROM emp order by workdept
WORKDEPT | SALARY | dense_rank() |
---|---|---|
A00 | 39250 | 1 |
A00 | 46500 | 2 |
A00 | 49250 | 3 |
A00 | 66500 | 4 |
A00 | 152750 | 5 |
B01 | 94250 | 1 |
C01 | 68420 | 1 |
C01 | 68420 | 1 |
C01 | 72420 | 2 |
C01 | 73800 | 3 |