基本概念
1.什么是数据库(database)
保存数据的容器,通常是一个或者一组文件
2.为什么使用数据库?
把数据存储在程序中无法持久化数据
把数据直接存储在自己创建的文件当中有很大缺点
- 数据量打的时候特别慢
- 无法单独对一条数据进行操作,需要全部取出来,循环操作
3.如何操作数据库?
通过一门语言专门操作数据库的语言----SQL
SQL(Structured Query Language),是一种专门用来操作数据的编程语言
Sql特点
是很多数据库管理系统例如mysql,orcale等的通用语言
简单易学,语句全都是由描述性极强的英语单词组成,且数目不多
不区分大小写,与java一样使用;作为结束符
使用--或者#添加注释
sql分类
DDL(data definition language)
操作数据库和表
DML
操作记录的增删改
DQL
操作记录的查询
DCL
操作用户的权限
TCL
操作数据的事务安全
4.数据库分类
从数据存储结构上划分
关系型数据库
行结构,以行为主,一行代表一条数据
非关系型数据库
列结构,以列为主,一列代表一列数据
字典结构,键值对存储数据
MySQL基本操作
1.安装
自行根据资料中提供的软件以及安装文档安装
2.操作
1.安装数据库管理系统(DBMS)这款软件,例如mysql
2.登录数据库软件
cmd命令 mysql -u root -p
图形化软件,例如navicat
3.输入对应操作数据库的sql
基本SQL
1.sql操作对象有哪些?
数据库(dababase)
表(table)
- 一个数据库中可以包含多张表,就像文件夹与文件的关系一样,因此真正负责保存数据的是表,但同一个库中表名字不能相同
行(row)
表中的记录,一行就代表一条记录。一张表中可以有多行,有几行就代表该表中存了几条数据,就像Excel表与行的关系一样
列(column)
列代表表中一部分数据,行由列组成,就像Excel行与单元格的关系一样
2.数据库
create database [if not exists] 数据库名;
show databases;
use 数据库名;
drop database [if exists] 数据库名;
SHOW DATABASES;#查看全部数据库
CREATE DATABASE test84; #创建数据库
USE test84;#切换数据库
DROP DATABASE test84;#删除指定数据库
3.操作数据表
创建表之前
创建表之前
学会对数据进行分列
学会指定列的数据类型
整数类型
tinyint (对应java byte)
int (对应java int)
bigint (对应java long)
字符串类型
char (对应 String)
varchar (对应 String,可变化,可变长字符串)
浮点数类型(区别,精度,大小)
float (对应 float)
double (对应double)
decimal (对应BigDecimal)
时间类型(存储要和java对应)
date (年与日)
time (时分秒)
datetime (年与日时分秒)
timestamp (时间戳)
学会给列指定长度
数据类型的长度
1. 字符型
char(n):最大长度为255个字符
varchar(n):最大长度为65535个字符(受字符编码影响)
2.整数型
tinyint: 1字节,范围-128~127
int/integer: 4字节,范围-2147483648~2147483647
bigint: 8字节,范围-9223372036854775808~9223372036854775807
3.浮点数型
float(n):4字节,n代表数字位数,总位数不超过24
double(n):8字节,n代表数字位数,总位数不超过53
decimal(m,d):m+2字节,m代表总长度,d代表小数位数,总位数不超过65
学会给列指定约束(可以添加多个约束)
1)主键
primary key
给每一条记录增加唯一标识,非空且唯一
自增 auto_increment
2)唯一
unique
3)非空
not null
4)默认值
default
学会给列添加注释
comment ' '
创建表
建表之前先建模 (建模很重要,添加约束,设计要严谨,控制数据长度,添加注释)
create table 表名(
列名 数据类型(长度) 约束条件 comment ' ',
列名 数据类型(长度) 约束条件 comment ' ',
.....
);
CREATE TABLE student(
id INT(255) AUTO_INCREMENT UNIQUE COMMENT '序号',
id_number VARCHAR(18) UNIQUE COMMENT '身份证号',
studentname VARCHAR(255) NOT NULL COMMENT '学生姓名',
age INT COMMENT '年龄',
birth DATE COMMENT '生日',
gender TINYINT(1) COMMENT '性别',
height DECIMAL(3, 2) COMMENT '身高',
score INT DEFAULT 0 COMMENT '分数', -- 假设默认分数为0,您可以根据需要修改
create_time DATETIME COMMENT '创建时间',
update_time DATETIME COMMENT '更新时间'
);
查看数据库中全部表 showtables
SHOW TABLES ;
删除表droptables表名
更新表
添加新列
alter table 表名 add 新列名 数据类型(长度)约束 comment ' '
ALTER TABLE student ADD address VARCHAR(50) COMMENT '地址' AFTER score;#插入列到score后,不写AFTER score;默认插入到最后。
删除列
alter table 表名 drop column 要删除列名;
ALTER TABLE student DROP COLUMN address; #删除address列
查看建表sql
show create table 表名;
4.数据增删改
添加记录
insert into 表名(列名1,列名2...) values(值1,值2...);
单条插入
insert into student(id_number, studentName, age, birth, gender, height, address, create_time, update_time) values ('41162520057776','鲁家见',0,'2024-08-05',0,1.8,'河南周口',now(),now());
多条插入
insert into student(id_number, studentName, age, birth, gender, height, address, create_time, update_time) values ('41162520457776','鲁家见',0,'2024-08-05',0,1.8,'河南周口',now(),now()), ('41162520057756','刘峰',0,'2024-08-05',0,1.8,'河南周口',now(),now()), ('41162520057716','工单',0,'2024-08-05',0,1.8,'河南周口',now(),now()), ('41162520057766','山湾的',0,'2024-08-05',0,1.8,'河南周口',now(),now()), ('41162520057276','小件',0,'2024-08-05',0,1.8,'河南周口',now(),now());
修改记录
update 表名 set 列名1=值1,列名2=值2 [where 条件]
修改全部数据
update student set age = 18;
根据条件修改数据
update student set studentName = '八嘎雅鹿' where id = 1;
删除记录
delete from 表名 [where 条件]
根据条件删除数据
delete from student where id > 1;
5.数据查询
简单查询
基本语法(除法查询全部否则不能使用*会降低效率)
select ... from 表名
别名
select 列名 [as] 列别名 from 表名 [as] 表别名
使用别名把下滑行转小驼峰
select create_time as createTime from student;
取别名可以省略as
select create_time createTime from student;
去重关键字
select distinct 列名 from 表名
sql中字符串拼接concat(要拼接的字段)
select distinct concat(studentName,'',age) as nameAge from student;
去重一般只针对一个字段去重
select distinct age from student;
条件查询
select ... from 表名 where 条件
关系运算符
in关键字(里面值不能超过1024)
select ... from 表名 where 列名 in(值1,值2..);
in查询(查询年龄等于0,或18)
select * from student where age in(0,18);
between关键字
select ... from 表名 where 列名 between 较小的值 and 较大的的值
查询范围时间范围常用
select * from student where age between -1 and 100;
is null关键字
is null 为空
is not null 不为空
逻辑运算符
and
or
not
取反
常与In ,between连用
not in()
select * from student where age not in (0);
not between
like关键字
_ 单个任意字符
select * from student where studentName like '鲁__';
% 多个任意字符
select * from student where studentName like '小%';
聚合函数
count
返回某列的行数
如果是count(*)使用*通配符则代表统计所有符合条件的行数,包括null
单独统计某列 count(列名),会忽略掉值为null的列
忽略掉值为null空行
- max
- min
- sum
- avg
还有大量函数.....
分组
select 分组列,聚合函数() from 表名 group by 分组 having 分组后条件
where在分组前条件过滤,不能使用聚合函数
having在分组后条件过滤,可以使用聚合函数
group by 使用查出来数据一定要构成关系型数据库要求的行列结构(常识)
group by 也可以对多列进行分组,与单列分组一样,其实就是把多个列拼接后的值相同的放进一组
排序
select ... from 表名 order by 排序列 [asc | desc](一般针对数字或者时间进行排序)
asc 升序 默认值
desc 降序
select * from emp order by id desc ;
限制结果
select ... from 表名 where .... limit 个数(取结果前几个)(限制结果必须写在最后)
分页
select ... from 表名 limit 开始行数,检索行数
select * from emp limit 0,5; select * from emp limit 5,5;