在学习Oracle数据库的第四章——SQL基础时,我们会涉及到SQL(Structured Query Language)的基本概念以及如何使用基本的SQL查询语句来获取数据。以下是这一章节中可能涵盖的一些关键点:
SQL简介
SQL是一种用于管理和处理数据库的标准计算机语言。它主要用于存储、检索、管理和操作关系型数据库中的数据。SQL可以用来执行各种任务,包括创建新的数据库表、插入新的记录、更新现有记录、删除记录以及查询数据。
基本查询语句
基本的SQL查询语句通常从SELECT开始,它允许用户指定想要选择哪些列(columns),接着是FROM关键字,用来指定要从哪个表(table)中选择数据。此外,还可以使用WHERE子句来过滤结果集,使用ORDER BY对结果进行排序等。
下面是一些简单的SQL查询语句的例子:
-
选择所有列的所有行:
SELECT * FROM employees;
这个查询会返回employees表中的所有行。
-
选择特定列的所有行:
SELECT first_name, last_name FROM employees;
这个查询仅返回employees表中的first_name和last_name两列的数据。
-
使用WHERE子句进行过滤:
SELECT * FROM employees WHERE department_id = 30;
这个查询将只返回属于部门ID为30的员工信息。
-
使用ORDER BY子句进行排序:
SELECT * FROM employees ORDER BY salary DESC;
这个查询将返回所有员工的信息,并按照工资从高到低排序。
-
使用聚合函数:
SELECT COUNT(*) FROM employees;
此查询计算employees表中的总行数。
-
使用GROUP BY进行分组统计:
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id;
这个查询计算每个部门的平均工资。
通过这些基本的SQL查询语句,你可以开始探索和管理数据库中的数据。随着进一步的学习,你将会接触到更复杂的查询,如联接(JOIN)、子查询(subquery)等高级特性。
使用 JOIN 子句
JOIN 是一个非常重要的概念,因为它允许你从多个表中组合数据。以下是一个简单的 INNER JOIN 示例:
SELECT e.first_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
这个查询将 employees
表与 departments
表连接起来,基于它们具有相同的 department_id
,并选择员工的名字和部门名称。
使用 UNION 操作符
UNION 操作符用于合并两个或更多 SELECT 语句的结果集,但是每个 SELECT 语句中的列必须具有相同数量,并且类型相似。
SELECT first_name, last_name FROM employees
WHERE department_id = 30
UNION
SELECT first_name, last_name FROM employees
WHERE department_id = 100;
此查询将返回 department_id
为 30 或 100 的所有员工的名字和姓氏。
使用子查询(Subqueries)
子查询是指在一个查询内部的另一个查询。子查询的结果可以作为外部查询的一部分使用。
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
这里,内部查询 (SELECT AVG(salary) FROM employees)
计算所有员工的平均工资,外部查询则选择那些工资高于平均值的员工。
使用聚合函数
除了之前提到的 COUNT 和 AVG 函数外,SQL 还提供了其他聚合函数,比如 SUM 和 MIN/MAX。
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id;
这个查询显示了每个部门的最大工资。
使用窗口函数(Window Functions)
窗口函数允许你在查询中执行复杂的计算,例如计算每行相对于整个结果集的位置。常见的窗口函数有 RANK(), DENSE_RANK(), ROW_NUMBER() 等。
SELECT first_name, last_name, salary,
RANK() OVER (ORDER BY salary DESC) as salary_rank
FROM employees;
这个查询将根据工资降序排列员工,并为每个员工分配一个排名。
总结
以上就是一些基本的 SQL 查询语句和它们的应用示例。通过这些基本的知识,你应该能够开始编写自己的查询,并逐步学习更高级的功能。SQL 是一种非常强大的工具,能够帮助你有效地管理和分析数据。随着经验的增长,你将能够写出更加复杂和高效的查询。
更多SQL特性和用法
复杂的条件过滤 - CASE语句
CASE语句可以让你在SQL查询中实现条件逻辑。它可以用于根据不同的条件返回不同的结果。
SELECT first_name,
last_name,
CASE
WHEN salary > 10000 THEN 'High Earner'
WHEN salary BETWEEN 5000 AND 10000 THEN 'Medium Earner'
ELSE 'Low Earner'
END AS earner_status
FROM employees;
这个查询将根据员工的薪水范围给他们分类为“High Earner”、“Medium Earner”或“Low Earner”。
数据修改 - INSERT, UPDATE, DELETE
除了查询数据之外,SQL还允许你修改数据库中的数据。以下是一些常见的数据修改语句:
- INSERT: 向表中插入新记录。
INSERT INTO employees (first_name, last_name, email, hire_date, job_id, salary, department_id)
VALUES ('John', 'Doe', '[email protected]', '2024-01-01', 'IT_PROG', 8000, 30);
- UPDATE: 更新现有的记录。
UPDATE employees
SET salary = 9000
WHERE employee_id = 100;
- DELETE: 删除记录。
DELETE FROM employees
WHERE employee_id = 100;
请注意,在执行任何修改数据的操作前,确保你已经备份了相关数据,以防止意外丢失。
视图(Views)
视图是一个虚拟表,其内容是由存储在一个SELECT语句中的结果集构成的。视图可以简化复杂的查询,并且可以用来隐藏数据的真实结构。
CREATE VIEW high_earners AS
SELECT *
FROM employees
WHERE salary > 10000;
SELECT * FROM high_earners;
在这个例子中,我们创建了一个名为 high_earners
的视图,它包含所有薪水超过10000的员工信息。
存储过程(Stored Procedures)
存储过程是预编译的SQL语句集合,可以带参数并作为一个单元执行。它们可以增强SQL功能,并提供事务支持。
CREATE OR REPLACE PROCEDURE update_salary(emp_id IN NUMBER, new_salary IN NUMBER) IS
BEGIN
UPDATE employees SET salary = new_salary WHERE employee_id = emp_id;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END;
/
这段代码定义了一个存储过程 update_salary
,它接受员工ID和新工资作为输入参数,并更新该员工的薪水。
通过这些更高级的主题,你可以看到SQL不仅仅是一个用于查询数据的语言,而且还是一个强大的工具,可以帮助你管理、修改和优化你的数据库环境。希望这些信息对你有所帮助!
当然,我们可以继续探讨更多的SQL主题,包括一些高级特性和技术,这些将帮助你更好地管理和操作数据库。
高级SQL主题
事务处理(Transactions)
事务是一系列作为单个工作单元执行的SQL操作。如果事务中的任何一个操作失败,则事务中的所有更改都将回滚,以保持数据的一致性。
BEGIN TRANSACTION;
UPDATE employees SET salary = salary + 1000 WHERE department_id = 30;
COMMIT;
在这个例子中,我们首先开始一个新的事务,然后增加所有部门ID为30的员工的薪水,最后提交事务。如果在事务过程中发生错误,可以使用 ROLLBACK
回滚所有的更改。
触发器(Triggers)
触发器是在特定事件(如插入、更新或删除)发生时自动执行的SQL代码块。它们可以用来强制业务规则或数据完整性。
CREATE OR REPLACE TRIGGER check_salary_update
BEFORE UPDATE OF salary ON employees
FOR EACH ROW
DECLARE
BEGIN
IF :NEW.salary < 3000 THEN
RAISE_APPLICATION_ERROR(-20001, 'Salary cannot be less than 3000.');
END IF;
END;
/
这个触发器会在更新 employees
表中的 salary
字段之前检查新薪水是否低于3000。如果是,则抛出一个错误。
索引(Indexes)
索引是用来提高数据检索速度的数据结构。尽管它们可以显著加快查询速度,但它们也会占用额外的存储空间,并可能影响写入性能(因为每次数据更改时都需要更新索引)。
CREATE INDEX idx_dept ON employees(department_id);
这个命令创建了一个名为 idx_dept
的索引,以加快按 department_id
检索 employees
表的速度。
分区(Partitioning)
分区是在大型表中为了提高性能而采用的一种策略。分区可以按范围、列表或散列等方式进行。
CREATE TABLE sales (
sale_date DATE NOT NULL,
amount NUMBER(10,2) NOT NULL,
customer_id NUMBER(6)
)
PARTITION BY RANGE (sale_date)
INTERVAL (NUMTODSINTERVAL(1, 'YEAR')) (
PARTITION p0 VALUES LESS THAN (TO_DATE('2020-01-01', 'YYYY-MM-DD'))
);
在这个例子中,sales
表被按日期范围进行区间分区,每隔一年创建一个新的分区。
序列(Sequences)
序列是用来生成唯一编号的对象,通常用于为主键字段自动填充。
CREATE SEQUENCE seq_employee_id
INCREMENT BY 1
START WITH 1000
MINVALUE 1000
MAXVALUE 9999
CYCLE
CACHE 20;
这个命令创建了一个名为 seq_employee_id
的序列,每次调用时递增1,从1000开始。
SELECT seq_employee_id.NEXTVAL FROM DUAL;
这段代码展示了如何使用序列来生成下一个可用的ID。
结合实际场景的综合练习
为了更好地掌握SQL技能,实践是非常重要的。你可以尝试构建一些小项目,比如模拟一个在线商店的订单系统,其中包括客户、产品、订单和支付等表,并使用上述介绍的各种SQL特性来实现数据的增删改查等功能。
希望这些补充内容能帮助你更全面地理解SQL及其应用。如果你有任何具体的问题或者需要进一步的指导,请随时提问。
标签:salary,employees,基础,查询,SQL,Oracle,id,SELECT From: https://blog.csdn.net/hummhumm/article/details/143229764