1 数据库(中):DDL(数据库设计)、DML(增删改表中数据)、DQL(查询表中数据)单表基本语法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
-
- 在开始本节前先看看一个项目中哪些部分会和数据库交互?
- 一些在设计数据库表时的小tip:
- 一、DDL-数据库设计
-
- 1 操作数据库(数据库的创建、查询、修改、删除、使用)
-
- (1)数据库的查询(show)
-
- show databases; ---- 查询所有数据库名称
- show create database 数据库名称; ---- 查询某个数据库的字符集:查询某个数据库的创建语句
- (2)数据库的创建(create)
-
- create database 数据库名; ---- 创建一个数据库(如果数据库已经存在会提示错误信息)
- create database if not exists 数据库名; ---- 创建一个数据库,但是创建前会先检查数据库是否已经存在
- create database 数据库名 character set 编码类型; ---- 创建指定编码类型数据库
- create database if not exists 数据库名 character set 编码类型; ---- 创建一个指定编码方式的数据库(会先判断数据库是否已经存在)
- (3)数据库的修改(alter)
-
- alter database 数据库名称 character set 字符集类型; ---- 修改数据库的字符集
- (4)数据库的删除(drop)
-
- drop database 数据库名称; ---- 删除指定数据库(数据库不存在会报错)
- drop database if exists 数据库名称; ---- 删除指定数据库(删除前先判断数据库是否存在在删除,不会抛出错误)
- (5)数据库的使用
-
- select database(); ---- 查询当前正在使用的数据库名称
- use 数据库名称; ---- 使用指定数据库
- (6)IDEA图形界面也可以直接点击就可以创建、删除、使用数据库了(后面的表也一样)
- 2 操作表
-
- (1)表的创建
-
- SQL中的常见数据类型
-
- ---- int: 整数
- ---- double(m,n): 小数类型(m表示这个小数一共多少位,n表示小数点后面有几位)
- ---- date:日期,只包含年月日,yyyy-MM-dd
- ---- datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
- ---- timestamp: 时间戳类型,包含年月日时分秒yyyy-MM-dd HH:mm:ss
- ---- varchar(m): 变长字符串(m表示最大字符数)
- ---- char(m): 定长字符串(m表示占用的字符数),注意的是在MySQL中char是字符串喔,和Java不一样
- SQL中的数据类型(完整版)
- create table 表名(.......); ---- 创建一张表的语法
-
- ---- 无约束无注释创建一张表
- ---- 无约束有注释创建一张表
- ---- 有约束有注释创建一张表
-
- ------ 非空约束:not null
- ------ 唯一约束:unique
- ------ 主键约束:primary key(auto_increment自增)
- ------ 默认约束:default
- ------ 外键约束:foreign key
- ---- 图形化界面创建表(现在企业开发中喜欢用图形化界面创建表,但高手还是自己写代码)
- create table 表名 like 被复制的表名; --- 复制表
- (2)表的查询
-
- show tables; ---- 查询某个数据库中所有表的名字
- show create table 表名; ---- 查询某个表的字符集类型
- desc 表名;---- 查询表的结构(表的信息)
- (3)表的删除
-
- drop table 表名;
- drop table if exists 表名;
- (4)表的修改
-
- alter table 表名 rename to 新的表名;---- 修改表名
- alter table 表名 character set 字符集名称; ---- 修改表的字符集
- alter table 表名 add 列名 数据类型; ---- 添加一列
- alter table 表名 change 列名 新列名 新数据类型; ---- 修改列名称和类型
- alter table 表名 modify 列名 新数据类型; ---- 修改指定列的数据类型
- alter table 表名 drop 列名; ---- 删除列
- (5)表创建完以后怎么修改字段的约束?== 表的修改的应用
-
- 非空约束的删除、添加(表创建后)
- 唯一约束的删除、添加(表创建后)
- 主键约束的删除、添加(表创建后)
- (6)图形化界面中表的操作(在这里我们要创建一张表,后面会在这张表的基础上进行学习)
- 二、DML:增删改表中的数据
-
- 1 添加数据 (insert into ...)
-
- (1)insert into 表名(字段名1,字段名2,...) values(值1,值2,...); ---- 指定字段添加数据
- (2)insert into 表名 values(值1,值2, ...); ---- 全部字段添加数据
- (3)insert into 表名(字段名1,字段名2,...)values (值1,值2,...),(值1,值2,...); ---- 批量添加数据(指定字段)
- (4)insert into 表名 values(值1,值2,….),(值1,值2,….); ---- 批量添加数据(全部字段)
- 2 update 表名 set 字段名1 = 值1,字段名2 = 值2, ... [where 条件]; ---- 修改数据
- 3 delete from 表名 [where 条件]; ---- 删除数据
- 三、DQL:查询表中的数据
-
- 0 先来准备一张要来进行演示的表并插入数据
- 1 基本查询
-
- select 字段1,字段2,字段3 from 表名;----- 查询多个字段
- select * from 表名; ----- 查询所有字段(通配符):
- select 字段1[as 别名1],字段2[as 别名2] from 表名; ----- 设置别名:
- select distinct 字段列表 from 表名; ----- 去除重复记录:
- 2 条件查询(where):select 字段列表 from 表名 where 条件列表;
-
- 补充:SQL中的条件运算符 + 模糊查询
- 条件查询、模糊查询演示
- 3 聚合查询:
-
- (1)SQL中的聚合函数:select 聚合函数(单个字段) from 表名; (纵向聚合)
- (2)横向聚合
- 4 分组查询(group by)
- 5 排序查询(order by)
- 6 分页查询(limit)
- 四、补充知识点
-
- 1 SQL中的 if(条件表达式,true取值,false取值)
- 2 SQL中的 ifnull(表达式,true取值) 判断函数
- 3 SQL中的 case 表达式 when 值l then 结果1 when 值2 then 结果2 ... else 结果 end
- 五、案例练习
-
- 1 需求1:根据需求完成员工管理的条件分页查询
- 2 需求2:有一张成绩表如下,如何计算每个同学math+english的分数和?(其实就是横向聚合)
前言
在开始本节前先看看一个项目中哪些部分会和数据库交互?
一些在设计数据库表时的小tip:
- (1)对于一些离散型的字段,如男、女,一般不直接使用字符串,而是存一个标签,如:0-男,1-女
这么做的原因是:直接存男、女就定死了,如果用标签我们可以在外部修改映射表,更加灵活,0- boy,1-girl;就像这样,更加灵活。 - (2)对于图片、或者一些大文件数据,我们不会直接存在数据库的表中,数据库中的表中只要存其url访问路径、或者硬盘路径.
很显然这种设计很合理 - (3)对于后台管理表来说,有两个通用字段是最好加上,一个是数据创建时间,另一个是最后一次的修改时间
create_time:用来记录这条数据产生的时间,也就是插入这条记录的时间
update_time:修改时间就是,每一次对这条数据进行了修改,我都要更新这个修改的时间
一、DDL-数据库设计
DDL部分的SQL语句虽然基本都已经被图形化界面替代了,但是我们还是是要学,面试可不管这些。
1 操作数据库(数据库的创建、查询、修改、删除、使用)
- 操作数据库: CRUD
- 1.C(create):创建
- 2.R(Retrieve):查询
- 3.U(update):修改
- 4.D(Delete):删除
- 5.使用数据库
(1)数据库的查询(show)
show databases; ---- 查询所有数据库名称
其中,information schema、mysql、performance schema、sys是四个MySQL的内置数据库,这几个数据库不要动。
【注】:db01是我自己create的一个数据库,不用管。
show create database 数据库名称; ---- 查询某个数据库的字符集:查询某个数据库的创建语句
(2)数据库的创建(create)
create database 数据库名; ---- 创建一个数据库(如果数据库已经存在会提示错误信息)
【注】:可以用schema来替换database
create schema数据库名;也是创建数据库,后面看到SQL语句中schema和database是可以等价替换的。
create database if not exists 数据库名; ---- 创建一个数据库,但是创建前会先检查数据库是否已经存在
【注】:更加安全,就算存在也不会报错,也不会重复创建
create database 数据库名 character set 编码类型; ---- 创建指定编码类型数据库
MySQL中可以用SQL语句指定创建的数据库的字符类型,但是里面的表有可以修改表的字符类型,这就很奇怪了?
在 MySQL 中,数据库和表的字符集可以独立指定,这是设计上的灵活性,而非冲突或矛盾之处。以下是一些理解要点:
(1)数据库字符集:指定数据库默认使用的字符集。这意味着在这个数据库中创建的新表如果没有指定字符集,则默认使用数据库的字符集。
(2)表字符集:你可以在创建表时指定表的字符集。这允许在同一个数据库中具有不同字符集的表,以满足具体应用需求。
(3)列字符集:甚至可以为表中的各个列指定字符集,为每列提供不同的字符存储方式。
这种设计允许开发者根据数据和应用要求灵活选择合适的字符集和排序规则。例如,一个多语言应用可能需要在数据库中存储不同语言的数据,因此需要这种灵活性来处理不同的字符集。
create database if not exists 数据库名 character set 编码类型; ---- 创建一个指定编码方式的数据库(会先判断数据库是否已经存在)
(3)数据库的修改(alter)
alter database 数据库名称 character set 字符集类型; ---- 修改数据库的字符集
(4)数据库的删除(drop)
drop database 数据库名称; ---- 删除指定数据库(数据库不存在会报错)
drop database if exists 数据库名称; ---- 删除指定数据库(删除前先判断数据库是否存在在删除,不会抛出错误)
(5)数据库的使用
select database(); ---- 查询当前正在使用的数据库名称
什么数据库都没使用就是返回null
use 数据库名称; ---- 使用指定数据库
(6)IDEA图形界面也可以直接点击就可以创建、删除、使用数据库了(后面的表也一样)
这里就不演示了,那个界面很简单摸索一下。一般就是 新建–>架构(数据库schema),实在自己摸索不会,看下面这个几分钟的视频就可以了,图形化傻瓜操作
参考视频
2 操作表
(1)表的创建
SQL中的常见数据类型
参考视频
---- int: 整数
---- double(m,n): 小数类型(m表示这个小数一共多少位,n表示小数点后面有几位)
---- date:日期,只包含年月日,yyyy-MM-dd
---- datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
---- timestamp: 时间戳类型,包含年月日时分秒yyyy-MM-dd HH:mm:ss
---- varchar(m): 变长字符串(m表示最大字符数)
---- char(m): 定长字符串(m表示占用的字符数),注意的是在MySQL中char是字符串喔,和Java不一样
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
我们挑选一些常见的详细讲一下:
- 常见数据类型:
- int: 整数
— e.g. age int - double(m,n): 小数类型(m表示这个小数一共多少位,n表示小数点后面有几位)
— e.g. score double(5,2) 小数一共5位,小数点后有2位数字 - date:日期,只包含年月日,yyyy-MM-dd
- datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
- timestamp: 时间戳类型,包含年月日时分秒yyyy-MM-dd HH:mm:ss
【注】如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值 - varchar(m): 字符串(m表示最大字符数)
e.g. name varchar(20): 姓名最大20个字符
e.g. zhangsan 8个字符 张三 2个字符 - char(m):定长字符串(m表示占用的字符数),注意的是在MySQL中char是字符串喔,和Java不一样
e.g. char(2) 就可以表示两个字符,ab,男生等等
- int: 整数
【注1】:char和varchar的选择与区别
char(10): 最多只能存10个字符, 不足10个字符, 占用10个字符空间 性能高 浪费空间
varchar(10): 最多只能存10个字符,不足10个字符, 按照实际长度存储 性能低 节省空间
空间不值钱啊,以空间换时间现在是很值得的。
【注2】:
上面这些就是常用的,另外下面还有一些二进制数据类型,比如说视频、图像这些数据都是二进制数据类型,但是我们今后开发时并不会选择讲这类数据直接放在数据库中,我们只用在数据库中存这类二进制数据的磁盘路径即可,这样使用io流会更加快,不然多数据库这一层只会更加的慢。
SQL中的数据类型(完整版)
下面给出MySQL里面的详细具体有哪些数据类型(了解一下即可,真要用再查):
数值类型
类型 | 大小 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
---|---|---|---|---|
TINYINT | 1byte | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2bytes | (-32768,32767) | (0,65535) | 大整数值 |
MEDIUMINT | 3bytes | (-8388608,8388607) | (0,16777215) | 大整数值 |
INT/INTEGER | 4bytes | (-2147483648,2147483647) | (0,4294967295) | 大整数值 |
BIGINT | 8bytes | (-263,263-1) | (0,2^64-1) | 极大整数值 |
FLOAT | 4bytes | (-3.402823466 E+38,3.402823466351 E+38) | 0 和 (1.175494351 E-38,3.402823466 E+38) | 单精度浮点数值 |
DOUBLE | 8bytes | (-1.7976931348623157 E+308,1.7976931348623157 E+308) | 0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308) | 双精度浮点数值 |
DECIMAL | 依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 小数值(精确定点数) |
字符串类型
类型 | 大小 | 描述 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串(需要指定长度) |
VARCHAR | 0-65535 bytes | 变长字符串(需要指定长度) |
TINYBLOB | 0-255 bytes | 不超过255个字符的二进制数据 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 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 | 极大文本数据 |
日期时间类型
类型 | 大小 | 范围 | 格式 | 描述 |
---|---|---|---|---|
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 | 混合日期和时间值,时间戳 |
create table 表名(…); ---- 创建一张表的语法
参考视频
- 语法:
- 其中 [ ] 内的是可选择性的内容,可与加可以不加
- 约束(约束是作用在表中字段上的):就是对这个字段(列)做一些约束,例如唯一标识,添加数据要求id必须唯一这些,下面demo案例中会讲约束一共有哪些
- comment:这个后面可以加一些你对这个字段的解释说明
下面通过几个demo演示就基本知道是干什么了这里在,
---- 无约束无注释创建一张表
create table tb_user1(
id int,
username varchar(20),
name varchar(10),
age int,
gender char(1)
);
---- 无约束有注释创建一张表
create table tb_user2(
id int comment 'ID,唯一标识',
username varchar(20) comment '用户名',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) comment '性别'
) comment '用户表';
---- 有约束有注释创建一张表
------ 非空约束:not null
------ 唯一约束:unique
------ 主键约束:primary key(auto_increment自增)
------ 默认约束:default
------ 外键约束:foreign key
- 约束:
- 概念: 约束是作用于表中字段上的规则,用于限制存储在表中的数据。
- 目的: 保证数据库中数据的正确性、有效性和完整性。
- MySQL中一共给我们提供了五种字段约束
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段值不能为null | not null |
唯一约束 | 保证字段的所有数据都是唯一、不重复的(确保列中的所有值都是唯一的,但允许存在 NULL 值(唯一约束可以有NULL值,但是只能有一条记录为null)。一个表中可以有多个唯一约束。) | unique |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一(不仅要求列中的值唯一,而且不允许 NULL 值。一个表只能有一个主键约束。) | primary key(auto_increment自增) |
默认约束 | 保存数据时,如果未指定该字段值,则采用默认值 | default |
外键约束 | 让两张表的数据建立连接,保证数据的一致性和完整性 | foreign key |
这里先简单演示一下,像外键约束需要多张表后面学了多表操作才能演示。
下面我们以:
- 这张表来演示前四个约束怎么使用
- id : 采用主键约束
- username:采用非空约束+唯一约束
同一个字段可以同时指定多个约束。其实这里的 非空+唯一就已经等价与主键约束了,但是主键约束只能有一个,所以这里我们采用这个组合的写法 - name: 采用非空约束
- gender:采用默认约束,如果添加数据没有指定这个字段的值,用 “男”默认填充
create table tb_user3(
id int primary key comment 'ID,唯一标识', -- id int primary key auto_increment comment 'ID,唯一标识', 换成这个我们添加数据时就算不传id也会自动添加且自增方式
username varchar(20) not null unique comment '用户名',
name varchar(10) not null comment '姓名',
age int comment '年龄',
gender char(1) default '男' comment '性别'
) comment '用户表';
【注】:可以看到id的上面多了一个黄色小钥匙,这就是主键约束。
---- 图形化界面创建表(现在企业开发中喜欢用图形化界面创建表,但高手还是自己写代码)
参考视频,由于是图形化界面演示,所以还是直接去看视频就好了
还是很方便的,还能生成代码。
- 需求:根据下面字段设计并创建一张员工表(tb_emp)
且每个员工初始默认密码是:123456
还需要一个create_time(本条数据创建时间)和update_time(本条数据最后修改时间)
id作为唯一标识当主键是必不可少的。
create table tb_emp(
id int primary key auto_increment comment '主键ID,唯一标识',
username varchar(20) not null unique comment '用户名',
password varchar(32) default '123456' comment '密码',
name varchar(10) not null comment '姓名',
gender int not null comment '性别, 1:男 2:女', -- 1:男 2:女
image varchar(300) comment '头像的URL', -- http://www.baidu.com/a.jpg
job int comment '职位, 1:班主任 2:讲师 3:学工主管 4:教研主管',
entry_date date comment '入职日期', -- 2020-01-01 年月日
create_time datetime not null comment '创建时间', -- 2020-01-01 10:10:10 年月日时分秒
update_time datetime not null comment '更新时间' -- 2020-01-01 10:10:10 年月日时分秒
) comment '用户表';
【注】:注意到,username 、name 、gender 、create_time、update_time 这几个字段是非空,后面往里面添加数据要注意
create table 表名 like 被复制的表名; — 复制表
(2)表的查询
show tables; ---- 查询某个数据库中所有表的名字
show create table 表名; ---- 查询某个表的字符集类型
desc 表名;---- 查询表的结构(表的信息)
(3)表的删除
drop table 表名;
drop table if exists 表名;
(4)表的修改
alter table 表名 rename to 新的表名;---- 修改表名
alter table 表名 character set 字符集名称; ---- 修改表的字符集
MySQL中可以用SQL语句指定创建的数据库的字符类型,但是里面的表有可以修改表的字符类型,这就很奇怪了?
在 MySQL 中,数据库和表的字符集可以独立指定,这是设计上的灵活性,而非冲突或矛盾之处。以下是一些理解要点:
(1)数据库字符集:指定数据库默认使用的字符集。这意味着在这个数据库中创建的新表如果没有指定字符集,则默认使用数据库的字符集。
(2)表字符集:你可以在创建表时指定表的字符集。这允许在同一个数据库中具有不同字符集的表,以满足具体应用需求。
(3)列字符集:甚至可以为表中的各个列指定字符集,为每列提供不同的字符存储方式。
这种设计允许开发者根据数据和应用要求灵活选择合适的字符集和排序规则。例如,一个多语言应用可能需要在数据库中存储不同语言的数据,因此需要这种灵活性来处理不同的字符集。
alter table 表名 add 列名 数据类型; ---- 添加一列
alter table 表名 change 列名 新列名 新数据类型; ---- 修改列名称和类型
alter table 表名 modify 列名 新数据类型; ---- 修改指定列的数据类型
alter table 表名 drop 列名; ---- 删除列
(5)表创建完以后怎么修改字段的约束?== 表的修改的应用
前面学习了,创建表的时候给字段添加约束,但是如果表已经创建完成,怎么修改已有字段的约束呢?
其实这里就要用到表的修改里面 在 alter 语法了。
非空约束的删除、添加(表创建后)
-- 创建表时添加约束
create table demo_table(
id int,
name varchar