"Commandes SQL (y compris des exemples de phrases) version bien organisée (2)"
- Aller à "Commandes SQL (y compris des phrases d'exemple) version bien organisée (1)
- 8 fonctions
- 9 sous-requêtes
Aller à "Commandes SQL (y compris des phrases d'exemple) version bien organisée (1)
8 fonctions
8.1 Fonctions de traitement de texte
fonction | illustrer |
---|---|
GAUCHE() | (ou utilisez la fonction substring) renvoie les caractères à gauche de la chaîne |
LONGUEUR() | (Utilisez également DATALENGTH() ou LEN()) Renvoie la longueur de la chaîne |
INFÉRIEUR() | (Access utilise LCASE()) pour convertir la chaîne en minuscules |
LTRIM() | Supprimer les espaces à gauche de la chaîne |
DROITE() | (ou utilisez la fonction substring) renvoie les caractères à droite de la chaîne |
RTRIM() | Supprimer les espaces à droite de la chaîne |
SOUNDEX() | Renvoie la valeur SOUNDEX d'une chaîne |
SUPÉRIEUR() | (Access utilise UCASE()) pour convertir les chaînes en majuscules |
8.2 Fonctions de traitement numérique
fonction | illustrer |
---|---|
ABDOS() | renvoie la valeur absolue d'un nombre |
CS() | Renvoie le cosinus d'un angle |
EXP() | Renvoie la valeur de l'exposant d'un nombre |
PI() | retour pi |
PÉCHÉ() | Renvoie le sinus d'un angle |
CARRÉ() | Renvoie la racine carrée d'un nombre |
BRONZER() | Renvoie la tangente d'un angle |
8.3 Fonctions de traitement du temps
fonction | illustrer |
---|---|
maintenant() | date du jour |
curé() | date actuelle |
heure actuelle() | heure actuelle |
Différence de temps | DATE_ADD() # Ajoute l'intervalle de temps spécifié à la date DATE_SUB() # Soustrait l'intervalle de temps spécifié de la date Par exemple : DATE_SUB(curdate(), INTERVAL 7 DAY) moins sept jours à partir de la date actuelle |
Fonction de décalage horaire timestampdiff |
Syntaxe : timestampdiff(unit, begin, end) begin et end peuvent être de type DATE ou DATETIME, et les paramètres peuvent être de types mixtes. |
8.3.1 Convertir l'horodatage au format personnalisé from_unixtime
fonction | illustrer |
---|---|
Format | from_unixtime(timestamp(horodatage à convertir),'%Y-%m-%d %h:%i:%s') |
%Y années | 4e place, 2023 |
%y | année, 2 chiffres, 23 |
%M | nom du mois |
%m | mois, valeur (00-12) |
%D | jour du mois avec préfixe anglais |
%d | Jour du mois, valeur (00-31) |
%Son | 00:00:00 |
8.3.2 Convertir le format d'heure CONVERT()
fonction | illustrer |
---|---|
Format | CONVERT(expr,type) expr : la valeur à convertir type : le type de données à convertir |
DATE | Convertir expr au format 'AAAA-MM-JJ' |
DATEHEURE | Convertir expr au format 'AAAA-MM-JJ HH:MM:SS' |
TEMPS | Convertir expr au format 'HH:MM:SS' |
CARBONISER | Convertit expr au format CHAR (chaîne de caractères de longueur fixe) |
SIGNÉ | Convertir expr au format INT (entier signé) |
NON SIGNÉ | Convertir expr au format INT (entier non signé) |
DÉCIMAL | Convertir expr au format FLOAT (virgule flottante) |
BINAIRE | Convertir expr au format binaire |
8.3.3 Obtenir l'heure du système
fonction | illustrer |
---|---|
SGBD | fonction/variable |
Accès | MAINTENANT() |
DB2 | DATE ACTUELLE |
MySQL | DATE ACTUELLE() |
Oracle | SYSDATE |
PostgreSQLName | DATE ACTUELLE |
serveur SQL | AVOIR UN RENDEZ-VOUS() |
SQLiteName | Date('maintenant') |
8.4 fonction d'agrégation (fonction d'agrégation)
fonction | illustrer |
---|---|
MOY() | renvoie la moyenne d'une colonne |
COMPTER() | Renvoie le nombre de lignes dans une colonne |
MAX() | renvoie la valeur maximale d'une colonne |
MIN() | renvoie la valeur minimale d'une colonne |
SOLEIL() | Renvoie la somme des valeurs dans une colonne |
Exemple : composition de fonctions d'agrégation | 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 |