SQL脚本:创建表、插入数据及查询操作指南

0 次阅读

SQL数据库作为现代软件系统中存储和管理数据的重要工具,SQL脚本是数据库开发、运维以及数据分析过程中不可缺少的组成部分。通过编写SQL脚本,可以完成数据表创建、数据初始化、数据查询、数据维护等多种操作。掌握SQL脚本的基本结构和常用语句,是数据库学习和实际项目开发中的基础能力。

本文将围绕SQL脚本中的创建表、插入数据以及查询操作展开详细介绍,通过完整示例帮助开发人员理解SQL语句的执行逻辑,并掌握数据库操作的常见实践方法。

SQL脚本的基本组成

SQL脚本通常由一组按照执行顺序排列的SQL语句组成,可以保存为.sql文件,在数据库客户端或命令行工具中批量执行。

一个完整的SQL脚本通常包含以下几个部分:

  • 数据库环境准备,例如创建数据库或选择目标数据库。

  • 数据表结构定义,包括字段名称、数据类型、约束条件等。

  • 初始化数据插入,用于填充基础业务数据。

  • 数据查询语句,用于验证数据或实现业务检索。

  • 数据维护操作,例如更新和删除数据。

合理组织SQL脚本结构,可以提高数据库部署效率,也方便项目迁移和版本管理。

创建数据表(CREATE TABLE)

创建数据表是SQL脚本中最基础的操作之一。通过CREATE TABLE语句,可以定义数据存储结构。

例如创建一个用户信息表:

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    age INT,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

上述SQL语句创建了一个名为users的数据表,其中包含以下字段:

  • id:用户唯一编号,设置为主键,并自动递增。

  • username:用户名,使用VARCHAR类型保存字符串。

  • email:用户邮箱信息。

  • age:用户年龄。

  • create_time:记录创建时间,默认使用当前时间。

常见数据类型说明

不同数据库系统支持的数据类型略有差异,但常用类型基本类似。

数据类型使用场景
INT存储整数数据,例如编号、数量
BIGINT存储较大范围整数
VARCHAR存储可变长度字符串
CHAR存储固定长度字符串
DATE存储日期
DATETIME存储日期和时间
DECIMAL存储精确小数,例如金额

在设计表结构时,需要根据业务需求合理选择字段类型,避免空间浪费或数据溢出。

添加表字段约束

为了保证数据完整性,创建表时通常会增加约束条件。

常见约束包括:

主键约束(PRIMARY KEY)

主键用于唯一标识表中的每条记录。

id INT PRIMARY KEY

一个数据表通常只能存在一个主键。

非空约束(NOT NULL)

限制字段不能为空。

username VARCHAR(50) NOT NULL

例如用户名称不能为空,可以避免出现无效数据。

唯一约束(UNIQUE)

保证字段值不能重复。

email VARCHAR(100) UNIQUE

适用于账号、邮箱、身份证编号等具有唯一性的字段。

默认值约束(DEFAULT)

当插入数据时未指定字段值,可以使用默认值。

status INT DEFAULT 1

插入数据(INSERT INTO)

创建数据表后,需要通过INSERT语句向表中添加数据。

插入单条数据

例如向users表添加一条用户记录:

INSERT INTO users(username, email, age)
VALUES ('张三', 'zhangsan@example.com', 25);

执行后,数据库会新增一条用户信息。

批量插入数据

实际项目中通常需要一次插入多条数据:

INSERT INTO users(username, email, age)
VALUES
('李四', 'lisi@example.com', 30),
('王五', 'wangwu@example.com', 28),
('赵六', 'zhaoliu@example.com', 22);

批量插入相比多次执行单条INSERT语句,能够减少数据库连接次数,提高执行效率。

指定全部字段插入

也可以按照表字段顺序插入:

INSERT INTO users
VALUES
(1, '陈明', 'chenming@example.com', 26, NOW());

不过这种方式依赖字段顺序,当表结构发生变化时容易出现错误,因此实际开发中更推荐明确指定字段名称。

查询数据(SELECT)

SELECT是SQL中使用频率最高的语句,用于从数据库中读取数据。

查询全部字段

SELECT * FROM users;

该语句会返回users表中的所有数据。

在测试阶段可以使用,但生产环境通常不建议大量使用SELECT *,因为可能导致查询无用字段,影响性能。

查询指定字段

SELECT username, email
FROM users;

只返回需要的数据,可以降低数据传输量,提高查询效率。

使用WHERE条件筛选数据

WHERE用于限制查询范围。

例如查询年龄大于25岁的用户:

SELECT *
FROM users
WHERE age > 25;

多个条件可以结合AND或OR:

SELECT *
FROM users
WHERE age > 20
AND email IS NOT NULL;

常见条件运算符包括:

  • = :等于

  • <> 或 !=:不等于


  • :大于

  • <:小于

  • BETWEEN:范围查询

  • IN:指定集合查询

  • LIKE:模糊匹配

例如查询用户名包含“张”的用户:

SELECT *
FROM users
WHERE username LIKE '%张%';

数据排序(ORDER BY)

ORDER BY用于对查询结果进行排序。

按照年龄升序:

SELECT *
FROM users
ORDER BY age ASC;

按照创建时间倒序:

SELECT *
FROM users
ORDER BY create_time DESC;

其中:

  • ASC表示升序,也是默认排序方式。

  • DESC表示降序。

数据分页查询(LIMIT)

在网站列表、后台管理系统等场景中,经常需要分页显示数据。

例如查询前10条用户信息:

SELECT *
FROM users
LIMIT 10;

查询第11到20条数据:

SELECT *
FROM users
LIMIT 10 OFFSET 10;

分页查询能够避免一次加载大量数据,提高系统响应速度。

使用聚合函数统计数据

SQL提供了多种聚合函数,用于数据统计分析。

查询用户数量

SELECT COUNT(*) AS total
FROM users;

查询平均年龄

SELECT AVG(age) AS avg_age
FROM users;

查询最大年龄

SELECT MAX(age)
FROM users;

常用聚合函数包括:

  • COUNT:统计数量。

  • SUM:计算总和。

  • AVG:计算平均值。

  • MAX:获取最大值。

  • MIN:获取最小值。

分组查询(GROUP BY)

GROUP BY用于按照指定字段进行分类统计。

例如统计不同年龄段的用户数量:

SELECT age, COUNT(*) AS total
FROM users
GROUP BY age;

如果需要过滤分组结果,可以使用HAVING:

SELECT age, COUNT(*) AS total
FROM users
GROUP BY age
HAVING COUNT(*) > 2;

WHERE用于过滤原始数据,而HAVING用于过滤分组后的结果,这是两者的重要区别。

多表查询基础

实际业务系统通常包含多个数据表,例如用户表、订单表、商品表等。

假设存在订单表orders:

CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    amount DECIMAL(10,2)
);

查询用户及对应订单信息:

SELECT 
    users.username,
    orders.amount
FROM users
INNER JOIN orders
ON users.id = orders.user_id;

INNER JOIN可以连接两个相关表,并返回匹配的数据。

常见连接方式包括:

  • INNER JOIN:查询两个表中匹配的数据。

  • LEFT JOIN:保留左表全部数据。

  • RIGHT JOIN:保留右表全部数据。

  • FULL JOIN:返回两个表所有匹配和非匹配数据(部分数据库支持)。

SQL脚本执行注意事项

编写和执行SQL脚本时,需要注意以下几点:

1. 保持执行顺序合理

通常应该按照以下顺序执行:

  1. 创建数据库。

  2. 创建数据表。

  3. 添加基础数据。

  4. 执行查询验证。

  5. 创建索引和优化结构。

如果顺序错误,例如先插入数据再创建表,会导致执行失败。

2. 注意数据安全

不要直接将用户输入拼接到SQL语句中,否则可能产生SQL注入风险。

例如:

SELECT *
FROM users
WHERE username = '用户输入';

实际开发中应使用参数化查询,例如Java中的PreparedStatement、Python中的参数绑定方式。

3. 合理创建索引

对于经常用于查询条件的字段,可以建立索引:

CREATE INDEX idx_username