详解SQL数据定义功能
数据定义
- 1. 数据库模式(Schema)的定义与删除
- 定义模式
- 删除模式
- 2. 基本表的定义、修改与删除
- 定义表
- 约束
- 1. `NOT NULL` 约束
- 2. `DEFAULT` 约束
- 3. `UNIQUE` 约束
- 4. `PRIMARY KEY` 约束
- 多列主键示例:
- 5. `FOREIGN KEY` 约束
- 6. `CHECK` 约束
- 7. `AUTO_INCREMENT` (MySQL 特有)
- 综合示例:定义一张复杂表
- 修改表结构
- 删除表
- 3. 视图(View)的定义与删除
- 创建视图
- 删除视图
- 4. 索引的建立、修改与删除
- 创建索引
- 修改索引
- 删除索引
- 总结
1. 数据库模式(Schema)的定义与删除
定义模式
CREATE SCHEMA schema_name;
- 示例:
CREATE SCHEMA my_schema;- 说明:创建名为
my_schema的模式。
- 说明:创建名为
删除模式
DROP SCHEMA schema_name [CASCADE | RESTRICT];
- 示例:
DROP SCHEMA my_schema CASCADE;- 说明:
CASCADE:删除模式时,同时删除模式中的所有对象。RESTRICT:如果模式中存在对象,则无法删除。
- 说明:
2. 基本表的定义、修改与删除
定义表
CREATE TABLE table_name (column1 datatype [constraints],column2 datatype [constraints],...columnN datatype [constraints]
);
- 示例:
CREATE TABLE employees (employee_id INT PRIMARY KEY,name VARCHAR(100) NOT NULL,department_id INT,hire_date DATE,salary DECIMAL(10, 2) );- 说明:创建名为
employees的表,包含以下字段:employee_id:主键,不允许为空。name:员工姓名,不允许为空。department_id:部门编号,允许为空。hire_date:雇佣日期。salary:薪资,精确到小数点后两位。
- 说明:创建名为
约束
1. NOT NULL 约束
- 作用:保证列的值不能为
NULL,即必须提供一个值。 - 语法:
column_name data_type NOT NULL - 示例:
CREATE TABLE employees (employee_id INT NOT NULL,name VARCHAR(100) NOT NULL,hire_date DATE NOT NULL );- 说明:
employee_id、name和hire_date列都必须有值,不能为NULL。
- 说明:
2. DEFAULT 约束
- 作用:为列设置一个默认值,当插入数据时未提供值时使用默认值。
- 语法:
column_name data_type DEFAULT default_value - 示例:
CREATE TABLE employees (employee_id INT NOT NULL,name VARCHAR(100) NOT NULL,hire_date DATE DEFAULT CURRENT_DATE,salary DECIMAL(10, 2) DEFAULT 3000.00 );- 说明:
hire_date默认值是当前日期。salary默认值是 3000.00,如果插入数据时未提供salary值,将使用默认值。
- 说明:
3. UNIQUE 约束
- 作用:保证列中的值唯一,不能重复。
- 语法:
column_name data_type UNIQUE - 示例:
CREATE TABLE employees (employee_id INT NOT NULL UNIQUE,email VARCHAR(255) UNIQUE );- 说明:
employee_id和email列中的值不能重复。UNIQUE可以保证唯一性,但不同于主键,它允许列中存在NULL值。
- 说明:
4. PRIMARY KEY 约束
- 作用:用于标识表中的唯一记录,必须唯一且不能为
NULL。 - 语法:
column_name data_type PRIMARY KEY - 或者在多列上定义主键:
PRIMARY KEY (column1, column2, ...) - 示例:
CREATE TABLE employees (employee_id INT PRIMARY KEY,name VARCHAR(100),department_id INT,hire_date DATE );- 说明:
employee_id是表的主键,值必须唯一且不能为NULL。
- 说明:
多列主键示例:
CREATE TABLE order_items (order_id INT,item_id INT,quantity INT,PRIMARY KEY (order_id, item_id)
);
- 说明:
order_id和item_id组合在一起作为主键,确保每个订单中每个商品的记录唯一。
5. FOREIGN KEY 约束
- 作用:用于建立两张表之间的关系,确保外键列的值必须在另一张表中存在。
- 语法:
column_name data_type REFERENCES parent_table (parent_column) - 或者:
FOREIGN KEY (column_name) REFERENCES parent_table (parent_column) - 示例:
CREATE TABLE departments (department_id INT PRIMARY KEY,department_name VARCHAR(100) );CREATE TABLE employees (employee_id INT PRIMARY KEY,name VARCHAR(100),department_id INT,FOREIGN KEY (department_id) REFERENCES departments(department_id) );- 说明:
department_id是employees表中的外键,引用departments表中的department_id。
- 说明:
6. CHECK 约束
- 作用:限制列的值必须满足某个条件。
- 语法:
column_name data_type CHECK (condition) - 或者:
CHECK (condition) - 示例:
CREATE TABLE employees (employee_id INT PRIMARY KEY,name VARCHAR(100) NOT NULL,salary DECIMAL(10, 2) CHECK (salary >= 0),age INT CHECK (age BETWEEN 18 AND 65) );- 说明:
salary列的值必须大于或等于 0。age列的值必须在 18 和 65 之间。
- 说明:
7. AUTO_INCREMENT (MySQL 特有)
- 作用:为列自动生成唯一的递增值,通常用于主键。
- 语法:
column_name data_type AUTO_INCREMENT - 示例:
CREATE TABLE employees (employee_id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL );- 说明:
employee_id列的值将自动生成,初始值为 1,每次插入新行时递增。
- 说明:
综合示例:定义一张复杂表
CREATE TABLE employees (employee_id INT AUTO_INCREMENT PRIMARY KEY, -- 主键,自动递增name VARCHAR(100) NOT NULL, -- 员工姓名,不能为空email VARCHAR(255) UNIQUE, -- 邮箱必须唯一department_id INT, -- 部门编号hire_date DATE DEFAULT CURRENT_DATE, -- 默认值为当前日期salary DECIMAL(10, 2) CHECK (salary >= 0), -- 薪资必须大于或等于 0FOREIGN KEY (department_id) REFERENCES departments(department_id) -- 外键约束
);
- 详细解读:
employee_id是主键,自动递增,唯一且不能为空。name是员工姓名,不能为空。email必须唯一,避免重复。department_id是外键,必须引用departments表中的department_id。hire_date默认值是当前日期。salary的值必须大于或等于 0。
修改表结构
-
添加列
ALTER TABLE table_name ADD column_name datatype [constraints];- 示例:
ALTER TABLE employees ADD email VARCHAR(255);- 说明:为
employees表添加email列。
- 说明:为
- 示例:
-
修改列类型
ALTER TABLE table_name ALTER COLUMN column_name TYPE new_datatype;- 示例:
ALTER TABLE employees ALTER COLUMN salary TYPE DECIMAL(12, 2);- 说明:将
employees表中的salary列的精度修改为 12 位(小数点后两位)。
- 说明:将
- 示例:
-
删除列
ALTER TABLE table_name DROP COLUMN column_name [CASCADE | RESTRICT];- 示例:
ALTER TABLE employees DROP COLUMN email;- 说明:删除
employees表中的email列。
- 说明:删除
- 示例:
删除表
DROP TABLE table_name [CASCADE | RESTRICT];
- 示例:
DROP TABLE employees CASCADE;- 说明:删除
employees表及其依赖对象。
- 说明:删除
3. 视图(View)的定义与删除
创建视图
视图是基于一个或多个表的查询结果集,定义一个视图后可以像查询表一样查询视图。
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
- 示例:
CREATE VIEW employee_salary AS SELECT employee_id, name, salary FROM employees WHERE salary > 50000;- 说明:
- 创建一个名为
employee_salary的视图,该视图包含employees表中薪资大于 50000 的员工的employee_id、name和salary。
- 创建一个名为
- 说明:
删除视图
DROP VIEW view_name;
- 示例:
DROP VIEW employee_salary;- 说明:删除
employee_salary视图。
- 说明:删除
4. 索引的建立、修改与删除
创建索引
-
普通索引
CREATE INDEX index_name ON table_name (column1, column2, ...);- 示例:
CREATE INDEX idx_department_id ON employees(department_id);- 说明:为
employees表的department_id列创建普通索引。
- 说明:为
- 示例:
-
唯一索引
CREATE UNIQUE INDEX index_name ON table_name (column1, column2, ...);- 示例:
CREATE UNIQUE INDEX idx_employee_email ON employees(email);- 说明:为
employees表的email列创建唯一索引。
- 说明:为
- 示例:
修改索引
索引本身无法直接修改,需要删除后重新创建。
删除索引
DROP INDEX index_name;
- 示例:
DROP INDEX idx_department_id;- 说明:删除名为
idx_department_id的索引。
- 说明:删除名为
总结
CREATE用于创建模式、表和索引。ALTER用于修改表结构。DROP用于删除模式、表和索引。- 使用
CASCADE会删除对象及其依赖关系,RESTRICT则要求先删除所有依赖关系。
相关文章:
详解SQL数据定义功能
数据定义 1. 数据库模式(Schema)的定义与删除定义模式删除模式 2. 基本表的定义、修改与删除定义表约束1. NOT NULL 约束2. DEFAULT 约束3. UNIQUE 约束4. PRIMARY KEY 约束多列主键示例: 5. FOREIGN KEY 约束6. CHECK 约束7. AUTO_INCREMENT…...
vscode python相对路径的问题
vscode python相对路径的问题 最近使用使用vscode连接wsl2写python时,经常遇到找不到包中的方法的问题,最终发现vscode在执行python代码时目录不是从当前python文件开始算起,而是从当前工作区的目录开始算起,比如说我打开的是/ho…...
通达信软件+条件选股+code
在通达信软件中,你的选股公式需要放在 "公式管理器" 的 "条件选股公式" 分类中。以下是详细操作步骤: 一、打开公式管理器 打开通达信软件,按快捷键 Ctrl + F (或点击顶部菜单栏:"公式" → "公式管理器") 二、创建新公式 选择分…...
机器学习常见激活函数
激活函数的作用 引入非线性因素 若神经网络仅由线性层构成,那么无论网络的层数有多少,其整体的输出依然是输入的线性组合。这样的网络只能拟合线性函数,在处理复杂的非线性问题(如语音识别、图像分类)时能力十分有限。…...
Unreal Engine 5(虚幻引擎)动画制作快捷键大全
Unreal Engine 5 中 动画制作(主要涉及 Sequencer、动画蓝图等模块)的 鼠标操作 与 核心快捷键 整理,按动画制作流程分类: 一、Sequencer 时间轴操作 功能目标鼠标操作快捷键说明移动播放头左键点击时间轴标尺区域拖动播放头按住…...
OpenFeign的配置类可以进行哪些配置
1. 日志级别(Logger Level) 工作原理 Feign的日志级别控制了日志输出的详细程度,有助于调试和监控。日志级别包括: NONE:不记录任何信息。BASIC:仅记录请求方法和URL及响应状态码和执行时间。HEADERS&am…...
netcore publish报错 error CS1056: Unexpected character
问题:jenkins netcore publish报错 检查文件编码,发现是:GB2312。转换为:UTF-8-BOM。 问题解决 。...
网页制作14-Javascipt时间特效の显示动态日期
<!doctype html> <html> <head> <meta charset"utf-8"> <title>动态日期</title> </head><script>var today new Date();//获取时间var ytoday.getFullYear();//截取年var mtoday.getMonth();//截取月份,返回0~11v…...
《高效迁移学习:Keras与EfficientNet花卉分类项目全解析》
从零到精通的迁移学习实战指南:以Keras和EfficientNet为例 一、为什么我们需要迁移学习? 1.1 人类的学习智慧 想象一下:如果一个已经会弹钢琴的人学习吉他,会比完全不懂音乐的人快得多。因为TA已经掌握了乐理知识、节奏感和手指…...
【单片机】嵌入式系统的硬件与软件特性
嵌入式系统的软件结构 嵌入式系统的软件结构一般分为 不带操作系统(Bare Metal) 和 带操作系统(RTOS / Linux) 两种。不同的软件架构适用于不同的应用场景,如 简单控制系统、实时控制系统、物联网、工业自动化等。 嵌…...
5G核心网实训室搭建方案:轻量化部署与虚拟化实践
5G核心网实训室 随着5G技术的广泛应用,行业对于5G核心网人才的需求日益增长。高校、科研机构和企业纷纷建立5G实训室,以促进人才培养、技术创新和行业应用研究。IPLOOK凭借其在5G核心网领域的深厚积累,提供了一套高效、灵活的5G实训室搭建方…...
使用Qt创建悬浮窗口
在Qt中创建悬浮窗口(如无边框、可拖动的浮动面板或提示框)可以通过以下方法实现。以下是几种常见场景的解决方案: 方法1:使用无边框窗口 鼠标事件拖动 适用于自定义浮动工具窗口(如Photoshop的工具栏)。 …...
蓝耘MaaS平台:阿里QWQ应用拓展与调参实践
摘要:本文深入探讨了蓝耘MaaS平台与阿里QWQ模型的结合,从平台架构、模型特点到应用拓展和调参实践进行了全面分析。蓝耘平台凭借其强大的算力支持、弹性资源调度和全栈服务,为QWQ模型的高效部署提供了理想环境。通过细化语义描述、调整推理参…...
一次Milvus迁移的记录
前言 希望把Linux上生产环境中使用docker compose运行的milvus迁移到本地(mac os)的docker compose中 操作过程 找到了官方有两个相关的项目: https://github.com/zilliztech/milvus-backup https://github.com/zilliztech/vts 但是…我都没用,因为使…...
在线 SQL 转 SQLAlchemy:一键生成 Python 数据模型
一款高效的在线 SQL 转 SQLAlchemy 工具,支持自动解析 SQL 语句并生成 Python SQLAlchemy 模型代码,适用于数据库管理、后端开发和 ORM 结构映射。无需手写 SQLAlchemy 模型,一键转换 SQL 结构,提升开发效率,简化数据库…...
即插即用模块--KANLinear
KAN网络 KAN网络即Kolmogorov-Arnold 网络,是一类基于 Kolmogorov-Arnold 表示定理的神经网络架构,具有强大的非线性表达能力。在相同迭代次数下超越传统MLP,不仅训练速度更快,收敛性更好,而且在拟合复杂函数时的精度…...
LLM本地化部署与管理实用工具实践记录
文章目录 前言OllamaQWen模型部署Python调用API AnythingLLM本地基础配置AI知识库检索 CherryStudio访问DeepSeek系统内置AI助手嵌入知识库文档 LLMStudio基础环境安装模型管理应用命令行的管理 总结 前言 发现好久没更新 CSDN 个人博客了,更多的是转移到了个人私有…...
免费高质量贴图(Textures) 网站推荐
以下是一些提供 免费或高质量贴图(Textures) 的网站,包括 PBR 贴图、HDRI 贴图、材质等,适用于 Three.js、Blender、Unity、Unreal Engine 等软件。 🌍 1. Poly Haven(https://polyhaven.com/)⭐…...
第十次CCF-CSP认证(含C++源码)
第十次CCF-CSP认证 分蛋糕满分题解 学生排队满分题解 Markdown语法题目解读满分代码 结语 分蛋糕 题目链接 满分题解 基本思路:我们需要保证除了最后一个小朋友之外的所有人,分得的蛋糕都大于等于给定的K值,为什么是大于等于,是…...
windows 启用linux子系统不必再装双系统
搜索栏搜索:启用或关闭Windows功能,把下面3项勾选上: 若没有Hyper-V,则根据以下步骤添加: 在桌面新建一个txt文件,将下面的程序复制进去,之后修改文件后缀名为.bat 右键管理员运行即可。 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.m…...
lanqiaoOJ 1180:斐波那契数列 ← 矩阵快速幂
【题目来源】 https://www.lanqiao.cn/problems/1180/learning/ 【题目描述】 定义斐波那契数列数列为 F11,F21,FnFn-1Fn-2,n>2。 给定一个正整数 n,求 Fn 在模 10^97 的值。 【输入格式】 第1行为一个整数 T&#x…...
go程序运行Spaitalite踩坑记录
Spatialite参考资料:8.1. 开源地理空间数据库 — Python与开源GIS Ubuntu安装SpaitaLite: apt-get install libspatialite7 libsqlite3-mod-spatialite apt-get install spatialite-bin 命令行打开数据库:spatialite xxx.db 执行一个空间函…...
【react】react中的<></>和React Fragment的用法及区别详解
目录 1、<>是什么 2、为什么要使用<>? 3、如何使用<>? 基本用法 需要传递属性时(如key) 使用效果 注意事项 总结 4、React Fragment 与空标签(<>)详解 1. Fragment 的用…...
Everything搜索工具下载使用教程(附安装包),everything搜索工具文件快速查找
文章目录 前言一、Everything搜索工具下载二、Everything搜索工具下载使用教程 前言 Everything搜索工具能凭借文件名实时精准定位文件,接下来的教程,将详细为你呈现 Everything搜索工具的下载及使用方法,助你开启高效文件搜索的便捷之旅 。…...
LeetCode 解题思路 17(Hot 100)
解题思路: 找到链表中点: 使用快慢指针法,快指针每次移动两步,慢指针每次移动一步。当快指针到达末尾时,慢指针指向中点。递归分割与排序: 将链表从中点处分割为左右两个子链表,分别对这两个子…...
Qt程序基于共享内存读写CodeSys的变量
文章目录 1.背景2.结构体从CodeSys导出后导入到C2.1.将结构体从CodeSys中导出2.2.将结构体从m4文件提取翻译成c格式 3.添加RTTR注册信息4.读取PLC变量值5.更改PLC变量值 1.背景 在文章【基于RTTR在C中实现结构体数据的多层级动态读写】中,我们实现了通过字符串读写…...
7-12 关于堆的判断
输入样例: 5 4 46 23 26 24 10 24 is the root 26 and 23 are siblings 46 is the parent of 23 23 is a child of 10输出样例: F T F T 这题是建最小堆,数据结构牛老师讲过这个知识点,但是我给忘了,补题搜了一下才解…...
《SQL编程思想》中的 MySQL 建表语句和测试数据
《SQL编程思想》中的 MySQL 建表语句 建表语句 -- 创建 4 个示例表和索引 CREATE TABLE department( dept_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 部门编号,自增主键, dept_name VARCHAR(50) NOT NULL COMMENT 部门名称) ENGINEInnoDB COMM…...
STL标准库
感谢哔哩哔哩UP“开发者LaoJ”,以下是学习记录~ 一、容器 1.1、vector 底层实现是动态数组,向尾部插入数据很方便,但是向中间和头部插入数据需要移动其它元素 可以实现随机访问 如果插入时,当前vector容纳不下,会…...
STM32 HAL库实战:高效整合DMA与ADC开发指南
STM32 HAL库实战:高效整合DMA与ADC开发指南 一、DMA与ADC基础介绍 1. DMA:解放CPU的“数据搬运工” DMA(Direct Memory Access) 是STM32中用于在外设与内存之间直接传输数据的硬件模块。其核心优势在于无需CPU干预,…...
