本文纲要
SQL语言分类DDL------操作数据库DDL------操作表- 数据类型详解
- 图形化工具
Navicat DML------操作数据DQL------数据查询
7.1 基础查询
7.2 条件查询
7.3 模糊查询
7.4 排序查询
7.5 聚合函数
7.6 分组查询
7.7 分页查询
7.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个系统数据库(informationschema、mysql、performanceschema、sys)以及用户自建的数据库
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 分页参数
执行顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。
为演示查询,我们重新创建一张结构更丰富的 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 ) 基础查询
- 查询多个字段
sql
# 查询姓名和年龄
SELECT name, age FROM stu;
- 查询所有字段
sql
# 方式1:列出所有字段(推荐)
SELECT id, name, age, sex, address, math, english, hire_date FROM stu;
# 方式2:使用 * 通配符(学习时可用,生产环境不推荐)
SELECT * FROM stu;
不推荐 * 的原因:无法直观看出查询了哪些列,不利于代码阅读和维护,也不方便添加注释。
- 去除重复记录
sql
# 查询所有地址,去除重复
SELECT DISTINCT address FROM stu;
- 起别名
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;
WHERE 与 HAVING 区别:
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(各种查询)的核心语法与实战案例。重点包括:
- 数据库和表的创建、修改、删除。
- 数据类型的选择,尤其是
CHAR与VARCHAR的区别。 - 插入、更新、删除数据时
WHERE条件的必要性。 - 查询语句中
WHERE、LIKE、ORDER BY、聚合函数、GROUP BY、LIMIT的使用。 - 使用Navicat提升SQL编写效率。
掌握这些基础,就能应对大多数日常数据操作需求,也为后续JavaWeb开发中整合JDBC或MyBatis打下扎实的SQL基础。