外星人一号 發表於 2025-11-12 09:02:10

Oracle 数据库简单查询从基础语法到实战案例

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、查询基础:语法结构与核心规则</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1. 核心语法结构</a></li><li><a href="#_lab2_0_1">2. 关键注意事项</a></li></ul><li><a href="#_label1">二、基础查询:从部分列到特殊处理</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_2">1. 查询指定部分列</a></li><li><a href="#_lab2_1_3">2. 查询所有列</a></li><li><a href="#_lab2_1_4">3. 对列进行数学运算</a></li><li><a href="#_lab2_1_5">4. 给列 / 表取别名</a></li><li><a href="#_lab2_1_6">5. 字符串拼接</a></li><li><a href="#_lab2_1_7">6. 数据去重(DISTINCT)</a></li><li><a href="#_lab2_1_8">7. 条件判断(CASE WHEN)</a></li><li><a href="#_lab2_1_9">8. 查询当前时间(SYSDATE + DUAL 表)</a></li></ul><li><a href="#_label2">三、条件查询(WHERE):精准筛选数据</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_10">1. 比较查询(&gt;、&gt;=、&lt;、&lt;=、!=、=)</a></li><ul class="third_class_ul"><li><a href="#_label3_2_10_0">(1)等值查询(=)</a></li><li><a href="#_label3_2_10_1">(2)不等值查询(&gt;、&gt;=、&lt;、&lt;=、!=、&lt;&gt;)</a></li></ul><li><a href="#_lab2_2_11">2. 空值查询(IS NULL / IS NOT NULL)</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_2_12">3. 多条件查询(AND / OR)</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_2_13">4. 区间查询(BETWEEN AND / NOT BETWEEN AND)</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_2_14">5. 枚举查询(IN / NOT IN)</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_2_15">6. 模糊查询(LIKE)【重点】</a></li><ul class="third_class_ul"><li><a href="#_label3_2_15_2">常见场景案例</a></li></ul></ul><li><a href="#_label3">四、排序(ORDER BY):规范结果顺序</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">五、函数:简化复杂计算与处理</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_16">1. 单行函数</a></li><ul class="third_class_ul"><li><a href="#_label3_4_16_3">(1)取余函数(MOD (m, n))</a></li><li><a href="#_label3_4_16_4">(2)字符串长度函数(LENGTH (字符串))</a></li><li><a href="#_label3_4_16_5">(3)日期转换函数(TO_DATE / TO_CHAR)</a></li></ul><li><a href="#_lab2_4_17">2. 多行函数(组函数)</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label5">六、总结与拓展</a></li><ul class="second_class_ul"></ul></ul></div><p>在 Oracle 数据库日常操作中,查询是最基础也最核心的技能。本文将基于<code>employees</code>(员工表)和<code>departments</code>(部门表),从语法规则、基础查询、条件查询、排序到函数应用,系统梳理 Oracle 简单查询的全流程,每个知识点都搭配实战案例,适合新手入门学习,也可作为日常开发的参考手册。</p>
<p class="maodian"><a name="_label0"></a></p><h2>一、查询基础:语法结构与核心规则</h2>
<p>在开始查询之前,必须先掌握 Oracle 查询的基础语法和注意事项,避免因格式问题导致报错。</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1. 核心语法结构</h3>
<p>Oracle 查询的最基本结构由<code>SELECT</code>(指定查询列)和<code>FROM</code>(指定数据来源表)组成,语法如下</p>
<div class="jb51code"><pre class="brush:sql;">SELECT 列名1, 列名2, 列名3, …-- 要查询的列,多列用逗号分隔
FROM 表名;                   -- 数据所在的表,结尾加分号表示语句结束</pre></div>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2. 关键注意事项</h3>
<p>这 3 条规则是避免语法错误的 &ldquo;避坑指南&rdquo;,务必牢记:</p>
<ul><li><strong>大小写不敏感</strong>:SQL 关键字(如<code>SELECT</code>、<code>FROM</code>)、表名(如<code>employees</code>)、字段名(如<code>salary</code>)均不区分大小写,<code>select first_name from employees</code>与<code>SELECT FIRST_NAME FROM EMPLOYEES</code>效果一致。</li><li><strong>标点符号为英文</strong>:所有标点(逗号、分号、引号等)必须使用英文符号,例如查询姓名时用<code>&#39;King&#39;</code>(英文单引号),而非中文<code>&lsquo;King&rsquo;</code>。</li><li><strong>分号的作用</strong>:单条查询语句结尾可加分号;多条语句同时执行时,每条语句必须以分号分隔,执行前需选中所有要运行的 SQL 脚本。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>二、基础查询:从部分列到特殊处理</h2>
<p>基础查询涵盖 &ldquo;查哪些列&rdquo;&ldquo;如何处理列数据&rdquo;&ldquo;如何简化列名&rdquo; 等场景,是后续复杂查询的基础。</p>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>1. 查询指定部分列</h3>
<p>当不需要表中所有数据,仅需特定列时,直接在<code>SELECT</code>后指定列名即可。</p>
<p><strong>需求</strong>:查询所有员工的 &ldquo;姓名(名 + 姓)&rdquo; 和 &ldquo;薪资&rdquo;</p>
<div class="jb51code"><pre class="brush:sql;">-- first_name:员工名,last_name:员工姓,salary:薪资
SELECT first_name, last_name, salary
FROM employees;</pre></div>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>2. 查询所有列</h3>
<p>若需获取表中所有字段数据,无需逐个列出列名,用通配符<code>*</code>代替即可(注意:生产环境中尽量避免用<code>*</code>,优先指定列名,减少不必要的数据传输)。</p>
<p><strong>需求</strong>:查询<code>employees</code>表中所有员工的完整信息</p>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM employees;</pre></div>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>3. 对列进行数学运算</h3>
<p>仅支持对<strong>数字类型列</strong>(如薪资<code>salary</code>、员工编号<code>employee_id</code>)进行数学运算,常见运算包括加减乘除,不支持<code>%</code>取余(需用后续的<code>mod</code>函数),<code>\</code>在 Oracle 中有特殊含义,也不可用。</p>
<p><strong>需求</strong>:计算员工薪资 &ldquo;加 100&rdquo;&ldquo;减 100&rdquo;&ldquo;乘 100&rdquo;&ldquo;除 100&rdquo; 后的结果</p>
<div class="jb51code"><pre class="brush:sql;">SELECT
salary + 100 AS 薪资加100,
salary - 100 AS 薪资减100,
salary * 100 AS 薪资乘100,
salary / 100 AS 薪资除100
FROM employees;</pre></div>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>4. 给列 / 表取别名</h3>
<p>查询结果中,默认显示原始列名(如<code>salary*12</code>),可读性差;表名过长时,也可简化。通过 &ldquo;别名&rdquo; 可解决这一问题,规则如下:</p>
<ul><li><strong>列别名</strong>:用<code>AS</code>关键字(可省略),格式为<code>列表达式 AS 别名</code>,别名含中文或特殊字符时需用双引号括起。</li><li><strong>表别名</strong>:必须省略<code>AS</code>,直接用<code>表名 别名</code>,常用于多表关联查询。</li></ul>
<p><strong>需求 1</strong>:计算员工年薪,并将列名显示为 &ldquo;年薪&rdquo;</p>
<div class="jb51code"><pre class="brush:sql;">-- AS可省略,两种写法均有效
SELECT salary * 12 AS 年薪 FROM employees;
SELECT salary * 12 年薪 FROM employees;-- 省略AS</pre></div>
<p><strong>需求 2</strong>:给<code>employees</code>表取别名<code>e</code>,查询员工名和薪资</p>
<div class="jb51code"><pre class="brush:sql;">-- 表别名不可加AS,正确写法如下
SELECT e.first_name, e.salary
FROM employees e;</pre></div>
<p class="maodian"><a name="_lab2_1_6"></a></p><h3>5. 字符串拼接</h3>
<p>Oracle 中用<code>||</code>实现字符串拼接,相当于 Java 中的<code>+</code>,拼接的 &ldquo;字符 / 字符串&rdquo; 需用<strong>英文单引号</strong>括起(Oracle 不区分字符和字符串)。</p>
<p><strong>需求</strong>:将员工的 &ldquo;名&rdquo; 和 &ldquo;姓&rdquo; 拼接为 &ldquo;姓名&rdquo;(格式:名 - 姓)</p>
<div class="jb51code"><pre class="brush:sql;">SELECT first_name || '-' || last_name AS 姓名
FROM employees;</pre></div>
<p class="maodian"><a name="_lab2_1_7"></a></p><h3>6. 数据去重(DISTINCT)</h3>
<p>当查询结果存在重复数据时,用<code>DISTINCT</code>去除重复行,规则如下:</p>
<ul><li><code>DISTINCT</code>后仅跟 1 个字段:去除该字段的重复值。</li><li><code>DISTINCT</code>后跟多个字段:仅当所有字段的值均相同时,才视为重复行并去除。</li></ul>
<p><strong>需求 1</strong>:查询所有员工的 &ldquo;领导编号&rdquo;,去除重复编号</p>
<p>sql</p>
<p><strong>需求 2</strong>:查询 &ldquo;部门编号 + 领导编号&rdquo; 的唯一组合(即同一部门的同一领导仅显示一次)</p>
<div class="jb51code"><pre class="brush:sql;">SELECT DISTINCT department_id, manager_id
FROM employees;</pre></div>
<p class="maodian"><a name="_lab2_1_8"></a></p><h3>7. 条件判断(CASE WHEN)</h3>
<p><code>CASE WHEN</code>相当于 Java 中的<code>if-else</code>,用于对表中已有列的数据进行判断,生成新的列(如根据薪资分级)。</p>
<p><strong>语法格式</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">CASE
WHEN 条件1 THEN 结果1-- 满足条件1时,显示结果1
WHEN 条件2 THEN 结果2-- 满足条件2时,显示结果2
...
ELSE 其他结果          -- 所有条件都不满足时,显示其他结果
END AS 新列名</pre></div>
<p><strong>需求</strong>:根据员工薪资分级,生成 &ldquo;薪资水平&rdquo; 列(高薪:&ge;10000,一般:&ge;8000,垃圾:&lt;8000)</p>
<div class="jb51code"><pre class="brush:sql;">SELECT
salary,
CASE
    WHEN salary &gt;= 10000 THEN '高薪'
    WHEN salary &gt;= 8000 THEN '一般'
    ELSE '垃圾'
END AS 薪资水平
FROM employees;</pre></div>
<p class="maodian"><a name="_lab2_1_9"></a></p><h3>8. 查询当前时间(SYSDATE + DUAL 表)</h3>
<p>Oracle 中用<code>SYSDATE</code>获取当前系统时间(包含日期和时分秒),但<code>SYSDATE</code>需结合 &ldquo;哑表<code>DUAL</code>&rdquo; 使用 &mdash;&mdash;<code>DUAL</code>是 Oracle 内置的一行一列的临时表,仅用于无实际表关联的查询(如查询常量、函数结果)。</p>
<p><strong>需求</strong>:查询当前系统时间</p>
<div class="jb51code"><pre class="brush:sql;">SELECT SYSDATE AS 当前时间
FROM dual;</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>三、条件查询(WHERE):精准筛选数据</h2>
<p>基础查询是 &ldquo;获取所有数据&rdquo;,而条件查询用<code>WHERE</code>子句筛选 &ldquo;符合条件的数据&rdquo;,是日常查询中最常用的功能。语法结构如下:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT 列名1, 列名2, ...
FROM 表名
WHERE 筛选条件;-- 筛选条件需满足“布尔值”(true/false)</pre></div>
<p class="maodian"><a name="_lab2_2_10"></a></p><h3>1. 比较查询(&gt;、&gt;=、&lt;、&lt;=、!=、=)</h3>
<p>通过比较运算符筛选数据,包括 &ldquo;等值查询&rdquo; 和 &ldquo;不等值查询&rdquo;。</p>
<p class="maodian"><a name="_label3_2_10_0"></a></p><h4>(1)等值查询(=)</h4>
<p>筛选 &ldquo;字段值等于指定值&rdquo; 的数据,注意字符串需用英文单引号括起。</p>
<p><strong>需求</strong>:查询 &ldquo;员工名(first_name)为 King&rdquo; 的所有信息</p>
<div class="jb51code"><pre class="brush:sql;">SELECT *
FROM employees
WHERE first_name = 'King';-- 字符串'King'用英文单引号</pre></div>
<p class="maodian"><a name="_label3_2_10_1"></a></p><h4>(2)不等值查询(&gt;、&gt;=、&lt;、&lt;=、!=、&lt;&gt;)</h4>
<p>筛选 &ldquo;字段值不等于 / 大于 / 小于指定值&rdquo; 的数据,<code>!=</code>和<code>&lt;&gt;</code>均表示 &ldquo;不等于&rdquo;,效果一致。</p>
<p><strong>需求</strong>:查询 &ldquo;薪资(salary)大于 8000&rdquo; 的员工姓名和薪资</p>
<div class="jb51code"><pre class="brush:sql;">SELECT first_name, last_name, salary
FROM employees
WHERE salary &gt; 8000;</pre></div>
<p class="maodian"><a name="_lab2_2_11"></a></p><h3>2. 空值查询(IS NULL / IS NOT NULL)</h3>
<p>Oracle 中不能用<code>=</code>判断空值,必须用<code>IS NULL</code>(查询空值)或<code>IS NOT NULL</code>(查询非空值)。</p>
<p><strong>需求 1</strong>:查询 &ldquo;部门编号(department_id)为空&rdquo; 的员工信息</p>
<div class="jb51code"><pre class="brush:sql;">-- 错误写法:WHERE department_id = null
SELECT *
FROM employees
WHERE department_id IS NULL;-- 正确写法</pre></div>
<p><strong>需求 2</strong>:查询 &ldquo;部门编号(department_id)非空&rdquo; 的员工信息</p>
<div class="jb51code"><pre class="brush:sql;">SELECT *
FROM employees
WHERE department_id IS NOT NULL;</pre></div>
<p class="maodian"><a name="_lab2_2_12"></a></p><h3>3. 多条件查询(AND / OR)</h3>
<p>当筛选条件有多个时,用<code>AND</code>或<code>OR</code>连接:</p>
<ul><li><code>AND</code>:相当于 Java 中的<code>&amp;&amp;</code>,<strong>所有条件必须同时满足</strong>。</li><li><code>OR</code>:相当于 Java 中的<code>||</code>,<strong>满足任意一个条件即可</strong>。</li></ul>
<p><strong>需求 1</strong>:查询 &ldquo;员工编号(employee_id)&le;150 且 薪资&ge;10000&rdquo; 的员工信息</p>
<div class="jb51code"><pre class="brush:sql;">SELECT *
FROM employees
WHERE employee_id &lt;= 150 AND salary &gt;= 10000;</pre></div>
<p><strong>需求 2</strong>:查询 &ldquo;员工编号&le;150 或 薪资&ge;8000&rdquo; 的员工信息</p>
<div class="jb51code"><pre class="brush:sql;">SELECT *
FROM employees
WHERE employee_id &lt;= 150 OR salary &gt;= 8000;</pre></div>
<p class="maodian"><a name="_lab2_2_13"></a></p><h3>4. 区间查询(BETWEEN AND / NOT BETWEEN AND)</h3>
<p>筛选 &ldquo;字段值在指定区间内&rdquo; 的数据,<code>BETWEEN 最小值 AND 最大值</code>包含区间的边界值,等价于<code>&gt;= 最小值 AND &lt;= 最大值</code>;<code>NOT BETWEEN AND</code>则相反。</p>
<p><strong>需求 1</strong>:查询 &ldquo;员工编号在 110~150 之间(包含 110 和 150)&rdquo; 的员工信息</p>
<div class="jb51code"><pre class="brush:sql;">-- 等价写法1:WHERE employee_id &gt;= 110 AND employee_id &lt;= 150
SELECT *
FROM employees
WHERE employee_id BETWEEN 110 AND 150;-- 更简洁</pre></div>
<p><strong>需求 2</strong>:查询 &ldquo;员工编号不在 110~150 之间&rdquo; 的员工信息</p>
<div class="jb51code"><pre class="brush:sql;">SELECT *
FROM employees
WHERE employee_id NOT BETWEEN 110 AND 150;</pre></div>
<p class="maodian"><a name="_lab2_2_14"></a></p><h3>5. 枚举查询(IN / NOT IN)</h3>
<p>筛选 &ldquo;字段值在指定枚举列表中&rdquo; 的数据,<code>IN (值1, 值2, ...)</code>等价于<code>= 值1 OR = 值2 OR ...</code>;<code>NOT IN</code>则相反,适用于枚举值较少的场景。</p>
<p><strong>需求 1</strong>:查询 &ldquo;部门编号为 60、90、100&rdquo; 的员工信息</p>
<div class="jb51code"><pre class="brush:sql;">-- 等价写法:WHERE department_id = 60 OR department_id = 90 OR department_id = 100
SELECT *
FROM employees
WHERE department_id IN (60, 90, 100);-- 更简洁</pre></div>
<p><strong>需求 2</strong>:查询 &ldquo;部门编号不是 60、90、100&rdquo; 的员工信息</p>
<div class="jb51code"><pre class="brush:sql;">SELECT *
FROM employees
WHERE department_id NOT IN (60, 90, 100);</pre></div>
<p class="maodian"><a name="_lab2_2_15"></a></p><h3>6. 模糊查询(LIKE)【重点】</h3>
<p>通过通配符匹配 &ldquo;字符串格式&rdquo; 的数据,语法为<code>LIKE &#39;匹配模式&#39;</code>,核心是掌握两个通配符:</p>
<ul><li><code>%</code>:匹配<strong>任意多个字符</strong>(包括 0 个字符)。</li><li><code>_</code>:匹配<strong>恰好 1 个字符</strong>(不能多也不能少)。</li></ul>
<p class="maodian"><a name="_label3_2_15_2"></a></p><h4>常见场景案例</h4>
<table><thead><tr><th>需求</th><th>SQL 语句</th><th>说明</th></tr></thead><tbody><tr><td>查询 &ldquo;姓(last_name)以 K 开头&rdquo; 的员工</td><td><code>SELECT * FROM employees WHERE last_name LIKE &#39;K%&#39;;</code></td><td><code>K%</code>表示 &ldquo;以 K 开头,后面跟任意字符&rdquo;</td></tr><tr><td>查询 &ldquo;姓中包含 a&rdquo; 的员工</td><td><code>SELECT * FROM employees WHERE last_name LIKE &#39;%a%&#39;;</code></td><td><code>%a%</code>表示 &ldquo;任意位置包含 a&rdquo;</td></tr><tr><td>查询 &ldquo;姓以 K 开头且长度为 5&rdquo; 的员工</td><td><code>SELECT * FROM employees WHERE last_name LIKE &#39;K____&#39;;</code></td><td><code>K</code>后跟 4 个<code>_</code>,共 5 个字符(K+4 个字符)</td></tr></tbody></table>
<p class="maodian"><a name="_label3"></a></p><h2>四、排序(ORDER BY):规范结果顺序</h2>
<p>默认情况下,查询结果的顺序是随机的(与数据存储顺序相关),用<code>ORDER BY</code>可按指定列排序,语法如下:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT 列名1, 列名2, ...
FROM 表名
WHERE 筛选条件
ORDER BY 列名1 , 列名2 ;-- 排序规则</pre></div>
<ul><li><code>ASC</code>:升序(默认,可省略),如数字从大到小、字符串按字典序(A&rarr;Z)。</li><li><code>DESC</code>:降序,如数字从大到小、字符串按字典序(Z&rarr;A)。</li><li>多列排序:先按第一列排序,若第一列值相同,再按第二列排序,以此类推。</li></ul>
<p><strong>需求 1</strong>:查询 &ldquo;部门编号为 50&rdquo; 的员工,按 &ldquo;薪资降序&rdquo; 排列(薪资高的在前)</p>
<div class="jb51code"><pre class="brush:sql;">SELECT *
FROM employees
WHERE department_id = 50
ORDER BY salary DESC;</pre></div>
<p><strong>需求 2</strong>:查询 &ldquo;部门编号为 50&rdquo; 的员工,先按 &ldquo;薪资降序&rdquo;,薪资相同的按 &ldquo;员工名升序&rdquo;(A&rarr;Z)排列</p>
<div class="jb51code"><pre class="brush:sql;">SELECT *
FROM employees
WHERE department_id = 50
ORDER BY salary DESC, first_name ASC;</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>五、函数:简化复杂计算与处理</h2>
<p>Oracle 函数按作用范围分为 &ldquo;单行函数&rdquo; 和 &ldquo;多行函数(组函数)&rdquo;,前者处理每一行数据并返回一个结果,后者处理一组数据并返回一个结果。</p>
<p class="maodian"><a name="_lab2_4_16"></a></p><h3>1. 单行函数</h3>
<p class="maodian"><a name="_label3_4_16_3"></a></p><h4>(1)取余函数(MOD (m, n))</h4>
<p>计算<code>m</code>除以<code>n</code>的余数,等价于 Java 中的<code>m % n</code>,支持数字列或常量</p>
<p><strong>需求 1</strong>:计算 5 除以 2 的余数</p>
<div class="jb51code"><pre class="brush:sql;">SELECT MOD(5, 2) AS 余数
FROM dual;-- 结果为1</pre></div>
<p><strong>需求 2</strong>:计算每个员工薪资除以 3 的余数</p>
<div class="jb51code"><pre class="brush:sql;">SELECT salary, MOD(salary, 3) AS 薪资取余3
FROM employees;</pre></div>
<p class="maodian"><a name="_label3_4_16_4"></a></p><h4>(2)字符串长度函数(LENGTH (字符串))</h4>
<p>计算字符串的长度(字符数),支持字符串常量或字符类型列(如<code>first_name</code>、<code>last_name</code>)。</p>
<p><strong>需求 1</strong>:计算字符串 &ldquo;adbcedf&rdquo; 的长度</p>
<div class="jb51code"><pre class="brush:sql;">SELECT LENGTH('adbcedf') AS 字符串长度
FROM dual;-- 结果为7</pre></div>
<p><strong>需求 2</strong>:查询 &ldquo;姓(last_name)长度为 5&rdquo; 的员工信息</p>
<div class="jb51code"><pre class="brush:sql;">SELECT *
FROM employees
WHERE LENGTH(last_name) = 5;</pre></div>
<p class="maodian"><a name="_label3_4_16_5"></a></p><h4>(3)日期转换函数(TO_DATE / TO_CHAR)</h4>
<p>Oracle 中日期有特定格式,<code>TO_DATE</code>用于将 &ldquo;字符串&rdquo; 转为 &ldquo;日期类型&rdquo;,<code>TO_CHAR</code>用于将 &ldquo;日期类型&rdquo; 转为 &ldquo;指定格式的字符串&rdquo;,核心是掌握日期格式符(常用格式符如下):</p>
<table><thead><tr><th>格式符</th><th>含义</th><th>示例</th></tr></thead><tbody><tr><td><code>yyyy</code></td><td>4 位年份</td><td>2024</td></tr><tr><td><code>mm</code></td><td>2 位月份</td><td>05(5 月)</td></tr><tr><td><code>dd</code></td><td>2 位日期</td><td>10</td></tr><tr><td><code>hh</code></td><td>24 小时制小时</td><td>14(下午 2 点)</td></tr><tr><td><code>mi</code></td><td>分钟</td><td>30</td></tr><tr><td><code>ss</code></td><td>秒</td><td>45</td></tr><tr><td><code>day</code></td><td>星期几</td><td>星期五</td></tr></tbody></table>
<p><strong>需求 1</strong>:将字符串 &ldquo;1992-12-23 8:50:55&rdquo; 转为日期类型</p>
<p>sql</p>
<p><strong>需求 2</strong>:将当前时间(SYSDATE)转为 &ldquo;2024-05-10 14:30:45 星期五&rdquo; 格式</p>
<div class="jb51code"><pre class="brush:sql;">SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd hh:mi:ss day') AS 格式化时间
FROM dual;</pre></div>
<p class="maodian"><a name="_lab2_4_17"></a></p><h3>2. 多行函数(组函数)</h3>
<p>组函数默认将表中所有行视为 &ldquo;一组数据&rdquo;,返回一个汇总结果,常见函数如下:</p>
<table><thead><tr><th>函数</th><th>作用</th><th>说明</th></tr></thead><tbody><tr><td><code>MAX(列)</code></td><td>求最大值</td><td>忽略空值,适用于数字、日期、字符串(按字典序)</td></tr><tr><td><code>MIN(列)</code></td><td>求最小值</td><td>同上</td></tr><tr><td><code>AVG(列)</code></td><td>求平均值</td><td>仅适用于数字列,忽略空值</td></tr><tr><td><code>SUM(列)</code></td><td>求总和</td><td>仅适用于数字列,忽略空值</td></tr><tr><td><code>COUNT(列)</code></td><td>求非空行数</td><td>统计该列 &ldquo;有值&rdquo; 的行数,空值不计数;<code>COUNT(*)</code>统计所有行数(包括空值)</td></tr></tbody></table>
<p><strong>需求 1</strong>:统计<code>employees</code>表的 &ldquo;员工总数&rdquo;&ldquo;最高薪资&rdquo;&ldquo;最低薪资&rdquo;&ldquo;平均薪资&rdquo;</p>
<div class="jb51code"><pre class="brush:sql;">SELECT
COUNT(*) AS 员工总数,      -- 统计所有行数(包括空值)
MAX(salary) AS 最高薪资,    -- 最高薪资
MIN(salary) AS 最低薪资,    -- 最低薪资
AVG(salary) AS 平均薪资   -- 平均薪资(自动忽略空值)
FROM employees;</pre></div>
<p><strong>需求 2</strong>:统计 &ldquo;部门编号(department_id)非空&rdquo; 的员工数量</p>
<div class="jb51code"><pre class="brush:sql;">SELECT COUNT(department_id) AS 部门非空员工数
FROM employees;-- 空的department_id不计数</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>六、总结与拓展</h2>
<p>本文覆盖了 Oracle 简单查询的核心知识点,从基础语法到实战案例,可满足日常开发中 80% 以上的简单查询需求。后续可进一步学习 &ldquo;多表关联查询&rdquo;&ldquo;分组查询(GROUP BY)&rdquo;&ldquo;子查询&rdquo; 等进阶内容,逐步构建完整的 Oracle 查询体系。</p>
頁: [1]
查看完整版本: Oracle 数据库简单查询从基础语法到实战案例