SQL语句
MySQL中的注释
-- mysql中的注释
操作数据库
查看所有数据库
show databases;
切换数据库
use 数据库名;
查看当前数据库下所有表
show tables;
创建数据库
create database 数据库名;
删除数据库
drop database 数据库名;
操作数据表
创建数据表
create table 表名(
字段名 数据类型 [字段特征],
字段名 数据类型 [字段特征],
.
.
.
字段名 数据类型 [字段特征]
)
删除数据表
drop table 表名;
修改数据表
-- 对表重命名
alter table 旧表名 rename to 新表名;
-- 添加新字段
alter table 表名 add column 字段名 数据类型 字段特征;
-- 修改字段
alter table 表名 change 旧字段名 新字段名 数据类型 字段特征;
-- 删除字段
alter table 表名 drop 字段名;
添加约束
-- 添加非空约束
alter table 表名 change 旧字段名 新字段名 数据类型 not null;
-- 添加主键约束
alter table 表名 add primary key(字段名);
-- 添加唯一约束
alter table 表名 add unique(字段名);
-- 添加默认值约束
alter table 表名 alter 字段名 set default '默认值';
-- 添加外键约束
alter table 从表表名 add foreign key(从表外键字段) references 主表(主表主键字段)
操作数据
数据添加
insert into 表名[(字段1,字段2...)] values
('值1','值2',...),
('值1','值2',...),
...
('值1','值2',...)
数据修改
update 表名 set 字段1='值',字段2='值' where 条件
数据删除
delete from 表名 where 条件
-- 或
truncate table 表名
数据查询
select 字段名1,字段名2... from 表名 where 条件
函数
select 函数名(字段名) from 表名
聚合函数名 | 作用 |
count(字段名) | 统计数量 |
sum(字段名) | 求和 |
avg(字段名) | 平均 |
max(字段名) | 最大 |
min(字段名) | 最小 |
数学相关函数名 | 作用 |
abs(字段名) | 绝对值 |
pow(字段名) | 次幂 |
sqrt(字段名) | 开平方 |
round(字段名) | 四舍五入 |
ceil(字段名) | 向上取整 |
floor(字段名) | 向下取整 |
字符串相关函数名 | 作用 |
length(字符串) | 得字符串长度 |
trim(字符串) / ltrim(字符串) / rtrim(字符串) | 去除字符串首尾/首/尾空格 |
left(字符串,n) / right(字符串,n) | 从字符串左/右开始截取n个字符 |
substr(字符串,start) | 从start开始截取至末尾 |
substr(字符串,start,length) | 从start开始截取length个字符 |
lcase(字符串) / ucase(字符串) | 转换小写/大写 |
instr(字符串1,字符串2) / locate(字符串2,字符串1) | 得到字符串2在字符串1中出现的顺序 |
reverse(字符串) | 翻转字符串 |
concat(字符串1,字符串2...) | 拼接字符串 |
replace(字符串,旧字符串,新字符串) | 将字符串中的旧字符串替换为新字符串 |
时间相关函数名 | 作用 |
now() | 当前日期时间 |
current_date() / curdate() | 当前日期 |
current_time() / curtime() | 当前时间 |
year(日期) / month(日期) / day(日期) | 得到年/月/日部分 |
datediff(时间1,时间2) | 计算时间1与时间2相隔的天数 |
timediff(时间1,时间2) | 计算时间1与时间2相隔的时分秒 |
TIMESTAMPDIFF(时间单位,时间1,时间2) | 计算时间1与时间2相隔的指定时间单位 |
分组
select 分组字段,统计函数 from 表名 group by 分组字段 having 统计函数所需满足的条件
连接查询
交叉连接
select * from 表1,表2;
select * from 表1 cross join 表2;
select * from 表1 inner join 表2;
内连接
select * from 表1,表2 where 表1.字段=表2.字段;
select * from 表1 inner join 表2 on 表1.字段=表2.字段;
左连接
select * from 表1 left join 表2 on 表1.字段=表2.字段;
右连接
select * from 表2 right join 表1 on 表1.字段=表2.字段;
视图
创建视图
create view 视图名 as
查询的sql语句;
使用视图
select * from 视图名
删除视图
drop view 视图名;
JDBC
- Connection:用于设置连接的数据库的地址、账号、密码
- PreparedStatement:用于预处理、执行sql语句
- ResultSet:用于接收查询后的数据
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?serverTimezone=Asia/Shanghai",username,password);
PreparedStatement pst=conn.prepareStatement(sql语句);
ResultSet rs=pst.executeQuery();
事务
原子性Atomicity
- 事务是最小的执行单元
一致性Consistency
- 事务执行前后,必须让所有数据保持一致状态。
隔离性Isolation
- 事务并发时相互隔离,互不影响
持久性Durability
- 事务一旦提交,对数据的改变是永久的
手动提交/回滚事务
- 关闭事务自动提交:set @@autocommit=0
- 开启事务:start transaction;
- 事务要执行的sql;
- 没有提交之前,如果要回滚,使用rollback;
- 如果要提交,使用commit;一旦提交成功,无法rollback。
事务并发可能问题
问题 | 描述 |
脏读 | 事务A读取到了事务B未提交的数据 |
不可重复读 | 事务A中如果要读取两次数据,在这期间,事务B对数据进行了修改并提交,导致事务A读取两次的情况不一致 |
幻读 | 事务A读取id为1~10之间的数据,假如只有id为2和5的数据,在读取期间,事务B添加了一条id为3的数据,导致事务A多读到了事务B中的数据 |
事务隔离级别
隔离级别 | 能否出现脏读 | 能否出现不可重复读 | 能否出现幻读 |
Read Uncommitted未提交读RU | 会 | 会 | 会 |
Read Committed已提交读RC(Oracle默 认) | 不会 | 会 | 会 |
Repeatable Read可重复读RR(MySQL 默认) | 不会 | 不会 | 会 |
Serializable可序列化 | 不会 | 不会 | 不会 |
查看事务隔离级别
select @@transatcion_isolation
设置事务隔离级别
set [session|global] transaction isolation level [read uncommitted|read committed|repeatable read|serializable]
触发器
创建
create trigger 触发器名
触发时机 触发操作 on 表名 for each row
begin
触发时执行的sql;
end
使用
创建成功后无需刻意调用,在执行相应的操作时,自动执行触发器
删除
drop trigger 触发器名;