MySQL sql语言简介和DDL语句介绍
SQL 通用语法与核心操作详解
SQL 通用语法规范
SQL(Structured Query Language,结构化查询语言)是用于管理关系型数据库的标准语言,掌握其基础语法是进行数据库操作的前提。
-
语句结构:SQL 语句可单行或多行书写,每条语句必须以分号(;)结尾,分号是 SQL 语句的终止符,用于标识一条语句的结束。
-
格式规范:SQL 语句中可以自由使用空格或缩进以增强代码的可读性。合理的格式化能使复杂的 SQL 语句结构更清晰,便于维护和团队协作。
-
大小写规则:在 MySQL 数据库中,SQL 语句不区分大小写,关键字(如 SELECT、INSERT 等)建议使用大写形式,以与表名、字段名等区分开,提升代码的可读性。
-
注释方法:
- 单行注释:可使用
--
(两个减号加一个空格)或#
开头,注释内容从符号开始到本行结束。 - 多行注释:使用
/* */
包裹,/*
表示注释开始,*/
表示注释结束,可跨越多行。
- 单行注释:可使用
SQL 语言分类
SQL 语言根据功能可分为四大类:
- DDL(Data Definition Language,数据定义语言):用于定义数据库对象(数据库、表、字段等),如 CREATE、ALTER、DROP 等语句。
- DML(Data Manipulation Language,数据操纵语言):用于对数据库中的数据进行增删改操作,如 INSERT、UPDATE、DELETE 等语句。
- DQL(Data Query Language,数据查询语言):用于查询数据库中的数据,核心语句是 SELECT。
- DCL(Data Control Language,数据控制语言):用于管理数据库的权限和事务控制,如 GRANT、REVOKE、COMMIT 等语句。
DDL 语句 - 数据库操作
查询数据库
-
查看当前数据库服务器中所有的数据库:
SHOW DATABASES;
-
查看当前正在使用的数据库:
SELECT DATABASE();
创建数据库
创建数据库的基本语法:
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
参数说明:
IF NOT EXISTS
:可选参数,用于判断要创建的数据库是否已存在,若不存在则创建,避免重复创建导致的错误。DEFAULT CHARSET
:指定数据库的默认字符集,常用的有 utf8、utf8mb4 等(utf8mb4 支持 emoji 表情)。COLLATE
:指定数据库的排序规则,通常与字符集对应,如 utf8mb4_general_ci 是 utf8mb4 字符集的通用排序规则。
示例:
CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
删除数据库
删除数据库的语法:
DROP DATABASE [IF EXISTS] 数据库名;
IF EXISTS
:可选参数,用于判断数据库是否存在,若存在则删除,避免删除不存在的数据库时出错。
示例:
DROP DATABASE IF EXISTS mydb;
使用数据库
要对某个数据库进行操作,需先切换到该数据库:
USE 数据库名;
示例:
USE mydb; -- 切换到 mydb 数据库
DDL - 表操作
查询表信息
-
查看当前数据库中所有的表:
SHOW TABLES;
-
查看指定表的结构(字段信息):
DESC 表名; -- 或 DESCRIBE 表名;
-
查看指定表的创建语句(包括表结构、字符集、引擎等详细信息):
SHOW CREATE TABLE 表名;
创建表
创建表的基本语法:
CREATE TABLE 表名 (字段1 字段1类型 [约束条件] [COMMENT 字段1注释],字段2 字段2类型 [约束条件] [COMMENT 字段2注释],...字段n 字段n类型 [约束条件] [COMMENT 字段n注释]
) [ENGINE=存储引擎] [DEFAULT CHARSET=字符集] [COMMENT 表注释];
约束条件
:如 PRIMARY KEY(主键)、NOT NULL(非空)、UNIQUE(唯一)等,用于保证数据的完整性和一致性。ENGINE
:指定表的存储引擎,MySQL 常用的有 InnoDB(默认,支持事务、外键)、MyISAM 等。
示例:创建一个用户表(user)
CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID,自增主键',username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名,非空且唯一',age INT COMMENT '年龄',create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间,默认当前时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '用户信息表';
MySQL 常用数据类型详细分类介绍
MySQL 提供了丰富的数据类型,用于存储不同类型的数据。合理选择数据类型不仅能节省存储空间,还能提高查询效率和数据完整性。以下是 MySQL 中常用数据类型的详细分类介绍:
一、数值类型
数值类型用于存储数字数据,MySQL 提供了多种数值类型以满足不同的精度和范围需求。
1. 整数类型
整数类型适用于存储没有小数部分的数字,MySQL 提供了多种整数类型,主要区别在于存储范围和占用空间:
类型 | 字节数 | 有符号范围 | 无符号范围 | 说明 |
---|---|---|---|---|
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 微型整数,适合存储状态标记等小范围数值 |
SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 | 小整数,适合存储如年龄(0-120)等中等范围数值 |
MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 | 中整数,适用范围更广 |
INT | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 | 标准整数,最常用的整数类型 |
BIGINT | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 | 大整数,适合存储极大的数值如身份证号、订单号等 |
使用示例:
-- 年龄字段,使用TINYINT UNSIGNED(0-255足够)
age TINYINT UNSIGNED COMMENT '用户年龄'-- 订单ID,使用BIGINT确保足够大的范围
order_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '订单ID'
2. 小数类型
小数类型用于存储带有小数部分的数字,分为浮点型和定点型:
-
FLOAT(m, d):单精度浮点型
- m:总位数(精度),d:小数位数(标度)
- 占用4字节,精度约7位有效数字
- 示例:
FLOAT(6, 2)
可存储范围 -9999.99 ~ 9999.99
-
DOUBLE(m, d):双精度浮点型
- 占用8字节,精度约15位有效数字
- 示例:
DOUBLE(10, 4)
可存储范围 -999999.9999 ~ 999999.9999
-
DECIMAL(m, d):定点型(精确小数)
- m:总位数(165),d:小数位数(030,且d ≤ m)
- 存储精确的小数,适合财务数据(如金额)
- 示例:
DECIMAL(10, 2)
表示总共10位数字,其中2位是小数,可存储范围 -99999999.99 ~ 99999999.99
使用示例:
-- 产品价格,使用DECIMAL确保精确计算
price DECIMAL(10, 2) NOT NULL COMMENT '产品价格'-- 科学计算数据,使用DOUBLE
temperature DOUBLE(5, 2) COMMENT '温度值'
二、字符串类型
字符串类型用于存储文本数据,MySQL 提供了多种字符串类型以适应不同长度和特性的文本。
1. 短字符串类型
-
CHAR(n):固定长度字符串
- n:字符串长度(1~255)
- 存储时会用空格填充到指定长度,查询时自动去除尾部空格
- 适合存储长度固定的数据(如身份证号、手机号、性别等)
- 示例:
CHAR(11)
适合存储11位手机号
-
VARCHAR(n):可变长度字符串
- n:最大长度(0~65535)
- 仅占用实际需要的存储空间加1-2字节的长度标识
- 适合存储长度不固定的文本(如用户名、地址等)
- 示例:
VARCHAR(50)
适合存储最长50个字符的用户名
CHAR与VARCHAR对比:
- CHAR查询效率略高,VARCHAR更节省空间
- 当数据长度接近固定时,优先使用CHAR
2. 长字符串类型
当需要存储超过255个字符的文本时,可使用以下类型:
类型 | 最大长度 | 说明 |
---|---|---|
TINYTEXT | 255字节 | 微型文本,适合存储简短描述 |
TEXT | 65535字节(约64KB) | 标准文本类型,适合存储文章段落等 |
MEDIUMTEXT | 16777215字节(约16MB) | 中长文本,适合存储较长的文章、HTML内容等 |
LONGTEXT | 4294967295字节(约4GB) | 长文本,适合存储极长的文本数据如日志、大型文档等 |
使用示例:
-- 商品简介,使用TEXT
product_desc TEXT COMMENT '商品详细描述'-- 系统日志,使用LONGTEXT
system_log LONGTEXT COMMENT '系统运行日志'
3. 二进制字符串类型
用于存储二进制数据(如图片、文件等):
- BINARY(n):固定长度二进制字符串
- VARBINARY(n):可变长度二进制字符串
- TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB:对应不同长度的二进制大对象
注意:在实际开发中,通常不建议将图片、文件等大二进制数据直接存储在数据库中,而是存储文件路径,文件本身存储在文件系统中。
三、日期时间类型
日期时间类型用于存储日期和时间信息,MySQL 提供了多种类型以满足不同的时间精度需求:
类型 | 字节数 | 格式 | 范围 | 说明 |
---|---|---|---|---|
DATE | 3 | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 仅存储日期 |
TIME | 3 | HH:MM:SS | -838:59:59 ~ 838:59:59 | 仅存储时间,可表示负数(过去的时间)和超过24小时的时间 |
YEAR | 1 | YYYY | 1901 ~ 2155 | 仅存储年份 |
DATETIME | 8 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 存储日期和时间,不受时区影响 |
TIMESTAMP | 4 | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 存储日期和时间,受时区影响,可自动更新 |
使用示例:
-- 用户生日,仅需日期
birthday DATE COMMENT '用户生日'-- 订单创建时间,使用DATETIME
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '订单创建时间'-- 最后登录时间,使用TIMESTAMP自动更新
last_login_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后登录时间'
DATETIME与TIMESTAMP对比:
- DATETIME范围更大,不受时区影响,适合存储固定的日期时间(如生日)
- TIMESTAMP范围较小,受时区影响,适合存储需要随系统时区自动调整的时间(如日志时间)
四、枚举和集合类型
1. ENUM类型(枚举)
ENUM类型用于存储一个预定义集合中的单个值,适合存储状态、类型等有限选项的数据:
-- 性别字段,只能是'男'或'女'
gender ENUM('男', '女') COMMENT '性别'-- 订单状态,只能是预定义的几个状态
order_status ENUM('待支付', '已支付', '已发货', '已完成', '已取消') COMMENT '订单状态'
特点:
- 最多可包含65535个不同的成员
- 存储时使用数字索引(1开始),节省空间
- 如果插入的值不在预定义列表中,会插入一个空值(严格模式下会报错)
2. SET类型(集合)
SET类型用于存储一个预定义集合中的零个或多个值,适合存储多个可选值:
-- 兴趣爱好,可选择多个
hobby SET('读书', '运动', '音乐', '旅游', '游戏') COMMENT '兴趣爱好'
特点:
- 最多可包含64个不同的成员
- 存储时使用位运算,节省空间
- 查询时可以使用FIND_IN_SET()函数检查某个值是否存在
五、数据类型选择建议
- 最小化原则:在满足需求的前提下,选择最小的类型(如年龄用TINYINT而非INT)
- 精确性原则:财务数据使用DECIMAL而非FLOAT/DOUBLE
- 可读性原则:选择直观反映数据含义的类型(如日期用DATE而非字符串)
- 索引考虑:过长的字符串类型不适合作为索引,可考虑使用前缀索引
- 未来扩展:预留一定的扩展空间(如VARCHAR(50)足够时不要用VARCHAR(20))
合理选择数据类型是数据库设计的基础,直接影响数据库的性能、存储空间和数据完整性,开发中应根据实际业务需求仔细斟酌。
修改表结构
-
修改字段的数据类型:
ALTER TABLE 表名 MODIFY 字段名 新数据类型;
示例:将 user 表的 age 字段类型改为 SMALLINT
ALTER TABLE user MODIFY age SMALLINT;
-
修改字段名和字段类型:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [COMMENT 注释] [约束条件];
示例:将 user 表的 age 字段改名为 user_age,类型改为 TINYINT
ALTER TABLE user CHANGE age user_age TINYINT COMMENT '用户年龄';
-
添加字段:
ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件] [COMMENT 注释];
示例:向 user 表添加 email 字段
ALTER TABLE user ADD email VARCHAR(100) UNIQUE COMMENT '邮箱,唯一';
-
删除字段:
ALTER TABLE 表名 DROP 字段名;
示例:删除 user 表的 email 字段
ALTER TABLE user DROP email;
-
修改表名:
ALTER TABLE 表名 RENAME TO 新表名;
示例:将 user 表改名为 users
ALTER TABLE user RENAME TO users;
删除表
-
直接删除表:
DROP TABLE [IF EXISTS] 表名;
- 此操作会彻底删除表结构及所有数据,且不可恢复。
示例:删除 users 表
DROP TABLE IF EXISTS users;
- 此操作会彻底删除表结构及所有数据,且不可恢复。
-
清空表数据并重置自增主键:
TRUNCATE TABLE 表名;
- TRUNCATE 会删除表中所有数据,但保留表结构,同时会重置自增主键(AUTO_INCREMENT)的值为初始值。
- 与 DELETE 语句(DML)不同,TRUNCATE 是 DDL 语句,执行速度更快,且无法回滚。
示例:清空 users 表数据
TRUNCATE TABLE users;
补充:Ubuntu 系统中 MySQL 图形化工具安装
以下是在 Ubuntu 系统中安装和启动 MySQL Workbench 的完整步骤总结:
一、安装 MySQL Workbench
由于 Ubuntu 官方软件源中可能没有 mysql-workbench-community
包,推荐使用 snap 方式安装(更简单可靠):
- 打开终端,执行安装命令:
等待安装完成,终端会显示安装成功的提示。sudo snap install mysql-workbench-community
二、启动 MySQL Workbench
方法 1:通过命令行启动
-
直接使用完整路径启动:
/snap/bin/mysql-workbench-community
-
(推荐)创建简化命令(一次设置,永久使用):
sudo ln -s /snap/bin/mysql-workbench-community /usr/local/bin/mysql-workbench
之后即可直接输入以下命令启动:
snap run mysql-workbench-community
方法 2:通过图形界面启动
- 点击 Ubuntu 桌面左下角的“应用菜单”(九宫格图标)
- 在搜索框中输入“MySQL Workbench”
- 点击搜索结果中的图标即可启动
三、补充操作
-
更新 Workbench:
sudo snap refresh mysql-workbench-community
-
卸载 Workbench:
sudo snap remove mysql-workbench-community
通过以上步骤,即可在 Ubuntu 系统中完成 MySQL Workbench 的安装和启动,进行数据库可视化管理操作。