目录
一、MySQL数据模型
关系型数据库
关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的二维表组成的数据库
优点:1.都是使用表结构,格式一致,易于维护
2.使用通用的SQL语言操作,使用方便,可用于复杂查询
3.数据存储在磁盘中,安全
二、DDL --操作数据库
1.查询
show databases;
2.创建
a.创建数据库
create database 数据库名称;
b.创建数据库(判断,如果不存在则创建)
create database if not exists 数据库名称;
3.删除
a.删除数据库
drop database 数据库名称;
b.删除数据库(判断,如果存在则删除)
drop database if exists 数据库名称;
4.使用数据库
a.查看当前使用数据库
select database();
b.使用数据库
use 数据库名称;
三、DDL --操作表
查询表
查询当前数据库下所有表名称
show tables;
查询表结构
desc 表名称;
创建表
create table 表名{
字段名1 数据类型1,
字段名2 数据类型2,
........
字段名n 数据类型n
};
注意:最后一行末尾,不能加逗号
MySQL 数据类型
分类 | 数据类型 | 大小 | 描述 | |
数值类型 | TINYINT | 1 byte | 小整数值 | |
SMALLINT | 2 bytes | 大整数值 | ||
MEDIUMINT | 3 bytes | 大整数值 | ||
INT或INTEGER | 4 bytes | 大整数值 | age int | |
BIGINT | 8 bytes | 极大整数值 | ||
FLOAT | 4 bytes | 单精度浮点数值 | ||
DOUBLE | 8 bytes | 双精度浮点数值 | score double(总长度,小数点后保留的位数) 0~100 2 | |
DECIMAL | 小数值 | |||
日期和时间类型 | DATE | 3 | 日期值 | birthday date |
TIME | 3 | 时间值或持续时间 | ||
YEAR | 1 | 年份值 | ||
DATETIME | 8 | 混合日期和时间值 | ||
TIMESTAMP | 4 | 混合日期和时间值,时间戳 | “张三” | |
字符串类型 | CHAR | 0-255 bytes | 定长字符串 | name char(10) 10个字符空间 存储的性能高 浪费空间 |
VARCHAR | 0-65535 bytes | 变长字符串 | name varchar(10) 2个字符空间 存储性能低 节约空间 | |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 | ||
TINYTEXT | 0-255 bytes | 短文本字符串 | ||
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 | ||
TEXT | 0-65 535 bytes | 长文本数据 | ||
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 | ||
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 | ||
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 | ||
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
删除表
a.删除表
drop table 表名;
b.删除表时判断是否存在
drop table if exists 表名;
修改表
1.修改表名
alter table 表名 rename to 新表名;
2.添加一列
alter table 表名 add 列名 数据类型;
3.修改数据类型
alter table 表名 modify 列名 新数据类型;
4.修改列名和数据类型
alter table 表名 change 列名 新列名 新数据类型;
5.删除列
alter table 表名 drop 列名;
四、DML
添加数据
1.给指定列添加数据
insert into 表名(列名1,列名2,.....) values(值1,值2,.....);
2.给全部列添加数据
insert into 表名 values (值1,值2,.....);
3.批量添加数据
insert into 表名(列名1,列名2,.....) values(值1,值2,.....),(值1,值2,.....).....;
insert into 表名 values(值1,值2,.....),(值1,值2,.....).....;
修改数据
update 表名 set 列名1=值1,列名2=值2,... [where 条件];
注意:修改语句如果不加条件,则将所有数据都修改
删除数据
delete from 表名 [where 条件];
注意:删除语句如果不加条件,则将所有数据都删除
五、DQL
基础查询
1.查询多个字段
select 字段列表 from 表名;
select * from 表名; --查询所有数据
2.去除重复记录
select distinct 字段列表 from 表名;
3.起别名
AS : AS 也可以省略
条件查询
1.条件查询语法
select 字段列表 from 表名 where 条件列表;
2.条件
排序查询
select 字段列表 from 表名 order by 排序字段名1[排序方式1],排序字段名2[排序方式2]...;
排序方式:
1.asc:升序排列(默认值)
2.desc:降序排列
注意:如果有多个排序条件,当前面条件值一样时,才会根据第二条件进行排列
分组查询
聚合函数
1.概念:将一列数据作为一个整体,进行纵向计算。
2.聚合函数的分类
3.聚合函数语法
select 聚合函数名(列名) from 表;
注意:null值不参与所有聚合函数运算
分组查询
1.分组查询语法
select 字段列表 from 表名[where 分组前条件限定] group by 分组字段名
[having 分组后条件过滤];
注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
where和having的区别
执行的时机不一样:where是分组之前的限定,不满足where条件不参与分组,而having是分组之后对结果的过滤。
可判断的条件不一样:where不能对聚合函数进行判断,having可以
执行顺序:where>聚合函数>having
分页查询
1.分页查询语法
select 字段列表 from 表名 limit 起始索引,查询条目数;
起始索引:从0开始
计算公式:起始索引=(当前页码-1)*每页显示条数
tips:
分页查询limit是mysql的方言
oracle分页查询使用rownumber
sql server分页查询使用top
六、约束
约束的概念和分类
1.约束的概念
约束时作用于表中列上的规则,用于限制加入表的数据
约束的存在保证了数据库中数据的正确性,有效性和完整性
2.约束的分类
外键约束
1.概念:外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性
2.语法
(1)添加约束
--创建表时添加外键约束
create table 表名(
列名 数据类型,
...
[constraint] [外键名称] foreign key(外键列名) references 主表(主表列名)
);
--建完表后添加外键约束
alter table 表名 add constraint 外键名称 foreign key(外键字段名称)references 主表名称(主表列名称);
(2)删除约束
alter table 表名 drop foreign key 外键名称;
七、多表查询
笛卡尔积:取A和B集合所有的组合情况
多表查询:从多张表查询数据
1.连接查询
->内连接:相当于查询A、B交集数据
->外连接:
&左外连接:相当于于查询A表所有数据和交集部分数据
&右外连接:相当于于查询B表所有数据和交集部分数据
2.子查询
1.内连接
内连接查询语法
--隐式内连接
select 字段列表 from 表1,表2...where条件;
--显示内连接
select 字段列表 from 表1[inner] join 表2 on 条件;
2.外连接
外连接语法
--左外连接
select 字段列表 from 表1 left outer join 表2 on 条件;
--右外连接
select 字段列表 from 表1 right outer join 表2 on 条件;
3.子查询
1.子查询概念:查询中嵌套查询,称嵌套查询为子查询
2.子查询根据查询结果不同。作用不同
单行单列 多行单列 多行多列
--单行单列 作为条件值,使用= != <>等进行判断
select 字段列表 from 表 where 字段名=(子查询);
--多行单列:作为条件值,使用in关键字进行条件判断
select 字段列表 from 表 where 字段名 in(子查询);
--多行多列 作为虚拟表
select 列表 from (子查询)where 条件;
八、事务
事务简介
数据库的事务是一种机制,一个操作序列,包含了一组数据库操作命令
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功要么同时失败
事务是一个不可分割的工作逻辑单元
--开启事务
start transaction;
--或
begin;
--提交事务
commit;
--回滚事务
rollback;
事务四大特征 (ACID)
1.原子性(Atomicity):事务是不可分割的最小操作单位,要么同时成功要么同时失败
2.一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
3.隔离性(Isolation):多个事务之间,操作性可见
4.持久性(Durability):事务一旦提交或回滚,他对数据库中的数据的改变时永久的
九、JDBC
JDBC概念
JDBC就是使用JAVA语言操作关系型数据库的一套API
全称:(Java DataBase Connectivity)Java数据库连接
JDBC本质
官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
各个数据库厂商取实现这套接口,提供数据库驱动jar包
我们可以用这套接口(JDBC)编程,真正执行代码的是驱动jar包中的实现类
步骤
0.创建工程,导入驱动jar包
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "xxx";
String password = "xxx";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql语句
String sql = "update...";
//4.获取执行sql对象
Statement stmt = conn.createStatement();
//5.执行sql
stmt.executeUpdate(sql);
//6.处理返回结果
//7.释放资源
stmt.close();
conn.close();
ResultSet
1.封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql) 执行DQL语句,返回ResultSet对象
2.获取查询结果
boolean next() (1)将光标从当前位置向前移动一行 (2)判断当前行是否为有效行
返回值 true or false
3.xxx getXxx(参数) 获取数据
xxx:数据类型 如 int getInt(参数)
参数 int:列的编号,从1开始
PreparedStatement
preparedstatement作用
1.预编译sql语句并执行,预防sql注入问题
2.sql注入:是通过操作输入来修改事先定义好的sql语句,用以达到执行代码对服务器进行攻击的方式
//SQL语句中的参数值,使用?占位符来代替
String sql = "select * from user where username=? and password = ?";
//通过connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
//设置参数值
//PreparedStatement对象:setXxx(参数1,参数2):给?赋值
//Xxx:数据类型 如 setint(参数1,参数2)
//参数1:?的位置编号 从1开始
//参数2:?的值
//执行sql
pstmt.executeUpdate(); 或 pstmt.executeQuery(); //不需要再传递sql
十、数据库连接池
数据库连接池简介
数据库连接池是一个容器。负责分配,管理数据库连接
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处:资源重用 提升系统响应速度 避免数据库连接遗漏
数据库连接池实现
标准接口:DataSource
官方(sun)提供的数据库连接池标准接口,由第三方组织实现此接口
功能:获取连接
Connection getConnection();
常见数据库连接池
DBCP C3P0 Druid
Druid(德鲁伊)
Durid连接池是阿里巴巴开源的数据库连接池项目
功能强大,性能优秀,是Java语言最好的数据库连接池之一
1.导入jar包
2.配置druid.properties 定义配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
username=root
password=1234
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
3.加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("druid.properties文件路径"));
4.获取连接池对象
DataSource dataSource = DuridDataSourceFactory.createDataSource(prop);
5.获取数据库连接 connection
Connection conn = dataSource.getConnection();
System.out.println(conn);