- 执行顺序:
FROM > ON > JOIN > WHERE > GROUP BY > HAVING > SELECT > ORDER BY
- 模糊查询:
LIKE + %(通配符) 如:LIKE '%A%'
LIKE + (占位符) 如:LIKE 'A_'
IN
NOT IN
JOB IN ('SALESMAN','CLERK')
BETWEEN ... AND ...
NOT BETWEEN... AND ...
5.查询去重 DISTINCT
SELECT DISTINCT DEPTNO,JOB FROM EMP
6.查询排序 ORDER BY
ASC 升序可以省略,默认由小到大排序即升序排列;
DESC 降序
SELECT EMPNO,ENAME,DEPTNO,SAL FROM EMP
ORDER BY DEPTNO,SAL DESC;
- 关键词:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
VARCHAR2
NUMBER
DATE
SUM()、和
AVG()、平均值
COUNT()、总个数
MAX()、最大值
MIN()、最小值
MEDIAN() 中间值
OVER() 开窗函数:
SELECT EMPNO,ENAME,SAL,SUM(SAL)OVER() FROM EMP;
- 去null
NVL(COMM,0)
- 约束
PRIMARY KEY 主键约束
NOT NULL 非空约束
DEFAULT 0 无约束,默认为0
DEFAULT SYSDATE 添加系统时间为默认入职时间
①加别名 AS
SELECT SUM(SAL) AS 合计工资,
AVG(SAL) 平均工资, -- 这里省略了 AS
COUNT(*) AS CT, -- 工作中表头和表名尽量用英文表示
MAX(SAL) AS MAX_SAL1, -- 可以使用英文 + 下划线 + 数字表示,注意不能数字开头
FROM EMP;
②虚拟列 AS
CREATE TABLE PRORE(ID NUMBER,
名称 VARCHAR2(20),
数量 NUMBER,
单价 NUMBER,
金额 AS (数量 * 单价), -- 虚拟列:由数量乘以单价得来
其他名称 AS (名称||'国产') -- 虚拟列:由名称拼接国产得来
);
SELECT * FROM PRORE;
-
ASCII码
-
删除语句:
----删除表结构和数据:DORP (DDL)
----删除指定条件数据语句:DELETE (DML)
----删除所有数据语句:TRUNCATE (DDL)不能回滚
① CONSTRAINT 限制
② COMMIT; 提交
( TCL 语句)
③ ROLLBACK; 回滚
④ COMMENT 注释
COMMENT ON TABLE EMP240515 IS '这是一个员工表,用于存储员工的相关信息';--给表添加注释
COMMENT ON COLUMN EMP240515.EMPNO IS '这是一个员工号';--给EMMPNO添加注释
COMMENT ON COLUMN EMP240515.HIREDATE IS '默认获取系统时间为入职时间';--给HIREDATE添加注释
- 集合:
UNION ALL(并集),
UNION(并集),
INTERSECT(交集),
MINUS(补集)
SELECT DEPTNO FROM DEPT --4 A
MINUS
SELECT DEPTNO FROM EMP --14 B A-B
- 分组拼接明细数据: LISTAGG
SELECT JOB,COUNT(*),SUM(SAL),
LISTAGG(ENAME,' , ')WITHIN GROUP(ORDER BY SAL) AS ENAME,
LISTAGG(SAL,' < ')WITHIN GROUP(ORDER BY SAL) AS SAL
FROM EMP
GROUP BY JOB
-- MYSQL分组拼接明细数据
SELECT JOB,GROUP_CONCAT(ENAME SEPARATOR ',')
FROM EMP
GROUP BY JOB;
ORACLE函数
分为系统函数和自定义函数
--系统函数又分为:单行函数、聚合函数、开窗函数/分析函数
--单行函数又分为:数字函数、字符函数、日期函数
--数字函数
①ABS() --取绝对值
②ROUND(X,Y) --对数字X保留Y位小数,并进行四舍五入
SELECT ROUND(3.146,2) FROM DUAL; --3.15
SELECT ROUND(3.141) FROM DUAL; --3
③TRUNC(X,Y) --对数字X保留Y位小数,但不会进行 四舍五入
SELECT TRUNC(3.146,2) FROM DUAL; --3.14
SELECT TRUNC(3.646) FROM DUAL; --3
④POWER(X,Y) --返回X的Y次方,求幂
SELECT POWER(3,2) FROM DUAL; --9
⑤MOD(X,Y) --对X取Y的余数
SELECT MOD(5,2) FROM DUAL ; --1
--日期函数
--日期-日期=天数
系统时间:SYSDATE
SELECT SYSDATE - TO_DATE('2026-8-1','YYYY-MM-DD') FROM DUAL;
--日期+数字=日期SELECT SYSDATE + 7 FROM DUAL; --2026/8/31 9:37:12
①ROUND(日期,截取单位)
SELECT ROUND(TO_DATE('20260824133423','YYYYMMDDHH24MISS'),'DD') FROM DUAL; --2026/8/25
SELECT ROUND(TO_DATE('20260813','YYYYMMDD'),'MM') FROM DUAL; --2026/8/01
SELECT ROUND(TO_DATE('20260413','YYYYMMDD'),'YYYY') FROM DUAL;--2026/1/01
②TRUNC(日期,截取单位) --用法跟ROUND一致,唯一区别是TRUNC不会四舍五入
③ADD_MONTHS(日期,数字) --返回几个月之后的当前时间
SELECT ADD_MONTHS(SYSDATE,2) FROM DUAL; --2026/10/24 9:45:55
SELECT ADD_MONTHS(SYSDATE,-2) FROM DUAL; --2026/6/24 9:46:10
④LAST_DAY(日期) --返回日期对应月份的最后一天
SELECT LAST_DAY(SYSDATE) FROM DUAL;
⑤MONTHS_BETWEEN(日期,日期) --返回两个日期相差的月份数
SELECT MONTHS_BETWEEN(SYSDATE,TO_DATE('20260521','YYYYMMDD')) FROM DUAL; --3.11084826762246
--字符函数
LENGTH() --返回字符串的长度
SELECT LENGTH('SCOTT') FROM DUAL; --5
--去空值时好用
REPLACE(X,Y,Z) --将字符串X中的Y替换成Z,Z不写默认替换成空值
SELECT REPLACE('SCOTT','S','T') FROM DUAL;
INSTR(X,Y,Z,M) --查找字符串X中字符Y的位置,从第Z为开始找,找第M次出现Y的位置
--示例:查找字符串'ABCDEFCG'中第一次出现C的位置
SELECT INSTR('ABCDEFCG','C',1,1) FROM DUAL; --3
SELECT INSTR('ABCDEFCG','C',4,2) FROM DUAL; --0
SUBSTR(X,Y,Z)
--截取函数,对字符串X进行截取,从第Y为开始截
--截取Z为长度,Y为负数时表示从右往左数,Z不写表示截取第Y为之后的所有字符
SELECT SUBSTR('20260824',1,4) FROM DUAL;
--2026
⑥CONCAT(X,Y) --拼接字符串X和Y,一次只能拼接两个参数
SELECT CONCAT('2026','08') FROM DUAL;
--202608
SELECT CONCAT(CONCAT('2026','08'),'24') FROM DUAL;
--20260824
⑦|| --管道符,也可以拼接多个字符串
WM_CONCAT() --拼接整个字段的值,默认用逗号拼接:
SELECT WM_CONCAT(ENAME) FROM EMP;
将EMP表的工作用横杠"-"拼接起来,并且不能重复
--输出:CLERK-SALESMAN-MANAGER-ANALYST-PRESIDENT
SELECT REPLACE(WM_CONCAT(DISTINCT JOB),',','-') FROM EMP
UPPER() 小写转大写
LOWER() 大写转小写
TRIM() --去左右空格
SELECT TRIM(' A B C ') FROM DUAL; --A B C
LTRIM() --去左空格SELECT LTRIM(' A B C ') FROM DUAL; --A B C
RTRIM() --去右空格SELECT RTRIM(' A B C ') FROM DUAL; -- A B C
--函数总结:分析函数/开窗函数:可以同时输出明细数据和聚合值
主要有聚合型和非聚合型
--聚合型
SUM/AVG/MAX/MIN/COUNT()OVER(PARTITION BY ...ORDER BY ...)
--加了ORDER BY 有累计效果
--非聚合型
RATIO_TO_REPORT()OVER(PARTITION BY ...) --占比函数
FIRST_VALUE()OVER(PARTITION BY ...ORDER BY ...) --取第一个值
NTILE()OVER(PARTITION BY ...ORDER BY ...) --切片函数
WM_CONCAT()OVER(PARTITION BY ...ORDER BY ...) --拼接函数
--排名
ROW_NUMBER()OVER(PARTITION BY ...ORDER BY ...) --不考虑并列,1 2 3 4
RANK()OVER(PARTITION BY ...ORDER BY ...) --考虑并列,并空出排名,1 2 2 4
DENSE_RANK()OVER(PARTITION BY ...ORDER BY ...) --考虑并列,不会空出排名,1 2 2 3
--偏移
LAG()OVER(PARTITION BY ...ORDER BY ...) --向上偏移
LEAD()OVER(PARTITION BY ...ORDER BY ...) --向下偏移
--注意:分析函数不能直接用在WHERE之后,一般分析函数不会跟GROUP BY 一起使用