CRUD语句的关键字用大写或者小写都可以,下面统一用小写
数据库
查看有哪些数据库
show databases ; // 符号;不能省
创建
create database [if not exists ] 库名;//[ if not exists ] 是可选项,表示不存在就创建
create database 库名;
删除
drop database 库名;
drotp database if exists 库名;
使用
use 库名;
常用数据类型
整型 | 说明 | 对应java中的类型 |
BIT (M) | 二进制数,M指定位数,默认值为1。M的范围1到64,存储数据范围2^64-1。 |
常用
Boolean
对应
BIT
,此时
默认是
1
位,即只能存
0
和
1
|
INT | Integer | |
BIGINT | Long | |
浮点型 | ||
DECIMAL(M,D) |
双精度,
M
指定长度,
D
表示
小数点位数。精确数值
| BigDecimal |
字符串 | ||
CHAR(size) | 固定长度的字符串类型,不足的部分会用空格填充。 | String |
VARCHAR(size) |
可变长度字符串,只占用实际存储的数据长度,不填充空格。size为存储的最大值
| String |
TEXT | 长文本数据类型 | String |
日期类型 | 说明 | 对应java中的类型 |
DATETIME |
范围从
1000
到
9999
年,不会进行时区的
检索及转换。
|
java.util.Date
、
java.sql.Timestamp
|
TIMESTAMP
|
范围从
1970
到
2038
年,自动检索当前时
区并进行转换。
|
java.util.Date
、
java.sql.Timestamp
|
表
创建表
create table 表名 (字段名) ;
create table students ( id int, name varchar(6) comment'姓名', birthday timestamp);
//用comment关键字增加字段说明;
查看表结构
desc 表名;
Field | Type | Null | Key | Default | Extra |
字段名称 | 字段类型 | 是否允许为空 | 索引类型 | 默认值 | 扩充的属性 |
查看数据库中有哪些表
show tables;
删除表
drop table (if exists ) 表名; //删库删表的操作在实际开发中慎用
删库和删表都是是drop关键字, 后面跟table或者database,进行区分。
新增值
指定列增加
insert [into] 表名 (列名 ) values(指定字段的值),(可以添加多行);//[into] 这里表示可以省略
全列增加
insert 表名 values (各个字段的值);//全列添加的话,列名可以省略
查询
指定列查询(推荐)
select 列名 from 表名;
select id ,name ,amount, sesume from user;
全列查询
select * from user;//(不推荐使用*,建议正式开发时即使是全列查询也将每个列名单独列出来,提高查询效率,但少量数据时这样写比较方便)
select id,name,amount,sesume from user;
表达式查询
select amount +10 from user; //数字类型的字段可以这样,但这并没有对amount字段的值在硬盘中进行修改,只是短暂修改存储在内存中,因为这是查询的sql。只有delete,update,insert的sql才能修改硬盘的存储数据。
数据流向:硬盘存储的数据- >读到内存->内存中计算->返回mysql客户端显示;
别名 as
在列名的后面直接加上别名,或者在中间加上as关键字,就可以以别名的形式返回
select name [as] n from student;//[ as]这里表示可以省略
去重 distinct
用distinct关键字可以对查询到的重复结果进行去重;
select distinct 列名 from user ; //加在列名的前面,所有指定列的数据都重复时才会去重;
排序 order by
1.没有order by 排序的结果,顺序具有随机性;
2,null被认为最小值,升序在最上面,降序在最下面;
3.可以对多个字段排序,排序优先级根据书写顺序决定,
4.也可以用表达式或者别名排序。
select class_id d from student order by d desc;
asc - 升序;//默认为升序
desc -降序;
条件查询 where
符号 | 说明 |
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,不能比较NULL,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,能比较NULL ,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
between a1 and a2 | 范围匹配,[a1, a2] |
in(option,····) | 如果是option中的任何一个的则返回结果 |
is null | 为空的 |
is not null | 不为空的 |
like | 模糊查询,‘%’匹配任意字符,‘_’匹配一个字符 |
符号 | 说明 |
or | 条件满足一个就行 |
and | 条件全部满足 |
where条件可以使用表达式,但不能使用别名;
and的优先级高于or,在同时使用时,or要优先执行的部分需要使用()。
分页查询 limit
起始下标为0;
从0开始,筛选n条结果
select * from student order by id limit n;
从s开始,筛选n条结果
select * from student limit s,n ;
从s开始,筛选n条结果,表达更明确
select * from student limit n offset s;//offset表示起始位置

修改
update 表名 set 列名 =value [where ] [ order by];
update student set class_id =1 where name="bb";
删除值
delete from 表名 [where ][ limit]; //后面可以根据需求添加限制条件
数据库约束
创建表时设置对表数据的约束条件。
default
默认值约束,当某一字段为空时指定默认值
create table student (id int ,name varchar(4)default “cc”);
not null
表示字段值不能为空。
create table student (id int not null, name varchar(6));
unique
唯一的,表示该字段的值不能重复
create table student (id int unique);
primary key
主键,用来标识表中的每一条记录,标识为主键的列的数据不能为空 ,不能重复,跟身份证id一样标识一条数据。一个表只能有一个主键。
create table students (id int primary key);
等效写法:create table students( id int not null unique);
auto_increment
一般是用整数id字段作为主键,auto_increment可以使主键根据上一条记录的id值自增。
create table students(id int primary key auto_increment, name varchar(6) );
使用:
创建表插入两条数据
加了auto_increment后,当不指定id值时,id会从0自增;也可以自己指定id值,那下一条数据会根据上一条记录的id值自增。
当删除id为100和101的两条数据,再插入新数据时,id还是根据被删除的id自增。后续id自增都是根据曾经的最大值进行自增。中间的数字除非手动指定,否则就浪费了,不过int类型能表示40多亿个数,浪费一点没啥,id不会重复。
在分布式系统中,如何生成不重复的id?方法有很多,如用时间戳(ms级)+机器编号+随机因子构造出字符串,再计算hash值等方法。
foreign key
外键约束,强制关联两个表的数据完整性,确保两个表的数据一致性和有效性。
作用:
数据完整性:确保子表中的数据必须在父表中有对应记录;
查询优化:外键字段通常会自动创建索引,提升多表连接查询的性能;
业务逻辑约束:强制实现业务逻辑(如订单必须属于某一个用户)
使用:
foreign key (子表字段) references 父表(字段);//外键用于关联其他表中的主键或者唯一键。
create table class (id int primary key auto_increment,name varchar(10)); //父表
create table student (id int primary auto_increment , name varchar(5), class_id int
,foreign key (class_id) references class(id) ); //子表
class为父表,student为子表,当student中的class_id与class的id关联后,子表中只能添加父表中相应class_id的数据,父表不能删除子表中已关联的数据,相互约束。要删除父表数据就要先删除子表数据。一旦建立外键约束,后续针对子表的操作,也会频繁涉及到对父表中被关联字段的查询。对于主键或者unique约束的字段,查询效率更高,所以只关联父表的主键或unique字段。