当前位置: 首页 > news >正文

Oracle数据库常用语法详解

一、基础查询

1. SELECT语句

-- 基本查询
SELECT employee_id, first_name, salary 
FROM employees 
WHERE department_id = 50;-- 列计算
SELECT employee_id, salary * 12 AS annual_salary 
FROM employees;-- 去重查询
SELECT DISTINCT department_id 
FROM employees;

2. 条件过滤

-- 多条件查询
SELECT * 
FROM employees 
WHERE salary > 5000 AND department_id IN (30, 50);-- 模式匹配
SELECT * 
FROM employees 
WHERE first_name LIKE 'A%'; -- 以A开头

3. 排序与分页

-- 排序
SELECT * 
FROM employees 
ORDER BY salary DESC, hire_date ASC;-- 分页(Oracle 12c+)
SELECT * 
FROM employees 
ORDER BY employee_id 
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

二、数据操作

1. 插入数据

-- 单条插入
INSERT INTO employees (employee_id, first_name, salary)
VALUES (101, 'John', 6000);-- 多条插入
INSERT ALLINTO employees VALUES (102, 'Alice', 5500)INTO employees VALUES (103, 'Bob', 5800)
SELECT * FROM DUAL;

2. 更新数据

-- 基础更新
UPDATE employees 
SET salary = salary * 1.1 
WHERE department_id = 50;-- 带条件更新
UPDATE employees 
SET (salary, commission_pct) = (SELECT 1.2 * salary, 0.1 FROM employees WHERE employee_id = 101)
WHERE employee_id = 102;

3. 删除数据

-- 安全删除
DELETE FROM employees 
WHERE hire_date < SYSDATE - 365 AND department_id = 30;-- 级联删除(需外键约束)
DELETE FROM departments 
WHERE department_id = 30;

三、高级功能

1. 连接查询

-- 内连接
SELECT e.first_name, d.department_name 
FROM employees e
JOIN departments d 
ON e.department_id = d.department_id;-- 左连接
SELECT e.first_name, d.department_name 
FROM employees e
LEFT JOIN departments d 
ON e.department_id = d.department_id;-- 自连接
SELECT e1.first_name AS employee, e2.first_name AS manager 
FROM employees e1
JOIN employees e2 
ON e1.manager_id = e2.employee_id;

2. 子查询

-- 单行子查询
SELECT * 
FROM employees 
WHERE salary > (SELECT AVG(salary) FROM employees);-- 多行子查询
SELECT * 
FROM employees 
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);-- 关联子查询
SELECT * 
FROM employees e 
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);

3. 聚合函数

-- 基础聚合
SELECT department_id, COUNT(*) AS employee_count,AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;-- HAVING过滤
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 6000;

四、数据库对象

1. 视图

-- 创建视图
CREATE VIEW emp_salary_view AS
SELECT employee_id, first_name, salary 
FROM employees 
WHERE salary > 5000;-- 更新视图
CREATE OR REPLACE VIEW emp_salary_view AS
SELECT employee_id, first_name, salary, department_id 
FROM employees 
WHERE salary > 5000 
WITH CHECK OPTION; -- 限制更新范围

2. 索引

-- 创建B树索引
CREATE INDEX idx_emp_last_name 
ON employees(last_name);-- 函数索引
CREATE INDEX idx_emp_upper_name 
ON employees(UPPER(last_name));-- 复合索引
CREATE INDEX idx_emp_dept_sal 
ON employees(department_id, salary);

3. 存储过程

-- 基本结构
CREATE OR REPLACE PROCEDURE raise_salary (p_emp_id IN NUMBER, p_percent IN NUMBER)
IS
BEGINUPDATE employees SET salary = salary * (1 + p_percent/100)WHERE employee_id = p_emp_id;COMMIT;
EXCEPTIONWHEN OTHERS THENROLLBACK;RAISE;
END;

五、性能优化

1. 执行计划分析

EXPLAIN PLAN FOR
SELECT * 
FROM employees 
WHERE department_id = 50;SELECT * 
FROM TABLE(DBMS_XPLAN.DISPLAY);

2. 索引优化原则

  1. 高选择性的列优先建索引
  2. 避免在频繁更新的列建索引
  3. 复合索引遵循最左前缀原则
  4. 定期分析表统计信息:
    ANALYZE TABLE employees COMPUTE STATISTICS;
    

3. 查询优化技巧

-- 使用绑定变量
VAR dept_id NUMBER;
EXEC :dept_id := 50;SELECT * 
FROM employees 
WHERE department_id = :dept_id;-- 避免SELECT *
SELECT employee_id, first_name, salary 
FROM employees;-- 合理使用HINT
SELECT /*+ INDEX(employees idx_emp_dept_sal) */ * 
FROM employees 
WHERE department_id = 50;

六、常见问题解决

1. 空值处理

-- NVL函数
SELECT employee_id, NVL(commission_pct, 0) 
FROM employees;-- COALESCE函数
SELECT employee_id, COALESCE(manager_id, 0) 
FROM employees;

2. 字符串处理

-- 连接字符串
SELECT first_name || ' ' || last_name AS full_name 
FROM employees;-- 截取字符串
SELECT SUBSTR(first_name, 1, 3) 
FROM employees;

3. 日期处理

-- 当前日期时间
SELECT SYSDATE FROM DUAL;-- 日期计算
SELECT hire_date, SYSDATE - hire_date AS days_employed 
FROM employees;-- 格式化日期
SELECT TO_CHAR(hire_date, 'YYYY-MM-DD') 
FROM employees;

希望这篇博客能帮助您系统掌握Oracle常用语法。实际开发中建议结合Oracle官方文档(https://docs.oracle.com/)进行深入学习,并通过SQL Tuning等工具持续优化查询性能。

http://www.lryc.cn/news/601824.html

相关文章:

  • 逆向入门(43)程序逆向篇-tsrh-crackme
  • C++ auto 类型推导
  • Android MQTT 长连接最佳实践技术分享
  • 5.4 ASPICE适配过程中的实施改进
  • 机械学习初识--什么是机械学习--机械学习有什么重要算法
  • Red靶机攻略
  • 字符串是数据结构还是数据类型?
  • Day44 Java数组08 冒泡排序
  • python中的容器与自定义容器
  • Pinocchio 结合 CasADi 进行 IK 逆运动学及 Mujoco 仿真
  • 09_opencv_遍历操作图像像素
  • CIFAR100数据集实测-基于 AlexNet模型的压缩/Bagging/Boosting 探索
  • 人社部物联网安装调试员的实训平台
  • 深度学习(鱼书)day04--手写数字识别项目实战
  • 网络协议:计算机世界的“交通规则“与“社交礼仪“
  • java--WebSocket简单介绍
  • Flutter开发实战之性能优化与调试
  • 深入解析MIPI C-PHY (四)C-PHY物理层对应的上层协议的深度解析
  • Pytest 参数化进阶:掌握 parametrize 的多种用法
  • maven <dependencyManagement>标签的作用
  • AutoLabelImg:高效的数据自动化标注工具和下载
  • IndexedDB全面掌握:从入门到Odoo OWL框架实战
  • mac系统彻底删除mysql并重装
  • [AI8051U入门第十步]W5500-客户端
  • 全方位评测:11款主流指标平台优劣分析
  • FreeRTOS—队列集
  • 【Web APIs】JavaScript 节点操作 ⑩ ( 节点操作综合案例 - 动态生成表格案例 )
  • add新增管理员功能、BaseController类的简介--------示例OJ
  • 链表算法综合——重排链表
  • Webpack 和 Vite 的关键区别