Oracle 第4章:SQL基础

news2024/10/25 23:12:06

在学习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', 'johndoe@example.com', '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及其应用。如果你有任何具体的问题或者需要进一步的指导,请随时提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2223619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

400V交流智能剩余电流监测系统设计与应用

摘要&#xff1a;针对变电站400V交流系统频繁发生剩余电流保护器跳闸的问题&#xff0c;本研究设计了一套智能化的分布式剩余电流监测系统。该系统利用CT传感器采集400V系统各负载端的剩余电流数据&#xff0c;经过运算处理后&#xff0c;将信息传递给交流绝缘监测装置。随后&a…

>甘晴void:小蒟蒻的CCSP2024

小蒟蒻前两天参加了CCSP2024 最终幸运蹭铜&#xff08;蹭着本科的边边捞到了铜牌&#xff0c;没有遗憾了&#xff09;。 评价感受 本来只是来打酱油&#xff08;蹭吃蹭喝&#xff09;的&#xff0c;因为自从推免结束后&#xff0c;已经正好一个月没碰代码了&#xff0c;上一次…

DeepLearn-实现天气的识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本次使用的数据集有晴天、雨天、多云和日出。 导入基本的包 包括读取文件、图像处理、科学计算和tensorflow的api包layers是层模块&#xff0c;提供了神经网络…

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist 环境 python 3.10 torch 2.4.0cu118 torchvision 0.19.0cu118 vllm 0.6.1.post2cu118问题详情 if torch._C._d…

利用客户端导入有关联的业务数据(DBeaver+sql)

前言 最近有点坑&#xff0c;麻辣烫的活落手上了&#xff0c;上个迭代除了自己的开发任务&#xff0c;还有处理接手的工作。然后节后问题又多&#xff0c;还有前1个迭代没有测试的模块本迭代测试&#xff0c;烦死了。 这次这个数据处理的活&#xff0c;以后希望可以交出…

香橙派5(RK3588)使用npu加速yolov5推理的部署过程

香橙派5使用npu加速yolov5推理的部署过程 硬件环境 部署过程 模型训练(x86主机) 在带nvidia显卡(最好)的主机上进行yolo的配置与训练, 获取最终的best.pt模型文件, 详见另一篇文档 模型转换(x86主机) 下载airockchip提供的yolov5(从pt到onnx) 一定要下这个版本的yolov5, …

docker集成Nginx和Mysql (教程)

文章目录 前言一、Docker 集成Nginx步骤 1&#xff1a;安装 Docker步骤 2&#xff1a;拉取官方的 Nginx Docker 镜像1.可以先搜索nginx镜像(查看nginx镜像)2.拉取nginx镜像步骤 3&#xff1a;运行 Nginx 容器 二、Docker 集成Mysql步骤 1&#xff1a;拉取mysql镜像步骤2、运行 …

Vulnhub打靶-DC-1

基本信息 靶机下载&#xff1a;https://download.vulnhub.com/dc/DC-1.zip 攻击机器&#xff1a;192.168.20.128&#xff08;Windows操作系统&#xff09;& 192.168.20.138&#xff08;kali&#xff09; 靶机&#xff1a;192.168.20.0/24 目标&#xff1a;获取2个flag…

SQL 干货 | SQL 半连接

大多数数据库开发人员和管理员都熟悉标准的内、外、左和右连接类型。虽然可以使用 ANSI SQL 编写这些连接类型&#xff0c;但还有一些连接类型是基于关系代数运算符的&#xff0c;在 SQL 中没有语法表示。今天我们将学习一种这样的连接类型&#xff1a;半连接&#xff08;Semi …

tensorflow案例3--运动鞋识别(学习tensorflow动态加载学习率、如何设置早停等方法)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 这个案例还是以学习API为主&#xff0c;学习了tensorflow如何动态加载学习率、如何设置早停等方法&#xff1b;这个案例主要学习为主&#xff0c;由于模…

SpringBoot 集成RabbitMQ 实现钉钉日报定时发送功能

文章目录 一、RabbitMq 下载安装二、开发步骤&#xff1a;1.MAVEN 配置2. RabbitMqConfig 配置3. RabbitMqUtil 工具类4. DailyDelaySendConsumer 消费者监听5. 测试延迟发送 一、RabbitMq 下载安装 官网&#xff1a;https://www.rabbitmq.com/docs 二、开发步骤&#xff1a;…

Python 实现彩票抽奖系统详解(双色球)

目录 一、系统功能概述 二、代码实现详解 &#xff08;一&#xff09;自选功能实现&#xff08;ziXuanCaiPiao函数&#xff09; &#xff08;二&#xff09;机选功能实现&#xff08;autoChoiceCaiPiao函数&#xff09; &#xff08;三&#xff09;彩票展示功能实现&#x…

如何解决 IDEA 的 pom.xml 文件中,依赖警告问题

原因 在升级高版本的Idea后&#xff0c;我的是&#xff08;2024.2&#xff09;版本。Idea默认引入了插件 Package Checker 插件&#xff0c;用于检查 Maven 的 pom.xml 引入的 jar 包是否有漏洞风险。如果有漏洞风险则直接在引入的 pom.xml 下画黄线警告。 虽然不是错误&…

Tkinter -- python GUI学习与使用

前言 python GUI 目前pythonGUI有很多&#xff0c;哪一个最好&#xff1f; 先说说我选择的思路&#xff0c;我的目的是开发一个易用的软件&#xff0c;最重要的是稳定&#xff0c;并且碰到问题能够解决&#xff0c;因此&#xff0c;我的目标很明确&#xff0c;有比较大的用户群…

杂项笔记

1 这个好像如果如果分配空间就会执行 这个扩容好像会进行拷贝 2 3 4 没懂 5

【数据结构与算法】走进数据结构的“时间胶囊”——栈

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 引言 一.栈的基本概念 1.1 定义 1.2 特性 1.3 基本操作 二.栈的实现方式 2.1 顺序栈 2.2 链栈 三.顺序栈的实现 定义顺序栈的结构 初始化 入栈 检查栈是否为空 出栈 销毁 四.链栈的实现 定义链栈的结构 初始…

未来汽车驾驶还会有趣吗?车辆动力学系统简史

未来汽车驾驶还会有趣吗&#xff1f;车辆动力学系统简史 本篇文章来源&#xff1a;Schmidt, F., Knig, L. (2020). Will driving still be fun in the future? Vehicle dynamics systems through the ages. In: Pfeffer, P. (eds) 10th International Munich Chassis Symposiu…

数字图像处理的概念(一)

一 何谓数字图像处理 1 图像的概念 图像是对客观存在的物体的一种相似性的、生动的写真或描述。 2 图像的类别 可见光成像和不可见光成像 单波段、多波段和超波段图像 伽马射线成像 主要用途包括核 医学和天文观测 等 。 核医学 a)同位素注射 骨骼扫描图像 b)正电子放射( …

【Docker】安装、镜像、容器

什么是Docker&#xff1f; Docker&#xff1a;是基于Go语言实现的开源项目。 Docker 是一个用于开发、交付和运行应用程序的开放平台。它允许开发人员将应用程序及其依赖包打包到一个可移植的容器中&#xff0c; 然后在任何流行的 Linux 机器上运行。Docker 容器是完全隔离的&…

Openpyxl--学习记录

1.工作表的基本操作 1.1 工作表的新建打开与保存 1.1.1 创建工作簿 from openpyxl import Workbook from pathlib import Pathfile_path Path.home() / "Desktop" / "123.xlsx"# 1.创建工作簿 wb Workbook() # 2.访问默认工作簿 ws wb.active # 3.填充…