SQL语言分类详解
| 缩写 | 全称 | 说明 |
|---|---|---|
| DDL | Data Definition Language | 数据定义语言,用于定义数据库中的对象,如数据库、表、字段等结构。 |
| DML | Data Manipulation Language | 数据操作语言,用于对数据库表中的记录进行插入、删除和修改操作。 |
| DQL | Data Query Language | 数据查询语言,主要用于检索数据库表中的数据记录。 |
| DCL | Data Control Language | 数据控制语言,用于管理数据库用户权限及访问控制,例如创建用户、授予权限等。 |
DDL 操作:数据库与表的管理
在执行SQL语句时,需注意以下通用规则:
- SQL语法不区分大小写。
- 每条语句通常以分号(;)结尾。
数据库相关操作
-- 查询
--查询所有数据库
show databases;
--查询当前数据库
select database();
--创建数据库
create database [if not exists] 数据库名[defaul charset 字符集] [collate 排序规律];
--删除
drop database [if exists]数据库名;
--使用
use 数据库名;
表结构操作
查看已有数据表
--查询当前数据库所有表
show tables;
-- 查询表结构
desc 表名;
-- 查询指定表的建表语句
show create table 表名;
新建数据表
create table 表名(
字段1 字段1类型[comment 字段1注释]
字段2 字段2类型[comment 字段1注释]
字段3 字段3类型[comment 字段1注释]
.......
) [comment 表注释];
其中,comment 为可选参数,常用于添加注释信息,便于理解字段或表的用途。
create table user(
id int comment '编号',
name varchar(50) comment '姓名',
age int comment '年龄',
gender varchar(50) comment '性别'
) comment '用户表';
查看表的结构信息
获取建表所用的完整SQL语句
修改表结构
新增字段
alter table 表名 add 字段名 类型(长度)[comment 注释] [约束];
-- 在emp表增加一个新的字段“昵称”为nickname,类型为varchar(20)
alter table emp add nickname varchar(20) comment "昵称";
字段调整
- 更改字段的数据类型
- 修改字段名称及其数据类型
alter table 表名 modify 字段名 新数据类型(长度);
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束]
更改表名
alter table 表名 rename to 新表名;
--将emp表中的nickname字段修改为username,类型为varchar(30)
alter table emp nickname username varchar(30) comment '昵称';
-- 将emp表的表名修改为employee
alter table emp rename to employee;
删除表操作
- 直接删除指定表
- 删除并重新创建同名表(清空结构)
drop table [if exists] 表名;
truncate table 表名;
常用数据类型概览
整数类型
| 类型 | 存储空间 | 有符号范围 (SIGNED) | 无符号范围 (UNSIGNED) | 描述 |
|---|---|---|---|---|
| TINYINT | 1 字节 | (-128, 127) | (0, 255) | 适用于小数值场景 |
| SMALLINT | 2 字节 | (-32,768, 32,767) | (0, 65,535) | 较小的整数存储 |
| MEDIUMINT | 3 字节 | (-8,388,608, 8,388,607) | (0, 16,777,215) | 中等范围整数 |
| INT / INTEGER | 4 字节 | (-2,147,483,648, 2,147,483,647) | (0, 4,294,967,295) | 标准整型,最常用 |
| BIGINT | 8 字节 | (-2^63, 2^63-1) | (0, 2^64-1) | 大数值整型,适合超大数据 |
浮点与定点类型
| 类型 | 存储空间 | 取值范围(近似) | 特点说明 |
|---|---|---|---|
| FLOAT | 4 字节 | ~(-3.4028236E+38, 3.4028236E+38) | 单精度浮点数,适用于一般精度要求 |
| DOUBLE | 8 字节 | ~(-1.7976931348623157E+308, ...) | 双精度浮点数,更高精度计算 |
| DECIMAL | 可变长度 | 精确表示 | 高精度定点数,常用于财务计算。M代表总位数(精度),D代表小数位数(标度)。 |
示例:
age字段推荐使用 TINYINT,占用空间小且通常不会出现负数情况。
TINYINT UNSIGNED
score 若保留一位小数且最大长度为4位,则 DECIMAL(4,1) 更合适。DOUBLE(4,1)
字符串与文本类型
| 分类 | 类型 | 大小限制 | 描述 |
|---|---|---|---|
| 字符串类型 | CHAR | 0 - 255 字节 | 定长字符串,适合固定长度内容,如性别、状态码等。 |
| VARCHAR | 0 - 65535 字节 | 变长字符串,节省空间,适合长度变化较大的文本。 |
CHAR 与 VARCHAR 的差异
- CHAR 类型即使实际内容较短也会占满预设长度,例如 CHAR(10) 存 "a" 仍占10字节。
char(10)
varchar(10)
二进制与大文本类型
| 类型 | 大小范围 | 用途说明 |
|---|---|---|
| TINYBLOB | 0 - 255 字节 | 存储小型二进制数据 |
| TINYTEXT | 0 - 255 字节 | 短文本内容存储 |
| BLOB | 0 - 65,535 字节 | 较长的二进制数据,如图片、文件片段 |
| TEXT | 0 - 65,535 字节 | 普通长度文本数据 |
| MEDIUMBLOB | 0 - 16,777,215 字节 | 中等长度的二进制数据 |
| MEDIUMTEXT | 0 - 16,777,215 字节 | 中等长度文本 |
| LONGBLOB | 0 - 4,294,967,295 字节 | 超大型二进制对象 |
| LONGTEXT | 0 - 4,294,967,295 字节 | 超长文本内容存储 |
使用建议:
- BLOB 系列用于存储非文本类二进制数据,如图像、音频等。
- TEXT 系列适用于大段文字内容,根据数据量选择不同级别:
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
LONGBLOB
LONGTEXT
日期与时间类型
| 类型 | 存储大小 | 有效范围 | 格式 | 说明 |
|---|---|---|---|---|
| DATE | 3 字节 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 仅包含日期部分 |
| TIME | 3 字节 | -838:59:59 至 838:59:59 | HH:MM:SS | 表示时间间隔或具体时刻 |
| YEAR | 1 字节 | 1901 至 2155 | YYYY | 年份值存储 |
| DATETIME | 8 字节 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 日期与时间组合 |
| TIMESTAMP | 4 字节 | 1970-01-01 00:00:01 至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 时间戳,受时区影响,自动更新常见于日志场景 |
用于记录联合的日期与时间值,适用于标记具体的时间点。
DATETIME 类型:将日期和时间组合存储,精度可达秒级,适合需要完整时间戳的场景。
TIMESTAMP 类型:表示自 1970 年 1 月 1 日以来的时间戳,常用于记录操作发生的具体时间,受时区设置影响。
DATE 类型:仅用于保存日期信息(如生日、节假日等),不包含时间部分。其标准格式为:
YYYY-MM-DD
TIME 类型:专门用来表示时间值(小时、分钟、秒),支持负数,可用于持续时间的计算。
YEAR 类型:用于存储年份数据,适用于记录与年相关的字段,例如设备生产年份或作品发布年份。
示例展示如下:
create table emp(
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(10) comment '姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
sno char(18) comment '身份证号',
time date comment '入职时间'
) comment '员工表';
输入数据后生成的表结构如下所示:
DML(数据操作语言)
插入数据
向指定字段插入单条记录:
insert into 表名 (字段1,字段2,....) values(值1,值2,....);
向所有字段插入完整记录:
insert into 表名 values(值1,值2,值3,....);
批量插入多条数据:
inset into 表名 (字段名1,字段名2,....) values (值1,值2,值3,...) (值1,值2,值3,....);
insert into 表名 values(值1,值2,值3,....),(值1,值2,值3,....);
SQL 示例语句:
– 向指定字段插入数据 insert into employee(id,workno,name,gender,age,sno,time) values (1,'1','hong','女',19,123456789123456789,'2024-12-16'); – 查询表中全部数据 SELECT * from employee; – 插入完整字段的数据 insert into employee values (2,'2','kang','男',20,123456789456789123,'2025-05-06'); – 批量添加多条记录 insert into employee values (3,'3','tong','女',20,123456789456723123,'2025-05-06'), (4,'4','miaomiao','女',20,145456789456789123,'2024-05-06');
更新数据
修改现有记录中的字段值:
update 表名 set 字段名1 = 值1,字段2 = 值2,....[where 条件]
注意:WHERE 条件是可选的。若省略该条件,则会更新表中所有行的数据。
-- 修改id为1的数据,将name改为'rora'
update employee set name = 'rora' where id = 1;
-- 修改id为4的数据,将age改为23
update employee set age = 23 where id = 4;
-- 修改所有数据,将日期改为2020-06-16
update employee set time = '2020-06-16';
删除数据
从表中移除指定或全部记录:
delete from 表名 [where 条件];
说明:
- DELETE 语句中的 WHERE 条件为可选项;如未指定,则清空整张表的数据。
- 无法通过 DELETE 删除某一字段的值;如需清空字段内容,应使用 UPDATE 语句处理。
-- 删除gender为女的数据
delete from employee where gender = "女";
DQL(数据查询语言)
DQL 主要用于查询数据库表中的记录,核心关键字为 SELECT。
基本语法结构:
- SELECT:指定要查询的字段列表
- FROM:指定数据来源的表名
- WHERE:设定筛选条件
- GROUP BY:按指定字段进行分组
- HAVING:对分组后的结果进行条件过滤
- ORDER BY:定义排序规则
- LIMIT:实现分页功能
常见查询类型:
- 基础字段查询
- 条件筛选查询(使用 WHERE)
- 聚合函数查询(如 count, max, min, avg, sum)
- 分组统计查询(GROUP BY)
- 排序查询(ORDER BY)
- 分页查询(LIMIT)
具体应用示例:
1. 查询多个字段的数据:
select 字段1,字段2,字段3...from 表名;
select * from 表名;
2. 使用别名显示查询结果:
select 字段1[as 别名],字段2[as 别名2]...from 表名;
3. 去除查询结果中的重复项:
select distinct 字段列表 from 表名;
重新创建 emp 表并导入测试数据:
CREATE TABLE emp (
id INT COMMENT '编号',
workno VARCHAR(10) COMMENT '工号',
name VARCHAR(10) COMMENT '姓名',
gender CHAR(1) COMMENT '性别',
age TINYINT UNSIGNED COMMENT '年龄',
idcard CHAR(18) COMMENT '身份证号',
workaddress VARCHAR(50) COMMENT '工作地址',
entrydate DATE COMMENT '入职时间'
) COMMENT '员工表';
完成数据录入后的效果:
-- 查询指定字段 name,workno,age,返回
select name,workno,age from emp;
-- 查询所有字段
select * from emp;
select id,workno,name,gender,age,idcard,workaddress,entrydate from emp;
-- 查询所有员工工作地址,起别名
select workaddress as '工作地址' from emp;
-- 查询员工地址,去重
select distinct workaddress from emp;

雷达卡


京公网安备 11010802022788号







