SQL(Structured Query Language,结构化查询语言)是用于管理关系型数据库的标准语言。它不仅能够查询数据,还能定义数据结构、操作数据、管理数据库对象以及控制用户访问权限。下面从基础到高级,全面讲解 SQL 的核心概念与用法。
一、SQL 概述
1.1 什么是 SQL?
1.2 SQL 的主要分类
| 分类 |
英文全称 |
作用 |
常用命令 |
| 数据定义语言(DDL) |
Data Definition Language |
定义/修改数据库结构 |
CREATE, ALTER, DROP, TRUNCATE |
| 数据操纵语言(DML) |
Data Manipulation Language |
操作表数据(增删改) |
INSERT, UPDATE, DELETE, MERGE |
| 数据查询语言(DQL) |
Data Query Language |
查询表数据 |
SELECT |
| 数据控制语言(DCL) |
Data Control Language |
权限管理 |
GRANT, REVOKE |
| 事务控制语言(TCL) |
Transaction Control Language |
事务管理 |
BEGIN, COMMIT, ROLLBACK, SAVEPOINT |
二、数据库基础概念
-
数据库(Database):存储数据的容器,通常包含多张表。
-
表(Table):结构化数据的集合,由行和列组成。
-
列(Column):字段,定义数据的类型(INT、VARCHAR、DATE 等)。
-
行(Row):记录,表中一条完整的数据。
-
主键(Primary Key):唯一标识一行数据的列或组合列,非空且唯一。
-
外键(Foreign Key):指向另一张表主键的列,用于建立表间关联。
-
索引(Index):加速查询的数据结构,类似书的目录。
三、数据定义语言(DDL)
DDL 用于创建、修改和删除数据库对象,执行后自动提交事务(多数数据库)。
3.1 数据库操作 - -- 创建数据库
- CREATE DATABASE school CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
- -- 修改数据库字符集
- ALTER DATABASE school CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- -- 删除数据库(谨慎)
- DROP DATABASE school;
- -- 使用数据库
- USE school;
复制代码
3.2 表操作 - 创建表
- CREATE TABLE student (
- id INT AUTO_INCREMENT PRIMARY KEY COMMENT '学号',
- name VARCHAR(50) NOT NULL COMMENT '姓名',
- gender ENUM('男','女') DEFAULT '男' COMMENT '性别',
- birthday DATE COMMENT '出生日期',
- class_id INT COMMENT '班级ID',
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
- FOREIGN KEY (class_id) REFERENCES class(id)
- );
复制代码
修改表结构 - -- 添加列
- ALTER TABLE student ADD COLUMN phone VARCHAR(20) AFTER name;
- -- 修改列数据类型
- ALTER TABLE student MODIFY COLUMN phone VARCHAR(15);
- -- 修改列名
- ALTER TABLE student CHANGE COLUMN phone mobile VARCHAR(15);
- -- 删除列
- ALTER TABLE student DROP COLUMN mobile;
- -- 重命名表
- ALTER TABLE student RENAME TO student_info;
复制代码
删除表 - -- 删除表结构和数据
- DROP TABLE IF EXISTS student;
- -- 清空表数据(保留结构),不可回滚(部分数据库可)
- TRUNCATE TABLE student;
复制代码
四、数据操纵语言(DML)
DML 用于增、删、改表中的数据,通常需要显式或隐式提交事务。
4.1 插入数据 - -- 单行插入
- INSERT INTO student (name, gender, birthday, class_id)
- VALUES ('张三', '男', '2005-03-12', 1);
- -- 多行插入
- INSERT INTO student (name, gender, birthday, class_id) VALUES
- ('李四', '女', '200
复制代码 |