关系数据库标准语言SQL详解

article/2025/11/6 0:42:26

关系数据库标准语言SQL

SQL之所以能够为用户和业界所接受并成为国际标准,是因为它是一个综合的、功能极强又简洁易学的语言SQL集数据查询、数据操作、数据定义和数据控制 功能于一体,其主要特点包括以下几个部分:

  1. 综合统一

    SQL集数据定义语言、数据操纵语言、数据控制语言的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动。

  2. 高度非过程化

    SQL进行数据操作时,只要提出“做什么”,而无须指明“怎么做”,因此无须了解存取路径。存取路径的选择以及SQL的操作过程由系统自动完成

  3. 面向集合的操作方法

    非关系数据库模型采用面向记录的操作方式,操作对象时一条记录。而SQL采用集合操作方式,不仅操作对象、查找结果可以是元组集合,而且一次插入、删除、更新操作也可以是元组的集合。

  4. 以同一语法结构提供多种使用方法

    SQL既是独立的语言,又是嵌入式语言

  5. 语言简洁,易学易用

在这里插入图片描述

1. 数据定义

关系数据库支持三级模式结构,其模式、外模式、内模式中的基本对象有模式、表、试图和索引等。因此SQL的数据定义功能包括模式定义、表定义、视图和索引的定义

在这里插入图片描述

  1. 模式

    模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据试图。

  2. 外模式

    外模式也称子模式或用户模式,他是数据库用户(应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示

  3. 内模式

    内模式也称存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式

1.1 模式(数据库)的定义与删除

1.1.1 定义模式

CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句>|<试图定义子句>|<授权定义子句>]

mysqlCREATE SCHEMACREATE DATABASE效果一致

在这里插入图片描述

1.1.2 删除模式

DROP SCHEMA <模式名><CASCADE|RESTRICT>

CASCADERESTRICT二者必选其中一个

  • CASCADE:级联,表示在删除模式的同时把该模式下所有的数据库对象删除
  • RESTRICT:限制,表示如果模式中已经定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行

在这里插入图片描述

1.2 表的定义、删除与修改

1.2.1 数据类型

数值类型名
数值tyntint 十分小的数据 1个字节
smallint 较小的数据 2个字节
int 标准的整数 4个字节
bigint 较大的数据 8个字节
float 浮点型 4个字节
double 浮点数 8个字节
decimal 字符串形式的浮点数
字符串char 固定大小的字符串 0~255
vchar 可变字符串 0~65535
tinytext 微型文本 2^8-1
text 文本串 2^16-1
时间日期date YYYY-MM-DD 日期格式
time HH:mm:ss 时间格式
datetime YYYY-MM-DD HH:mm:ss
timestamp 时间戳 1970.1.1到现在的毫秒数
year 年份表示

1.2.2 基本表的定义

SQL创建数据库基本表的基本格式如下:

CREATE TABLE <表名>(<列名><数据类型> [列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
...
[表级完整性约束条件])

例:

CREATE TABLE "S-T".Course  (  /*"S-T"模式下的Course表*/Cno char(4),Cname char(40) UNIQUE; /*取唯一值*/Cpno char(4),FOREIGN KEY (cpno) REFERENCES Course(Cno) /*表级完整性约束条件,Cpno为外键,被参照表为Course,被参照列为Cno*/INDEX(`Cno`)
);

1.2.3 修改基本表

SQL修改数据库基本表的基本格式如下:

ALTER TABLE [<模式名>.]<表名>
[ADD [COLUM] <新列名><数据类型> [完整性约束]]
[ADD <表级完整性约束>]
[DROP [COLUMN] <列名> [CASCADE|RESTRICT]]
[DROP CONSTRAINT <完整性约束名> [RESTRICT|CASCADE]]
[ALTER COLUMN <列名><数据类型>];
//添加级联操作
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 	FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称)  	ON UPDATE CASCADE  	ON DELETE CASCADE;

1.2.4 删除基本表

SQL删除数据库基本表的基本格式如下:

DROP TABLE <表名> [RESTRICT|CASCADE]

1.3 索引

​ 当表的数据量比较大时,查询操作比较耗时。建立索引时加快查询速度的有效手段。数据库索引类似于图书后面的索引,能快速定位道需要查询的内容。

​ 常见的数据库索引有:

  • 顺序文件上的索引:针对属性值按升序或降序存储的关系建立一个顺序索引文件,索引文件由属性值和相 应的元组制作组成。
  • B+树索引:B+树的叶子结点为属性值和相应的元组指针
  • 散列索引:将索引属性按散列函数映射到相应的桶中
  • 位图索引:用位向量记录索引属性中可能出现的值

1.3.1 建立索引

SQL中建立索引的基本格式:

CREATE [UNIQUE][CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>]]...);
  • UNIQUE:此索引的每一个索引值只对应唯一的数据记录
  • CLUSTER:建立的索引为聚簇索引

1.3.2 修改索引

SQL中修改索引的基本格式:

ALTER INDEX <旧索引名> RENAMETO <新索引名>

1.3.3 删除索引

SQL中删除索引的基本格式:

DROP INDEX <索引名>

2. 数据查询

在这里插入图片描述

SELECT语法

SELECT [ALL | DISTINCT]
{* | table.* | [<列名>[as <别名>][,<列名>[as <表名>]][,...]]}
FROM <表名或视图名> [as <别名>]
[left | right | inner join <表名>] -- 联合查询
[WHERE <条件表达式>] -- 指定结果需满足的条件
[GROUP BY <列名>] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY <列名> [ASC|DESC]] -- 指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];
-- 指定查询的记录从哪条至哪条

[ ] 括号代表可选的 , { }括号代表必选的

2.1 条件查询

操作符名称语法描述
AND 或 &&a AND b 或 a && b逻辑与,同时为真结果才为真
OR 或 ||a OR b 或 a||b逻辑或,只要一个为真,则结果为真
NOT 或 !NOT a 或 !a逻辑非,若操作数为假,则结果为真!

模糊查找

操作符名称语法描述
IS NULLa IS NULL若操作符为NULL,则结果为真
IS NOT NULLa IS NOT NULL若操作符不为NULL,则结果为真
BETWEENa BETWEEN b AND c若 a 范围在 b 与 c 之间,则结果为真
LIKEa LIKE bSQL 模式匹配,若a匹配b,则结果为真
INa IN (a1,a2,a3,…)若 a 等于 a1,a2… 中的某一个,则结果为真

模糊查找中字符

符号含义
%'%'表示不限字符个数
_'_'表示限制字符数一个(数据库字符集影响汉字的字符数)
\转义字符(ESCAPE可以设置转义字符 如:where name like ‘DB\_Desgin’ ESCAPE ‘\’)

聚合函数

聚合函数作用注意事项
count(*)统计元组个数仅该语句计算过程中包含空值
count([distinct|all] <列名>)统计一列中值的个数统计指定列不为NULL的记录行数
max([distinct| all] <列名>)求列值中的最大值如果指定列是字符串类型,那么使用字符串排序运算;
min([distinct|all] <列名>)求列值中的最小值如果指定列是字符串类型,那么使用字符串排序运算
sum([distinct|all] <列名>)计算一列值的总和如果指定列类型不是数值类型,那么计算结果为0;
avg([distinct|all] <列名>)计算一列值的平均值如果指定列类型不是数值类型,那么计算结果为0;

2.2 连接查询

SELECT [ALL | DISTINCT]
{* | table.* | [<列名>[as <别名>][,<列名>[as <表名>]][,...]]}
FROM <表名或视图名> [as <别名>]

连接查询实质: 查询结果为多个表的笛卡儿积,通过where语句筛选出要查询的数据

在这里插入图片描述

操作符名称描述
INNER JOIN如果表中有至少一个匹配,则返回行
RIGHT JOIN即使左表中没有匹配,也从右表中返回所有的行
LEFT JOIN即使右表中没有匹配,也从左表中返回所有的行
/*
连接查询
如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
内连接 inner join
查询两个表中的结果集中的交集
外连接 outer join
左外连接 left join
(以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
右外连接 right join
(以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)
等值连接和非等值连接
自连接
*/
-- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
SELECT * FROM student;
SELECT * FROM result;
/*思路:
(1):分析需求,确定查询的列来源于两个类,student result,连接查询
(2):确定使用哪种连接查询?(内连接)
*/
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
-- 右连接(也可实现)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.studentno = s.studentno
-- 等值连接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s , result r
WHERE r.studentno = s.studentno
-- 左连接 (查询了所有同学,不考试的也会查出来)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
-- 查一下缺考的同学(左连接应用场景)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
WHERE StudentResult IS NULL
-- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno

2.3 嵌套查询

  • IN <select语句>子查询,若select语句查询结果为单行,则 IN等同于 ‘=’
  • EXISTS <select语句>子查询,exists的返回值为布尔类型,只有当子查询中条件成立是返回对应数据的查询结果
  • 使用比较运算符的子查询
  • 带ANY(有的系统用SOME)ALL的子查询
运算符含义
大于
大于等于
小于
小于等于
等于
<>不等于
/*============== 子查询 ================
什么是子查询?
在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句
嵌套查询可由多个子查询组成,求解的方式是由里及外;
子查询返回的结果一般都是集合,故而建议使用IN关键字;
*/
-- 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列
-- 方法一:使用连接查询
SELECT studentno,r.subjectno,StudentResult
FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = '数据库结构-1'
ORDER BY studentresult DESC;
-- 方法二:使用子查询(执行顺序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
SELECT subjectno FROM `subject`
WHERE subjectname = '数据库结构-1'
)
ORDER BY studentresult DESC;

3. 数据更新

在这里插入图片描述

3.1 插入数据

INSERT INTO <表名>[(<列名1>)[,<列名2>]...] VALUES (<常量1>[,<常量2>]...)
INSERT INTO <表名>[(<列名1>)[,<列名2>]...] 子查询

3.2 修改数据

UPDATE <表名> SET <列名>=<表达式>[,<列名>=<表达式>]... [WHERE <条件>] 

3.3 删除数据

DELETE FROM <表名> [WHERE <条件>]

空值注意事项

  • 空值的判断不能使用比较运算符,需要用IS NULLIS NOT NULL 表示

  • UNIQUE限制的属性不能取空值

  • 空值与任何值的算术运算和比较运算为UNKNOWN,逻辑运算结果如下:

    xyANDORNOT
    TUUTF
    FUFUT
    UUUUU
    UTUTU
    UFFUU

NULLIS NOT NULL` 表示

  • UNIQUE限制的属性不能取空值

  • 空值与任何值的算术运算和比较运算为UNKNOWN,逻辑运算结果如下:

    xyANDORNOT
    TUUTF
    FUFUT
    UUUUU
    UTUTU
    UFFUU

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

相关文章

sql语句规范

修改表名称&#xff1a;rename table 原始表名称 to 新的表名称; SQL注释 一般在编写sql脚本文件时需要添加合理的注释信息。 单行注释&#xff1a;select 1; #说明信息 或者 select 1; – 说明信息。 多行注释&#xff1a; /*开头 */收尾 数据类型 数值型 5种整型 tinyin…

SQL语言的规则与规范

SQL语言的规则与规范 前言一、SQL概述1、SQL背景知识2、SQL语言排行榜3、SQL 分类 二、SQL语言的规则与规范1、基本规则2、SQL大小写规范 &#xff08;建议遵守&#xff09;3、注 释4、命名规则&#xff08;暂时了解&#xff09;5、数据导入指令 前言 本博主将用CSDN记录软件开…

标准SQL

SQL是Structured Query Language的缩写&#xff0c;它的前身是著名的关系数据库原型系统System R所采用的SEQUEL语言。作为一种访问关系型数据库的标准语言&#xff0c;SQL自问世以来得到了广泛的应用&#xff0c;不仅是著名的大型商用数据库产品Oracle、DB2、Sybase、SQL Serv…

SQL标准的历史

SQL标准已经存在30多年了&#xff0c;它改变了吗?绝对的!了解从SQL-86到现代SQL(当今的标准数据语言)的过程。 SQL是IBM在20世纪70年代由IBM公司创建的。1974年&#xff0c;Donald Chamberlin和Raymond Boyce发表了SEQUEL:《A Structured English Query Language》&#xff0…

SQL语法基础篇 —— 常用的SQL标准

常用的SQL标准 SQL有两个主要的标准&#xff0c;分别是SQL92和SQL99。92和99代表了标准提出的时间&#xff0c;SQL92就是92年提出的标准规范。除了SQL92和SQL99以外&#xff0c;还有其他的标准。 最重要的SQL标准就是SQL92和SQL99。一般来说SQL92的形式更简单&#xff0c;但是…

mysql多表查询(一口气解决掉:自连接 左右连接 满连接等)

多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&#xff0c;…

【第一章】SQL基础知识

目录 ​编辑 1. 认识SQL 1.1 SQL的标准 1.2 SQL的种类 1.3 SQL的功能 2. 常量 2.1 数字常量 2.2 字符串常量 2.3 日期和时间常量 2.4 符号常量 3. 变量 3.1 局部变量 3.2 全局变量 4. 运算符 4.1 算术运算符 4.2 比较运算符 4.3 逻辑运算符 4.4 按位运算符 …

C# WinForm中NotifyICon控件的用法【1】

任务栏中的图标是一些进程的快捷方式&#xff0c;这些进程在计算机后台运行&#xff0c;如防病毒程序或音量控制。 平时我们在使用QQ的时候&#xff0c;QQ主界面隐藏到系统托盘里&#xff0c;需要调用的时候在点击出来&#xff0c;很好很强大。 那么我们在C#中如何实现呢。本…

notify() notifyAll() 区别

notify 参考&#xff1a;https://blog.csdn.net/weixin_44121696/article/details/109306019 public class ObjectTest {public static void main(String[] args) {Object objectLock new Object();new Thread(() -> {synchronized (objectLock) {System.out.println(Thre…

NotifyIcon的属性、事件、方法

参考文章: NotifyIcon控件的使用. 属性 属性名操作博主翻译ContextMenuStrip可绑定ContextMenuStrip控件当用户右击该图标&#xff0c;显示的快捷菜单Icon必须选择一个ico格式的图片&#xff0c;否则右下角任务栏不会出现对象的可见性级别。所有属性都适用 事件 1.鼠标双击…

notify和notifyAll

notify: notify只会唤醒众多等待线程中的其中一个线程 用包子铺案例来演示一下 package com.thread;/*** author 邓亚非*/ public class TestNotify {private static Object objectnew Object();public static void main(String[] args) {// 顾客1线程new Thread(new …

notify和notifyall的区别

文章目录 场景分析例子经典java线程状态流转图 场景 调用wait的线程的唤醒&#xff0c;一般通过notify和notifyAll,但是两者之间有什么区别呢&#xff1f; 分析 线程调用synchronized方法或者synchronized代码块需要获取对象锁&#xff0c;如果没有获取则进入锁池线程调用wa…

Winform从入门到精通(14)——NotifyIcon(史上最全)

文章目录 前言:一、属性1、BalloonTipIcon1.1 ToolTipIcon.Error1.2 ToolTipIcon.Info1.3 ToolTipIcon.Warning1.4 ToolTipIcon.None2、BalloonTipText3、BalloonTipTitle4、Icon4.1 界面设置icon属性4.2 代码设置Icon属性5、Tag6、Text7、Visible

WPF利用NotifyIcon创建任务栏图标(菜鸟教程)

学习目标&#xff1a; 记录从WPF应用创建开始&#xff0c;一步步到任务栏图标创建的全过程。 流程&#xff1a; 1、环境&#xff1a;Win10 VS2017 打开VS2017&#xff0c;选择文件 -> 新建 -> 项目 -> Visual C# -> Windows桌面 ->WPF应用 -> 更改项目名为…

Notify

1 有什么用 作用 &#xff1a; 解耦&#xff0c;异步&#xff0c;并行 举个栗子 假设我们有这么一个应用场景&#xff0c;为了完成一个用户注册淘宝的操作&#xff0c;可能需要将用户信息写入到用户库中&#xff0c;然后通知给红包中心给用户发新手红包&#xff0c;然后还需…

NotifyICon使用

2010-04-11 15:47 by Ju2ender, 1438 visits, 网摘, 收藏, 编辑 最常见使用NotifyIcon的程序就是QQ了&#xff0c;当初我很好奇这通知区域的小企鹅是如何随着QQ的运行放上去的&#xff0c;这的确是个有趣的技巧。 要是用到自己的程序上的确显得很专业&#xff01;我们来为自己的…

notifyIcon 用法

BalloonTipIcon —— 气泡提示的类型&#xff0c;有None&#xff08;无&#xff09;、Info&#xff08;蓝色感叹号&#xff09;、Warnning&#xff08;黄色感叹号&#xff09;、Error&#xff08;小红叉&#xff09; BalloonTipText —— 气泡提示的内容&#xff0c;如上图的N…

C#如何使用NotifyIcon实现任务栏托盘菜单及气泡提示

以软件【银行业会计人员技能训练系统】为例&#xff0c;如何使用NotifyIcon实现任务栏托盘菜单及气泡提示&#xff1f; 实现系统托盘方法如下&#xff1a; 1、向窗体中添加NotifyIcon控件和ContextMenuStrip控件&#xff1b; 2、为ContextMenuStrip控件添加子项&#xff1b; 3…

C#——NotifyICON的使用

1、作用&#xff08;给程序增加下方提示图标&#xff09; 2、实现方式 1&#xff09;添加NotifyIcon控件&#xff0c;属性中Visible设为true 2)选择要显示的图标(icon格式)&#xff0c;此时已经可以显示小图标&#xff0c;但右击不会显示小菜单栏. 3、添加ContextMenuStrip控…

【学习笔记】C# 动态系统托盘图标的实现 - NotifyIcon控件

操作步骤&#xff1a; 1、创建一个C# Windows窗体应用项目&#xff0c;命名为“IconTwinkle”&#xff1a; 2、双击解决方案中的“Resources.resx”&#xff0c;点击“添加资源”&#xff0c;选择图标并导入&#xff1a; 3、可见选定的图标已导入项目中&#xff1a; 4、双击右…