[TOC]
# 參考資料
[https://github.com/CyC2018/CS-Notes/blob/master/notes/SQL.md](https://github.com/CyC2018/CS-Notes/blob/master/notes/SQL.md)
[https://blog.csdn.net/qq\_37205708/article/details/94194465](https://blog.csdn.net/qq_37205708/article/details/94194465)
# 基礎
模式定義了數據如何存儲、存儲什么樣的數據以及數據如何分解等信息,數據庫和表都有模式。
主鍵的值不允許修改,也不允許復用(不能將已經刪除的主鍵值賦給新數據行的主鍵)。
SQL(Structured Query Language),標準 SQL 由 ANSI 標準委員會管理,從而稱為 ANSI SQL。各個 DBMS 都有自己的實現,如 PL/SQL、Transact-SQL 等。
SQL 語句不區分大小寫,但是數據庫表名、列名和值是否區分依賴于具體的 DBMS 以及配置。
SQL 支持以下三種注釋:
```sql
# 注釋
SELECT *
FROM mytable; -- 注釋
/* 注釋1
注釋2 */
```
數據庫創建與使用:
```sql
CREATE DATABASE test;
USE test;
```
# 數據定義
<table>
<tr>
<th rowspan=2>操作對象</th>
<th colspan=3>操作方式</th>
</tr>
<tr>
<td>創建</td>
<td>刪除</td>
<td>修改</td>
</tr>
<tr>
<td>模式</td>
<td>CREATE SCHEMA</td>
<td>DROP SCHEMA</td>
<td>\</td>
</tr>
<tr>
<td>表</td>
<td>CREATE TABLE</td>
<td>DROP TABLE</td>
<td>ALTER TABLE</td>
</tr>
<tr>
<td>視圖</td>
<td>CREATE VIEW</td>
<td>DROP VIEW</td>
<td>\</td>
</tr>
<tr>
<td>索引</td>
<td>CREATE INDEX</td>
<td>DROP IDNEX</td>
<td>\</td>
</tr>
</table>
## 創建 / 刪除數據庫
```sql
create database 數據庫名 [其他選項\]
```
例如我們需要創建一個名為 samp\_db 的數據庫, 在命令行下執行以下命令:
```sql
create database samp_db character set gbk;
```
為了便于在命令提示符下顯示中文, 在創建時通過 character set gbk 將數據庫字符編碼指定為 gbk。
刪除數據庫:
```sql
drop database 數據庫名
```
## 創建 / 刪除 / 修改基本表
創建表
```sql
CREATE TABLE mytable (
# int 類型,不為空,自增
id INT NOT NULL AUTO_INCREMENT,
# int 類型,不可為空,默認值為 1,不為空
col1 INT NOT NULL DEFAULT 1,
# 變長字符串類型,最長為 45 個字符,可以為空
col2 VARCHAR(45) NULL,
# 日期類型,可為空
col3 DATE NULL,
# 設置主鍵為 id
PRIMARY KEY (`id`));
```
修改表:
```sql
# 添加列
ALTER TABLE mytable
ADD col CHAR(20);
```
```sql
# 表 position 修改列 test
ALTER TABLE position MODIFY test CHAR(20) NOT NULL;
```
## 建立索引
```sql
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
```
- <表名>:要建索引的基本表的名字
- <列名>:可以建立在該表的一列或多列上,各列名之間用逗號分隔
- <次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
- UNIQUE:此索引的每一個索引值只對應唯一的數據記錄
- CLUSTER:表示要建立的索引是聚簇索引
# 數據查詢
```sql
SELECT [ALL | DISTINCT] <目標列表達式> [,<目標列表達式>] …
FROM <表名或視圖名>[, <表名或視圖名> ] …
[ WHERE <條件表達式> ]
[ GROUP BY <列名1> [ HAVING <條件表達式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
```
語義:根據 WHERE 子句的條件表達式,從 FROM 子句指定的基本表或視圖中找出滿足條件的元組,再按 SELECT 子句中的目標表達式,選出元組中的屬性值形成結果表。
<br />
如果有 GROUP BY 子句,則將結果按 <列名1> 的值進行分組,該屬性列值相等的元組稱為一個組。如果 GROUP BY 子句帶 HAVING 短語,則只有滿足指定條件的組才予以輸出。
<br />
如果有 ORDER BY 子句,則結果表還要按 <列名 2> 的值的升序或降序排列。
## 單表查詢
1、選中表中的若干列
```sql
SELECT Sno,Sname FROM Student
SELECT * FROM Student
# 查詢結果的第 2 列是一個算術表達式,表中會得到2014 – Sage的值
SELECT Sname, 2014 – Sage FROM Student
# 可以通過指定別名來改變查詢結果的列標題,Sname 列名會變為 NAME
SELECT Sname NAME, 'Year of Birth': BIRTH, 2004 – Sage BIRTHDAY, LOWER(Sdept) DEPARTMENT
```
2、選中表中的若干元組(行)
(1) DISDINCT 關鍵字消除重復的行
```sql
SELECT DISTINCT Sno FROM SC # 使用 DISTINCT 關鍵字消除重復的行
```
(2) 使用 WHERE 查詢滿足條件的元組
| 查詢條件 | 謂詞 |
| :---- | :---- |
| 比較 | =,>,<=,>=,<>,!>,!< 以及 NOT + 上述比較運算符 |
| 確定范圍 | BETWEEN AND,NOT BETWEEN AND |
| 確定集合 | IN,NOT IN |
| 字符匹配 | LIKE, NOT LIKE |
| 空值 | IS NULL, IS NOT NULL |
| 多重條件(邏輯運算) | AND,OR,NOT |
```sql
# 查詢年齡在 20~23 歲(包括 20 歲和 23 歲)之間的學生的姓名、系別、年齡
SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23;
```
```sql
# IN 用于查找屬性值屬于指定集合的元組,即 Sdept 等于 'CS' 'MA' 'IS' 中的一個即可
SELECT Sname, Ssex FROM Student WHERE Sdept IN ('CS', 'MA', 'IS');
```
字符匹配:`[NOT] LIKE '<匹配串>' [ESCAPE '<換碼字符>']`
語義:查找指定的屬性列值與`<匹配串>`相匹配的元組,ESCAPE 用于對通配符的轉義,如
```sql
WHERE Cname LIKE 'DB\_Design' ESCAPE '\';
# 將 \ 定義為轉義字符,這樣匹配的就是 'DB_Design',即 '_' 失去了通配符的含義
```
有以下通配符:
`%`:代表任意長度(>=0)的字符串
`_`:代表任意單個字符
`[ ]`:匹配括號內所列字符中的一個
`[^]`:匹配不在括號內所列字符中的單個字符
> 注:數據庫字符集為 ASCII 時一個漢字需要兩個 \_,字符集為 GBK 時只需要一個
多重條件查詢,邏輯運算符 AND 和 OR 可用來聯結多個查詢條件,AND 的優先級高于 OR,但可用括號改變優先級,示例如下:
```sql
SELECT Sname FROM Student WHERE Sdept = 'CS' AND Sage < 20
```
(3) ORDER BY 子句
對查詢結果按一個或多個屬性列的升序(ASC)或降序(DESC)排列,缺省值為升序
(4) 聚集函數(系統自帶函數)
- 序言 & 更新日志
- H5
- Canvas
- 序言
- Part1-直線、矩形、多邊形
- Part2-曲線圖形
- Part3-線條操作
- Part4-文本操作
- Part5-圖像操作
- Part6-變形操作
- Part7-像素操作
- Part8-漸變與陰影
- Part9-路徑與狀態
- Part10-物理動畫
- Part11-邊界檢測
- Part12-碰撞檢測
- Part13-用戶交互
- Part14-高級動畫
- CSS
- SCSS
- codePen
- 速查表
- 面試題
- 《CSS Secrets》
- SVG
- 移動端適配
- 濾鏡(filter)的使用
- JS
- 基礎概念
- 作用域、作用域鏈、閉包
- this
- 原型與繼承
- 數組、字符串、Map、Set方法整理
- 垃圾回收機制
- DOM
- BOM
- 事件循環
- 嚴格模式
- 正則表達式
- ES6部分
- 設計模式
- AJAX
- 模塊化
- 讀冴羽博客筆記
- 第一部分總結-深入JS系列
- 第二部分總結-專題系列
- 第三部分總結-ES6系列
- 網絡請求中的數據類型
- 事件
- 表單
- 函數式編程
- Tips
- JS-Coding
- Framework
- Vue
- 書寫規范
- 基礎
- vue-router & vuex
- 深入淺出 Vue
- 響應式原理及其他
- new Vue 發生了什么
- 組件化
- 編譯流程
- Vue Router
- Vuex
- 前端路由的簡單實現
- React
- 基礎
- 書寫規范
- Redux & react-router
- immutable.js
- CSS 管理
- React 16新特性-Fiber 與 Hook
- 《深入淺出React和Redux》筆記
- 前半部分
- 后半部分
- react-transition-group
- Vue 與 React 的對比
- 工程化與架構
- Hybird
- React Native
- 新手上路
- 內置組件
- 常用插件
- 問題記錄
- Echarts
- 基礎
- Electron
- 序言
- 配置 Electron 開發環境 & 基礎概念
- React + TypeScript 仿 Antd
- TypeScript 基礎
- React + ts
- 樣式設計
- 組件測試
- 圖標解決方案
- Storybook 的使用
- Input 組件
- 在線 mock server
- 打包與發布
- Algorithm
- 排序算法及常見問題
- 劍指 offer
- 動態規劃
- DataStruct
- 概述
- 樹
- 鏈表
- Network
- Performance
- Webpack
- PWA
- Browser
- Safety
- 微信小程序
- mpvue 課程實戰記錄
- 服務器
- 操作系統基礎知識
- Linux
- Nginx
- redis
- node.js
- 基礎及原生模塊
- express框架
- node.js操作數據庫
- 《深入淺出 node.js》筆記
- 前半部分
- 后半部分
- 數據庫
- SQL
- 面試題收集
- 智力題
- 面試題精選1
- 面試題精選2
- 問答篇
- 2025面試題收集
- Other
- markdown 書寫
- Git
- LaTex 常用命令
- Bugs