DDL 数据定义语言:简称DDL(Data Definition Language)
用来定义数据库对象:数据库,表,列等
关键字:create,alter,drop
搭建数据存储的框架,如管理数据库、管理数据表、管理字段
1、数据库的基本操作
① 创建数据库
创建 + 数据库 = create database 数据库名称(字母+数字+下划线组成,以字母开头,不能出现中文以及特殊字符)
mysql>create database 数据库名称[设置编码格式];案例 创建db_itheima库 create database db_itheima;创建db1库并指定默认字符集 create database db_itheima default charset gbk;create databaseifnot exists db_itheima default charactersetutf8;说明:不能创建相同名字的数据库 如果存在不报错(if not exists)扩展:编码格式,常见的gbk(中国的编码格式)与utf8(国际通用编码格式)
latin1:这是早期的字符编码格式,支持256个字符,适用于基本的西方语言字符集。
gb2312/gbk:由于latin1的字符集无法表示汉字,中国开发了自己的编码格式gb2312,后来升级为gbk,以支持更多汉字和扩展字符集。
big5:中国台湾也开发了一套用于表示繁体中文的字符编码格式,称为big5,适用于繁体中文字符集。
utf8:为了支持多语言环境,国际标准化组织开发了utf8编码,能够表示几乎所有已知语言的字符。由于早期版本的utf8不完全支持某些特殊符号和表情符号,MySQL5.6版本以后推出了utf8mb4,用于支持更多字符(如Emoji表情),每个字符最多使用4个字节。
② 查询数据库
显示 + 所有数据库 = show databases;
③ 删除数据库
删除 + 数据库 = drop database 数据库名称;
④ 选择数据库
从数据库列表中查找需要使用的数据库
mysql> use db_itheima;
查看正在使用的数据库(8.0以后版本需要基于select查询来获取当前数据库)
mysql> select database();
小结
创建数据库:CREATE DATABASE 数据库名;
查看数据库:SHOW DATABASES;
删除数据库:DROP DATABASE 数据库名; – 慎重
使用数据库:USE 数据库名;
DDL数据表操作
DDL要学4个关键字:create(创建)、drop(删除)、alter(修改)、show(查询)
特别注意:创建数据表必须有一个前提,首先要明确选择某一个数据库。
1、数据表的基本操作
1、数据表的创建
创建 + 数据表 = create table 数据表名称
PowerShell mysql> create table 数据表名称( 字段1 字段类型 [字段约束], 字段2 字段类型 [字段约束], ... ); 常用字段类型 整数:int(-21亿 ~ 21亿) 浮点:decimal(M,N),M代表整数长度 + 小数总长度,N代表小数点后保留几位小数,decimal(5,2) => 999.99 字符串类型:固定长度用char(M),变化长度用varchar(M) => M代表最大字符数 枚举类型:enum('男','女'),插入值要么为男,要么为女 案例:创建一个admin管理员表,拥有3个字段(编号、用户名称、用户密码) mysql> create database db_itheima; mysql> use db_itheima; mysql> create table tb_admin( id tinyint, username varchar(20), password char(32) ) engine=innodb default charset=utf8; tinyint :微整型,范围-128 ~ 127,无符号型,则表示0 ~ 255 表示字符串类型可以使用char与varchar,char代表固定长度的字段,varchar代表变化长度的字段 案例:创建一个article文章表,拥有4个字段(编号、标题、作者、内容) mysql> use db_itheima; mysql> create table tb_article( id int, title varchar(50), author varchar(20), content text ) engine=innodb default charset=utf8; text :文本类型,一般情况下,用varchar存储不了的字符串信息,都建议使用text文本进行处理。 varchar存储的最大长度,理论值65535个字符。但是实际上,有几个字符是用于存放内容的长度的,所以真正可以使用的不足65535个字符,另外varchar类型存储的字符长度还和编码格式有关。1个GBK格式的占用2个字节长度,1个UTF8格式的字符占用3个字节长度。GBK = 65532~65533/2,UTF8 = 65532~65533/32、查询已创建数据表
显示所有数据表(当前数据库)
mysql>use 数据库名称;mysql>show tables;显示数据表的创建过程(编码格式、字段等信息) mysql>desc 数据表名称;mysql>show create table 数据表名称;# 查询建表语句3、修改数据表信息(多写)
① 数据表字段添加
基本语法: alter table 数据表名称 add 新字段名称 字段类型 first;
mysql>altertable数据表名称add新字段名称 字段类型first; mysql>altertable数据表名称add新字段名称 字段类型after其他字段名称;选项说明:first:把新添加字段放在第一位after字段名称:把新添加字段放在指定字段的后面 案例:在tb_article文章表中添加一个addtime字段,类型为date(年-月-日)日期类型有两个:date(年-月-日)、time(小时:分钟:秒)、datetime(年-月-日 小时:分钟:秒) mysql>altertabletb_articleaddaddtimedateaftercontent;mysql>desctb_article;② 修改字段名称或字段类型
修改字段名称与字段类型(也可以只修改名称)
mysql>altertabletb_admin change username namevarchar(40);mysql>desctb_admin;说明: change比较神奇,既可以修改字段名称,又可以修改字段类型! change 源字段名称 修改后字段名称 修改后的字段类型(这个也可以不改,但是必须要写) 仅修改字段的类型 mysql>altertabletb_adminmodifynamevarchar(20);mysql>desctb_admin;说明:modify字段名称 新字段类型(仅可以修改字段类型)③ 删除某个字段
mysql>altertabletb_articledrop字段名称;mysql>desctb_article;④ 修改数据表名称
renametable旧名称to新名称;4、删除数据表
droptable数据表名称;扩展:查看数据库 与 数据表对应的编码格式-- 查看数据库编码格式showcreatedatabase数据库名称;-- 查看数据表编码格式showcreatetable数据表名称;showcreatedatabasedb_itheima;showcreatetabletb_article;2、字段类型详解(重点)
整数int、浮点数decimal、字符串char/varchar/text、枚举类型enum、日期时间类型date、time、datetime
类型 英文读音 中文近似注音 作用
int /ɪnt/ 因特 整数
decimal /ˈdesɪml/ 戴西莫 精确小数(金额)
char /tʃɑː®/ 查 定长字符串
varchar /ˈvɑːkɑː®/ 瓦卡 变长字符串
text /tekst/ 泰克斯特 大文本
enum /ɪˈnjuːm/ 伊纽姆 枚举单选
date /deɪt/ 德特 仅日期(年月日)
time /taɪm/ 泰姆 仅时间(时分秒)
datetime /ˌdeɪtˈtaɪm/ 德特泰姆 日期 + 时间
① 整数类型
分类 类型名称 说明
tinyint 很小的整数 -128 ~ 127
smallint 小的整数 -32768 ~ 32767
mediumint 中等大小的整数 -8388608 ~ 8388607
int(integer) 普通大小的整数 -2147483648 ~ 2147483647
create table tb_student(idint, name varchar(20), age tinyint unsigned)defaultcharset=utf8;unsigned 无符号的意思 SQL优化手段:尽量选择满足这个字段范围区间的数据类型!!!② 浮点类型(小数类型)
浮点类型(精度失真情况)和定点类型(推荐使用定点类型)
分类 类型名称
float 单精度浮点数
double 双精度浮点数
decimal(m,d) 定点数,decimal(10,2)
decimal(10,2) :代表这个数的总长度为10 = 整数长度 + 小数长度,2代表保留2位小数
decimal(5,2) :999.99
建议:① 精度要求不高(2-4位小数的情况,影响不大),可以使用float/double
② 如果精度要求比较高的情况,可以使用decimal
create table tb_product(idint, name varchar(100), price decimal(11,2))defaultcharset=utf8;③ 日期类型
份额里 类型名称
year YYYY 1901~2155
time HH:MM:SS -838:59:59~838:59:59
date YYYY-MM-DD 1000-01-01~9999-12-3
datetime YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59
timestamp YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC~2038-01-19 03:14:07UTC
选日期类型看格式,用的最多的是 => date、datetime
date:年-月-日
time:小时:分钟:秒数
datetime = date + time合并
create table tb_news(idint, title varchar(100), addtime datetime)defaultcharset=utf8;④ 文本(字符串类型)
类型名称 说明
char(m) m为0~255之间的整数定长(固定长度),m代表字符长度,255代表不能超过255个字符
varchar(m) m为0~65535之间的整数变长(变化长度),65535代表字节长度,和编码有关,utf8最多2万多个汉字
text 允许长度0~65535字节
mediumtext 允许长度0~167772150字节
longtext (扩展) 允许长度0~4294967295字节
选择文本,主要长度,固定char、变化varchar、还长的就是text。
varchar(m):理论值65535个字符,但是理论上底层最大能存储的字节数也是65535。但是如果是汉字,和编码格式有关,gbk模式下,1个汉字2个字节,理论上大概能3万左右个汉字。utf8模式下,1个汉字3个字节,理论值就是2万多个汉字。
普通:enum(‘值1’,‘值2’,‘值3’),多选一,从多个值中选择其中的某一个!!!
3、字段约束详解(重点)
字段约束:在数据类型的基础上,给字段添加约束行为(如不能为空等等)
基本语法:
create table 数据表名称(字段名称 字段类型[可选,字段约束])defaultcharset=utf8mb4;在MySQL中,字段约束一共有五种约束:① 主键约束 ② 唯一约束 ③ 非空约束 ④ 默认值约束 ⑤ 外键约束
1、主键约束
强调:非空、唯一、一个表中有且仅有1个主键,在MySQL中,往往id字段都是主键(primary keyarticle)文章表(id主键,title标题,author作者,addtime发布时间)
use db_itheima;create table article(idint primary key,# /ˈpraɪmeri/主要的title varchar(80), author varchar(20), addtimedate)defaultcharset=utf8mb4;或 create table article(idint, title varchar(80), author varchar(20), addtime date, primary key(id))defaultcharset=utf8mb4;-- 向表中插入数据 insert into article values(1,'MySQL数据库运维','张三','2025-02-10');-- 主键强制为null(错误演示) insert into article values(null,'Python运维开发','李四','2025-02-10');-- 主键强制重复(错误演示) insert into article values(1,'Python运维开发','李四','2025-02-10');2、唯一约束
强调:唯一,可以为空,一个表中可以同时拥有多个唯一约束
unique
主键约束 与 唯一约束区别?
和主键约束相同点:都是唯一的
和主键约束不同点:主键非空、有且仅有1个;唯一可以为空,在一个表中也可以同时拥有多个空值
案例:创建一个用户表,id主键,name,age,code(身份证号码,要求唯一)
create table users(idint primary key, name varchar(20), age tinyint unsigned, code char(18)unique)defaultcharset=utf8;-- 插入数据 insert intousersvalues(1,'张三',18,'123456789012345678');-- 插入重复数据(错误演示) insert intousersvalues(2,'李四',18,'123456789012345678');-- 插入数据,但是唯一列为null insert intousersvalues(2,'王五',18, null);3、非空约束
强调:非空,这个列不允许出现null空值
not null
案例:创建一个商品表goods,有id主键,name商品名称,price商品价格,name和price都必须为非空!
create table goods(idint primary key, name varchar(80)not null, price decimal(11,2)not null)defaultcharset=utf8mb4;-- 插入数据 insert into goods values(1,'Python从入门到放弃',99.99);-- 插入数据(错误演示) insert into goods values(2,'Java从入门到放弃', null);4、默认值约束
强调:默认值,插入数据时,如果没有指定对应的值,则其自动使用默认值做为最终结果
default 默认值
案例:创建一个用户表users,id主键、name用户名、age年龄、gender性别,要求gender默认值为male
drop tableusers;create table users(idint primary key, name varchar(20), age tinyint unsigned, gender enum('male','female')default'male')defaultcharset=utf8mb4;descusers;-- 插入数据 insert intousersvalues(1,'张三',18,'male');-- 插入数据(触发默认值) insert into users(id, name, age)values(2,'李四',18);insert intousersvalues(3,'王五',18, default);-- 插入数据(不使用默认值) insert intousersvalues(4,'赵六',18,'female');5、外键约束(了解)
强调:多表,级联操作
外键约束前提:① 多表 ② 数据表引擎必须为InnoDB引擎
小结:
MySQL语句中,一共有5种:(主键约束、唯一约束、非空约束、默认值约束、外键约束)
-- 产品类别表 CREATE TABLE product_category(cid INT PRIMARY KEY AUTO_INCREMENT COMMENT'分类主键', cname VARCHAR(50)NOT NULL COMMENT'分类名称', remark VARCHAR(200)COMMENT'分类备注')ENGINE=InnoDB DEFAULTCHARSET=utf8mb4;-- 产品表 CREATE TABLE product(pid INT PRIMARY KEY AUTO_INCREMENT COMMENT'产品主键', pname VARCHAR(100)NOT NULL COMMENT'产品名称', price DECIMAL(10,2)NOT NULL COMMENT'产品价格', stock INT DEFAULT0COMMENT'库存', cid INT COMMENT'所属分类id', -- 定义外键:product.cid 关联 product_category.cid FOREIGN KEY fk_product_category(cid)REFERENCES product_category(cid)ON DELETE CASCADE -- 级联删除:分类删掉,该分类下所有产品一起删 ON UPDATE CASCADE -- 级联更新:分类cid修改,产品里cid同步更新)ENGINE=InnoDB DEFAULTCHARSET=utf8mb4;4、auto_increment自动增长(重点)
作用:自动增长,往往用于设置主键,可以让其值自动增长,默认从1开始,依次递增。
drop tableusers;create table users(idint auto_increment primary key, name varchar(20), age tinyint unsigned, gender enum('male','female')default'male')defaultcharset=utf8mb4;insert intousersvalues(null,'张三',23,'male');insert intousersvalues(null,'李四',24,'male');delete fromuserswhereid=2;insert intousersvalues(null,'王五',25,'male');5、小结
主键约束和自动增长列: primary key 唯一+非空 auto_increment 确保行数据不重复的列,主键列唯一且不为空
唯一约束:unique 唯一 限定某个字段的值不能重复,但是允许null只重复
非空约束:not null 非空 限定某个字段的值不能为空(null),但是允许空字符串
外键约束:foreign key 表和表之间的关系 指的是主表中和从表的主键对应的哪个字段(从表的外键和主表的主键产生关联) 每个表中可以包含多个外键,外键是跨表引用其他表的主键,被引用为主表,外键表为子表