关系代数和关系数据库语言(SQL)

阅读提示:本篇文章较长,建议从目录上选取想看的内容。代码上的话,我习惯用小写,如果看不习惯建议跳过。有问题欢迎讨论!!!

一、基础概念

1.1数据库的概念

        数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它能够高效地存储、检索和管理大量数据。

1.2数据库类型

  • 关系型数据库,基于关系模型,数据以表格形式存储
  • 非关系型数据库,包括文档型(MongoDB)、键值型(Redis)、列存储型(Cassandra)、图数据库(Neo4j)等

二、关系模型

2.1关系型数据库核心概念

  • 模式:即逻辑模式,是数据库中全体数据的逻辑和特征的描述。
  • 表:数据以行和列的形式组织,每张表有一个唯一名称。
  • 属性:表中的一列即一个属性。
  • 元组:表中的一行即一个元组。
  • 字段:表中的列,表示数据的属性,每个字段有特定的数据类型(如整数、字符串、日期等)。
  • 域:一组具有相同数据类型的值的集合。
  • 码(键):表中某一个属性或一组属性,其值可以唯一确定一个元组。
  • 主键(主码):唯一标识表中每条记录的字段或字段组,不能为NULL,且值必须唯一。
  • 外键:一个表中的字段,引用另一个表的主键,用于建立表之间的关系。
  • 索引:提高数据检索速度的数据结构,类似于书籍的目录。

2.2关系代数

2.2.1选择

定义:从关系R中选择满足给定条件F的元组,记作σ_F(R)

特点:水平操作(按行筛选)

sql语句为:

select *    --全体学生
from Student        --从Student表
where Smajor='信息安全'    ---条件

2.2.2投影

定义:从关系R中选择若干属性列组成新的关系,记作π_A(R),其中A是属性列表

特点:垂直操作(按列筛选);会去除重复元组;结果关系的属性是A中指定的属性

sql语句

select  distinct Sno,Smajor    --distinct表示去除重复的元素
from Student

2.2.3连接

  • 等值连接

定义:从关系R和S的笛卡尔积中选取满足θ条件的元组,记作R⋈_{AθB}S.

                        /*笛卡尔积就不赘述*/

特点:θ为"="时称为等值连接;结果包含R和S的所有属性(可能有重复列

sql语句:

select *
from R 
join S on R.A=S.B
  • 自然连接
  1. 定义:R和S在所有公共属性上等值连接,并去除重复列

特点:自动识别同名属性进行匹配;结果关系不包含重复属性;如果无公共属性则退化为笛卡尔积

sql语句:

select *
from table1
natural join table2
  • 外连接

分类:

  • 左外连接(R⟕S):保留左边关系R的所有元组
  •  右外连接(R⟖S):保留右边关系S的所有元组
  •  全外连接(R⟗S):保留两边关系的所有元组

sql语句:

-- 左外连接
select * from R left join S on R.A=S.B;
-- 右外连接
select * from R right join S on R.A=S.B;
-- 全外连接
select * from R full join S on R.A=S.B;

2.2.4除

定义:给定关系R(X,Y)和S(Y),其中X、Y是属性组,R÷S得到一个新的关系,包含所有满足"在R中存在与S中所有Y值对应的X值"的X值。

        /*定义相对有点抽象,需要用象集来定义除法,下面的字潦草点,请见谅*/

sql语句:

选择那些X值,使得不存在任何S中的Y值与该X值没有配对,即选择与S中所有Y值都配对的X值

select distinct R.X from R R1
where not exists (select S.Y from Swhere not exist(select * from R R2where R2.X = R1.X and R2.Y = S.Y)
);

三、关系数据库语言

3.1数据库

3.1.1创建

create database database_name

3.1.2删除

drop database database_name

代码:

create database HE	--创建数据库
use HE	--使用HE的数据库
drop database HE	--删除数据库

3.2数据库模式

3.2.1创建

create schema uu	--创建模式
create schema schema_name  authorization owner_name;
--创建模式,并可指定所有者

3.2.2查看

SELECT name FROM sys.schemas;
--查看所有模式
--查看特定模式的详细信息
SELECT * 
FROM sys.schemas
WHERE name = 'dbo';  -- 替换为您想查看的模式名

/*创建、查看的方式有很多,这里就简单介绍一下*/

3.2.3删除

drop schema schema_name	--删除模式

3.3表

3.2.1创建

create table table_name
create table 表名 (列名1 数据类型 [约束],列名2 数据类型 [约束],...[表级约束]
);

3.2.2删除

drop table table_name

3.2.3修改

alter table database_name

例子:

alter table Student
add constraint c1 check(Ssex='男'OR Ssex='女')
--给表Student中Ssex添加约束,并将约束命名为c1

3.2.4约束

  • 主键约束
create table employees (employee_id int primary key,    --primary主码约束name varchar(50)
);-- 命名主键约束
create table students (student_id int,name varchar(50),constraint pk_student primary key (student_id)    --将主键命名为pk-studnet
);-- 复合主键
create table order_items (order_id int,product_id int,quantity int,constraint pk_order_items primary key (order_id, product_id)
);
  • 外键约束
create table orders (order_id int primary key,customer_id int,constraint fk_customer foreign key (customer_id) references customers(customer_id)
);-- 带级联操作
create table order_details (detail_id int primary key,order_id int,constraint fk_order foreign key (order_id) references orders(order_id)
);
  • 唯一约束
create table products (product_code varchar(20) unique,    --unique唯一约束
);
  • 检查约束
create table employees (age int check (age >= 18 and age <= 65),    Credit smallint not null check(Credit in('2','3','4')),Ssex char(2) check(Ssex in('男','女'))    --check检查约束
);
  • 默认约束
create table orders (--默认约束 (default)status varchar(20) default 'pending'
);
  • not null约束
create table customers (--非空约束 (not null)email varchar(100) not null
);

3.2.5插入

insert into 表名 (列1, 列2) 
values (值1, 值2);

例子:

insert into Student values    --没有指定特定的列表示每列都要插入
('2018001','李勇','男','2000-03-08','信息安全'),
('2018002','刘晨','女','1999-09-01','计算机科学与技术'),
('2018003','王敏','女','2001-09-01','计算机科学与技术'),
('2018004','张立','男','2000-01-08','计算机科学与技术');

3.2.6查询

1)单表查询

  • 基础查询
select * from Student	--查看Student表中全部信息select Sno,Sname from Student	--查看Student表中关于学号和姓名的信息select Sname, year(getdate()) - year(Sbirthdate)as age	--计算并起别名为age
from Student	--查看Student表中姓名和年龄
  • 条件查询
查询条件谓词
比较=,>,  <,   <=,   >=,   !=,   <>(不等于),   !>(不大于,  !<(不小于);    NOT +上述符号
确定范围between and,        not between and
字符匹配like ,        is not like
空值is null,        is not null
多重条件(逻辑)and ,        or,        not

 distinct消除重复列

select distinct Sno from SC		--distinct消除重复列

 where中确定条件

--查询专业为计算机科学与技术,性别为女的学生姓名
select Sname
from Student
where Smajor='计算机科学与技术'and Ssex='女';	

 建立视图,在视图中使用between and

--查询年龄在20和25之间的学生姓名、学号
--建立一个相关的视图
create view Sage as
select Sname, Sno, year(getdate()) - year(Sbirthdate)as age
from Student--在视图中查找
select Sname,Sno
from Sage
where age between 20 and 25;

 in 用来查找属性值属于集合的元组

--查找信息安全和计算机科学与技术学生姓名
--in 用来查找属性值属于集合的元组
select Sname 
from Student
where Smajor in('信息安全','计算机科学与技术')	

 字符匹配

--使用like进行匹配
select *
from Student
where Sname like '李勇'--%代表任意长度(长度可为0)的字符串
select *
from Student
where Sname like '刘%'	--查找姓刘的人--_(下划线)代表单个字符
select *
from Student
where Sno like '201800__'

排序

-- 单列排序
select * from 表名 
order by 列名 asc;  -- 升序(默认)-- 降序排序
select * from 表名 
order by 列名 desc;-- 多列排序
select * from 表名 
order by 列1 asc, 列2 desc;

聚集函数

select count(*) as 总数,sum(数值列) as 总和,avg(数值列) as 平均值,max(数值列) as 最大值,min(数值列) as 最小值
from 表名;

分组查询

-- 基本分组
select 列名, count(*) 
from 表名 
group by 列名;-- 分组后筛选
select 列名, avg(数值列) 
from 表名 
group by 列名 
having avg(数值列) > 100;

2)连接查询

/*之前在关系代数也说过就不举例子了*/

-- 内连接
select a.列, b.列 
from 表1 a 
inner join 表2 b on a.关联列 = b.关联列;-- 左连接
select a.列, b.列 
from 表1 a 
left join 表2 b on a.关联列 = b.关联列;-- 右连接
select a.列, b.列 
from 表1 a 
right join 表2 b on a.关联列 = b.关联列;

3)嵌套查询

--查询选修了"数据结构"课程的学生信息
select *
from Student
where Sno in (select Sno    --找与课程号相对应的学号from SCwhere Cno = (select Cno    --查找课程号from Coursewhere Cname = '数据结构')
);

4)集合查询

并操作:union

交操作:intersect

差操作:except

--查询选修了81001或81002课程的学生学号
select Sno
from SC
where Cno = '81001'    --选修了81001的学号
union                  --并操作
select Sno
from SC
where Cno = '81002';    --选修了81002的学号
--查询选修了81001但没有81002课程的学生学号
select Sno
from SC
where Cno = '81001'    --选修了81001的学号
except                 --差操作
select Sno
from SC
where Cno = '81002';    --选修了81002的学号

5)基于派生表的查询

--查询所有选修81001号课程的学生姓名
select Sname
from Student, (select Sno from SC where Cno='81001) as SCI
where Student.Sno=SCI.Sno

3.2.7更新

update 表名 
set 列1 = 值1 
where 条件;

3.4视图

3.3.1创建

create view 视图名 as
select 列1, 列2
from 表名
where 条件;

3.3.2删除

drop view 视图名

3.3.3查询、更新

与表的查询和更新差不多,只是把表名改为视图名

3.5索引

3.4.1创建

create index 索引名 
on 表名 (列名);

3.4.2删除

drop index 索引名;

/*很久没更了,一是准备比赛,二是github。不过我还是会在这上面更新一些基础内容,项目这些的话代码太多的就放在github上*/

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

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

相关文章

EXO 可以将 Mac M4 和 Mac Air 连接起来,并通过 Ollama 运行 DeepSeek 模型

EXO 可以将 Mac M4 和 Mac Air 连接起来&#xff0c;并通过 Ollama 运行 DeepSeek 模型。以下是具体实现方法&#xff1a; 1. EXO 的分布式计算能力 EXO 是一个支持 分布式 AI 计算 的开源框架&#xff0c;能够将多台 Mac 设备&#xff08;如 M4 和 Mac Air&#xff09;组合成…

区块链基本理解

文章目录 前言一、什么是分布式账本(DLT)二、什么是P2P网络?二、共识算法三、密码算法前言 区块链是由一个一个数据块组成的链条,按照时间顺序将数据块逐一链接,通过哈希指针链接,所有的数据块共同维护一份分布式账本(DLT),每个节点(可以理解为一个玩家,一台计算机)都拥…

Node.js中的洋葱模型

文章目录 前言 前言 Node.js中的洋葱模型是一种中间件执行机制&#xff0c;主要用于处理HTTP请求和响应的流程控制。该模型通过层层包裹的中间件结构&#xff0c;实现请求从外到内穿透、响应从内向外返回的顺序执行。以下从核心概念、实现原理、框架差异及实际应用等方面解析&…

UI-TARS Desktop:用自然语言操控电脑,AI 重新定义人机交互

在人工智能技术飞速发展的今天,从文本生成到图像识别,AI 的能力边界不断被打破。而字节跳动近期开源的 UI-TARS Desktop,则将这一技术推向了更复杂的交互场景——通过自然语言直接控制计算机界面,实现了图形用户界面(GUI)的智能化自动化。这款工具不仅降低了操作门槛,更…

一个可拖拉实现列表排序的WPF开源控件

从零学习构建一个完整的系统 推荐一个可通过拖拉&#xff0c;来实现列表元素的排序的WPF控件。 项目简介 gong-wpf-dragdrop是一个开源的.NET项目&#xff0c;用于在WPF应用程序中实现拖放功能&#xff0c;可以让开发人员快速、简单的实现拖放的操作功能。 可以在同一控件内…

C语言中字符串函数的详细讲解

C语言提供了丰富的字符串处理函数&#xff0c;这些函数在<string.h>头文件中声明。以下是一些常用字符串函数的详细讲解&#xff1a; 字符串拷贝函数 strcpy 功能&#xff1a;将源字符串&#xff08;包括结尾的\0&#xff09;复制到目标字符串。原型&#xff1a;char *s…

可视化数据图表怎么做?如何实现三维数据可视化?

目录 一、三维数据可视化的要点 1. 明确数据可视化的目标 2. 筛选与整理数据 3. 选择合适的图表类型 4. 运用专业工具制作 5. 优化图表的展示效果 二、数据可视化图表怎么做&#xff1f; 1. 理解三维数据的特性 2. 数据处理与三维建模 3. 设置光照与材质效果 4. 添加…

在Linux服务器上部署Jupyter Notebook并实现ssh无密码远程访问

Jupyter notebook版本7.4.2&#xff08;这个版本AI提示我Jupyter7&#xff08;底层是 jupyter_server 2.x&#xff09; 服务器开启服务 安装Jupyter notebook 7.4.2成功后&#xff0c;终端输入 jupyter notebook --generate-config 这将在 ~/.jupyter/ 目录下生成 jupyter_…

走出 Demo,走向现实:DeepSeek-VL 的多模态工程路线图

目录 一、引言&#xff1a;多模态模型的关键转折点 &#xff08;一&#xff09;当前 LMM 的三个关键挑战 1. 数据的真实性不足 2. 模型设计缺乏场景感知 3. 语言能力与视觉能力难以兼顾 &#xff08;二&#xff09;DeepSeek-VL 的根本出发点&#xff1a;以真实任务为锚点…

数据库原理及其应用 第六次作业

题目 参考答案 题目1. 教材P148第1题 问题&#xff1a;什么是数据库的安全性&#xff1f; 答案&#xff1a;数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏 。它通过用户身份鉴别、存取控制&#xff08;包括自主存取控制和强制存取控制&#x…

2025系统架构师---选择题知识点(押题)

1.《计算机信息系统安全保护等级划分准则》(GB 17859-1999)由低到高定义了五个不同级别的计算机系统安全保护能力。 第一级:用户自主保护级---通过隔离用户与数据实现访问控制,保护用户信息安全; 第二级:系统审计保护级---实施更细粒度的访问控制,通过审计和隔离资源确…

Qt操作SQLite数据库教程

Qt 中操作 SQLite 数据库的步骤如下&#xff1a; 1. 添加 SQLite 驱动并打开数据库 #include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery>// 创建数据库连接 QSqlDatabase db QSqlDatabase::addDatabase("QSQLITE"); db.setData…

从紫光集团看基本财务分析

PE 46PE 代表投资人对他的期望是它的业绩至少要增长50%才算及格。 但实际业绩 一年不如一年. 所以&#xff0c;这个PE 应该是 业绩倒退了&#xff0c;但是市值还没有掉下去&#xff0c;导致运算的结果处在高PE阶段。 那么随着股价的下跌&#xff0c;这个数字会慢慢变小。 当然…

基于MNIST数据集的手写数字识别(CNN)

目录 一&#xff0c;模型训练 1.1 数据集介绍 1.2 CNN模型层结构 1.3 定义CNN模型 1.4 神经网络的前向传播过程 1.5 数据预处理 1.6 加载数据 1.7 初始化 1.8 模型训练过程 1.9 保存模型 二&#xff0c;模型测试 2.1 定义与训练时相同的CNN模型架构 2.2 图像的预处…

centos中postfix的作用

/usr/libexec/postfix/master 是 Postfix 邮件服务器的主进程&#xff0c;qmgr 和 pickup 是 Postfix 的子进程。这些进程本身是正常的&#xff0c;但如果你怀疑服务器被用于钓鱼活动&#xff0c;需要进一步检查 Postfix 的配置和日志&#xff0c;确保它没有被滥用。 1. 检查 P…

蓝牙耳机什么牌子好?倍思值得冲不?

最近总被问“蓝牙耳机什么牌子好”&#xff0c;作为踩过无数坑的资深耳机党&#xff0c;必须安利刚入手的倍思M2s Pro主动降噪蓝牙耳机&#xff01;降噪、音质、颜值全都在线&#xff0c;性价比直接拉满。 -52dB降噪&#xff0c;通勤摸鱼神器 第一次开降噪就被惊到&#xff01…

游戏引擎学习第285天:“Traversables 的事务性占用”

回顾并为当天的工作做准备 我们有一个关于玩家移动的概念&#xff0c;玩家可以在点之间移动&#xff0c;而且当这些点移动时&#xff0c;玩家会随之移动。现在这个部分基本上已经在工作了。我们本来想实现的一个功能是&#xff1a;当玩家移动到某个点时&#xff0c;这个点能“…

java中的包机制

包机制 为了更好地组织类&#xff0c;java提供了包机制&#xff0c;用于区分类名的命名空间 包语句的语法格式为 package pkg1[. pkg2[. pkg3...]]一般利用公司域名倒置作为包名 &#xff1a; 公司域名&#xff1a;www.baidu.com 包名&#xff1a;com.baidu.www 为了能够…

python打卡DAY22

##注入所需库 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import random import numpy as np import time import shap # from sklearn.svm import SVC #支持向量机分类器 # # from sklearn.neighbors import KNeighborsClassifier …

CodeBuddy 开发 JSON 可视化工具实录:JsonVision 的诞生之旅

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 &#x1f9ed; 项目起点&#xff1a;一个灵光一现的念头 在日常的前端开发中&#xff0c;我时常需要调试复杂的…