SQL分类
分类 | 全称 | 解释 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户,控制数据库的访问权限 |
DDL
数据库操作
-- 查询
--查询所有数据库
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 '用户表';
查询表结构
查询建表语句
修改表
添加字段
alter table 表名 add 字段名 类型(长度)[comment 注释] [约束];
-- 在emp表增加一个新的字段“昵称”为nickname,类型为varchar(20)
alter table emp add nickname varchar(20) comment "昵称";
修改字段
1.修改数据
alter table 表名 modify 字段名 新数据类型(长度);
2.修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束]
3.修改表名
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;
删除表
1.删除表
drop table [if exists] 表名;
2.删除指定表,并重新创建该表
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) | ~ (0, 3.4028236E+38) | 单精度浮点数 |
DOUBLE | 8 字节 | ~(-1.7976931348623157E+308, …308) | ~ (0, 1.7976931348623157E+308) | 双精度浮点数 | |
DECIMAL | 可变大小 | 精确的定点数值 | 精确的定点数值 ,依赖M(精度)D(标度) | 小数值 (精确度高) |
解释:精度指整个小数的长度,标度指小数位数。
举例:age TINYINT UNSIGNED
占用字节小且不会出现负数
score DOUBLE(4,1)
一位小数,长度为4
以下是表格清晰化后的内容,用中文并使用 Markdown 格式:
字符串/文本类型数据类型概览
分类 | 类型 | 大小 | 描述 |
---|---|---|---|
字符串类型 | CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 | |
二进制类型 | TINYBLOB | 0-255 bytes | 不超过 255 个字节的二进制数据 |
TINYTEXT | 0-255 bytes | 短文本字符串 | |
BLOB | 0-65535 bytes | 二进制形式的长文本数据 | |
TEXT | 0-65535 bytes | 长文本数据 | |
MEDIUMBLOB | 0-16,777,215 bytes | 二进制形式的中等长度文本数据 | |
MEDIUMTEXT | 0-16,777,215 bytes | 中等长度的文本数据 | |
LONGBLOB | 0-4,294,967,295 bytes | 二进制形式的超长文本数据 | |
LONGTEXT | 0-4,294,967,295 bytes | 超长文本数据 |
- 字符串类型:
CHAR:定长字符串,适合长度固定的文本数据。
VARCHAR:变长字符串,适合长度可变的文本数据。
区别:char(10)
即使只有一个长度也会占用10个字节;varchar(10)
最多占用10个字节,真正占用字节数取决于长度 - 二进制类型和文本类型:
BLOB:用于存储二进制数据,例如图片或文件。
TEXT:用于存储文本数据,按长度分为TINYTEXT
、TEXT
、MEDIUMTEXT
和LONGTEXT
。
数据大小根据具体需求选择合适的类型,超长数据需要使用LONGBLOB
或LONGTEXT
。
以下是日期类型数据清晰化后的表格,用中文并使用 Markdown 格式展示:
分类 | 类型 | 大小 | 范围 | 格式 | 描述 |
---|---|---|---|---|---|
日期类型 | 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 | 记录联合日期和时间的值,用于标记时间 |
解释:
-
DATE 类型:
- 存储纯日期值(例如:生日、节假日)。
- 格式为
YYYY-MM-DD
。
-
TIME 类型:
- 用于表示时间值(时、分、秒),支持负值,适用于持续时间表示。
-
YEAR 类型:
- 用于存储年份值,适合年份相关数据(如生产年份)。
-
DATETIME 类型:
- 组合日期和时间的值,精确到秒,适用于完整的日期时间记录。
-
TIMESTAMP 类型:
- 表示自 1970 年以来的时间点,用于记录操作时间,受时区影响。
示例:
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,....);
-- 给指定字段添加数据
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 条件];
注:
1.delete语句的条件为可选项,如果没有,会删除表中的所有数据
2.delete语句不能删除某一个字段的值(可以使用update)
-- 删除gender为女的数据
delete from employee where gender = "女";
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;