本文整理了SQL基础语法分类总结表包含9大核心知识点1. 基础查询SELECT/别名2. 条件查询WHERE数值/字符/日期比较3. 范围查询BETWEEN/IN4. 模糊查询LIKE通配符5. 空值处理IS NULL/NVL6. 组合条件AND/OR/NOT优先级7. 排序ORDER BY单/多字段8. 执行顺序WHERE→SELECT→ORDER BY9. 万能表DUAL应用。通过分类表格和示例代码系统梳理了SQL查询的核心语法要点便于学习者快速查阅和复习。总结梳理老师的课堂笔记重点是使用表格分类总结提到的sql方便学生复习和学习以下是根据您的课堂笔记整理的SQL知识分类总结表格涵盖基础查询、条件筛选、范围匹配、模糊查询、空值处理、组合条件、排序及万能表等内容便于学生快速复习和查阅。一、基础查询与别名类别语法示例查询指定列SELECT 列1, 列2 FROM 表名;SELECT ENAME, SAL FROM EMP;查询所有列SELECT * FROM 表名;SELECT * FROM EMP;列别名列名 AS 别名或列名 别名SELECT SAL AS 薪资 FROM EMP;表别名表名 别名SELECT e.ENAME FROM EMP e;二、条件查询WHERE类别运算符示例数值比较, , , , , , !WHERE SAL 1000字符串比较需单引号区分大小写WHERE JOB CLERK日期比较TO_CHAR(日期,格式)或TO_DATE(字符串,格式)WHERE TO_CHAR(HIREDATE,YYYY) 1981三、日期处理函数函数说明示例TO_CHAR(日期,格式)日期 → 字符串TO_CHAR(HIREDATE,YYYY-MM)→1981-05TO_DATE(字符串,格式)字符串 → 日期TO_DATE(19810501,YYYYMMDD)SYSDATE当前系统时间SELECT SYSDATE FROM DUAL;日期格式YYYY年MM月DD日HH24小时MI分钟SS秒四、范围查询语法含义示例BETWEEN M AND N[M, N] 闭区间WHERE SAL BETWEEN 800 AND 1600NOT BETWEEN M AND N不在区间内WHERE SAL NOT BETWEEN 1000 AND 3000IN (值1, 值2, ...)在集合中WHERE DEPTNO IN (10, 20)NOT IN (...)不在集合中WHERE JOB NOT IN (SALESMAN,MANAGER)五、模糊查询LIKE通配符含义示例%匹配0个或多个字符WHERE ENAME LIKE S%S开头_匹配1个字符WHERE ENAME LIKE _L%第二位是LNOT LIKE反向模糊匹配WHERE ENAME NOT LIKE %K%ESCAPE \转义通配符如%或_WHERE ENAME LIKE %\%% ESCAPE \六、空值处理NULL语法/函数说明示例IS NULL判断为空WHERE COMM IS NULLIS NOT NULL判断非空WHERE MGR IS NOT NULLNVL(字段, 缺省值)空值替换SAL NVL(COMM, 0)注意NULL NULL返回False必须用IS NULL0不是空值有占位符。NULL 参与排序的时候默认是最大值。七、组合条件AND / OR / NOT运算符优先级说明NOT最高取反AND中等同时满足OR最低满足其一即可示例WHERE DEPTNO 20 AND JOB MANAGER OR DEPTNO 30 AND JOB SALESMAN等价于(DEPTNO 20 AND JOB MANAGER) OR (DEPTNO 30 AND JOB SALESMAN)八、排序ORDER BY语法说明示例ORDER BY 字段 ASC升序默认可省略ORDER BY ENAMEORDER BY 字段 DESC降序ORDER BY SAL DESC多字段排序先按第一字段再按第二字段ORDER BY DEPTNO, SAL DESCNULL 值排序默认作为最大值ORDER BY COMM DESC NULLS LAST可以在ORDER BY中使用列别名例如ORDER BY 月薪 DESC九、查询执行顺序逻辑理解textFROM 表名 WHERE 行级筛选 SELECT 列投影 ORDER BY 排序示例中SAL NVL(COMM,0) 1500是在WHERE中执行别名月薪只能在ORDER BY中使用。十、万能表 DUAL用途示例查询常量SELECT 1 FROM DUAL;系统时间SELECT SYSDATE FROM DUAL;无需表数据的计算SELECT 3*7 FROM DUAL;DUAL这个概念是Oracle独有的不过其他数据库也有各自的实现方式来达到相同的目的。可以把DUAL理解成一个由Oracle数据库自动创建的、只有一行一列的万能小表。Oracle中的 DUAL本质属于 SYS 用户的一张真实存在的物理表但所有用户都可以直接使用。结构只有一个叫DUMMY的列类型是VARCHAR2(1)里面只存放了一行数据值为X。设计目的为了满足 SQL 的语法要求SELECT语句必须跟一个FROM子句提供一个做简单计算或查询系统变量如SYSDATE的占位符。其他数据库的替代方案就像 可口可乐 是一个特定品牌名而其他品牌叫 可乐 一样。虽然很多数据库没有叫DUAL的表但都用各自的语法实现了同样的功能。数据库实现方式示例写法Oracle使用系统内置的DUAL表SELECT SYSDATE FROM DUAL;MySQL不强制使用FROM可直接查询但为了兼容也接受DUAL语法SELECT NOW();(也支持SELECT NOW() FROM DUAL;)PostgreSQL不强制使用FROM可直接查询SELECT CURRENT_TIMESTAMP;SQL Server不强制使用FROM可直接查询SELECT GETDATE();DB2使用SYSIBM.DUAL系统表SELECT CURRENT DATE FROM SYSIBM.DUAL;SQLite不强制使用FROM可直接查询SELECT DATE(now);可以看到除了 Oracle 和个别数据库像 MySQL、PostgreSQL、SQL Server 等已经不需要特意用一张表来充当占位符了**直接写SELECT语句就可以。总结特性Oracle其他主流数据库是否需要DUAL是语法强制要求否可以直接SELECTDUAL的本质一张物理存在的虚拟表一个为了方便迁移而设计的兼容性语法不过在日常学习和工作中查到的大部分网络资料都是基于Oracle体系的所以在学习阶段了解并掌握DUAL的用法还是很有必要的。整理所有的sql示例以下是根据您的课堂笔记整理的所有SQL示例代码汇总按学习顺序分类每条示例均配有说明方便复习和练习。一、基础查询与别名sql-- 查询指定列 SELECT ENAME, SAL FROM EMP; ​ -- 查询所有列 SELECT * FROM EMP; ​ -- 列别名AS可省略 SELECT ENAME AS 姓名, SAL 薪资 FROM EMP; ​ -- 表别名 SELECT e.ENAME, e.SAL FROM EMP e;二、条件查询WHEREsql-- 数值筛选薪资超过1000 SELECT ENAME, SAL FROM EMP WHERE SAL 1000; ​ -- 数值筛选薪资不低于3000 SELECT * FROM EMP WHERE SAL 3000; ​ -- 字符筛选文员 SELECT ENAME, SAL FROM EMP WHERE JOB CLERK; ​ -- 字符筛选排除销售 SELECT * FROM EMP WHERE JOB SALESMAN; ​ -- 练习1不是20号部门 SELECT ENAME, SAL, DEPTNO FROM EMP WHERE DEPTNO 20; ​ -- 练习2员工SCOTT SELECT * FROM EMP WHERE ENAME SCOTT;三、日期筛选sql-- 1981年入职TO_CHAR方式 SELECT * FROM EMP WHERE TO_CHAR(HIREDATE, YYYY) 1981; ​ -- 1981年5月之前入职TO_CHAR方式 SELECT ENAME, HIREDATE, SAL FROM EMP WHERE TO_CHAR(HIREDATE, YYYYMM) 198105; ​ -- 1981年5月之前入职TO_DATE方式 SELECT ENAME, HIREDATE, SAL FROM EMP WHERE HIREDATE TO_DATE(19810501, YYYYMMDD); ​ -- 练习11982年之后入职TO_CHAR SELECT * FROM EMP WHERE TO_CHAR(HIREDATE, YYYY) 1982; ​ -- 练习11982年之后入职TO_DATE SELECT * FROM EMP WHERE HIREDATE TO_DATE(19821231, YYYYMMDD); ​ -- 练习21981年2月入职TO_CHAR SELECT ENAME, HIREDATE, SAL FROM EMP WHERE TO_CHAR(HIREDATE, YYYYMM) 198102; ​ -- 练习21981年2月入职BETWEEN SELECT ENAME, HIREDATE, SAL FROM EMP WHERE HIREDATE BETWEEN TO_DATE(19810201, YYYYMMDD) AND TO_DATE(19810228, YYYYMMDD);四、范围筛选BETWEEN / INsql-- BETWEEN薪资800-1600 SELECT * FROM EMP WHERE SAL BETWEEN 800 AND 1600; ​ -- BETWEEN1981年1-3月入职 SELECT * FROM EMP WHERE TO_CHAR(HIREDATE, YYYYMM) BETWEEN 198101 AND 198103; ​ -- IN10或20号部门 SELECT * FROM EMP WHERE DEPTNO IN (10, 20); ​ -- IN指定年月入职 SELECT ENAME, SAL, HIREDATE FROM EMP WHERE TO_CHAR(HIREDATE, YYYYMM) IN (198102, 198201, 198705); ​ -- NOT BETWEEN薪资不在1000-3000 SELECT * FROM EMP WHERE SAL NOT BETWEEN 1000 AND 3000; ​ -- NOT IN排除指定岗位 SELECT ENAME, JOB, SAL FROM EMP WHERE JOB NOT IN (SALESMAN, MANAGER, CLERK); ​ -- 练习1薪资1000-3000 SELECT ENAME, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 3000; ​ -- 练习2排除指定年月 SELECT * FROM EMP WHERE TO_CHAR(HIREDATE, YYYY-MM) NOT IN (1981-02, 1982-01, 1980-12);五、模糊查询LIKEsql-- S开头 SELECT * FROM EMP WHERE ENAME LIKE S%; ​ -- 第二位是L SELECT * FROM EMP WHERE ENAME LIKE _L%; ​ -- 5位长度 SELECT * FROM EMP WHERE ENAME LIKE _____; ​ -- 最少6位长度 SELECT * FROM EMP WHERE ENAME LIKE ______%; ​ -- 倒数第二位是E SELECT * FROM EMP WHERE ENAME LIKE %E_; ​ -- 包含S SELECT * FROM EMP WHERE ENAME LIKE %S%; ​ -- 反向模糊不包含K SELECT * FROM EMP WHERE ENAME NOT LIKE %K%; ​ -- 反向模糊倒数第二位不是E SELECT * FROM EMP WHERE ENAME NOT LIKE %E_; ​ -- 转义匹配%号 SELECT * FROM EMP WHERE ENAME LIKE %\%% ESCAPE \; ​ -- 练习1包含J SELECT * FROM EMP WHERE ENAME LIKE %J%; ​ -- 练习2倒数第三位是N SELECT * FROM EMP WHERE ENAME LIKE %N__; ​ -- 练习3最后一位不是T SELECT * FROM EMP WHERE ENAME NOT LIKE %T;六、空值筛选IS NULL / NVLsql-- 没有佣金IS NULL SELECT * FROM EMP WHERE COMM IS NULL; ​ -- 有领导IS NOT NULL SELECT * FROM EMP WHERE MGR IS NOT NULL; ​ -- 错误写法COMM NULL返回空 SELECT * FROM EMP WHERE COMM NULL; ​ -- 月薪计算NVL处理空值 SELECT ENAME, SAL, COMM, SAL NVL(COMM, 0) AS 月薪 FROM EMP; ​ -- 练习1有佣金的员工 SELECT ENAME, JOB, SAL, COMM FROM EMP WHERE COMM IS NOT NULL; ​ -- 练习2有领导计算月薪和年薪 SELECT ENAME, SAL, COMM, SAL NVL(COMM, 0) AS 月薪, (SAL NVL(COMM, 0)) * 12 AS 年薪 FROM EMP WHERE MGR IS NOT NULL;七、组合条件AND / OR / NOTsql-- 20号部门经理 30号部门销售 SELECT * FROM EMP WHERE DEPTNO 20 AND JOB MANAGER OR DEPTNO 30 AND JOB SALESMAN; ​ -- 排除20号 姓名5位 薪资1000 SELECT * FROM EMP WHERE NOT DEPTNO 20 AND ENAME LIKE _____ AND SAL 1000; ​ -- 1981或1982入职名字不包含J不是10号部门 SELECT * FROM EMP WHERE TO_CHAR(HIREDATE, YYYY) 1981 OR TO_CHAR(HIREDATE, YYYY) 1982 AND ENAME NOT LIKE %J% AND DEPTNO ! 10; ​ -- 薪资1000 且 名字不是5位长度 SELECT * FROM EMP WHERE SAL 1000 AND NOT ENAME LIKE _____; ​ -- 练习120号部门薪资1000-3000 SELECT * FROM EMP WHERE DEPTNO 20 AND SAL BETWEEN 1000 AND 3000; ​ -- 练习21981年薪资≥1200 或 1982年1月后无佣金 SELECT * FROM EMP WHERE (TO_CHAR(HIREDATE, YYYY) 1981 AND SAL 1200) OR (TO_CHAR(HIREDATE, YYYYMM) 198201 AND COMM IS NULL);八、排序ORDER BYsql-- 单字段升序ASC省略 SELECT ENAME, SAL FROM EMP ORDER BY ENAME; ​ -- 单字段降序 SELECT ENAME, SAL FROM EMP ORDER BY SAL DESC; ​ -- 多字段排序先部门升序再月薪降序 SELECT ENAME AS 姓名, SAL AS 薪资, COMM AS 佣金, SAL NVL(COMM, 0) AS 月薪, DEPTNO AS 部门 FROM EMP WHERE DEPTNO 20 OR (DEPTNO 30 AND JOB SALESMAN) ORDER BY DEPTNO ASC, SAL NVL(COMM, 0) DESC; ​ -- 姓名升序 薪资降序 SELECT ENAME, SAL, COMM, SAL NVL(COMM, 0) FROM EMP ORDER BY ENAME, SAL DESC; ​ -- NULL作为最大值默认 SELECT * FROM EMP ORDER BY COMM DESC; ​ -- 空值放在最后 SELECT * FROM EMP ORDER BY COMM DESC NULLS LAST; ​ -- 空值放在最前 SELECT * FROM EMP ORDER BY COMM NULLS FIRST; ​ -- 筛选月薪1500后排序 SELECT ENAME, DEPTNO, SAL, COMM, SAL NVL(COMM, 0) AS 月薪 FROM EMP WHERE SAL NVL(COMM, 0) 1500 ORDER BY DEPTNO, 月薪 DESC; ​ -- 练习1多部门组合排序 SELECT * FROM EMP WHERE (DEPTNO 10 AND JOB CLERK) OR (DEPTNO 20 AND JOB MANAGER) OR DEPTNO 30 ORDER BY DEPTNO, SAL DESC; ​ -- 练习21981或1982年后入职按月薪降序 SELECT ENAME, SAL, COMM, SAL NVL(COMM, 0) AS 月薪 FROM EMP WHERE TO_CHAR(HIREDATE, YYYY) 1981 OR TO_CHAR(HIREDATE, YYYY) 1982 ORDER BY 月薪 DESC;九、万能表 DUALsql-- 查询当前系统时间 SELECT SYSDATE FROM DUAL; ​ -- 查询常量 SELECT 1 AS A1 FROM DUAL WHERE 1 1; ​ -- 查询字符串 SELECT ABC FROM DUAL; ​ -- 计算表达式 SELECT 3 * 7 FROM DUAL;附录常用函数速查函数作用示例TO_CHAR(日期, 格式)日期转字符串TO_CHAR(HIREDATE, YYYY-MM)TO_DATE(字符串, 格式)字符串转日期TO_DATE(19810501, YYYYMMDD)NVL(字段, 缺省值)空值替换NVL(COMM, 0)SYSDATE当前系统时间SYSDATE课后作业desc emp; /* 名称 空值? 类型 -------- -------- ------------ EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) */ select * from emp where ROWNUM 20; --7369 SMITH CLERK 7902 17-12月-80 800 20 --7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 --7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 --7566 JONES MANAGER 7839 02-4月 -81 2975 20 --7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 --7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 --7782 CLARK MANAGER 7839 09-6月 -81 2450 10 --7788 SCOTT ANALYST 7566 13-7月 -87 3000 20 --7839 KING PRESIDENT 17-11月-81 5000 10 --7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 --7876 ADAMS CLERK 7788 13-7月 -87 1100 20 --7900 JAMES CLERK 7698 03-12月-81 950 30 --7902 FORD ANALYST 7566 03-12月-81 3000 20 --7934 MILLER CLERK 7782 23-1月 -82 1300 10 --1.输出员工薪资在 1000到2000之间,且岗位不是销售也不是经理的所有员工信息; select * from EMP where sal between 1000 and 2000 and job not in(MANAGER,SALESMAN); --2.排除20号部门的经理 以及 30号部门销售,输出其他的所有员工明细信息; SELECT * FROM EMP WHERE NOT (DEPTNO 20 AND JOB MANAGER) AND NOT (DEPTNO 30 AND JOB SALESMAN); --3.输出入职时间在 1982年10月之前的所有员工姓名,入职时间,中文展示; select ename as 姓名, HIREDATE as 入职时间 from EMP where to_char(HIREDATE,YYYYMM)198210; --4.输出所有入职时间既不是1981年2月 也不是 1981年5 月 也不是 1982年1月的所有员工信息; select * from EMP where to_char(HIREDATE,YYYYMM) not in(198102,198105,198201); --5.输出20号部门入职时间在1982年之前以及30号部门入职时间在1985年之前的所有员工信息; select * from EMP where (DEPTNO20 and to_char(HIREDATE,YYYY)1982) or (DEPTNO30 and to_char(HIREDATE,YYYY)1985); --6.输出所有员工姓名是五个字符以及姓名中包含T 的员工姓名,薪资 以及入职时间; select ename,sal,HIREDATE from EMP where ename like _____ or ename like %T%; --7.找出所有员工姓名不包含S且,长度不低于5位长度的员工信息; select * from EMP where ename not like %S% and ename like _____%; --8.找出所有存在上级领导编号的员工,并且计算他们的年薪是多少,输出 员工姓名 领导编号 薪资 佣金 年薪; select ename,MGR,sal,comm,(salnvl(comm,0))*12 as 年薪 from EMP where MGR is not Null; --9.输出所有佣金低于500(为空默认为0,也是低于500)的所有员工信息; select * from EMP where nvl(comm,0) 500; --10.输出每个员工的姓名,薪资 佣金 月薪(薪资佣金) 年薪 按照姓名的升序 年薪的降序排序; --两个排序字段之间必须用逗号隔开 select ename,sal,comm,(salnvl(comm,0)) as 月薪,(salnvl(comm,0))*12 as 年薪 from EMP order by ename asc,年薪 desc; --11.筛选1981年之后入职的所有员工,输出他们的姓名 月薪 佣金 年薪 部门编号, --按照部门编号升序,月薪的降序排序; select ename,(salnvl(comm,0)) as 月薪,comm,(salnvl(comm,0))*12 as 年薪,DEPTNO from EMP WHERE TO_CHAR(HIREDATE, YYYY) 1981 order by DEPTNO asc,月薪 desc; --12. 筛选30号部门所有销售 以及 20号部门 1985 年之前入职的所有员工,然后输出 他们的 --员工姓名 薪资 佣金 月薪 部门编号 --要求 按照部门编号升序 佣金降序排序,并且 佣金为空的排在最后面。 select ename,sal,comm,(salnvl(comm,0)) as 月薪,DEPTNO,hiredate from EMP where (DEPTNO30 and jobSALESMAN) or (DEPTNO20 and to_char(hiredate,YYYY)1985) ORDER BY DEPTNO ASC, comm DESC NULLS LAST;