Oracle约束 SQL语句分类 集合运算 索引 相关知识点讲解

article/2025/9/26 15:40:42

ORACLE 约束:

数据库用来确保数据满足业务的手段,强制数据符合某些特定条件或者规范才可以插入

  1. 主键约束: primary key PK
  2. 唯一约束:unique
  3. 非空约束:not null
  4. 外键约束:foreign key FK
  5. 检查约束: check
  6. 默认约束: default

主键约束:

主键是唯一表示某一行的数据方法。
特点:唯一、非空、一张表只有一个主键、主键列必须有索引,如果没有会自动创建索引。
语法:

-- 创建表时添加 :
CREATE TABLE 表名(
列名  类型 pirimary key...
)CREATE TABLE2(
列名1 类型,
列名2 类型,
... ,
CONSTRAINT 约束名 primary key(列名)
)
-- 创建表之后添加:
-- 表创建之后添加约束可以借助于图形界面
-- 也可以通过ALTER TABLE 去添加、修改约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY(列名)-- 为了统一规范,一般通过  表名_关键词来作为约束名)

唯一约束:

唯一约束可以作用在一列或者多列上,用于确保数据的唯一性。
特点:唯一、会默认创建索引、唯一约束允许为null(多个null)

外键约束:

外键约束定义在具有父子关系的子表中,外键约束使子表中的列必须对应父表中的主键列。用于确保数据的完整性。
特点: 外键约束的子表中的列和附表中的主键类型一致, 列名可以不同
对应父类中的列必须是主键或者唯一键
外键约束的列允许为null
语法:

 CREATE TABLE 表名(
列   类型  REFERENCES 父表(父表对应的主键的列)
)
-- 创建表之后添加外键
ALTER TABLE 表名 ADD CONSTRAINT 约束名 关键词(子表列) REFERENCES 父表(父表的类)

案例:
--先建父表,后建子表CREATE TABLE TYPE(
ID NUMBER(5) PRIMARY KEY,
NAME VARCHAR2(200) UNIQUE
)CREATE TABLE GOODZ(
ID NUMBER(5) PRIMARY KEY,
NAME VARCHAR2(200),
PRICE NUMBER(9, 2),
--外键
TYPEID NUMBER(5) REFERENCES TYPE(ID)
)

ALTER TABLE GOODZ ADD CONSTRAINT
GOODZ_FK FOREIGN KEY(T_ID)
REFERENCES TYPE(ID)

注:
创建主外键约束时,先创建父表后创建子表
删除表: 先删除子表后删除父表
删除表中的数据时: 先删除子表数据再删除父表中的数据

检查约束:

检查约束可以用于给指定的列进行一些简单的校验。 比如:性别 男\女
设定某一些值的特定范围
例子:

CREATE TABLE(
SEX VARCHAR2(10) CHECK(SEX IN ('男', '女')),
AGE NUMBER(4) CHECK(AGE > 0 AND AGE <= 100)
)

约束目的:保证存入数据库的数据是正确的、有意义的数据


SQL语句分类

DDL(Data Defintion Language) 数据定义语言: 用来定义和修改数据库对象(表结构)
包括:CREATE DROP ALTER TRUNCATE(截断表)
DDL操作是隐式提交事务, 不需要手动提交,也不能使用rollback
DML(Data Manipulation Language) 数据操作语言:
包括:INSERT DELETE UPDATE
每一次操作都需要做事务 commit / rollback
DCL(Data Control Language) 数据控制语言::用于控制数据库权限
包括:GRANT 授权 REVOKE 撤销
GRANT CONNECT, RESOURCE TO ADMIN
REVOKE CONNECT TO ADMIN
TCL(Transaction Control Language) 事务控制语言: commit / rollback
DQL(Data Query Language) 数据查询语言: SELECT

删除表

DELETE 和 DROP 和 TRUNCATE 区别?

delete:只删除表数据,不能删除表定义,不释放空间,可以提交或回滚事务,还会触发触发器。
truncate:使用语法类似于drop, 也是删除表中的数据,不需要提交事务, 不能删除表的定义,
可以释放空间(相当于把表删掉,又创建了一张新的表)。
drop:删除表,会删除表中的定义,并且会释放空间,也不需要提交事务。

速度:DROP > TRUNCATE > DELETE


集合运算:

并集 UNION 和 UNION ALL

UNION:将两个结果集合并, 去重, 会按照默认排序规则排序
UNION ALL : 将两个结果集合并, 不去重, 不排序

注:合并的两个结果集, 列的类型和个数相同, UNION 也可以作为行转列来使用

行转列:

涉及的函数:

DECODE(列名,值1,结果1,… [,缺省值]);
CASE 列 WHEN 值1 THEN 结果1 WHEN 值2 THEN 结果2 [ELSE 缺省值] END

SELECT NAME, SUM(CASE COURSE WHEN '语文'
THEN SCORE ELSE 0 END) 语文,SUM(CASE COURSE WHEN '数学'
THEN SCORE ELSE 0 END) 数学,SUM(CASE COURSE WHEN '英语'
THEN SCORE ELSE 0 END) 英语
FROM TESTTABLE
GROUP BY NAME

列转行:

在这里插入图片描述

SELECT NAME, '语文' COURSE, CH_SCORE 
FROM TESTTABLE2UNION ALLSELECT NAME, '数学' COURSE, MA_SCORE 
FROM TESTTABLE2UNION ALLSELECT NAME, '英语' COURSE, EN_SCORE 
FROM TESTTABLE2

交集 INTERSECT :

获取两个结果集相同的部分 语法类似于并集

差集 MINUS:

两个结果集不同的部分


索引:

索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。
语法:CREATE INDEX 索引名 ON 表名(列[,列2,列3]) [tablespace 表空间名]
注: 主键和唯一键会默认创建索引
使用:1.如果查询时使用了添加索引的列作为查询条件,则数据库会默认走索引
          2.如果对多列建立索引,代表联合索引,查询时条件顺序是创建索引的顺序来走索引。

EXPLAIN PLAN F5 如果走了索引,就看到了索引的执行计划。

常见不走索引的情况:

1 . like 使用%进行模糊查询 不走索引
(如:列 like ‘%xxxx’ 不走索引     列 like ‘xxx%’ 走索引)
2.使用 is null 或 is not null 不走索引
3.where子句中使用了函数 不走索引
4.使用<>, not 不走索引

什么样子的列适合加索引?

非空、唯一 且不经常修改的数据还有经常作为查询条件的数据。
总结: 索引并不是越多越好, 索引可以增加查询的效率,但是会降低增删改的效率。


http://chatgpt.dhexx.cn/article/R5WPFVHu.shtml

相关文章

SQL对数据进行统计、常用集合函数

学生表&#xff1a; 1、统计记录个数 1&#xff09; count&#xff08;【all】*&#xff09;【as 列别名】 返回表中的记录数 执行&#xff1a;SELECT COUNT (* ) FROM 学生表 结果为&#xff1a; 执行&#xff1a;SELECT COUNT (* ) as 学生总人数 FROM 学生表…

关系数据库SQL数据查询

关系数据库SQL数据查询 数据查询 一、单表查询 1.查询仅涉及一个表&#xff0c;选择表中的若干列 [例1] 查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student; [例2] 查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student;查询全部列 选出所有属…

样本轮廓系数(原理、sklearn.metrics.silhouette_score、silhouette_samples参数介绍)

一、轮廓系数含义&#xff1a; 轮廓系数&#xff08;Silhouette Coefficient&#xff09;&#xff0c;是聚类效果好坏的一种评价方式。 最佳值为1&#xff0c;最差值为-1。接近0的值表示重叠的群集。负值通常表示样本已分配给错误的聚类&#xff0c;因为不同的聚类更为相…

java上位机开发(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前对于java语言&#xff0c;很多人都认为太简单。其实这是不对的&#xff0c;因为某种意义上来说所&#xff0c;java语言就像学习日语一样&#…

Qt之上位机开发实战(一)

一、Qt三大金刚 1、qt下的串口编程 2、qt下的网络编程 3、qt下的GPIO 本章节先介绍一下qt下的串口编程&#xff0c;首先我们新建一个Widget项目 其中接受框使用Plain Text Edit&#xff08;设置只读&#xff09;&#xff0c;串口号等按钮使用Combo Box&#xff0c;发送框使…

C# | 上位机开发新手指南(二)上位机通信

上位机开发新手指南&#xff08;二&#xff09;上位机通信 文章目录 上位机开发新手指南&#xff08;二&#xff09;上位机通信前言串口通信应用场景与控制器通信与传感器通信与仪器仪表通信与智能家居设备通信 常见协议ModbusCAN&#xff08;Controller Area Network&#xff…

C# 西门子PLC上位机开发环境搭建

一、安装软件 1. TIA_Portal_STEP7 15 博途&#xff0c;西门子的自动化开发软件 2. SIMATIC_S7PLCSIM_V15_1 西门子的仿真软件 3. NetToPLCsim C#程序是不能和仿真通信的&#xff0c;只有利用此软件&#xff0c;C#程序才能连接到仿真 二、配置软件 1. 博途 点击 创建新…

java上位机开发(网络编程)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所谓的网络编程&#xff0c;一般就是指UDP、TCP编程。传统的方法就是用api或者sdk直接编程&#xff0c;这种方法对于简单的协议是可以的。但是对于…

上位机开发(详细设计)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 所谓软件详细设计,它的上面对应的是架构设计,下面对应的是程序开发。架构设计有可能涉及多个软件,比如既可能涉及上位机这端,也可能涉及到mcu这端。详细设计的话,一般要落实到…

android ble 上位机,BLE的Android上位机开发(下)

原标题&#xff1a;BLE的Android上位机开发(下) ELLO! 大家好&#xff01;马上就更新下篇了呢~哈哈&#xff01;(上篇的地址&#xff1a;BLE的Android上位机开发(上))废话不多说了&#xff0c;先上主角吧&#xff01;代码如下&#xff01; [Java] 纯文本查看复制代码 ? 01 02 …

java上位机开发(java基础)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 java基础就是把java环境安装好&#xff0c;把基础程序构建起来。至少说让开发的同学来说有一点信心。从这一点来说&#xff0c;就算编写一个“Hell…

上位机开发的意义

上位机开发的意义 常见的上位机定义为一台可以发出特定操控命令的计算机&#xff0c; 通过操作预先设定好的命令&#xff0c;将命令传递给下位机&#xff0c;通过下位机来控制设备完成各项操作。此定义着重于强调控制指令的发送&#xff0c;实际上除了发送控制命令&#xff0c…

Qt之上位机开发实战(三)

UDP编程 udp相对于tcp来说相对简单&#xff0c;udp不分客户端和服务器&#xff0c;只需要使用一个QUdpSocket类&#xff0c;首先完成布局 Pro文件下加QT core gui network&#xff0c;.h文件下加#include <QUdpSocket> .h文件public下创建对象 QUdpSocket *udpSocket;…

C# | 上位机开发新手指南(三)框架

上位机开发新手指南&#xff08;三&#xff09;框架 文章目录 上位机开发新手指南&#xff08;三&#xff09;框架.NETWinFormsWPFUnity3D CQTMFC 其他语言LabVIEW .NET WinForms 在上位机开发中&#xff0c;Windows Forms是使用最广泛的C#框架之一。Windows Forms是.NET Fra…

哈喽上位机(上位机开发指南)

哈喽&#xff0c;上位机&#xff01; -------上位机开发指南 作者&#xff1a;Robert Zhang本博客以一个程序猿的角度解答了: - 有关上位机开发的疑惑 - 上机软件开发需要学习哪些知识 - 开发一个完整商业软件所需的技术与实现方法 - 怎样美化软件&#xff0c;那些漂亮的软件…

C#上位机开发常遇问题

C#上位机开发常遇问题 C#引用C动态库/静态库静态库动态库 unsafe和fixed关键字的应用unsafefixed Path类的使用写在结尾 最近完成了一个小项目的开发&#xff0c;在开发中遇到了一些问题&#xff0c;我感觉这些问题其他人在开发的时候也会遇到&#xff0c;所以我在这边总结一下…

C# 三菱PLC上位机开发环境搭建

一、安装软件 用到两个三菱的软件&#xff1a; 1. MX Component&#xff08;下载地址 也可以直接在官网上搜索&#xff0c;注意MX后面有空格&#xff09; 用于连接PLC 2. GX Works2&#xff08;下载地址 用GX Works3也行&#xff09; 这个软件主要是电气做PLC编程&#xf…

USB上位机开发

上位机开发采用图形化界面&#xff0c;使用C#语言进行开发。调用C编写的Dll动态库&#xff0c;实现与STM32进行USB通信的目的。 首先&#xff0c;编写Dll动态库。 开发环境采用VS2017&#xff0c;语言C 将lusb0_usb.h和libusb.lib文件拷贝到工程目录下。 libusb-win32-bin-…

Matlab上位机开发

Matlab上位机开发 1 了解上位机1.1 上位机的作用1.2 常用上位机开发方式1.2.1 Windows上位机&#xff08;基于串口通信&#xff09;1.2.2 Android上位机&#xff08;基于网络通信&#xff09; 1.3 教程概况1.3.1 C#上位机开发教程1.3.2 IoT App开发1.3.3 Matlab上位机开发 2 He…

C# | 上位机开发新手指南(一)概述

C#上位机开发新手指南&#xff08;一&#xff09;概述 文章目录 C#上位机开发新手指南&#xff08;一&#xff09;概述前言学习C#编程基础熟悉上位机开发相关知识选择合适的开发环境熟练掌握C#编程技巧掌握常用控件的使用方法学习与硬件通讯的方法最后 前言 C#&#xff0c;是微…