關系代數和關系數據庫語言(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.pswp.cn/news/906008.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906008.shtml
英文地址,請注明出處:http://en.pswp.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;我時常需要調試復雜的…