<think>嗯,用户让我介绍一下Oracle的常用语法。首先,我需要确定用户的背景。可能他们刚开始学习Oracle数据库,或者是已经有一定基础想复习一下?不管怎样,我需要涵盖基本的SQL操作,比如DDL、DML、查询语句,还有常用函数、子查询、连接这些内容。
用户可能需要的不仅仅是列出语法,最好还能有例子说明,这样更容易理解。比如,创建表的时候,可能需要解释字段类型,主键约束这些。还有,查询部分要包括基本的SELECT,WHERE,聚合函数,分组,排序,这些都很基础但重要。
另外,Oracle有一些特有的功能,比如分页查询用ROWNUM或者12c之后的FETCH,序列和同义词,这些可能也是用户想了解的。需要区分不同版本,比如12c之前和之后的差异,避免用户使用时出现问题。
子查询和连接部分,用户可能需要知道内连接、外连接的区别,以及如何正确使用JOIN语法。函数方面,字符串函数、日期函数和转换函数都是常用的,可以举几个例子,比如TO_CHAR处理日期格式,NVL处理空值。
还要考虑性能方面的内容吗?比如索引的创建,但用户可能暂时只需要基础语法。不过提到索引的创建也是有必要的,毕竟优化查询常用。
最后,可能需要提醒用户注意Oracle的版本差异,比如分页方法的不同,以及一些最佳实践,比如使用JOIN代替旧式的连接语法。这样用户不仅能写出正确的语句,还能符合现代的标准。</think>以下是 Oracle 数据库的常用语法及示例介绍,涵盖基本 SQL 操作和常用功能:
---
### **1. 数据定义语言 (DDL)**
#### 创建表
```sql
CREATE TABLE employees (
emp_id NUMBER(10) PRIMARY KEY,
name VARCHAR2(50) NOT NULL,
hire_date DATE DEFAULT SYSDATE,
salary NUMBER(10, 2),
dept_id NUMBER(5)
);
```
#### 修改表结构
```sql
-- 添加列
ALTER TABLE employees ADD (email VARCHAR2(100));
-- 修改列类型
ALTER TABLE employees MODIFY (salary NUMBER(12, 2));
-- 删除列
ALTER TABLE employees DROP COLUMN email;
```
#### 删除表
```sql
DROP TABLE employees;
```
---
### **2. 数据操作语言 (DML)**
#### 插入数据
```sql
INSERT INTO employees (emp_id, name, salary)
VALUES (1, '张三', 8000);
```
#### 更新数据
```sql
UPDATE employees
SET salary = 9000
WHERE emp_id = 1;
```
#### 删除数据
```sql
DELETE FROM employees
WHERE emp_id = 1;
```
---
### **3. 查询语句 (SELECT)**
#### 基础查询
```sql
SELECT emp_id, name, salary FROM employees;
```
#### 条件过滤 (`WHERE`)
```sql
SELECT * FROM employees
WHERE salary > 5000 AND hire_date > DATE '2020-01-01';
```
#### 聚合函数
```sql
SELECT
AVG(salary) AS avg_salary,
MAX(hire_date) AS latest_hire_date,
COUNT(*) AS total_employees
FROM employees;
```
#### 分组 (`GROUP BY` + `HAVING`)
```sql
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
HAVING AVG(salary) > 7000;
```
#### 排序 (`ORDER BY`)
```sql
SELECT name, hire_date, salary
FROM employees
ORDER BY salary DESC, hire_date ASC;
```
---
### **4. 分页查询**
#### Oracle 12c+ 语法
```sql
SELECT * FROM employees
OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;
```
#### 传统方法(12c 之前)
```sql
SELECT * FROM (
SELECT t.*, ROWNUM rn
FROM (SELECT * FROM employees ORDER BY hire_date) t
) WHERE rn BETWEEN 11 AND 15;
```
---
### **5. 连接查询**
#### 内连接
```sql
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;
```
#### 左外连接
```sql
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;
```
---
### **6. 子查询**
#### 单行子查询
```sql
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
```
#### 多行子查询 (`IN`, `EXISTS`)
```sql
SELECT name FROM employees
WHERE dept_id IN (SELECT dept_id FROM departments WHERE location = '北京');
```
---
### **7. 常用函数**
#### 字符串函数
```sql
SELECT
UPPER(name) AS upper_name,
SUBSTR(name, 1, 3) AS short_name,
LENGTH(name) AS name_length
FROM employees;
```
#### 日期函数
```sql
SELECT
SYSDATE AS current_time,
TO_CHAR(hire_date, 'YYYY-MM-DD') AS formatted_date,
MONTHS_BETWEEN(SYSDATE, hire_date) AS months_worked
FROM employees;
```
#### 转换函数
```sql
SELECT
TO_CHAR(12345.67, '999,999.99') AS formatted_num,
TO_NUMBER('1000') + 500 AS num_result,
NVL(salary, 0) AS salary_with_default -- 处理 NULL
FROM employees;
```
---
### **8. 索引**
```sql
-- 创建索引
CREATE INDEX idx_emp_name ON employees(name);
-- 唯一索引
CREATE UNIQUE INDEX idx_emp_email ON employees(email);
```
---
### **9. 序列(自增主键工具)**
```sql
-- 创建序列
CREATE SEQUENCE emp_seq
START WITH 1000 INCREMENT BY 1 NOCACHE;
-- 使用序列
INSERT INTO employees (emp_id, name)
VALUES (emp_seq.NEXTVAL, '李四');
```
---
### **10. 同义词**
```sql
-- 创建同义词(简化对象访问)
CREATE SYNONYM emp FOR hr.employees;
SELECT * FROM emp; -- 等同于访问 hr.employees
```
---
### 注意事项:
1. **大小写不敏感**:Oracle 默认对象名和列名为大写,但字符串内容区分大小写。
2. **分号结尾**:SQL 语句建议以分号结束(PL/SQL 块中必须使用)。
3. **事务控制**:使用 `COMMIT` 提交事务,`ROLLBACK` 回滚。
可根据具体需求组合使用上述语法,并参考 Oracle 官方文档深入学习。