?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 語言進行數據庫操作和數據分析。