首页 > 数据库 >Oracle 第4章:SQL基础

Oracle 第4章:SQL基础

时间:2024-10-26 13:20:22浏览次数:8  
标签:salary employees 基础 查询 SQL Oracle id SELECT

在学习Oracle数据库的第四章——SQL基础时,我们会涉及到SQL(Structured Query Language)的基本概念以及如何使用基本的SQL查询语句来获取数据。以下是这一章节中可能涵盖的一些关键点:

SQL简介

SQL是一种用于管理和处理数据库的标准计算机语言。它主要用于存储、检索、管理和操作关系型数据库中的数据。SQL可以用来执行各种任务,包括创建新的数据库表、插入新的记录、更新现有记录、删除记录以及查询数据。

基本查询语句

基本的SQL查询语句通常从SELECT开始,它允许用户指定想要选择哪些列(columns),接着是FROM关键字,用来指定要从哪个表(table)中选择数据。此外,还可以使用WHERE子句来过滤结果集,使用ORDER BY对结果进行排序等。

下面是一些简单的SQL查询语句的例子:

  1. 选择所有列的所有行

    SELECT * FROM employees;
    

    这个查询会返回employees表中的所有行。

  2. 选择特定列的所有行

    SELECT first_name, last_name FROM employees;
    

    这个查询仅返回employees表中的first_name和last_name两列的数据。

  3. 使用WHERE子句进行过滤

    SELECT * FROM employees WHERE department_id = 30;
    

    这个查询将只返回属于部门ID为30的员工信息。

  4. 使用ORDER BY子句进行排序

    SELECT * FROM employees ORDER BY salary DESC;
    

    这个查询将返回所有员工的信息,并按照工资从高到低排序。

  5. 使用聚合函数

    SELECT COUNT(*) FROM employees;
    

    此查询计算employees表中的总行数。

  6. 使用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

相关文章

  • 【MySQL数据库】MySQL主从复制
    文章目录MySQL主从复制MySQL主从复制的分类MySQL主从复制原理MySQL主从复制的配置步骤MySQL主从复制的同步模式MySQL主从复制实验环境准备关闭防火墙和SELinux时间同步主服务器设置从服务器设置MySQL主从复制配置主服务器配置从服务器配置(以Slave1为例,Slave2配置......
  • 【MySQL数据库】MySQL读写分离
    文章目录读写分离概念读写分离的动机读写分离的适用场景主从复制与读写分离MySQL读写分离原理MySQL读写分离的实现方式代表性程序MySQL读写分离实验搭建MySQL读写分离Amoeba服务器配置测试读写分离问答读写分离概念读写分离是为了优化数据库性能,通过将写......
  • shell基础
    shell基础双引号(""):允许变量展开和命令替换,但保留大部分特殊字符的字面含义。$``\!单引号(''):所有内容都被视为字面量,不会进行变量展开或命令替换。例如,echo'$VAR'会输出$VAR而不是变量的值。反引号():用于命令替换,将命令的输出替换到命令行中。例如,DATE=$(dat......
  • Sql高级
    sql高级1.索引与视图常见的数据结构栈:先进后出队列:先进先出数组;查询快,根据下标查询链表:分为双链表与单链表。单链表指向下一个数据的存储位置;双链表指向前一个与下一个数据的存储位置(引用地址)。二叉树:左小右大平衡二叉树:二叉树的优化版本,尽可能的让树的度数变低,提高查找......
  • C语言数组与函数实践:构建基础版扫雷游戏
         使用C语言中的数组和函数来构建一个简单的扫雷游戏。通过这个项目,你可以练习如何在C语言中使用数组来存储和处理游戏数据,如何使用函数来组织代码并提高代码的可读性和可维护性。        在实现这个项目时,你可以按照以下步骤进行:1、定义游戏数组:使用二维数......
  • 「漏洞复现」BladeX企业级开发平台 tenant/list SQL 注入漏洞复现(CVE-2024-33332)
    0x01 免责声明请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需......
  • linux基础
    linux基本命令1修改时区1.修改时区timedatectlset-timezone“时区”2.创建用户查看用户idadmin创建用户useraddadmin修改密码passwdadmin输入两次修改自己的密码时直接passwd3切换用户su-adminsuadmn注销exit4vim1.按i键进入插入模式2.按esc键返回......
  • 零基础小白如何入门大模型?(附学习路线)
    大模型赛道有前景吗?这个问题,是个热门话题,但不是个好问题。因为,它基于不同的提问人、提问意图,会有不同的答案。前排提示,文末有大模型AGI-CSDN独家资料包哦!对于一个职业发展初期的新人,提问的意图可能是:我要不要转行去大模型赛道,从而可以获得更快的职业发展?让我三年内直达......
  • Redis的基础命令
    一、数据库操作命令1.redis中库的说明redis中的库默认存在16个库,分别按照0-15来排列选择库的命令:select0-15例如:select1就是选择一号库的意思2.清空表的命令1.清除当前表:flushdb2.清除所有表:flushall3.redis中客户端显示中文./redis-cli-p7000--raw二、操作key相......
  • 【MySQL基础】数据库与表的基本操作:从创建到管理
    文章目录写在前面:1、数据库的创建和管理1.创建数据库:CREATEDATABASE注意事项:2.查看已有数据库:SHOWDATABASES3.删除数据库:DROPDATABASE防止误删4.总结2、表的创建与管理1.创建数据表:CREATETABLE2.查看表结构:DESCRIBE表名3.删除数据表:DROPTABLE4.修改表结......