SQL 數據庫操作語言詳解

?1. SQL 語言概述

SQL(Structured Query Language)是用于管理關系型數據庫的標準語言,主要分為以下幾個子語言:

- DQL(數據查詢語言):SELECT - 用于數據查詢
- DML(數據操作語言):INSERT, DELETE, UPDATE - 用于數據操作
- DCL(數據控制語言):GRANT, REVOKE - 用于權限控制
- DDL(數據定義語言):CREATE, ALTER, DROP - 用于數據庫對象定義
- TCL(事務控制語言):COMMIT, ROLLBACK - 用于事務控制

?2. DDL(數據定義語言)

?2.1 創建表

```sql
CREATE TABLE t_student(
`stuid` INT(4) AUTO_INCREMENT PRIMARY KEY, -- 行級約束
`sname` VARCHAR(15) NOT NULL,
`ssex` VARCHAR(1) NOT NULL DEFAULT '男',
`age` INT(3) CHECK(age>=0 AND age<=100),
`email` VARCHAR(30) UNIQUE
);
```

?2.2 查看表結構

```sql
-- 查看建表語句
SHOW CREATE TABLE t_student;

-- 查看表結構
DESC t_student;
```

?2.3 修改表結構

```sql
-- 添加字段
ALTER TABLE t_student ADD cid INT(4);

-- 添加字段并指定位置
ALTER TABLE t_student ADD cid INT(4) FIRST; -- 添加到第一列
ALTER TABLE t_student ADD cid INT(4) AFTER ssex; -- 添加到指定列后

-- 刪除字段
ALTER TABLE t_student DROP cid;

-- 修改字段
ALTER TABLE t_student MODIFY cid INT(5); -- 修改字段類型
ALTER TABLE t_student CHANGE cid class_id INT(4); -- 修改字段名和類型

-- 添加外鍵約束
ALTER TABLE t_student ADD CONSTRAINT fk_stu_cid?
FOREIGN KEY (cid) REFERENCES t_class(cid);
```

?2.4 完整性約束

- 主鍵(PRIMARY KEY):非空 + 唯一
- 非空(NOT NULL)
- 自增(AUTO_INCREMENT)
- 默認值(DEFAULT)
- 檢查(CHECK)
- 唯一(UNIQUE)
- 外鍵(FOREIGN KEY)

?2.5 刪除表

```sql
DROP TABLE t_student; -- 刪除表及所有數據
```

?3. DML(數據操作語言)

?3.1 插入數據

```sql
-- 指定字段插入
INSERT INTO t_student(sname, ssex, age, email, cid)
VALUES('李方雷', DEFAULT, 10, '123456', 1);

-- 簡寫形式(為所有字段賦值)
INSERT INTO t_student VALUES(NULL, '李方雷', DEFAULT, 10, '123456', 1);
```

?3.2 更新數據

```sql
-- 更新所有記錄(不推薦)
UPDATE t_student SET age = 20;

-- 更新指定記錄(推薦)
UPDATE t_student SET age = 20 WHERE stuid = 1;
```

?3.3 刪除數據

```sql
-- 刪除所有記錄(不推薦)
DELETE FROM t_student;

-- 刪除指定記錄(推薦)
DELETE FROM t_student WHERE stuid = 1;
```

?3.4 刪除方式比較

| 操作 | 類型 | 回滾 | 索引 | 效率 |
|------|------|------|------|------|
| DELETE | DML | 支持 | 不重置 | 低 |
| TRUNCATE | DDL | 不支持 | 重置 | 高 |
| DROP | DDL | 不支持 | 刪除 | 最高 |

?4. DQL(數據查詢語言)

?4.1 基本語法結構

```sql
SELECT 字段1, 字段2, ..., 字段n
FROM 表名
WHERE 條件
GROUP BY 分組字段
HAVING 分組條件
ORDER BY 排序字段
LIMIT 分頁參數;
```

?4.2 執行順序

1. FROM - 確定表
2. WHERE - 篩選條件
3. GROUP BY - 分組
4. HAVING - 分組條件
5. SELECT - 確定顯示內容
6. ORDER BY - 排序
7. LIMIT - 分頁

?4.3 SELECT 子句詳解

```sql
-- 查詢所有字段(不推薦)
SELECT ?FROM emp;

-- 查詢指定字段
SELECT empno, ename, sal FROM emp;

-- 使用別名
SELECT empno AS empn, ename AS '員工姓名' FROM emp;

-- 計算字段
SELECT ename, sal12+IFNULL(comm, 0) AS '年薪' FROM emp;

-- 去重查詢
SELECT DISTINCT mgr FROM emp WHERE mgr IS NOT NULL;
```

?4.4 ORDER BY 子句

```sql
-- 多字段排序
SELECT ?FROM emp ORDER BY deptno ASC, mgr DESC;
```

?4.5 WHERE 子句

```sql
-- 關系運算符
SELECT ?FROM emp WHERE sal > 2000;
SELECT ?FROM emp WHERE deptno != 10;

-- 邏輯運算符
SELECT ?FROM emp WHERE mgr = 7521 AND deptno != 10;

-- 模糊查詢
SELECT ?FROM emp WHERE ename LIKE '%a%'; -- 包含a
SELECT ?FROM emp WHERE ename LIKE '_a%'; -- 第二個字母是a
SELECT ?FROM emp WHERE ename LIKE 'as%'; -- 以as開頭
SELECT ?FROM emp WHERE ename LIKE '%a'; -- 以a結尾

-- NULL值查詢
SELECT ?FROM emp WHERE comm IS NULL;
SELECT ?FROM emp WHERE comm IS NOT NULL;

-- 使用函數
SELECT ?FROM emp WHERE DATEDIFF(CURDATE(), hiredate) > 15000;
```

?4.6 常用函數

?字符串函數

```sql
SELECT REPLACE(ename, SUBSTRING(ename, 2, LENGTH(ename)-2), ''), ename FROM emp;
```

?時間函數

```sql
-- 系統時間
SELECT CURDATE(), CURTIME(), NOW(), SYSDATE();

-- 日期計算
SELECT DAYOFYEAR(CURDATE()) FROM DUAL;
SELECT DATEDIFF(CURDATE(), '2004-4-23') FROM DUAL;

-- 日期格式化
SELECT DATE_FORMAT(hiredate, '%Y:%m:%d') FROM emp;

-- 日期加減
SELECT DATE_ADD(hiredate, INTERVAL 3 MONTH) FROM emp;
```

?流程函數

```sql
SELECT ename, job,
CASE deptno?
WHEN 10 THEN '開發部'
WHEN 20 THEN '測試部'
WHEN 30 THEN '運維部'
END AS 部門名稱
FROM emp;
```

?聚合函數

```sql
SELECT?
COUNT() AS 總人數,
MAX(sal) AS 最高工資,
MIN(sal) AS 最低工資,
AVG(sal) AS 平均工資,
SUM(sal) AS 工資總額
FROM emp;
```

?5. 多表查詢

```sql
-- 避免笛卡爾積
SELECT ?FROM emp, dept WHERE emp.deptno = dept.deptno;

-- 內連接
SELECT ?FROM emp INNER JOIN dept ON emp.deptno = dept.deptno;

-- 左外連接
SELECT ?FROM emp LEFT JOIN dept ON emp.deptno = dept.deptno;

-- 右外連接
SELECT ?FROM emp RIGHT JOIN dept ON emp.deptno = dept.deptno;
```

?總結

SQL 是數據庫操作的核心語言,掌握其各種語句和函數的使用對于數據庫管理和數據分析至關重要。在實際應用中,應注意:

1. 合理使用索引提高查詢效率
2. 避免使用 SELECT ,明確指定需要的字段
3. 注意 NULL 值的處理
4. 使用 JOIN 時注意關聯條件,避免笛卡爾積
5. 合理使用事務保證數據一致性

通過不斷練習和實踐,可以更加熟練地運用 SQL 語言進行數據庫操作和數據分析。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96596.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96596.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96596.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

積分變換的前世今生

積分變換常應用于解微分方程微分方程的解法&#xff1a;時域經典法&#xff1b;頻域變換法&#xff1b;“積分變換”最初并不是為了解微分方程&#xff0c;而是出于更“純粹”的數學動機——理解函數的結構、求解代數或幾何問題&#xff0c;以及簡化復雜的積分運算。微分方程的…

《Linux——gflags》

一、什么是gflags&#xff1f; gflags 是一個由 Google 開發的命令行參數解析庫&#xff0c;主要用于在 C&#xff08;也支持其他語言&#xff09;程序中便捷地處理命令行參數。它的核心作用是幫助開發者快速定義、解析和使用命令行選項&#xff0c;避免手動編寫繁瑣的參數解析…

編譯器的前端中端和后端

前面說的詞法分析和語法分析&#xff0c;確實是編譯器前端 (Front End) 最核心的兩個部分。但前端的工作還沒有結束。編譯器各階段劃分 一個完整的編譯器通常可以分為三個部分&#xff1a;前端、中端 (Middle End)、后端 (Back End)。 前端 (Front End) 核心職責: 理解源代碼。…

黑馬Java進階教程,全面剖析Java多線程編程,并發和并行,筆記02

黑馬Java進階教程&#xff0c;全面剖析Java多線程編程&#xff0c;并發和并行&#xff0c;筆記02 一、并發和并行 并發&#xff1a;在同一時刻&#xff0c;有多個指令在單個CPU上交替執行 并行&#xff1a;在同一時刻&#xff0c;有多個指令在多個CPU上同時執行 二、為什么有…

20250908 背包DP總結

引子 ~ 我們都有一個家&#xff0c;名字叫背包 ~ 背包DP 顧名思義&#xff0c;背包DP是用來解決背包最值問題的。題目會給出背包的容量&#xff0c;以及幾個物品的屬性&#xff0c;比如重量&#xff0c;價值&#xff0c;限額等等&#xff0c;具體是什么看題目。 01背包 01…

Redis持久化之RDB:快照機制原理、配置與最佳實踐

Redis持久化之RDB&#xff1a;快照機制原理、配置與最佳實踐 1. RDB持久化概述 1.1 什么是RDB RDB&#xff08;Redis Database&#xff09;是Redis的默認持久化方式&#xff0c;它在指定的時間間隔內生成數據集的快照&#xff08;snapshot&#xff09;&#xff0c;并將快照保…

daily notes[44]

文章目錄基礎references基礎 hello,world是幾乎所有編程語言的第一例子&#xff0c;rust也不例外。但和其它語言不一樣&#xff0c;Rust的源碼最好擁有自己的項目目錄。 $ mkdir ~/pro $ cd ~/pro $ mkdir helloWorld $ cd helloWorld源代碼文件名為main.rs&#xff0c;內容如…

JavaScript對象創建方式完全指南:從原始到現代的演進之路

前言 作為一名前端開發者&#xff0c;JavaScript中對象創建是很重要。在JavaScript這門基于原型的語言中&#xff0c;對象幾乎無處不在。今天&#xff0c;我將帶領大家回顧JavaScript對象創建的7種方式&#xff0c;從最原始的字面量到現代的ES6 class&#xff0c;每一步演進都解…

基于單片機的無線水塔監控系統設計(論文+源碼)

本設計為基于單片機的無線水塔監控系統設計&#xff0c;主要由以下幾部分組成&#xff1a;均采用STC89C52RC單片機為主控&#xff1b;主機&#xff1a;NRF24L01無線通訊模塊&#xff0c;1602LCD液晶顯示屏。從機&#xff1a;NRF24L01無線通訊模塊&#xff0c;水位傳感器&#x…

凌晨0-3點不睡,你熬的不是夜,是人生!

“熬夜”這個詞&#xff0c;早已成為現代生活的常態。有人為了工作加班到深夜&#xff0c;有人為了娛樂刷劇到天明&#xff0c;但你知道嗎&#xff1f;熬夜最“要命”的時間段&#xff0c;其實是凌晨0點到凌晨3點。別以為只是少睡幾個小時而已&#xff0c;這個時間段不睡&#…

大語言模型基石:Transformer

一、引言 如今火爆的 GPT、LLaMA、通義千問、ChatGLM 等大語言模型&#xff0c;背后都離不開一個核心架構——Transformer。 2017 年&#xff0c;Google 在論文《Attention Is All You Need》中首次提出 Transformer 模型&#xff0c;徹底改變了自然語言處理的發展方向。它摒…

【算法】【鏈表】160.相交鏈表--通俗講解

算法通俗講解推薦閱讀 【算法–鏈表】83.刪除排序鏈表中的重復元素–通俗講解 【算法–鏈表】刪除排序鏈表中的重復元素 II–通俗講解 【算法–鏈表】86.分割鏈表–通俗講解 【算法】92.翻轉鏈表Ⅱ–通俗講解 【算法–鏈表】109.有序鏈表轉換二叉搜索樹–通俗講解 【算法–鏈表…

MySQL——庫的操作

1、創建數據庫語法&#xff1a;CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name這里的CHARACTER SET表示指定數據庫采用的字符集…

Python ast模塊(Abstract Syntax Trees,抽象語法樹)介紹及使用

文章目錄 核心概念 基本使用流程 常用節點類型 示例代碼 實際應用場景 注意事項 `ast.literal_eval()` 功能說明 適用場景 使用示例 限制與安全特性 與 `eval()` 的對比 總結 Python 的 ast 模塊( Abstract Syntax Trees,抽象語法樹)允許你解析、分析和修改 Python 代碼的…

C++寬度優先搜索算法:隊列與優先級隊列

本期我們就來深入學習一下C算法中一個很重要的算法思想&#xff1a;寬度優先搜索算法 寬度優先算法是一個應用十分廣泛的算法思想&#xff0c;涉及的領域也十分繁多&#xff0c;因此本篇我們先只涉獵它的一部分算法題&#xff1a;隊列/優先級隊列&#xff0c;后續我們會進一步地…

類的property屬性

??Python 中的 property 特性詳解??property 是 Python 中用于??將方法轉換為屬性??的裝飾器&#xff0c;它允許開發者以訪問屬性的方式調用方法&#xff0c;同時可以添加邏輯控制&#xff08;如數據校驗、計算屬性等&#xff09;。以下是其核心用法和優勢&#xff1a;…

【Redis#9】其他數據結構

引言 Redis 除了我們最常用的 String、Hash、List、Set、ZSet&#xff08;Sorted Set&#xff09; 這五種基本數據結構外&#xff0c;還提供了很多高級或特殊用途的數據結構/類型 &#xff0c;它們可以滿足更復雜的業務需求。 ? Redis 的“五大基本數據結構”回顧類型特點Stri…

AutoGen——自定義Agent

目錄引子自定義 AgentCountDownAgentArithmeticAgent在自定義 Agent 中使用自定義模型客戶端讓自定義 Agent 聲明式化Selector Group Chat示例&#xff1a;網頁搜索 / 數據分析代理&#xff08;Agents&#xff09;Workflow終止條件&#xff08;Termination Conditions&#xff…

【重定向和轉發的核心理解】

重定向和轉發 不廢話&#xff1a; “轉發” 的核心定義&#xff1a; 服務端內部主導跳轉、客戶端無感知&#xff08;僅 1 次請求&#xff09;、瀏覽器 URL 不改變&#xff0c;與傳統 Web 開發中 “轉發” 的本質邏輯完全一致&#xff0c;只是實現載體&#xff08;Nginx 路由層 …