创建表 (CREATE TABLE)
创建表是SQL数据库操作的基础。表是数据库中存储数据的主要对象,由行和列组成。
基本语法
CREATE TABLE 表名(
列名1 数据类型 [约束条件],
列名2 数据类型 [约束条件],
...
列名n 数据类型 [约束条件]
);
常用数据类型
INT - 整数
FLOAT/DOUBLE - 浮点数
CHAR(n) - 固定长度字符串,最多n个字符
VARCHAR(n) - 可变长度字符串,最多n个字符
DATE - 日期值 (YYYY-MM-DD)
TIME - 时间值 (HH:MM:SS)
DATETIME - 日期和时间的组合
常用约束条件
PRIMARY KEY - 主键约束,标识表中的唯一记录
FOREIGN KEY - 外键约束,用于建立表之间的关系
NOT NULL - 列不能包含NULL值
UNIQUE - 列中的所有值必须不同
DEFAULT 值 - 为列设置默认值
CHECK(条件) - 指定列必须满足的条件
示例
CREATE TABLE Students(
StudentID INT PRIMARY KEY,
StudentName VARCHAR(50) NOT NULL,
Age INT CHECK(Age > 0),
Gender CHAR(1),
Department VARCHAR(50),
EnrollmentDate DATE DEFAULT CURRENT_DATE
);
数据操作 (DML - Data Manipulation Language)
数据操作语言用于向数据库添加、修改和删除数据。
INSERT - 插入数据
-- 插入完整行
INSERT INTO 表名 VALUES (值1, 值2, ..., 值n);
-- 插入指定列
INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n);
示例
-- 插入单行数据
INSERT INTO Students VALUES (1001, '张三', 20, 'M', '计算机系', '2022-09-01');
-- 插入多行数据
INSERT INTO Students (StudentID, StudentName, Department) VALUES
(1002, '李四', '数学系'),
(1003, '王五', '物理系');
UPDATE - 更新数据
UPDATE 表名 SET 列1 = 值1, 列2 = 值2, ... WHERE 条件;
示例
-- 更新单个学生的信息
UPDATE Students SET Age = 21, Department = '信息管理系' WHERE StudentID = 1001;
-- 更新多个学生的信息
UPDATE Students SET EnrollmentDate = '2022-09-05' WHERE Department = '计算机系';
DELETE - 删除数据
DELETE FROM 表名 WHERE 条件;
示例
-- 删除指定学生
DELETE FROM Students WHERE StudentID = 1003;
-- 删除满足条件的所有记录
DELETE FROM Students WHERE EnrollmentDate < '2022-01-01';
注意: 如果在DELETE或UPDATE语句中省略WHERE子句,该操作将影响表中的所有记录!
数据查询 (SELECT)
SELECT语句是SQL中最常用的命令,用于从一个或多个表中检索数据。
基本语法
SELECT 列1, 列2, ... FROM 表名 WHERE 条件;
常用子句
WHERE - 指定检索条件
ORDER BY - 对结果排序
GROUP BY - 对数据分组
HAVING - 对分组结果进行筛选
LIMIT - 限制返回的行数
基本查询示例
-- 选择所有列
SELECT * FROM Students;
-- 选择特定列
SELECT StudentID, StudentName, Department FROM Students;
-- 使用WHERE子句过滤
SELECT * FROM Students WHERE Age > 20;
-- 使用ORDER BY排序
SELECT * FROM Students ORDER BY Age DESC, StudentName ASC;
高级查询功能
聚合函数
-- 计算学生平均年龄
SELECT AVG(Age) AS AverageAge FROM Students;
-- 统计每个系的学生人数
SELECT Department, COUNT(*) AS StudentCount
FROM Students
GROUP BY Department;
连接查询
-- 内连接
SELECT s.StudentName, c.CourseName, e.Grade
FROM Students s
INNER JOIN Enrollments e ON s.StudentID = e.StudentID
INNER JOIN Courses c ON e.CourseID = c.CourseID;
-- 左连接
SELECT s.StudentName, c.CourseName
FROM Students s
LEFT JOIN Enrollments e ON s.StudentID = e.StudentID
LEFT JOIN Courses c ON e.CourseID = c.CourseID;
子查询
-- 查找年龄高于平均年龄的学生
SELECT * FROM Students
WHERE Age > (SELECT AVG(Age) FROM Students);
-- 查找至少选修了一门课程的学生
SELECT * FROM Students
WHERE StudentID IN (SELECT DISTINCT StudentID FROM Enrollments);