一、数据库简介
数据库是一类软件,其作用就是更加高效的组织数据,我们要讲的数据库软件是MySQL,MySQL所使用的是sql语句,SQL语句就是专门操作数据库的编程语言
数据库组织形式为:数据库→表→行→列
每一个数据库里面包含若干个表,每个表里包含若干个列
二、数据库操作
1. 显示所有数据库:
show databases;
2. 创建数据库
create database [if not exists] 数据库名 [character set utf8mb4][collate utf8mb4_general_ci];
中括号中的内容为可选项:
- if not exists:加上这句话后,如果创建的数据库名已经有了,就不再创建这个数据库
- character set utf8mb4:指定字符集为 utf8mb4
- collate utf8mb4_general_ci:字符集 utf8mb4 的校对规则,ci表示大小写不敏感,这意味着在比较字符串时,大小写字母视为相同
3. 选中数据库
use 数据库名;
4. 删除数据库
drop database [if exists] 数据库名;
当该数据库存在时,将其删除
三、常用数据类型
数据类型 | 大小 | 说明 | 对应Java类型 |
int | 4字节 | Integer | |
tinyint | 1字节 | Byte | |
smallint | 2字节 | Short | |
bigint | 8字节 | Long | |
decimal(M,D) | M与D的最大值+ 2 | 双精度,M指定位数,D表示小数点后有保留几位 | BigDecimal |
varchar(size) | 0~65535个字节 | size的单位为字符,表示字符串的最大字符数 | String |
text | 0~65535个字节 | 长文本数据,长度自适应,依赖自动扩容 | String |
datetime | 8字节 | 日期类型 | java.util.Date |
- decimal(3, 2),12.34→不合法,12.3→不合法,2.34→合法
- varchar(6),hello→合法,abcdef→合法,abcdefghi→不合法
四、表的操作
每个数据库里都包含若干个表,因此在操作表之前,要先选中数据库
use 数据库名;
1. 查看表的结构
desc 表名;
2. 创建表
注意要先选中数据库,创建表语法示例:
create table 表名 (
字段 类型,
字段 类型,
字段 类型
);
可以使用 comment 增加字段说明
create table t_student (
id int,
name varchar(20) comment '姓名',
password varchar(50) comment '密码',
age int
);
3. 删除表
drop table [if exists] 表名;
如果指定的表存在,则将其删除
五、表的增删查改
首先创建一个学生表,为后续讲解提供一个示例表
use test_db; //选中数据库 test_db
drop database if exists t_student;
create table t_student (
id int,
sn int comment '学号',
name varchar(20) comment '姓名',
qq_mail varchar(20) comment 'QQ邮箱'
);
5.1 新增
1. 单行数据+全列插入
insert into t_student values (100, 10000, '唐三藏', '22222');
insert into t_student values (101, 10001, '孙悟空', '11111');
2. 多行数据+指定列插入
INSERT INTO student (id, sn, name) VALUES
(102, 20001, '曹孟德'),
(103, 20002, '孙仲谋');
5.2 查询
注意:查询某个表之前,都要先选定数据库
use test_db;
首先创建一个表,以便后续演示
use test_db;
drop table if exists exam_result;
create table exam_result (
id int,
name varchar(20),
chinese decimal(3,1),
math decimal(3,1),
english decimal(3,1)
);
-- 插入测试数据
insert into exam_result (id, name, chinese, math, english) values
(1,'唐三藏', 67, 98, 56),
(2,'孙悟空', 87.5, 78, 77),
(3,'猪悟能', 88, 98.5, 90),
(4,'曹孟德', 82, 84, 67),
(5,'刘玄德', 55.5, 85, 45),
(6,'孙权', 70, 73, 78.5),
(7,'宋公明', 75, 65, 30);
5.2.1 全列查询
select * from 表名;
5.2.2 指定列查询
select 字段, 字段,..., 字段 from 表名
5.2.3 指定查询字段为表达式
-- 表达式不包含字段
select id, name, 10 from exam_result;
-- 表达式包含一个字段
select id, name, english + 10 from exam_result;
-- 表达式包含多个字段
select id, name, chinese + math + english from exam_result;
5.2.4 别名
将查询结果的列指定别名
select id, name, chinese + math + english [as] 总分 from exam_result;
as 可以加也可以不加
5.2.5 去重:distinct
先查询数学成绩:
select math from exam_result;
98重复了,加上distinct:
select distinct math from exam_result;
注意:distinct可以用在一个或多个列上,当用在多个列时,只有这些列的组合完全相同才会进行去重,比如对名字和数学成绩去重,只有名字和数学成绩都相同时才会去重
5.2.6 排序:order by
不加order by 的查询,其返回结果都是未知的;
- 对NULL数据排序视为比任何数据都小,如果为升序,则排在最前面,如果为降序,则排在最后面
asc→升序,不加则默认为asc;desc→降序
select name, qq_mail from t_student order by qq_mail;
select name, qq_mail from t_student order by qq_mail desc;
- 使用表达式及别名排序
select name, chinese + english + math total from exam_result
order by total DESC;
5.2.7 条件查询:where
运算符 | 说明 |
>,>=,<,<= | |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=,<> | 不等于 |
between a0 and a1 | 如果 a0 <= value <= a1,返回 TRUE(1) |
in(option, …) | 如果是 option 中的任意一个,返回 TRUE(1) |
like | % 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
is null | 查询某一列为 NULL 的数据 |
is not null | 查询某一列不为 NULL 的数据 |
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 查询某一列不为...的数据 |
注意:
1. where 条件可以使用表达式,但不能使用别名
2. and 优先级高于 or,必要时可以使用小括号
- in
select name, english from exam_result where english in (56, 77, 30, 99);
- 模糊查询:like
-- % 匹配任意多个(包括 0 个)字符
select name from exam_result where name like '孙%';-- 匹配到孙悟空、孙权
-- _ 匹配严格的一个任意字符
select name from exam_result where name like '孙_';-- 匹配到孙权
5.2.8 分页查询
语法:
-- 起始下标为 0
-- 从 0 开始,筛选 n 条结果
select ... from table_name [where ...] [order by ...] limit n;
-- 从 s 开始,筛选 n 条结果
select ... from table_name [where ...] [order by ...] limit s, n;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
select ... from table_name [where ...] [order by ...] limit n offset s;
按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页
-- 第 1 页
select id, name, math, english, chinese from exam_result order by id limit 3
offset 0;
-- 第 2 页
select id, name, math, english, chinese from exam_result order by id limit 3
offset 3;
-- 第 3 页,如果结果不足 3 个,不会有影响
select id, name, math, english, chinese from exam_result order by id limit 3
offset 6;
5.3 修改
update 表名 set 字段 = expr [, 字段 = expr ...]
[where ...] [order by ...] [limit...]
1. 将孙悟空的数学成绩改为80
update exam_result set math = 80 where name = '孙悟空';
2. 将总成绩倒数前三的 3 位同学的数学成绩减 30 分
update exam_result set math = math - 30
order by chinese + math + english limit 3;
5.4 删除
delete from 表名 [where ...] [order by ...] [limit ...]
1. 删除整个表
delete from exam_result
2. 删除孙悟空的成绩
delete from exam_result where name = '孙悟空';
🙉本篇文章到此结束