数据类型:
- 数值:注意数值类型范围
- 日期时间
- 字符串
终端操作:
- 登录数据库服务器:
mysql -uusername -ppassword
- 退出登录:
exit;
- 查看数据服务器里面有的数据库:
show databases;
- 创建数据库:
create database [数据库名];
- 删除数据库
drop database [数据库名];
- 选中要操作的数据库:
use [数据库名];
- 查看数据库中的表:
show tables;
- 创建表:
create table [表名] ([字段名] 字段类型(字段值长度) , [字段名] [ 字段类型 [(字段值长度)] ]);
- 查看表的信息,表结构,字段信息等
describe [表名];
desc [表名];
- 删除表
drop table [表名];
- 增加数据:
insert into [表名] [(字段表)] values([字段值表]);
- 删除数据:
delete from [表名] where [字段名]=[字段值];
- 修改数据:
update [表名] set [字段名]=[字段值];
- 查询数据:
select * from [表名] [where [字段名]=[字段值]];
查询特定字段
select [字段名] from [表名];
查询特定字段排重
select distinct [字段名] from [表名];
与查询
select * from [表名] where [字段名] between [值1] and [值2];
select * from [表名] where [字段名] > [值1] and [字段名] < [值2];
或查询
select * from [表名] where [字段名] in([值1],[值2],[值3]);
select * from [表名] where [字段名1]=[值1] or [字段名2]=[值2];
排序
#升序
select * from [表名] order by [字段名] asc;
#降序
select * from [表名] order by [字段名] desc;
统计个数
select count(*) from [表名] where [字段名]=[字段值];
获取最大最小值
select [字段名] from [表名] where [字段名]=(select max([字段名]) from [表名]);
#最大max
#最小min
分组取平均值
select avg([字段名]) from [表名] group by [字段名];
分组
group by [字段名];
模糊查询
like 'a%'
not like 'a%'
多表查询
select [表1.字段],[表2.字段] from [表名1],[表名2] where [从表.外键]=[主表.被关联字段];
取并集
union
至少,任意一个
any
所有
all
别名
as
sql的连接查询
- 内连接:查询两张表相关的数据
inner join
或者join
select * from [表1] inner join [表2] on [表1.字段1]=[表2.字段2];
- 外连接
- 左连接:
left join
或者left outer join
select * from [表1] left join [表2] on [表1.字段1]=[表2.字段2];
- 右连接:
right join
或者right outer join
select * from [表1] right join [表2] on [表1.字段1]=[表2.字段2];
- 完全外连接:
full join
或者full outer join
MySQL不支持full join
可以用左连接 union 右连接
代替
select * from [表1] full join [表2] on [表1.字段1]=[表2.字段2];
MySQL约束
- 创建表的时候添加约束(注意联合约束)
alter table [表名] add [约束]( [字段名] );
alter table [表名] modify [字段名] [字段类型] [约束];
- 删除使用
alter table [表名] drop ...;
- 主键约束
唯一确定表中的一条记录,不重复且不能为空。
create tsble [表名](
id int primary key,
name varchar(20)
);
联合主键
create tsble [表名](
id int,
name varchar(20),
password varchar(20),
primary key(id,name)
);
注意:联合主键只要多个主键不同时重复也可以。
如果建表的时候忘记设置主键
alter table [表名] add primary key([字段名]);
删除主键
alter table [表名] drop primary key;
通过修改字段的方式添加主键
alter table [表名] modify [字段名] [字段类型] primary key;
- 自增约束
create table [表名](
id int primary key auto_increment;
name varchar(20)
);
设置为自增约束的字段可以不传值,配合主键使用。
- 唯一约束
约束字段值不可重复
create table [表名](
id int unique,
name varchar(20)
);
注意:下面这种方式同时设置多个字段时是联合的,不能同时重复
create table [表名](
id int,
name varchar(20),
unique(id,name)
);
alter table [表名] add unique([字段名]);
alter table [表名] modify [字段名] [字段类型] unique;
删除唯一约束
alter table [表名] drop index [字段名];
- 非空约束
修饰的字段不能为空
create table [表名](
id int,
name varchar(20) not null
);
- 默认约束
添加字段的时候没有传值就使用默认值
create table [表名](
id int,
name varchar(20),
age int default 18
);
- 外键约束
涉及联合表:主表,从表
create table classes(
id int primary key,
name varchar(20)
);
create table students(
id int primary key,
name varchar(20),
class_id int,
foreign key(class_id) references classes(id)
);
主表中没有的数据值,在从表里是不能用的;
主表中被从表引用的数据不能被删除。
数据库设计的三大范式
- 第一范式:数据表中的所有字段都是不可分割的原子值;
拆分的越细越容易操作,但不一定都是好处。 - 第二范式:满足第一范式的前提下,除主键的每个字段都必须完全依赖于主键;
如果出现不完全依赖,只可能发生在联合主键的情况下。这时候就要拆表。 - 第三范式:满足第二范式的前提下,除主键外其他字段不能有传递依赖。
MySQL事务
不可分割的最小工作单元,保证一个业务的完整性。
MySQL默认开启事务(自动提交)
select @@autocommit;
结果
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
关闭自动提交
set autocommit=0;
关闭自动提交后可以回滚,提交的话需要手动提交
事务的四大特征:
- A 原子性:事务是最小单位,不可分割;
- C 一致性:同一事务中的sql 语句,必须同时成功或者同时失败;
- I 隔离性:事务1和事务2之间是具有隔离性的;
- D 持久性:事务一旦结束,就不可返回。
事务开启
- 自动开启
- 手动开启
begin;
#或者
start transaction;
事务提交
- 自动提交
- 手动提交
commit;
事务回滚
rollback;
事务的隔离级别
-
read uncommitted;
:读未提交的(脏读) -
read committed;
:读已经提交的(不可重复读,前后不一致) -
repeatable read;
:(默认的)可以重复读(幻读) -
serializable
:串行化(性能差)
- 查看隔离级别
#MySQL 8.0 以上
select @@global.transaction_isolation;#系统级别
select @@transaction_isolation;#会话级别
#MySQL 8.0 以下
select @@global.tx_isolation;#系统级别
select @@tx_isolation;#会话级别
- 修改隔离级别
#MySQL 8.0 以上
set global.transaction_isolation level [隔离级别];#系统级别
set transaction_isolation level [隔离级别];#会话级别
#MySQL 8.0 以下
set global.tx_isolation level [隔离级别];#系统级别
set tx_isolation level [隔离级别];#会话级别