JavaWeb快速入门:SQL基础之DDL、DML、DQL详解

本文纲要

  1. SQL 语言分类
  2. DDL------操作数据库
  3. DDL------操作表
  4. 数据类型详解
  5. 图形化工具Navicat
  6. DML------操作数据
  7. DQL------数据查询
    7.1 基础查询
    7.2 条件查询
    7.3 模糊查询
    7.4 排序查询
    7.5 聚合函数
    7.6 分组查询
    7.7 分页查询
    7.8 综合案例与小结
  8. 总结

SQL语言分类

SQL(Structured Query Language)是操作关系型数据库的标准语言,按功能可分为以下几类:
#mermaid-svg-VXacIugIgcvobPkp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VXacIugIgcvobPkp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VXacIugIgcvobPkp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VXacIugIgcvobPkp .error-icon{fill:#552222;}#mermaid-svg-VXacIugIgcvobPkp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VXacIugIgcvobPkp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VXacIugIgcvobPkp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VXacIugIgcvobPkp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VXacIugIgcvobPkp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VXacIugIgcvobPkp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VXacIugIgcvobPkp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VXacIugIgcvobPkp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VXacIugIgcvobPkp .marker.cross{stroke:#333333;}#mermaid-svg-VXacIugIgcvobPkp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VXacIugIgcvobPkp p{margin:0;}#mermaid-svg-VXacIugIgcvobPkp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VXacIugIgcvobPkp .cluster-label text{fill:#333;}#mermaid-svg-VXacIugIgcvobPkp .cluster-label span{color:#333;}#mermaid-svg-VXacIugIgcvobPkp .cluster-label span p{background-color:transparent;}#mermaid-svg-VXacIugIgcvobPkp .label text,#mermaid-svg-VXacIugIgcvobPkp span{fill:#333;color:#333;}#mermaid-svg-VXacIugIgcvobPkp .node rect,#mermaid-svg-VXacIugIgcvobPkp .node circle,#mermaid-svg-VXacIugIgcvobPkp .node ellipse,#mermaid-svg-VXacIugIgcvobPkp .node polygon,#mermaid-svg-VXacIugIgcvobPkp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VXacIugIgcvobPkp .rough-node .label text,#mermaid-svg-VXacIugIgcvobPkp .node .label text,#mermaid-svg-VXacIugIgcvobPkp .image-shape .label,#mermaid-svg-VXacIugIgcvobPkp .icon-shape .label{text-anchor:middle;}#mermaid-svg-VXacIugIgcvobPkp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VXacIugIgcvobPkp .rough-node .label,#mermaid-svg-VXacIugIgcvobPkp .node .label,#mermaid-svg-VXacIugIgcvobPkp .image-shape .label,#mermaid-svg-VXacIugIgcvobPkp .icon-shape .label{text-align:center;}#mermaid-svg-VXacIugIgcvobPkp .node.clickable{cursor:pointer;}#mermaid-svg-VXacIugIgcvobPkp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VXacIugIgcvobPkp .arrowheadPath{fill:#333333;}#mermaid-svg-VXacIugIgcvobPkp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VXacIugIgcvobPkp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VXacIugIgcvobPkp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VXacIugIgcvobPkp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VXacIugIgcvobPkp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VXacIugIgcvobPkp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VXacIugIgcvobPkp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VXacIugIgcvobPkp .cluster text{fill:#333;}#mermaid-svg-VXacIugIgcvobPkp .cluster span{color:#333;}#mermaid-svg-VXacIugIgcvobPkp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VXacIugIgcvobPkp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VXacIugIgcvobPkp rect.text{fill:none;stroke-width:0;}#mermaid-svg-VXacIugIgcvobPkp .icon-shape,#mermaid-svg-VXacIugIgcvobPkp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VXacIugIgcvobPkp .icon-shape p,#mermaid-svg-VXacIugIgcvobPkp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VXacIugIgcvobPkp .icon-shape .label rect,#mermaid-svg-VXacIugIgcvobPkp .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VXacIugIgcvobPkp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VXacIugIgcvobPkp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VXacIugIgcvobPkp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SQL
DDL 数据定义语言
DML 数据操作语言
DQL 数据查询语言
DCL 数据控制语言
操作数据库和表
增删改表中数据
查询表中数据
权限控制等

  • DDL(Data Definition Language):定义数据库对象,如库、表、列等。
  • DML(Data Manipulation Language):对表中数据进行增、删、改。
  • DQL(Data Query Language):查询表中数据,是使用最频繁的操作。
  • DCL(Data Control Language):定义访问权限和安全级别。

本篇重点讲解 DDL、DML 和 DQL

DDL------操作数据库

DDL操作数据库主要包括查询、创建、删除和使用数据库

1 ) 查询所有数据库

sql 复制代码
# 查看当前MySQL服务中有哪些数据库 
SHOW DATABASES;

执行后会列出MySQL自带的4个系统数据库(informationschemamysqlperformanceschemasys)以及用户自建的数据库

2 ) 创建数据库

sql 复制代码
# 直接创建 
CREATE DATABASE db1;
# 判断不存在再创建(推荐)
CREATE DATABASE IF NOT EXISTS db1;

使用IF NOT EXISTS可避免因数据库已存在而报错

3 ) 删除数据库

sql 复制代码
# 直接删除 
DROP DATABASE db2;
# 判断存在再删除(推荐)
DROP DATABASE IF EXISTS db2;

IF EXISTS同样用于防止删除不存在的数据库时出错。

4 ) 使用数据库

sql 复制代码
# 切换/进入数据库 
USE db1;
# 查看当前使用的数据库 
SELECT DATABASE();

后续对表的操作都需先进入对应的数据库

DDL------操作表

对表的操作包括查询、创建、修改和删除。

1 ) 查询表

sql 复制代码
# 查询当前数据库下所有表 
SHOW TABLES;
# 查看表结构 
DESC 表名;

DESC(description)可展示表的字段、类型等信息。

2 ) 创建表

语法:

sql 复制代码
CREATE TABLE 表名 (
    字段1 数据类型,
    字段2 数据类型,
    ...
    字段n 数据类型   -- 最后一行不要加逗号 
);

示例:创建用户表 tb_user

sql 复制代码
CREATE TABLE tb_user (
    id INT,
    username VARCHAR(20),
    password VARCHAR(32)
);

示例:创建学生表 tb_stu

sql 复制代码
CREATE TABLE tb_stu (
    id INT,
    name VARCHAR(10),
    gender CHAR(1),
    birthday DATE,
    score DOUBLE(5,2),
    email VARCHAR(64),
    tel VARCHAR(20),
    status TINYINT 
);

3 ) 修改表

使用 ALTER TABLE 实现,主要操作如下:

操作 关键字 示例
修改表名 RENAME TO ALTER TABLE student RENAME TO stu;
添加列 ADD ALTER TABLE stu ADD address VARCHAR(50);
修改列类型 MODIFY ALTER TABLE stu MODIFY address CHAR(50);
修改列名和类型 CHANGE ALTER TABLE stu CHANGE address addr VARCHAR(30);
删除列 DROP ALTER TABLE stu DROP addr;

完整示例:

sql 复制代码
# 将student表改名为stu 
ALTER TABLE student RENAME TO stu;
# 给stu表添加地址列 
ALTER TABLE stu ADD address VARCHAR(50);
# 将address列的类型改为CHAR(50)
ALTER TABLE stu MODIFY address CHAR(50);
# 将address列改名为addr,并修改类型为VARCHAR(30)
ALTER TABLE stu CHANGE address addr VARCHAR(30);
# 删除addr列 
ALTER TABLE stu DROP addr;

4 ) 删除表

sql 复制代码
# 直接删除 
DROP TABLE tb_user;
# 判断存在再删除(推荐)
DROP TABLE IF EXISTS tb_user;

数据类型详解

MySQL中的数据类型主要分为三类:数值型、日期型和字符串型。

1 ) 数值型

类型 大小(字节) 说明
TINYINT 1 小整数
SMALLINT 2 小整数
MEDIUMINT 3 中等整数
INT / INTEGER 4 整数
BIGINT 8 大整数
FLOAT 4 单精度浮点数
DOUBLE 8 双精度浮点数,可指定精度 DOUBLE(总长度, 小数位数)
DECIMAL --- 定点数,以字符串形式存储,精度更高

示例:

sql 复制代码
# 年龄用INT 
age INT,
# 分数用DOUBLE,总长5位,小数2位(如100.00)
score DOUBLE(5,2)

2 ) 日期型

类型 格式 说明
DATE YYYY-MM-DD 日期
TIME HH:MM:SS 时间
YEAR YYYY 年份
DATETIME YYYY-MM-DD HH:MM:SS 日期时间
TIMESTAMP YYYY-MM-DD HH:MM:SS 时间戳,受时区影响,不推荐

示例:

sql 复制代码
birthday DATE 

3 ) 字符串型

类型 说明
CHAR(M) 定长字符串,M最大255字节,空间换时间
VARCHAR(M) 变长字符串,M最大65535字节,时间换空间
TEXT / LONGTEXT 大文本数据
BLOB / LONGBLOB 二进制大对象

CHAR vs VARCHAR

  • CHAR(10):固定占用10个字符空间,不足补空格,适合固定长度(如性别)。
  • VARCHAR(10):按实际长度占用空间,节约存储,适合长度变化的数据(如用户名)。

示例:

sql 复制代码
# 性别固定一个字符 
gender CHAR(1),
# 用户名最长10个字符 
name VARCHAR(10)

4 ) 学生表设计案例

设计一张学生表,合理选择数据类型:

sql 复制代码
CREATE TABLE student (
    id INT,                 -- 编号 
    name VARCHAR(10),       -- 姓名,最长10汉字 
    gender CHAR(1),         -- 性别,一个汉字 
    birthday DATE,          -- 生日 
    score DOUBLE(5,2),      -- 入学成绩,小数后保留两位 
    email VARCHAR(64),      -- 邮箱,最长64字符 
    tel VARCHAR(15),        -- 电话,可能含横杠等字符 
    status TINYINT          -- 状态,用数字表示 
);

图形化工具Navicat

命令行编写SQL效率较低,开发中常用图形化客户端工具,如 Navicat。它提供:

  • 可视化的数据库连接管理
  • 表结构设计器(右键"设计表"直接修改字段)
  • 查询编辑器(带语法提示、美化SQL
  • 数据导入导出等功能

安装后新建MySQL连接,填写主机、端口、用户名、密码,测试连接成功后即可使用。双击数据库即可进入,在查询窗口中编写SQL,选中执行。

建议:学习阶段依然要手写SQL,因为后续代码中需要嵌入SQL语句;工具只是辅助提效。

DML------操作数据

DML用于对表中数据进行增、删、改。

1 ) 添加数据(INSERT

语法:

sql 复制代码
# 给指定列添加数据 
INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);
# 给所有列添加数据(列名可省略,但不推荐)
INSERT INTO 表名 VALUES (值1, 值2, ...);
# 批量添加 
INSERT INTO 表名 (列1, 列2, ...) VALUES 
(值1, 值2, ...),
(值1, 值2, ...),
(值1, 值2, ...);

示例:向学生表 stu(此处为DML演示用的旧stu表,结构含id,name,sex,birthday,score等)插入数据。

sql 复制代码
-- 查询所有数据(当前为空)
SELECT * FROM stu;
-- 1. 给指定列添加数据 
INSERT INTO stu (id, name) VALUES (1, '张三');
-- 2. 给所有列添加数据(列名写全,清晰明了)
INSERT INTO stu (
    id,       -- 编号 
    name,     -- 姓名 
    sex,
    birthday,
    score,
    email,
    tel,
    status 
) VALUES (
    2,
    '李四',
    '男',
    '1999-11-11',
    88.88,
    'lisi@wb.cn',
    '13888888888',
    1 
);
-- 3. 批量添加(省略列名,仅演示,实际建议写全)
INSERT INTO stu VALUES 
(3, '李四', '男', '1999-11-11', 88.88, 'lisi@wb.cn', '13888888888', 1),
(4, '李四', '男', '1999-11-11', 88.88, 'lisi@wb.cn', '13888888888', 1),
(5, '李四', '男', '1999-11-11', 88.88, 'lisi@wb.cn', '13888888888', 1);

注意:省略列名时,VALUES 中的值必须与表结构的列顺序完全一致,且数量相同,开发中建议始终写明列名。

2 ) 修改数据(UPDATE

语法:

sql 复制代码
UPDATE 表名 SET 列1=值1, 列2=值2, ... [WHERE 条件];

示例:

sql 复制代码
# 将张三的性别改为女 
UPDATE stu SET sex = '女' WHERE name = '张三';
# 将张三的生日改为1999-12-12,分数改为99.99 
UPDATE stu SET birthday = '1999-12-12', score = 99.99 WHERE name = '张三';

致命警告:若忘记添加WHERE条件,会修改表中所有记录!

sql 复制代码
# 危险操作!会将所有学生性别改为女 
UPDATE stu SET sex = '女';

3 ) 删除数据(DELETE)

语法:

sql 复制代码
DELETE FROM 表名 [WHERE 条件];

示例:

sql 复制代码
# 删除张三的记录 
DELETE FROM stu WHERE name = '张三';
# 危险操作!不加WHERE会清空整个表 
DELETE FROM stu;

同样,删除时必须谨慎使用WHERE条件。

DQL------数据查询

DQL是使用最频繁的操作,用于从表中检索数据。

其完整语法如下:
#mermaid-svg-adFgSfbsrrJO5G7w{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-adFgSfbsrrJO5G7w .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-adFgSfbsrrJO5G7w .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-adFgSfbsrrJO5G7w .error-icon{fill:#552222;}#mermaid-svg-adFgSfbsrrJO5G7w .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-adFgSfbsrrJO5G7w .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-adFgSfbsrrJO5G7w .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-adFgSfbsrrJO5G7w .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-adFgSfbsrrJO5G7w .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-adFgSfbsrrJO5G7w .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-adFgSfbsrrJO5G7w .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-adFgSfbsrrJO5G7w .marker{fill:#333333;stroke:#333333;}#mermaid-svg-adFgSfbsrrJO5G7w .marker.cross{stroke:#333333;}#mermaid-svg-adFgSfbsrrJO5G7w svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-adFgSfbsrrJO5G7w p{margin:0;}#mermaid-svg-adFgSfbsrrJO5G7w .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-adFgSfbsrrJO5G7w .cluster-label text{fill:#333;}#mermaid-svg-adFgSfbsrrJO5G7w .cluster-label span{color:#333;}#mermaid-svg-adFgSfbsrrJO5G7w .cluster-label span p{background-color:transparent;}#mermaid-svg-adFgSfbsrrJO5G7w .label text,#mermaid-svg-adFgSfbsrrJO5G7w span{fill:#333;color:#333;}#mermaid-svg-adFgSfbsrrJO5G7w .node rect,#mermaid-svg-adFgSfbsrrJO5G7w .node circle,#mermaid-svg-adFgSfbsrrJO5G7w .node ellipse,#mermaid-svg-adFgSfbsrrJO5G7w .node polygon,#mermaid-svg-adFgSfbsrrJO5G7w .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-adFgSfbsrrJO5G7w .rough-node .label text,#mermaid-svg-adFgSfbsrrJO5G7w .node .label text,#mermaid-svg-adFgSfbsrrJO5G7w .image-shape .label,#mermaid-svg-adFgSfbsrrJO5G7w .icon-shape .label{text-anchor:middle;}#mermaid-svg-adFgSfbsrrJO5G7w .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-adFgSfbsrrJO5G7w .rough-node .label,#mermaid-svg-adFgSfbsrrJO5G7w .node .label,#mermaid-svg-adFgSfbsrrJO5G7w .image-shape .label,#mermaid-svg-adFgSfbsrrJO5G7w .icon-shape .label{text-align:center;}#mermaid-svg-adFgSfbsrrJO5G7w .node.clickable{cursor:pointer;}#mermaid-svg-adFgSfbsrrJO5G7w .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-adFgSfbsrrJO5G7w .arrowheadPath{fill:#333333;}#mermaid-svg-adFgSfbsrrJO5G7w .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-adFgSfbsrrJO5G7w .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-adFgSfbsrrJO5G7w .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-adFgSfbsrrJO5G7w .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-adFgSfbsrrJO5G7w .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-adFgSfbsrrJO5G7w .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-adFgSfbsrrJO5G7w .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-adFgSfbsrrJO5G7w .cluster text{fill:#333;}#mermaid-svg-adFgSfbsrrJO5G7w .cluster span{color:#333;}#mermaid-svg-adFgSfbsrrJO5G7w div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-adFgSfbsrrJO5G7w .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-adFgSfbsrrJO5G7w rect.text{fill:none;stroke-width:0;}#mermaid-svg-adFgSfbsrrJO5G7w .icon-shape,#mermaid-svg-adFgSfbsrrJO5G7w .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-adFgSfbsrrJO5G7w .icon-shape p,#mermaid-svg-adFgSfbsrrJO5G7w .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-adFgSfbsrrJO5G7w .icon-shape .label rect,#mermaid-svg-adFgSfbsrrJO5G7w .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-adFgSfbsrrJO5G7w .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-adFgSfbsrrJO5G7w .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-adFgSfbsrrJO5G7w :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SELECT 字段列表
FROM 表名列表
WHERE 条件列表
GROUP BY 分组字段
HAVING 分组后条件
ORDER BY 排序字段
LIMIT 分页参数

执行顺序:FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT

为演示查询,我们重新创建一张结构更丰富的 stu 表并插入8条数据:

sql 复制代码
DROP TABLE IF EXISTS stu;
CREATE TABLE stu (
    id INT,
    name VARCHAR(10),
    age INT,
    sex CHAR(1),
    address VARCHAR(20),
    math DOUBLE(5,2),
    english DOUBLE(5,2),
    hire_date DATE 
);
 
INSERT INTO stu VALUES 
(1, '马运', 20, '男', '杭州', 66, 78, '1998-09-01'),
(2, '马化腾', 25, '男', '深圳', 78, 88, '1998-09-01'),
(3, '马斯克', 57, '男', '香港', 56, 66, '1998-09-01'),
(4, '柳白', 18, '女', '湖南', 99, 99, '1999-09-01'),
(5, '柳青', 20, '女', '湖南', 76, NULL, '1999-09-01'),
(6, '刘德花', 22, '女', '香港', 99, 99, '1999-09-01'),
(7, '德玛西亚', 20, '男', '香港', 56, 65, '1999-09-01'),
(8, '赵六', 18, '男', '上海', 88, 88, '1998-09-01');

1 ) 基础查询

  1. 查询多个字段
sql 复制代码
# 查询姓名和年龄 
SELECT name, age FROM stu;
  1. 查询所有字段
sql 复制代码
# 方式1:列出所有字段(推荐)
SELECT id, name, age, sex, address, math, english, hire_date FROM stu;
# 方式2:使用 * 通配符(学习时可用,生产环境不推荐)
SELECT * FROM stu;

不推荐 * 的原因:无法直观看出查询了哪些列,不利于代码阅读和维护,也不方便添加注释。

  1. 去除重复记录
sql 复制代码
# 查询所有地址,去除重复 
SELECT DISTINCT address FROM stu;
  1. 起别名
sql 复制代码
# 使用 AS 关键字(可省略)
SELECT name AS 姓名, math AS 数学成绩, english AS 英语成绩 FROM stu;

# 省略 AS 
SELECT name 姓名, math 数学成绩, english 英语成绩 FROM stu;

2 ) 条件查询

使用 WHERE 子句过滤记录,常用运算符:

运算符 说明
>、<、>=、<=、=、<> 或 != 比较运算
BETWEEN...AND... 在某个范围之内
IN(...) 多选一
LIKE 模糊查询
IS NULL / IS NOT NULL 判断空值
AND 或 && 逻辑与
OR 或 || 逻辑或
NOT 或 ! 逻辑非

示例:

sql 复制代码
-- 1. 查询年龄大于20岁的学员 
SELECT * FROM stu WHERE age > 20;
-- 2. 查询年龄大于等于20岁的学员 
SELECT * FROM stu WHERE age >= 20;
-- 3. 查询年龄在20到30岁之间的学员 
SELECT * FROM stu WHERE age >= 20 AND age <= 30;
SELECT * FROM stu WHERE age BETWEEN 20 AND 30;   -- 简化写法 
-- 4. 查询入学日期在'1998-09-01'到'1999-09-01'之间的学员 
SELECT * FROM stu WHERE hire_date BETWEEN '1998-09-01' AND '1999-09-01';
-- 5. 查询年龄等于18岁的学员(注意:等号是一个)
SELECT * FROM stu WHERE age = 18;
-- 6. 查询年龄不等于18岁的学员 
SELECT * FROM stu WHERE age != 18;
SELECT * FROM stu WHERE age <> 18;   -- 另一种不等于 
-- 7. 查询年龄等于18、20或22岁的学员 
SELECT * FROM stu WHERE age = 18 OR age = 20 OR age = 22;
SELECT * FROM stu WHERE age IN (18, 20, 22);   -- 简化写法 
-- 8. 查询英语成绩为NULL的学员(不能用 = 或 !=)
SELECT * FROM stu WHERE english IS NULL;
-- 查询英语成绩不为NULL的学员 
SELECT * FROM stu WHERE english IS NOT NULL;

3 ) 模糊查询

使用 LIKE 配合通配符:

通配符 含义
_ 匹配单个任意字符
% 匹配0个或多个任意字符

示例:

sql 复制代码
-- 1. 查询姓'马'的学员 
SELECT * FROM stu WHERE name LIKE '马%';
-- 2. 查询第二个字是'花'的学员 
SELECT * FROM stu WHERE name LIKE '_花%';
-- 3. 查询名字中包含'德'的学员(最常用)
SELECT * FROM stu WHERE name LIKE '%德%';

4 ) 排序查询

使用 ORDER BY 子句,排序方式:

  • ASC:升序(默认)
  • DESC:降序
sql 复制代码
-- 1. 按年龄升序排列 
SELECT * FROM stu ORDER BY age ASC;
SELECT * FROM stu ORDER BY age;   -- 默认升序 
-- 2. 按数学成绩降序排列 
SELECT * FROM stu ORDER BY math DESC;
-- 3. 按数学成绩降序,若相同再按英语成绩升序 
SELECT * FROM stu ORDER BY math DESC, english ASC;

多字段排序:先按第一个字段排序,第一个字段值相同时才按第二个字段排序。

5 ) 聚合函数

将一列数据作为一个整体进行纵向计算。

函数 作用
COUNT(列) 统计数量(不包含NULL值)
MAX(列) 最大值
MIN(列) 最小值
SUM(列) 求和
AVG(列) 平均值

示例:

sql 复制代码
-- 1. 统计班级人数(一般用 COUNT(*))
SELECT COUNT(*) FROM stu;
-- 如果统计具体列,NULL值不参与计数 
SELECT COUNT(english) FROM stu;  -- 结果为7 
-- 2. 查询数学成绩最高分 
SELECT MAX(math) FROM stu;
-- 3. 查询数学成绩最低分 
SELECT MIN(math) FROM stu;
-- 4. 查询数学成绩总分 
SELECT SUM(math) FROM stu;
-- 5. 查询数学成绩平均分 
SELECT AVG(math) FROM stu;

注意:所有聚合函数都会忽略NULL值。

6 )分组查询

使用 GROUP BY 将数据分组,通常配合聚合函数进行统计。

语法:

sql 复制代码
SELECT 分组字段, 聚合函数 FROM 表名 
[WHERE 分组前条件]
GROUP BY 分组字段 
[HAVING 分组后条件];

示例:

sql 复制代码
-- 1. 查询男女同学各自的数学平均分 
SELECT sex, AVG(math) FROM stu GROUP BY sex;
注意:分组后查询的字段只能是分组字段或聚合函数,查其他字段无意义 
错误示例:SELECT name, sex, AVG(math) FROM stu GROUP BY sex;
-- 2. 查询男女同学各自的数学平均分及人数 
SELECT sex, AVG(math), COUNT(*) FROM stu GROUP BY sex;
-- 3. 查询男女数学平均分及人数,要求:分数低于70的不参与分组 
SELECT sex, AVG(math), COUNT(*) FROM stu WHERE math > 70 GROUP BY sex;
-- 4. 查询男女数学平均分及人数,要求:分数低于70不参与分组,且分组后人数大于2 
SELECT sex, AVG(math), COUNT(*) FROM stu 
WHERE math > 70 
GROUP BY sex 
HAVING COUNT(*) > 2;

WHEREHAVING 区别:

  • WHERE 在分组前过滤,不满足条件不参与分组;不能使用聚合函数
  • HAVING 在分组后过滤,可对聚合函数结果进行筛选

7 ) 分页查询

使用 LIMIT 子句限制返回的记录数,是MySQL特有的分页方式

语法:

sql 复制代码
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询条目数;
  • 起始索引从 0 开始。
  • 计算公式:起始索引 = (当前页码 - 1) × 每页条数

示例:

sql 复制代码
-- 1. 从第1条开始,查询3条数据 
SELECT * FROM stu LIMIT 0, 3;
-- 2. 每页3条,查询第1页(第1~3条)
SELECT * FROM stu LIMIT 0, 3;
-- 3. 每页3条,查询第2页(第4~6条)
SELECT * FROM stu LIMIT 3, 3;
-- 4. 每页3条,查询第3页(第7~8条,不足3条正常显示)
SELECT * FROM stu LIMIT 6, 3;

8 ) 综合案例与小结

以试题库管理系统为例,分析各查询子句的应用场景:

场景 使用的子句/关键字 SQL示例
筛选"课堂测试"的题目 WHERE WHERE use_scene = '课堂测试'
筛选多个使用场景 WHERE ... IN WHERE use_scene IN ('课堂测试','阶段考试')
筛选时间范围 WHERE ... BETWEEN WHERE input_time BETWEEN '2020-12-14' AND '2021-04-20'
搜索题干含"数组"的题目 WHERE ... LIKE WHERE stem LIKE '%数组%'
按难度排序 ORDER BY ORDER BY difficulty ASC
统计总题目数 COUNT() SELECT COUNT() FROM question
分页显示 LIMIT LIMIT 0, 15
按校区统计平均分 GROUP BY + AVG() GROUP BY campus

完整查询语法回顾:

sql 复制代码
SELECT 字段列表 
FROM 表名 
WHERE 条件 
GROUP BY 分组字段 
HAVING 分组后条件 
ORDER BY 排序字段 
LIMIT 分页参数;

总结

本文从SQL分类出发,详细讲解了 DDL(操作库和表)、DML(增删改数据)以及DQL(各种查询)的核心语法与实战案例。重点包括:

  • 数据库和表的创建、修改、删除。
  • 数据类型的选择,尤其是CHARVARCHAR的区别。
  • 插入、更新、删除数据时WHERE条件的必要性。
  • 查询语句中WHERELIKEORDER BY、聚合函数、GROUP BYLIMIT的使用。
  • 使用Navicat提升SQL编写效率。

掌握这些基础,就能应对大多数日常数据操作需求,也为后续JavaWeb开发中整合JDBCMyBatis打下扎实的SQL基础。