MySQL数据库基础(二):DDL,DML,DQL
接上篇:MySQL数据库基础(一):数据库安装和DataGrip安装
六、DDL数据库操作
1、MySQL的组成结构

注:我们平常说的MySQL,其实主要指的是MySQL数据库管理软件。
一个MySQL DBMS可以同时存放多个数据库,理论上一个项目就对应一个数据库。如博客项目blzhujianog数据库、商城项目shop数据库、微信项目wechat数据库。
一个数据库中还可以同时包含多个数据表,而数据表才是真正用于存放数据的位置。(类似我们Office软件中的Excel表格),理论上一个功能就对应一个数据表。如博客系统中的用户管理功能,就需要一个user数据表、博客中的文章就需要一个article数据表、博客中的评论就需要一个message数据表。
一个数据表又可以拆分为多个字段,每个字段就是一个属性。
一个数据表除了字段以外,还有很多行,每一行都是一条完整的数据(记录)。
2、数据库的基本操作
① 创建数据库
普及英语小课堂:
创建 => create
数据库 => database
创建 + 数据库 = create database
数据库名称(字母+数字+下划线组成,以字母开头,不能出现中文以及特殊字符)
基本语法:
特别注意:在MySQL中,当一条SQL语句编写完毕后,一定要使用分号;进行结尾,否则系统认为这条语句还没有结束。
案例:创建数据库的相关案例
扩展:编码格式,常见的gbk(中国的编码格式)与utf8(国际通用编码格式)
latin1 256个字符
国内汉字无法通过256个字符进行描述,所以国内开发了自己的编码格式gb2312,升级gbk
中国台湾业开发了一套自己的编码格式big5
很多项目并不仅仅只在本地使用,也可能支持多国语言,标准化组织开发了一套通用编码utf8,后来5.6版本以后又进行了升级utf8mb4
编写SQL语句是一个比较细致工作,不建议大家直接在终端中输入SQL语句,可以先把你要写的SQL语句写入一个记事本中,然后拷贝执行。
② 查询数据库
英语小课堂:
显示 => show
数据库 => database
显示 + 所有数据库 = show databases;
基本语法:显示所有数据库
③ 删除数据库
英语小课堂:
删除 => drop
数据库 => database
删除 + 数据库 = drop database
数据库名称; 基本语法:
案例:删除db_itheima数据库
④ 选择数据库
从数据库列表中查找需要使用的数据库
格式:
查看正在使用的数据库(8.0以后版本需要基于select查询来获取当前数据库)
3、小结
创建数据库:CREATE DATABASE 数据库名;
查看数据库:SHOW DATABASES;
删除数据库:DROP DATABASE 数据库名; 使用数据库:USE 数据库名;
七、DDL数据表操作
特别注意:创建数据表必须有一个前提,首先要明确选择某一个数据库。
1、数据表的基本操作
☆ 数据表的创建
英语小课堂:
创建 => create
数据表 => table
创建 + 数据表 = create table 数据表名称
基本语法:
案例:创建一个admin管理员表,拥有3个字段(编号、用户名称、用户密码)
use在MySQL中的含义代表选择,use 数据库名称相当于选择指定的数据库。而且use比较特殊,其选择结束后,其尾部可以不加分号;但是强烈建议所有的SQL语句都要加分号,养成一个好习惯。
tinyint :微整型,范围-128 ~ 127,无符号型,则表示0 ~ 255 表示字符串类型可以使用char与varchar,char代表固定长度的字段,varchar代表变化长度的字段。
案例:创建一个article文章表,拥有4个字段(编号、标题、作者、内容)
text :文本类型,一般情况下,用varchar存储不了的字符串信息,都建议使用text文本进行处理。
varchar存储的最大长度,理论值65535个字符。但是实际上,有几个字符是用于存放内容的长度的,所以真正可以使用的不足65535个字符,另外varchar类型存储的字符长度还和编码格式有关。1个GBK格式的占用2个字节长度,1个UTF8格式的字符占用3个字节长度。GBK = 65532~65533/2,UTF8 = 65532~65533/3
☆ 查询已创建数据表
英语小课堂:
显示 => show
数据表 => table
显示所有数据表(当前数据库)
显示数据表的创建过程(编码格式、字段等信息)
☆ 修改数据表信息
① 数据表字段添加
英语小课堂:
修改 => alter
数据表 => table
基本语法:
案例:在tb_article文章表中添加一个addtime字段,类型为date(年-月-日)
② 修改字段名称或字段类型
修改字段名称与字段类型(也可以只修改名称)
mysql> alter table tb_admin change username user varchar(40);mysql> desc tb_admin;
仅修改字段的类型
③ 删除某个字段
④ 修改数据表名称
☆ 删除数据表
英语小课堂:
删除 => drop
数据表 => table
2、字段类型详解
① 整数类型

② 浮点类型 浮点类型(精度失真情况)和定点类型(推荐使用定点类型)

decimal(10,2) :代表这个数的总长度为10 = 整数长度 + 小数长度,2代表保留2位小数
③ 日期类型

④ 文本

八、DML数据操作语言
1、DML包括哪些SQL语句
insert插入、update更新、delete删除
2、数据的增删改(重点)
英语小课堂: 增加:insert 删除:delete 修改:update
☆ 数据的增加操作
基本语法:
特别注意:在SQL语句中,除了数字,其他类型的值,都需要使用引号引起来,否则插入时会报错。
第一步:准备一个数据表
unsigned代表无符号型,只有0到正数。tinyint unsigned无符号型,范围0 ~ 255 enum枚举类型,多选一。只能从给定的值中选择一个
第二步:使用insert语句插入数据
第三步:批量插入多条数据
☆ 数据的修改操作
基本语法:
特别说明:如果在更新数据时,不指定更新条件,则其会把这个数据表的所有记录全部更新一遍。
案例:修改username='马鹏'这条记录,将其性别更新为男,家庭住址更新为广东省深圳市
案例:今年是2020年,假设到了2021年,现在存储的学员年龄都差1岁,整体进行一次更新
☆ 数据的删除操作
基本语法:
案例:删除tb_user表中,id=1的用户信息
delete from与truncate清空数据表操作
delete from与truncate区别在哪里?
delete:删除数据记录
数据操作语言(DML)
删除大量记录速度慢,只删除数据,主键自增序列不清零,100 => 新插入 => 101
可以带条件删除
truncate:删除所有数据记录
数据定义语言(DDL)
清里大量数据速度快,主键自增序列清零, 100 => 新插入 => 1
不能带条件删除
九、SQL约束
1、主键约束
1、PRIMARY KEY 约束唯一标识数据库表中的每条记录。
2、主键必须包含唯一的值。
3、主键列不能包含 NULL 值。
4、每个表都应该有一个主键,并且每个表只能有一个主键。 主键约束:要求主键这一列必须是唯一的、非空,另外一定要特别注意:一个表可以没有主键,但是如果有主键只能有且仅有一个主键。
遵循原则:
1)主键应当是对用户没有意义的(没创建一个数据表默认都应该拥有一个id字段)
2)永远也不要更新主键。
3)主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。(1-无穷大)
4) 主键应当由计算机自动生成。 创建主键约束:创建表时,在字段描述处,声明指定字段为主键

删除主键约束:如需撤销 PRIMARY KEY 约束,请使用下面的 SQL

补充:自动增长 => auto_increment,从1开始,依次递增
我们通常希望在每次插入新记录时,数据库自动生成字段的值。 我们可以在表中使用 auto_increment(自动增长列)关键字,自动增长列类型必须是整型,自动增长列必须为键(一般是主键)。
下列 SQL 语句把 "Persons" 表中的 "Id" 列定义为 auto_increment 主键
向persons添加数据时,可以不为Id字段设置值,也可以设置成null,数据库将自动维护主键值:
运行效果:

特别说明:如果某个列设置为自动增长,则这一列必须设置为主键,否则系统会报错。
2、非空约束
NOT NULL 约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。 下面的 SQL 语句强制 "id" 列和 "last_name" 列不接受 NULL 值:

3、唯一约束
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
注:虽然唯一约束与主键约束在描述上功能类似,但是其实还是很多区别的。
相同点:都可以表示唯一性,唯一标识数据表中的每一条记录(一行)
不同点:
① 插入数据的来源不同 主键大多数都是自动编号结合primary key 唯一大多数都是手工设置(不一定都是数字类型,如身份证号也可以表示唯一)
② 主键必须非空字段,但是唯一约束不要求列必须是非空的,这一列也可以出现null空值
③ 一个数据表中如果有主键,有且仅有1个主键。但是在一个数据表中可以拥有多个唯一约束 所以数据库考察中,经常会问:主键约束与唯一约束区别
主键一定满足唯一约束,但是唯一约束不一定是主键。
请注意:
每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

4、默认值约束
default 默认值
5、外键约束(了解)
外键约束(多表关联使用)
比如:有两张数据表,这两个数据表之间有联系,通过了某个字段可以建立连接,这个字段在其中一个表中是主键,在另外一张表中,我们就把其称之为外键。
6、小结
① 主键约束:唯一标示,不能重复,不能为空。
1)主键应当是对用户没有意义的,一般都叫id
2)永远也不要更新主键,自动编号
3)主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
4)主键应当由计算机自动生成,一般配合auto_increment自动增长
自动增长:
我们可以在表中使用 auto_increment(自动增长列)关键字,自动增长列类型必须是整型,自动增长列必须为键(一般是主键)。
② 非空约束:
NOT NULL 约束强制列不接受 NULL 值。
③ 唯一约束:
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
④ 默认值约束 default 默认值
⑤ 外键约束: 多表关联字段、在一个表中是主键,在另外一个表中是非主键(则这个字段一般就称之外键)
十、DQL数据查询语言
1、数据集准备
插入数据:
DataGrip软件关键字替换,可以使用Ctrl + R快捷键
2、select查询
3、简单查询
4、条件查询(where子句)

☆ 比较查询
☆ 范围查询
☆ 逻辑查询
☆ 模糊查询
☆ 非空查询
5、排序查询(order by子句)
6、聚合查询
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。 今天我们学习如下五个聚合函数:

案例演示:
7、分组查询与having子句
☆ 分组查询介绍
分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组。
分组查询基本的语法格式如下:
GROUP BY 列名 [HAVING 条件表达式] [WITH ROLLUP]
说明:
列名: 是指按照指定字段的值进行分组。
HAVING 条件表达式: 用来过滤分组后的数据。
WITH ROLLUP:在所有记录的最后加上一条记录,显示select查询时聚合函数的统计和计算结果
☆ group by的使用
group by可用于单个字段分组,也可用于多个字段分组
① group by可以实现去重操作
② group by的作用是为了实现分组统计(group by + 聚合函数)
☆ group by + 聚合函数的使用

☆ group_concat()函数
group_concat()是MySQL中自带的一个函数,这个函数主要用于分组查询中。其主要功能可以某个分组中的数据中的某列(字段)值进行concat拼接操作。 案例:统计男分组中,一共有哪些人,字段值与字段值之间使用逗号隔开。
☆ with rollup回溯统计
with rollup主要应用于group by分组中,代表对所有分组数据进行回溯统计。
但是我们希望在以上分组的基础上,在添加一行,没有分组,只有一个具体的值。这个值是以上两个分组的总记录数。
8、having的使用
having作用和where类似都是过滤数据的,但是两者之间的执行顺序不同
① where子句 ② group by子句 ③ having子句
第一种情况:如果只是简单的查询操作(没有group by的情况),大部分时间having是可以直接替代where子句
select * from product where price > 800;
以上语句等价于
select * from product having price > 800;
第二种情况:
案例演示:
9、limit子句的使用
应用场景:限制查询与分页查询
限制查询:主要限制数据查询的数量(获取数据表中的前3条数据)
select * from 数据表 limit 查询数量;
分页查询:实际特别接近,因为只要有分页的地方,底层100%都是使用limit子句实现的
分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式。例如数据共有30条,每页显示5条,第一页显示1-5条,第二页显示6-10条。
格式:
10、小结