SQL數(shù)據(jù)庫增刪改查基本操作及C#開發(fā)使用方法

基本了解
SQL(Structured Query Language)是用于訪問和處理關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)計算機語言。它包括數(shù)據(jù)定義語言(DDL)、數(shù)據(jù)操作語言(DML)和數(shù)據(jù)庫控制功能(DCL)。SQL的主要功能包括查詢數(shù)據(jù)、在表中插入、更新和刪除行、創(chuàng)建、替換、更改和刪除對象,以及控制對數(shù)據(jù)庫及其對象的訪問。
SQL是所有關(guān)系數(shù)據(jù)庫通用的標(biāo)準(zhǔn)語言,但某些關(guān)系數(shù)據(jù)庫可能不支持SQL中的少數(shù)語句。關(guān)系數(shù)據(jù)庫會在SQL基礎(chǔ)上進(jìn)行一些擴(kuò)展,增加一些額外的功能,這些額外的功能是該種關(guān)系數(shù)據(jù)庫特有的,只能在該種數(shù)據(jù)庫中使用。
常見的關(guān)系型數(shù)據(jù)庫有Oracle和MySQL。Oracle性能極好,但比較昂貴,大公司用得多;MySQL則是開源免費,體積小,性能也不錯,中小公司用得多。
數(shù)據(jù)表是存儲數(shù)據(jù)的邏輯單元,每一行稱為一條記錄,每一列稱為一個字段。主鍵是唯一標(biāo)識此條記錄的鍵。
總之,SQL是一種用于管理關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)計算機語言,具有豐富的功能和靈活性,廣泛應(yīng)用于各種關(guān)系型數(shù)據(jù)庫系統(tǒng)。
?
SQL是關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,用于執(zhí)行各種數(shù)據(jù)庫操作,例如增刪改查數(shù)據(jù)、定義數(shù)據(jù)庫結(jié)構(gòu)等。MySQL是一種具體的實現(xiàn),提供了關(guān)系型數(shù)據(jù)庫的管理功能,例如創(chuàng)建表、存儲數(shù)據(jù)、優(yōu)化查詢等。
在MySQL中,通過使用SQL語言,可以執(zhí)行各種數(shù)據(jù)庫操作,例如創(chuàng)建表、插入數(shù)據(jù)、查詢數(shù)據(jù)、更新數(shù)據(jù)等。因此,SQL和MySQL之間是一種語言和實現(xiàn)的關(guān)系,它們共同提供了關(guān)系型數(shù)據(jù)庫的功能。
除了SQL數(shù)據(jù)庫,還有許多其他常用的數(shù)據(jù)庫,以下列舉幾種常見的數(shù)據(jù)庫類型:
1、NoSQL數(shù)據(jù)庫:NoSQL數(shù)據(jù)庫是一種非關(guān)系型數(shù)據(jù)庫,它使用鍵值對(key-value)或者文檔(document)的形式存儲數(shù)據(jù),不需要事先定義數(shù)據(jù)模型。常見的NoSQL數(shù)據(jù)庫包括MongoDB、Cassandra、Redis等。
2、列式數(shù)據(jù)庫:列式數(shù)據(jù)庫是一種針對大規(guī)模數(shù)據(jù)處理和實時分析的數(shù)據(jù)庫,它將數(shù)據(jù)按照列進(jìn)行存儲,以便更快速地執(zhí)行查詢和計算操作。常見的列式數(shù)據(jù)庫包括Cassandra、HBase等。
3、內(nèi)存數(shù)據(jù)庫:內(nèi)存數(shù)據(jù)庫是將數(shù)據(jù)存儲在內(nèi)存中,而不是磁盤上的數(shù)據(jù)庫。由于內(nèi)存的讀寫速度比磁盤快得多,因此內(nèi)存數(shù)據(jù)庫可以提供非常高的查詢速度。常見的內(nèi)存數(shù)據(jù)庫包括Redis、Memcached等。
4、圖形數(shù)據(jù)庫:圖形數(shù)據(jù)庫用于存儲和查詢圖形結(jié)構(gòu)的數(shù)據(jù)。在圖形數(shù)據(jù)庫中,實體之間的關(guān)系被建模為節(jié)點和邊,這使得查詢和分析復(fù)雜的關(guān)系變得更加容易。常見的圖形數(shù)據(jù)庫包括Neo4j、GraphDB等。
5、時間序列數(shù)據(jù)庫:時間序列數(shù)據(jù)庫用于存儲和管理時間序列數(shù)據(jù),例如傳感器數(shù)據(jù)、交易記錄等。這些數(shù)據(jù)庫通常具有高性能、低延遲的特性,可以快速地存儲和查詢時間序列數(shù)據(jù)。常見的時間序列數(shù)據(jù)庫包括InfluxDB、Prometheus等。
這些數(shù)據(jù)庫類型各有特點,適用于不同的應(yīng)用場景。選擇合適的數(shù)據(jù)庫類型取決于所需的數(shù)據(jù)處理能力、查詢復(fù)雜度、數(shù)據(jù)規(guī)模等因素。
建表及添加
建表,數(shù)據(jù)源,數(shù)據(jù)庫。


安裝MySQL,在安裝過程中,需要設(shè)置MySQL的root用戶密碼。
啟動MySQL服務(wù):安裝完成后,MySQL服務(wù)默認(rèn)是未啟動的??梢栽凇胺?wù)”中手動啟動,也可以使用命令行方式啟動。具體命令為:net start mysql。
連接MySQL:可以使用MySQL自帶的命令行客戶端登錄,也可以使用圖形化客戶端如MySQL Workbench登錄。登錄時需要輸入用戶名(root)、密碼和要連接的服務(wù)器地址(localhost,如果MySQL服務(wù)在本機上)。
創(chuàng)建新的數(shù)據(jù)庫:登錄成功后,可以使用SQL語句來創(chuàng)建數(shù)據(jù)庫。語法為:sql CREATE DATABASE 數(shù)據(jù)庫名。例如,創(chuàng)建名為“my_db”的數(shù)據(jù)庫:sql CREATE DATABASE my_db。
選擇使用的數(shù)據(jù)庫:創(chuàng)建好數(shù)據(jù)庫后,需要使用“USE”語句來選擇要操作的數(shù)據(jù)庫。語法為:sql USE 數(shù)據(jù)庫名。例如,使用名為“my_db”的數(shù)據(jù)庫:sql USE my_db。
打開數(shù)據(jù)庫軟件,并登錄到數(shù)據(jù)庫服務(wù)器。你需要使用管理員帳戶登錄。
在數(shù)據(jù)庫服務(wù)器上創(chuàng)建一個新的數(shù)據(jù)庫。這可以通過命令行或者通過圖形界面完成。
?
客戶端連接數(shù)據(jù)庫需要以下參數(shù):
主機名(或IP地址):用于標(biāo)識數(shù)據(jù)庫所在的服務(wù)器。
端口號:數(shù)據(jù)庫服務(wù)器的端口號,默認(rèn)為3306。
用戶名:登錄數(shù)據(jù)庫的用戶名。
密碼:登錄數(shù)據(jù)庫的密碼。
數(shù)據(jù)庫名稱:連接的具體數(shù)據(jù)庫名稱。
以上是MySQL數(shù)據(jù)庫連接中的必要參數(shù)。除此之外,還有其他一些可選參數(shù),如超時時間、連接所使用的socket地址、SSL證書等,根據(jù)具體需求進(jìn)行配置。
?
建表
手動建表SQL建表語句用于創(chuàng)建一個新的數(shù)據(jù)庫表,并定義該表的結(jié)構(gòu)。下面是一個簡單的SQL建表語句的示例:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
...
);
在上述語句中,你需要提供以下信息:
table_name:要創(chuàng)建的表的名稱。
column1, column2, column3:表的列名。
datatype:每列的數(shù)據(jù)類型,例如整數(shù)(INT)、字符串(VARCHAR)、日期(DATE)等。
常見的數(shù)據(jù)類型包括以下幾種:
1、INTEGER(整數(shù)類型):用于存儲整數(shù)。
2、FLOAT(浮點數(shù)類型):用于存儲帶有小數(shù)點的數(shù)值。
3、CHAR(字符類型):用于存儲定長字符串。
4、VARCHAR(可變長字符串類型):用于存儲可變長度的字符串。
5、DATE(日期類型):用于存儲日期信息。
6、TIME(時間類型):用于存儲時間信息。
7、DATETIME(日期時間類型):用于存儲日期和時間信息。
8、BOOLEAN(布爾類型):用于存儲邏輯值(真/假)。
9、BLOB(二進(jìn)制大對象類型):用于存儲二進(jìn)制數(shù)據(jù)。
這些數(shù)據(jù)類型可以根據(jù)實際需求進(jìn)行選擇,以適應(yīng)不同類型的數(shù)據(jù)存儲。
數(shù)據(jù)表列類型描述PRIMARY KEY唯一標(biāo)識,INTeger PRIMARY KEY AUTOINCREMENT唯一標(biāo)識且自動編號自動遞增,該列數(shù)據(jù)無需操作自動完成編號。salary DECIMAL(10, 2) salary列被定義為帶有兩位小數(shù)的十進(jìn)制數(shù)等操作。
?
下面是一個更具體的示例,創(chuàng)建一個名為"Employees"的表,包含員工的ID、姓名、職位和入職日期等列:
CREATE TABLE Employees (
EmployeeID INT, --int整數(shù)類型
FirstName VARCHAR(50), --字符串長度50
LastName VARCHAR(50),
Position VARCHAR(50),
HireDate DATE --日期
);
在這個示例中,EmployeeID、FirstName、LastName、Position和HireDate是表的列名,分別使用了整數(shù)(INT)、字符串(VARCHAR)和日期(DATE)等數(shù)據(jù)類型。你可以根據(jù)實際需求調(diào)整列名和數(shù)據(jù)類型。
?
CREATE TABLE if not exists Employees是一種更靈活的語法,它只有在表不存在時才會創(chuàng)建表。如果表已經(jīng)存在,則不會執(zhí)行任何操作。這種語法允許您避免因表已經(jīng)存在而產(chǎn)生的錯誤。
另一方面,CREATE TABLE Employees將始終創(chuàng)建一個名為"Employees"的新表,而不管該表是否已經(jīng)存在。如果表已經(jīng)存在,這可能會導(dǎo)致數(shù)據(jù)冗余或錯誤。
?
提到的手動創(chuàng)建表和使用圖形界面工具創(chuàng)建表外,還有其他建表方法。以下是一些其他建表方法:
1、使用存儲過程創(chuàng)建表:您可以編寫存儲過程來創(chuàng)建表。存儲過程是預(yù)編譯的SQL語句,可以在數(shù)據(jù)庫中創(chuàng)建表、視圖、函數(shù)等。
2、使用觸發(fā)器創(chuàng)建表:觸發(fā)器是一種在數(shù)據(jù)庫中執(zhí)行特定操作時自動觸發(fā)的一段代碼。您可以使用觸發(fā)器在數(shù)據(jù)庫中創(chuàng)建表。
3、使用編程語言創(chuàng)建表:您可以使用各種編程語言(如Python、Java等)通過與數(shù)據(jù)庫交互來創(chuàng)建表。
增加
要向已存在的表中添加數(shù)據(jù),您可以使用SQL的INSERT INTO語句。以下是一個示例:
INSERT INTO table_name ? (column1, column2, column3, ...)
VALUES (value1, value2, ? value3, ...);
在上述語句中,您需要提供以下信息:
table_name:要添加數(shù)據(jù)的表的名稱。
(column1, column2, column3, ? ? ?...):要插入數(shù)據(jù)的列的名稱。
(value1, value2, value3, ? ? ?...):要插入到對應(yīng)列中的實際值。
以下是一個具體的示例,假設(shè)有一個名為"Students"的表,包含"StudentID"、"FirstName"、"LastName"、"Age"和"EnrollmentYear"等列。現(xiàn)在要向該表中插入一條新的學(xué)生記錄:
INSERT INTO Students ? (StudentID, FirstName, LastName, Age, EnrollmentYear)
VALUES (1, 'John', 'Doe', 20, 2022);
在這個示例中,我們向"Students"表中的指定列插入了新的值。請注意,插入的值必須與列的數(shù)據(jù)類型匹配。
?
SQL可以為原數(shù)據(jù)表添加新列。您可以使用ALTER TABLE語句來修改表結(jié)構(gòu),并添加新列。以下是添加新列的示例語法:
ALTER TABLE table_name
ADD column_name ? data_type;
在上面的語法中,您需要將"table_name"替換為要添加列的表名,"column_name"替換為要添加的列名,"data_type"替換為該列的數(shù)據(jù)類型。
例如,如果您有一個名為"employees"的表,并且想要在該表中添加一個名為"salary"的新列,數(shù)據(jù)類型為DECIMAL,您可以執(zhí)行以下語句:
ALTER TABLE employees
ADD salary DECIMAL;
執(zhí)行該語句后,"employees"表中將會添加一個新的"salary"列。請注意,如果新列的數(shù)據(jù)類型不是空的,您可能需要在添加列之后為該列提供適當(dāng)?shù)某跏贾怠?/p>
?
查詢
注釋符:單行注釋--,多行注釋使用/*開始,使用*/結(jié)束。
SQL語句命令執(zhí)行采用;號結(jié)束語句,可以寫多條語句實現(xiàn)。

條件查詢:
where 子句的語法如下:
SELECT
列
1,
列
2, ...
FROM
表名
WHERE
條件
;
?

查詢進(jìn)階
關(guān)聯(lián)查詢:
在之前的教程中,我們所有的查詢操作都是在單個數(shù)據(jù)表中進(jìn)行的。但有時,我們可能希望在單張表的基礎(chǔ)上,獲取更多額外數(shù)據(jù),比如獲取學(xué)生表中學(xué)生所屬的班級信息等。這時,就需要使用關(guān)聯(lián)查詢。
在 SQL 中,關(guān)聯(lián)查詢是一種用于聯(lián)合多個數(shù)據(jù)表中的數(shù)據(jù)的查詢方式。
其中,CROSS JOIN 是一種簡單的關(guān)聯(lián)查詢,不需要任何條件來匹配行,它直接將左表的 每一行 與右表的 每一行 進(jìn)行組合,返回的結(jié)果是兩個表的笛卡爾積。
SELECT e.name AS student_name, e.age AS student_age,
e.class_id, d.name AS class_name
FROM student e
CROSS JOIN class d;
?
在 SQL 中,INNER JOIN 是一種常見的關(guān)聯(lián)查詢方式,它根據(jù)兩個表之間的關(guān)聯(lián)條件,將滿足條件的行組合在一起。
注意,INNER JOIN 只返回兩個表中滿足關(guān)聯(lián)條件的交集部分,即在兩個表中都存在的匹配行。
SELECT e.name AS student_name, e.age AS student_age,
e.class_id, ?d.name AS class_name ,d.level AS class_level
FROM student e
JOIN class d ON e.class_id = d.id;
?
在 SQL 中,OUTER JOIN 是一種關(guān)聯(lián)查詢方式,它根據(jù)指定的關(guān)聯(lián)條件,將兩個表中滿足條件的行組合在一起,并 包含沒有匹配的行 。
在 OUTER JOIN 中,包括 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 兩種類型,它們分別表示查詢左表和右表的所有行(即使沒有被匹配),再加上滿足條件的交集部分。
有些數(shù)據(jù)庫并不支持 RIGHT JOIN 語法,那么如何實現(xiàn) RIGHT JOIN 呢?
其實只需要把主表(from 后面的表)和關(guān)聯(lián)表(LEFT JOIN 后面的表)順序進(jìn)行調(diào)換即可!
SELECT e.name AS student_name, e.age AS student_age,
e.class_id, d.name AS class_name,d.level AS class_level
FROM student e
LEFT ?JOIN class d ON e.class_id = d.id;
?
子查詢
子查詢是指在一個查詢語句內(nèi)部 嵌套 另一個完整的查詢語句,內(nèi)層查詢被稱為子查詢。子查詢可以用于獲取更復(fù)雜的查詢結(jié)果或者用于過濾數(shù)據(jù)。
當(dāng)執(zhí)行包含子查詢的查詢語句時,數(shù)據(jù)庫引擎會首先執(zhí)行子查詢,然后將其結(jié)果作為條件或數(shù)據(jù)源來執(zhí)行外層查詢。
打個比方,子查詢就像是在一個盒子中的盒子,外層查詢是大盒子,內(nèi)層查詢是小盒子。執(zhí)行查詢時,我們首先打開小盒子獲取結(jié)果,然后將小盒子的結(jié)果放到大盒子中繼續(xù)處理。
子查詢是一種強大的查詢工具,它可以嵌套在主查詢中,幫助我們進(jìn)行更復(fù)雜的條件過濾和數(shù)據(jù)檢索。
其中,子查詢中的一種特殊類型是 "exists" 子查詢,用于檢查主查詢的結(jié)果集是否存在滿足條件的記錄,它返回布爾值(True 或 False),而不返回實際的數(shù)據(jù)。
-- 主查詢
SELECT name, total_amount
FROM customers
WHERE customer_id
IN (
????
-- 子查詢????
SELECT
DISTINCT customer_id
????
FROM orders
????
WHERE total_amount
>
200);
和 exists 相對的是 not exists,用于查找不滿足存在條件的記錄。
SELECT name, age,class_id
FROM student
WHERE not EXISTS (
? ? -- 子查詢
? ? SELECT 1
? ? FROM class
? ? WHERE class.id = student.class_id
);
?
組合查詢
在 SQL 中,組合查詢是一種將多個 SELECT 查詢結(jié)果合并在一起的查詢操作。
包括兩種常見的組合查詢操作:UNION 和 UNION ALL。
1、UNION 操作:它用于將兩個或多個查詢的結(jié)果集合并, 并去除重復(fù)的行 。即如果兩個查詢的結(jié)果有相同的行,則只保留一行。
2、UNION ALL 操作:它也用于將兩個或多個查詢的結(jié)果集合并, 但不去除重復(fù)的行 。即如果兩個查詢的結(jié)果有相同的行,則全部保留。
-- UNION ALL操作
SELECT name, age, score,class_id
FROM student
UNION ALL
SELECT name, age, score,class_id
FROM student_new;
?
開窗函數(shù)
在 SQL 中,開窗函數(shù)是一種強大的查詢工具,它允許我們在查詢中進(jìn)行對分組數(shù)據(jù)進(jìn)行計算、 同時保留原始行的詳細(xì)信息 。
開窗函數(shù)可以與聚合函數(shù)(如 SUM、AVG、COUNT 等)結(jié)合使用,但與普通聚合函數(shù)不同,開窗函數(shù)不會導(dǎo)致結(jié)果集的行數(shù)減少。
打個比方,可以將開窗函數(shù)想象成一種 "透視鏡",它能夠?qū)⑽覀兙劢乖谀硞€特定的分組,同時還能看到整體的全景。
開窗函數(shù)sum over
該函數(shù)用法為:
SUM(計算字段名) OVER (PARTITION BY 分組字段名)
SELECT
? ? id,
? ? name,
? ? age,
? ? score,
? ? class_id,
? ? avg(score) OVER
? ? (PARTITION BY class_id) AS class_avg_score
FROM
? ? student;
?
sum over 函數(shù)的另一種用法:sum over order by,可以實現(xiàn)同組內(nèi)數(shù)據(jù)的 累加求和 。
示例用法如下:
SUM(計算字段名) OVER (PARTITION BY 分組字段名 ORDER BY 排序字段 排序規(guī)則)
? ? SELECT
? ? id,
? ? name,
? ? age,
? ? score,
? ? class_id,
? ? SUM(score) OVER
? ? (PARTITION BY class_id ORDER BY score ASC)
? ? AS class_sum_score
FROM
? ? student;
我們使用開窗函數(shù) SUM 來計算每個客戶的歷史訂單累計金額(cumulative_total_amount),并使用 PARTITION BY 子句按照 customer_id 進(jìn)行分組,并使用 ORDER BY 子句按照 order_date 進(jìn)行排序。從結(jié)果的前兩行可以看到,開窗函數(shù)保留了原始訂單的詳細(xì)信息,同時計算了每個客戶的歷史訂單累計金額;相比于只用 sum over,同組內(nèi)的累加列名稱
開窗函數(shù)Rank
Rank 開窗函數(shù)是 SQL 中一種用于對查詢結(jié)果集中的行進(jìn)行 排名 的開窗函數(shù)。它可以根據(jù)指定的列或表達(dá)式對結(jié)果集中的行進(jìn)行排序,并為每一行分配一個排名。在排名過程中,相同的值將被賦予相同的排名,而不同的值將被賦予不同的排名。
當(dāng)存在并列(相同排序值)時,Rank 會跳過后續(xù)排名,并保留相同的排名。
Rank 開窗函數(shù)的常見用法是在查詢結(jié)果中查找前幾名(Top N)或排名最高的行。
Rank 開窗函數(shù)的語法如下:
RANK()
OVER (
??
PARTITION
BY
列名
1,
列名
2, ...
-- 可選,用于指定分組列??
ORDER
BY
列名
3 [
ASC|DESC],
列名
4 [
ASC|DESC], ...
-- 用于指定排序列及排序方式
)
AS rank_column
其中,PARTITION BY 子句可選,用于指定分組列,將結(jié)果集按照指定列進(jìn)行分組;ORDER BY 子句用于指定排序列及排序方式,決定了計算 Rank 時的排序規(guī)則。AS rank_column 用于指定生成的 Rank 排名列的別名。
SELECT
? ? id,
? ? name,
? ? age,
? ? score,
? ? class_id,
? ? RANK() OVER
? ? (PARTITION BY class_id ORDER BY score DESC)
? ? AS ranking
FROM
? ? student;
開窗函數(shù)Row_Number
Row_Number 開窗函數(shù)是 SQL 中的一種用于為查詢結(jié)果集中的每一行 分配唯一連續(xù)排名 的開窗函數(shù)。
它與之前講到的 Rank 函數(shù),Row_Number 函數(shù)為每一行都分配一個唯一的整數(shù)值,不管是否存在并列(相同排序值)的情況。每一行都有一個唯一的行號,從 1 開始連續(xù)遞增。
Row_Number 開窗函數(shù)的語法如下(幾乎和 Rank 函數(shù)一模一樣):
ROW_NUMBER()
OVER (
??
PARTITION
BY column1, column2, ...
-- 可選,用于指定分組列??
ORDER
BY column3 [
ASC|DESC], column4 [
ASC|DESC], ...
-- 用于指定排序列及排序方式
)
AS row_number_column
其中,PARTITION BY子句可選,用于指定分組列,將結(jié)果集按照指定列進(jìn)行分組。ORDER BY 子句用于指定排序列及排序方式,決定了計算 Row_Number 時的排序規(guī)則。AS row_number_column 用于指定生成的行號列的別名。
SELECT
? ? id,
? ? name,
? ? age,
? ? score,
? ? class_id,
? ? ROW_NUMBER() OVER
? ? (PARTITION BY class_id ORDER BY score DESC)
? ? AS row_number
FROM
? ? student;
?
開窗函數(shù)-lag / lead
開窗函數(shù) Lag 和 Lead 的作用是獲取在當(dāng)前行之前或之后的行的值,這兩個函數(shù)通常在需要比較相鄰行數(shù)據(jù)或進(jìn)行時間序列分析時非常有用。
1)Lag 函數(shù)
Lag 函數(shù)用于獲取 當(dāng)前行之前 的某一列的值。它可以幫助我們查看上一行的數(shù)據(jù)。
Lag 函數(shù)的語法如下:
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY sort_column)
參數(shù)解釋:
column_name:要獲取值的列名。
offset:表示要向上偏移的行數(shù)。例如,offset為1表示獲取上一行的值,offset為2表示獲取上兩行的值,以此類推。
default_value:可選參數(shù),用于指定當(dāng)沒有前一行時的默認(rèn)值。
PARTITION BY和ORDER BY子句可選,用于分組和排序數(shù)據(jù)。
2)Lead 函數(shù)
Lead 函數(shù)用于獲取 當(dāng)前行之后 的某一列的值。它可以幫助我們查看下一行的數(shù)據(jù)。
Lead 函數(shù)的語法如下:
LEAD(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY sort_column)
參數(shù)解釋:
column_name:要獲取值的列名。
offset:表示要向下偏移的行數(shù)。例如,offset為1表示獲取下一行的值,offset為2表示獲取下兩行的值,以此類推。
default_value:可選參數(shù),用于指定當(dāng)沒有后一行時的默認(rèn)值。
PARTITION BY和ORDER BY子句可選,用于分組和排序數(shù)據(jù)。
·??????? SELECT
·??????? ? ? id,
·??????? ? ? name,
·??????? ? ? age,
·??????? ? ? score,
·??????? ? ? class_id,
·??????? ? ? LAG(name, 1, NULL) OVER
·??????? ? ? (PARTITION BY class_id ORDER BY score DESC)
·??????? ? ? AS prev_name,
·??????? ? ? LEAD(name, 1, NULL) OVER
·??????? ? ? (PARTITION BY class_id ORDER BY score DESC)
·??????? ? ? AS next_name
·??????? FROM
·??????? ? ? student;
基本操作
去重、排序、截斷偏移操作

條件分支
case when?支持同時指定多個分支,示例語法如下:
CASE WHEN (條件1) THEN 結(jié)果1
??????? ?? WHEN (條件2) THEN 結(jié)果2
??????? ?? ...
??????? ?? ELSE 其他結(jié)果 END

時間函數(shù)
常用的時間函數(shù)有:
DATE:獲取當(dāng)前日期
DATETIME:獲取當(dāng)前日期時間
TIME:獲取當(dāng)前時間
還有很多時間函數(shù),比如計算兩個日期的相差天數(shù)、獲取當(dāng)前日期對應(yīng)的毫秒數(shù)等,
SELECT name , DATE() AS '當(dāng)前日期' from student;
?
字符串處理
在 SQL 中,字符串處理是一類用于處理文本數(shù)據(jù)的函數(shù)。它們允許我們對字符串進(jìn)行各種操作,如轉(zhuǎn)換大小寫、計算字符串長度以及搜索和替換子字符串等。字符串處理函數(shù)可以幫助我們在數(shù)據(jù)庫中對字符串進(jìn)行加工和轉(zhuǎn)換,從而滿足不同的需求。
LOWER、UPPER字符串大小寫切換,LENGTH字符串長度等。
SELECT id , name, ?upper(name) AS upper_name
FROM student where name=='熱dog';
聚合函數(shù)
在 SQL 中,聚合函數(shù)是一類用于對數(shù)據(jù)集進(jìn)行?匯總計算?的特殊函數(shù)。它們可以對一組數(shù)據(jù)執(zhí)行諸如計數(shù)、求和、平均值、最大值和最小值等操作。聚合函數(shù)通常在 SELECT 語句中配合 GROUP BY 子句使用,用于對分組后的數(shù)據(jù)進(jìn)行匯總分析。(數(shù)學(xué)函數(shù)運算)
常見的聚合函數(shù)包括:
COUNT:計算指定列的行數(shù)或非空值的數(shù)量。
SUM:計算指定列的數(shù)值之和。
AVG:計算指定列的數(shù)值平均值。
MAX:找出指定列的最大值。
MIN:找出指定列的最小值。
·??????? SELECT SUM(score) AS total_score,
·??????? avg(score)AS avg_score,
·??????? MAX(score)AS max_score,
·??????? MIN(score)AS min_score
·??????? FROM student;
?
分組聚合
在 SQL 中,分組聚合是一種對數(shù)據(jù)進(jìn)行分類并對每個分類進(jìn)行聚合計算的操作。它允許我們按照指定的列或字段對數(shù)據(jù)進(jìn)行分組(單字段、多字段或having 子句分組),然后對每個分組應(yīng)用聚合函數(shù),如 COUNT、SUM、AVG 等,以獲得分組后的匯總結(jié)果。
舉個例子:某個學(xué)??梢园凑瞻嗉墝W(xué)生分組,并對每個班級進(jìn)行統(tǒng)計。查看每個班級有多少學(xué)生、每個班級的平均成績。這樣我們就能夠?qū)W(xué)校各班的學(xué)生情況有一個整體的了解,而不是單純看個別學(xué)生的信息。
在 SQL 中,通常使用 GROUP BY 關(guān)鍵字對數(shù)據(jù)進(jìn)行分組。
單字段分組:
SELECT class_id, avg(score) AS avg_score
FROM student
GROUP BY class_id;
多字段分組:
--統(tǒng)計學(xué)生表中每個班級每次考試的總學(xué)生人數(shù)
SELECT class_id,exam_num, COUNT(class_id) AS total_num
FROM student
GROUP BY class_id,exam_num;
?
在 SQL 中,HAVING 子句用于在分組聚合后對分組進(jìn)行過濾。它允許我們對分組后的結(jié)果進(jìn)行條件篩選,只保留滿足特定條件的分組。
HAVING 子句與條件查詢 WHERE 子句的區(qū)別在于,WHERE 子句用于在 分組之前 進(jìn)行過濾,而 HAVING 子句用于在 分組之后 進(jìn)行過濾。
--請你編寫一個 SQL 查詢,統(tǒng)計學(xué)生表中班級的總成績超過 150 分的班級編號(class_id)和總成績(total_score)。
SELECT class_id, SUM(score) AS total_score
FROM student
GROUP BY class_id
HAVING SUM(score) > 150;
?
刪除
在SQL中,刪除操作用于從數(shù)據(jù)庫表中刪除記錄。以下是SQL刪除操作的語法:
DELETE FROM table_name?
WHERE condition;
其中:
DELETE FROM指定要刪除記錄的表名。
WHERE關(guān)鍵字用于指定刪除記錄的條件。如果省略WHERE子句,則將刪除表中的所有記錄。
condition是一個可選的條件,用于指定要刪除的記錄。只有滿足條件的記錄才會被刪除。
以下是一些示例:
1、刪除表中滿足條件的記錄:
DELETE FROM table_name WHERE condition;
例如,要從名為employees的表中刪除所有薪資小于5000的記錄,可以使用以下語句:DELETE FROM employees WHERE salary < 5000;
2、刪除表中的所有記錄:
DELETE FROM table_name;
例如,要刪除名為customers的表中的所有記錄,可以使用以下語句:
DELETE FROM customers;
請注意,執(zhí)行刪除操作時要非常小心,因為一旦刪除數(shù)據(jù),將無法恢復(fù)。建議在執(zhí)行刪除操作之前備份重要數(shù)據(jù)。
更改
要修改SQL數(shù)據(jù)表中的數(shù)據(jù),您可以使用UPDATE語句。以下是一個基本的UPDATE語句的示例:
UPDATE table_name
SET column1 = ? new_value1, column2 = new_value2, ...
WHERE condition;
在上述語句中,您需要提供以下信息:
table_name:要修改數(shù)據(jù)的表的名稱。
SET:指定要更新的列和對應(yīng)的新值。
WHERE:可選項,用于指定更新的條件。只有滿足條件的記錄才會被更新。
以下是一個具體的示例,假設(shè)有一個名為"Students"的表,其中包含"StudentID"、"FirstName"、"LastName"和"Age"等列。現(xiàn)在要將ID為1的學(xué)生的名字改為"Jane",年齡改為21:
UPDATE Students
SET FirstName = 'Jane', Age = 21
WHERE StudentID = 1;
上述語句將更新滿足條件的記錄,即StudentID為1的學(xué)生的FirstName和Age列將被更新為新的值。請注意,根據(jù)實際情況,您可能需要根據(jù)需要調(diào)整列名、新值和條件。
其他操作
除了增刪改查還有以下常用的操作:
1、創(chuàng)建表(CREATE TABLE):用于在數(shù)據(jù)庫中創(chuàng)建新的表。您可以使用CREATE TABLE命令定義表的列、數(shù)據(jù)類型和其他屬性。
2、刪除表(DROP TABLE):用于從數(shù)據(jù)庫中刪除表。您可以使用DROP TABLE命令刪除指定的表。
3、創(chuàng)建索引(CREATE INDEX):用于在表的列上創(chuàng)建索引。索引可以提高數(shù)據(jù)查詢的性能。
4、刪除索引(DROP INDEX):用于從表中刪除索引。
5、創(chuàng)建視圖(CREATE VIEW):用于創(chuàng)建數(shù)據(jù)庫中的視圖。視圖是一個虛擬表,它基于存儲的查詢結(jié)果進(jìn)行定義,可以用于簡化復(fù)雜的查詢操作。
6、刪除視圖(DROP VIEW):用于從數(shù)據(jù)庫中刪除視圖。
這些操作是SQL中常見的操作,可以幫助您管理數(shù)據(jù)庫和操作數(shù)據(jù)。
?
上位機開發(fā)連接SQL,及SQL命令處理,在C#開發(fā)中連接SQL數(shù)據(jù)庫并進(jìn)行命令處理,通常涉及以下步驟:
1、安裝并引入必要的命名空間
在項目中引入System.Data.SqlClient命名空間,這是.NET用于與SQL Server交互的主要命名空間。
using System.Data.SqlClient;
2、建立數(shù)據(jù)庫連接
使用SqlConnection類來建立與數(shù)據(jù)庫的連接。在連接字符串中,需要提供數(shù)據(jù)庫的地址、用戶名、密碼以及數(shù)據(jù)庫名稱。
string connectionString ? = "Server=服務(wù)器地址;Database=數(shù)據(jù)庫名稱;User Id=用戶名;Password=密碼;";
SqlConnection connection = new SqlConnection(connectionString);
3、打開數(shù)據(jù)庫連接
使用Open()方法打開數(shù)據(jù)庫連接。
connection.Open();
4、執(zhí)行SQL命令
使用SqlCommand類來執(zhí)行SQL命令。你可以使用ExecuteNonQuery()方法執(zhí)行不返回結(jié)果集的命令,如INSERT、UPDATE、DELETE等,或者使用ExecuteReader()方法執(zhí)行返回結(jié)果集的命令,如SELECT。
string sql = "SELECT * ? FROM 表名";
SqlCommand command = new ? SqlCommand(sql, connection);
SqlDataReader reader = ? command.ExecuteReader();
5、處理結(jié)果
根據(jù)執(zhí)行的是ExecuteNonQuery還是ExecuteReader,處理結(jié)果的方式不同。對于前者,通常關(guān)注返回受影響行數(shù);對于后者,可以使用Read()方法逐行讀取結(jié)果集。
int rowsAffected = ? command.ExecuteNonQuery();
Console.WriteLine($"Rows ? affected: {rowsAffected}");
while (reader.Read())
{
Console.WriteLine($"{reader["列名1"]}, {reader["列名2"]}, ...");
}
6、關(guān)閉連接
在完成數(shù)據(jù)庫操作后,記得關(guān)閉數(shù)據(jù)庫連接。
connection.Close();
以上是基本的流程。在實際開發(fā)中,你可能還需要處理異常、使用參數(shù)化查詢等,以提高程序的健壯性和安全性。
END
