目录
DDL(Data Definition Language,数据定义语言)
DML(Data Manipulation Language,数据操纵语言)
DQL(Data Query Language,数据查询语言)
原子性:事务是不可分割的最小操作单位,要么同时成功,要么同属失败
DDL(Data Definition Language,数据定义语言)
主要用于维护存储数据的结构,这种结构包括数据库,表、视图、索引、同义词、聚簇等。
代表指令:
-
create
创建数据库和数据库的一些对象 -
drop
删除数据库/表、索引、条件约束以及数据表的权限等 -
alter
修改数据库表的定义及数据属性
DDL操作数据库
show databases; //查询数据库
create database if not exist 数据库名; //创建数据库
drop database if exist 数据库名; //删除数据库
use 数据库名称 select database(); //使用数据库 查看当前数据库
DDL操作表
dese 表名; //查询表的结构信息(一张表的所有字段)
show tables; //查询当前数据库下所有表的名称
create table 表名(
字段名1 数据类型1,
字段名2 数据类型2,
字段名3 数据类型3
);
create table 表名(
id int,
name varchar(15),
gender char(1),
grade double(5,2),
birthday date,
email varchar(64),
status tinyint
);
修改表
alter table 表名 rename to 新的表名 alter table 表名 add 列名 数据类型 alter table 表名 modify 列名 新的数据类型 //修改数据类型 alter table 表名 change 列名 新列名 新数据类型 alter table 表名 drop 列名
DML(Data Manipulation Language,数据操纵语言)
主要用于对数据库对象中包含的数据进行操作
代表指令:
-
insert
向数据库中插入一条数据 -
delete
删除表中的一条或者多条记录 -
updata
修改表中的数据
添加数据
select * from stu;
insert into stu(id,name) values(1,'张三'); //指定列添加数据
修改数据
update stu set sex='女' wwhere name='张三';
update stu set birthday ='1999-12-12', score=99.99 where name='张三';
删除数据
delete from stu where name='张三';
DQL(Data Query Language,数据查询语言)
主要用于查询数据库当中的数据
代表指令:
selete
查询表中的数据from
查询哪张表、视图where
约束条件- distinct去除重复记录 as 别名
select 字段列表
from 表名列表
where 条件查询
group by 分组查询
having 分组后条件
order by 排序字段
limit 分页
基础查询
select 字段 from 表名
条件查询
//select 字段 from 表名 where
select * from stu where age>20;
select * from stu where age>=20 and age<=30;
select * from stu where age between 20 and 30;
// =等于 !=不等于 <>
// 或者: age=20 or age=30 age in{18,20,22};
// Null值必须用 is null
// 模糊查询:
select * from stu where name like '马%'; //查询姓马的信息
select * from stu where name like '_花%'; //第二为花
select * from stu where name like '%德%'; //包含德
排序查询
//ASC:升序(默认)
//DESC:降序
select * from stu order by math desc;
select * from stu order by math desc,english asc;
分组查询:
聚合函数
函数名 | 功能 |
count(列名) | 统计数量(一般选用不为null的列)1主键 2* |
max(列名) | 最大值 |
min(列名) | 最小值 |
sum(列名) | 求和 |
avg(列名) | 平均值 |
select 聚合函数名(列名) from 表
select 字段列表 from 表名 where 分组前条件限定 group by 分组字段名 having 分组后条件过滤
// 分组之后 查询的字段为聚合函数和分组字段,查询其他字段无任何意义
select name,sex,avg(math),count(*) from stu group by sex;
select name,sex,avg(math),count(*) from stu where math>70 group by sex;
select name,sex,avg(math),count(*) from stu where math>70 group by sex having count(*)>2;
where与having的区别
执行时机不同 where是分组之前限定,不满足where条件,不参与分组,having是分组后对结果进行过滤 可判断的条件 where不能对聚合函数进行判断,having可以
执行顺序:where>聚合函数>having
分页查询
select * from stu limit 起始索引,查询条目数
select * from stu limit 0,3 //从0开始,查询3条
起始索引: (当前页码-1)*每页显示的条数
约束
外键约束:
//添加外键:在从表中添加
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id);
//删除外键:
alter table emp drop FOREIGN key fk_emp dept;
开启事务: BEGIN /STATR TRANSCATION
提交事务:COMMIT 有些是默认提交但有些需要手动提交
回滚事务:ROLLBACK
事务
事务四大特征
原子性:事务是不可分割的最小操作单位,要么同时成功,要么同属失败
一致性:事务完成时,必须使所有的数据都保持一致状态
隔离性:多个事物之间,操作的可见性
持久性:事务一旦提交或者回滚,它对数据库中的改变是永久的
并发事务引发的问题:脏读 不可重复读 幻读 为了解决这个问题引入了隔离级别这个·概念
SET SESSION TRANSCATION ISOLATION LEVEL SERIALIZABLE //设置隔离级别
三个隔离级别(isolation level):
读未提交Read uncommitted:多个同时在执行的事务,可以读取到其他事务,还处于事务未提交时的数据修改
(读已提交)Read committed
(重复读)Repeatable read(默认)
SERIALIZABLE:串行化 当一个事物正在进行的时候另一个必须等待 规避了幻读的问题
事务的隔离级别越高 数据越安全 但是性能越低
JDBC
概念:使用java语言操作关系型数据库的一套API
本质:
- 官方定义的一套操作所有关系型数据库的规则,也就是接口
- 各个数据库厂商·去实现这套接口,提供数据库jar包
- 使用这套接口(JDBC)编程,真正执行的代码是驱动jae包中的实现类
JDBC好处:
- 数据库厂商使用相同的接口,JAVA代码不需要针对不同数据库分别开发
- 可随时替换底层的数据库,访问数据库的java代码基本不变
在JDBC过程中,Connection中有事务的提交
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* @author hututu
* @date 2022/08/09 18:48
**/
public class JDBCDemo {
@Test
public void testResultSet() throws Exception{
String url= "jdbc:mysql;///db1?useSSL=false";
String username="root";
String password="123456";
Connection connection= DriverManager.getConnection(url,username,password);
String name="zhangsan";
String pwd="123";
String sql="select * from stu where name=? and word=?";
PreparedStatement preparedStatement= connection.prepareStatement(sql);
preparedStatement.setString(1,name);
preparedStatement.setString(2,pwd);
ResultSet rs=preparedStatement.executeQuery();
if (rs.next()){
System.out.println("登陆成功");
}else {
System.out.println("登陆失败");
}
rs.close();
preparedStatement.close();
connection.close();
}
}