掌握Oracle SQL基础语法:核心SQL语句详解,轻松驾驭数据库
发布时间: 2024-08-03 21:01:16 阅读量: 28 订阅数: 38
![掌握Oracle SQL基础语法:核心SQL语句详解,轻松驾驭数据库](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL3N6X21tYml6X3BuZy9Bb2xrWGZpYzlsZElaZHZDUmJzanlaMFJkNEQxaWFOU2lhVWI3eTZYY2Y3QmhvYTdoR0Vjbm5ZWW1OS0VIZlhITTFLMllDMHNHUGNKOUhINFAxMklLUTFRUS82NDA?x-oss-process=image/format,png)
# 1. Oracle SQL简介
Oracle SQL是一种强大的关系型数据库管理系统(RDBMS),用于存储、管理和检索数据。它以其高性能、可靠性和可扩展性而闻名。
SQL(结构化查询语言)是Oracle SQL用于与数据库交互的标准语言。它允许用户创建、修改和删除数据库对象(如表和视图),插入、更新和删除数据,以及查询和分析数据。
Oracle SQL广泛用于各种行业,包括金融、医疗保健、制造和零售。它为企业提供了一个可靠且高效的平台,用于管理和分析其关键数据。
# 2. 数据定义语言(DDL)
### 2.1 创建表
**创建表语法**
```sql
CREATE TABLE table_name (
column_name data_type [NOT NULL] [DEFAULT default_value],
...
);
```
**参数说明**
- `table_name`: 表名
- `column_name`: 列名
- `data_type`: 数据类型(如 INTEGER、VARCHAR2、DATE 等)
- `NOT NULL`: 指定列不能为 NULL
- `DEFAULT default_value`: 指定列的默认值
**代码逻辑**
该语句用于创建一个新的表,并指定表中列的名称、数据类型和约束。如果指定了 `NOT NULL`,则该列不能包含 NULL 值。如果指定了 `DEFAULT default_value`,则该列在插入新行时将使用指定的默认值。
### 2.2 修改表
**修改表语法**
```sql
ALTER TABLE table_name
ADD [COLUMN] column_name data_type [NOT NULL] [DEFAULT default_value]
| DROP COLUMN column_name
| MODIFY COLUMN column_name data_type [NOT NULL] [DEFAULT default_value]
| RENAME COLUMN old_column_name TO new_column_name
| RENAME TO new_table_name;
```
**参数说明**
- `table_name`: 表名
- `column_name`: 列名
- `data_type`: 数据类型(如 INTEGER、VARCHAR2、DATE 等)
- `NOT NULL`: 指定列不能为 NULL
- `DEFAULT default_value`: 指定列的默认值
- `old_column_name`: 旧列名
- `new_column_name`: 新列名
- `new_table_name`: 新表名
**代码逻辑**
该语句用于修改现有表的结构。它可以添加、删除、修改或重命名列,还可以重命名表本身。
### 2.3 删除表
**删除表语法**
```sql
DROP TABLE table_name;
```
**参数说明**
- `table_name`: 表名
**代码逻辑**
该语句用于删除现有表及其所有数据。删除表后,将无法恢复数据。
# 3. 数据操作语言(DML)
### 3.1 插入数据
**语法:**
```sql
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
```
**参数说明:**
* `table_name`: 要插入数据的表名。
* `column1`, `column2`, ...: 要插入数据的列名。
* `value1`, `value2`, ...: 要插入数据的具体值。
**代码块:**
```sql
INSERT INTO employees (employee_id, first_name, last_name, email)
VALUES (100, 'John', 'Doe', 'john.doe@example.com');
```
**逻辑分析:**
该代码块将一条新记录插入到 `employees` 表中。记录包含以下信息:
* `employee_id`: 100
* `first_name`: John
* `last_name`: Doe
* `email`: john.doe@example.com
### 3.2 更新数据
**语法:**
```sql
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
```
**参数说明:**
* `table_name`: 要更新数据的表名。
* `column1`, `column2`, ...: 要更新的列名。
* `value1`, `value2`, ...: 要更新的具体值。
* `condition`: 更新数据的条件。
**代码块:**
```sql
UPDATE employees
SET salary = salary * 1.10
WHERE department_id = 10;
```
**逻辑分析:**
该代码块将 `employees` 表中 `department_id` 为 10 的所有员工的工资提高 10%。
### 3.3 删除数据
**语法:**
```sql
DELETE FROM table_name
WHERE condition;
```
**参数说明:**
* `table_name`: 要删除数据的表名。
* `condition`: 删除数据的条件。
**代码块:**
```sql
DELETE FROM employees
WHERE employee_id = 100;
```
**逻辑分析:**
该代码块将 `employees` 表中 `employee_id` 为 100 的记录删除。
# 4 数据查询语言(DQL)
### 4.1 单表查询
单表查询是最基本的查询操作,用于从单个表中检索数据。Oracle SQL 提供了丰富的查询语法,可以满足各种查询需求。
**基本查询语法**
```sql
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件表达式;
```
**参数说明:**
* **SELECT**:指定要检索的列。
* **FROM**:指定要查询的表。
* **WHERE**:指定查询条件,用于过滤结果集。
**示例:**
```sql
SELECT customer_id, customer_name
FROM customers
WHERE city = 'London';
```
**逻辑分析:**
此查询从 `customers` 表中检索 `customer_id` 和 `customer_name` 列,并使用 `WHERE` 子句过滤结果,仅返回城市为 "London" 的客户记录。
### 4.2 多表查询
多表查询用于从多个表中检索数据,通过连接条件将表关联起来。Oracle SQL 支持多种连接类型,包括内连接、外连接和交叉连接。
**内连接**
```sql
SELECT 列名1, 列名2, ...
FROM 表名1
INNER JOIN 表名2 ON 连接条件;
```
**参数说明:**
* **INNER JOIN**:指定内连接,仅返回连接条件满足的记录。
* **ON**:指定连接条件,用于比较两个表中的列。
**示例:**
```sql
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
```
**逻辑分析:**
此查询从 `orders` 表和 `customers` 表中检索数据,通过 `INNER JOIN` 连接条件将这两个表关联起来。仅返回订单表中与客户表中记录匹配的订单记录。
### 4.3 子查询
子查询是一种嵌套查询,可以在主查询中使用。它允许在查询中使用其他查询的结果。
**基本语法**
```sql
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件表达式 IN (子查询);
```
**参数说明:**
* **IN**:指定子查询,用于过滤主查询的结果。
**示例:**
```sql
SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (
SELECT customer_id
FROM orders
WHERE product_id = 100
);
```
**逻辑分析:**
此查询从 `customers` 表中检索数据,并使用子查询过滤结果。子查询从 `orders` 表中检索购买了产品 ID 为 100 的客户 ID。主查询仅返回与子查询结果匹配的客户记录。
# 5. 数据控制语言(DCL)
### 5.1 权限管理
**GRANT 语句**
GRANT 语句用于授予用户或角色对数据库对象的特定权限。语法如下:
```sql
GRANT <权限> ON <对象> TO <用户或角色>
```
**参数说明:**
- `<权限>`:要授予的权限,例如 SELECT、INSERT、UPDATE、DELETE 等。
- `<对象>`:要授予权限的对象,例如表、视图、存储过程等。
- `<用户或角色>`:要授予权限的用户或角色。
**示例:**
授予用户 `user1` 对表 `table1` 的查询权限:
```sql
GRANT SELECT ON table1 TO user1;
```
**REVOKE 语句**
REVOKE 语句用于撤销用户或角色对数据库对象的权限。语法如下:
```sql
REVOKE <权限> ON <对象> FROM <用户或角色>
```
**参数说明:**
- `<权限>`:要撤销的权限。
- `<对象>`:要撤销权限的对象。
- `<用户或角色>`:要撤销权限的用户或角色。
**示例:**
撤销用户 `user1` 对表 `table1` 的查询权限:
```sql
REVOKE SELECT ON table1 FROM user1;
```
### 5.2 事务管理
**事务**
事务是一组原子操作,要么全部成功,要么全部失败。Oracle SQL 中的事务由以下步骤组成:
- **开始事务:**使用 `BEGIN` 语句开始一个事务。
- **执行操作:**执行事务中的 SQL 语句。
- **提交事务:**使用 `COMMIT` 语句提交事务,使所有更改永久生效。
- **回滚事务:**使用 `ROLLBACK` 语句回滚事务,撤销所有更改。
**示例:**
```sql
BEGIN;
INSERT INTO table1 (name, age) VALUES ('John', 30);
UPDATE table1 SET age = 31 WHERE name = 'John';
COMMIT;
```
**保存点**
保存点允许在事务中创建检查点,以便在发生错误时回滚到该点。使用 `SAVEPOINT` 语句创建保存点,使用 `ROLLBACK TO SAVEPOINT` 语句回滚到该点。
**示例:**
```sql
BEGIN;
SAVEPOINT my_savepoint;
INSERT INTO table1 (name, age) VALUES ('John', 30);
UPDATE table1 SET age = 31 WHERE name = 'John';
-- 如果发生错误,回滚到保存点
ROLLBACK TO SAVEPOINT my_savepoint;
COMMIT;
```
**锁**
锁用于防止并发事务修改同一行数据。Oracle SQL 支持以下类型的锁:
- **共享锁(S):**允许其他事务读取数据,但不能修改。
- **排他锁(X):**允许事务修改数据,但其他事务不能读取或修改。
- **意向共享锁(IS):**表示事务计划获取共享锁。
- **意向排他锁(IX):**表示事务计划获取排他锁。
**锁模式**
锁模式用于指定要获取的锁类型。以下是常见的锁模式:
- **ROW SHARE:**获取共享锁。
- **ROW EXCLUSIVE:**获取排他锁。
- **TABLE SHARE:**获取意向共享锁。
- **TABLE EXCLUSIVE:**获取意向排他锁。
**示例:**
```sql
SELECT * FROM table1 FOR UPDATE;
```
此语句将获取表 `table1` 上的排他锁,防止其他事务修改数据。
# 6.1 数据查询和分析
Oracle SQL 强大的查询功能使您可以高效地从数据库中提取和分析数据。以下是一些常见的查询技术:
### 1. 单表查询
单表查询用于从单个表中检索数据。基本的语法如下:
```sql
SELECT column_list
FROM table_name
WHERE condition;
```
例如,要从 `employees` 表中选择所有员工的姓名和工资,可以使用以下查询:
```sql
SELECT name, salary
FROM employees;
```
### 2. 多表查询
多表查询用于从多个表中检索数据。您可以使用 `JOIN` 关键字将表连接起来。常用的连接类型包括:
- **INNER JOIN:**仅返回满足连接条件的行。
- **LEFT JOIN:**返回左表的所有行,以及满足连接条件的右表行。
- **RIGHT JOIN:**返回右表的所有行,以及满足连接条件的左表行。
- **FULL JOIN:**返回两个表的所有行,无论是否满足连接条件。
例如,要从 `employees` 表和 `departments` 表中选择员工姓名、部门名称和工资,可以使用以下查询:
```sql
SELECT e.name, d.department_name, e.salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
```
### 3. 子查询
子查询是嵌套在另一个查询中的查询。它们可以用于执行更复杂的数据检索。子查询的语法如下:
```sql
SELECT column_list
FROM (subquery)
WHERE condition;
```
例如,要查找工资高于部门平均工资的员工,可以使用以下查询:
```sql
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = department_id);
```
### 4. 数据分析
Oracle SQL 提供了各种分析函数,用于执行聚合计算和统计分析。常用的分析函数包括:
- **SUM:**计算值的总和。
- **AVG:**计算值的平均值。
- **MAX:**计算最大值。
- **MIN:**计算最小值。
- **COUNT:**计算行数。
例如,要计算每个部门的员工总数,可以使用以下查询:
```sql
SELECT department_name, COUNT(*) AS employee_count
FROM employees
GROUP BY department_name;
```
0
0