Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)

Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(中):https://developer.aliyun.com/article/1580543

12 表的操作

12.1 查看表 show

-- 查看当前数据库下所有的表
show tables;

12.2 查看表结构 desc

-- 查看表结构
-- desc 表名
desc emp

12.3 表的创建 【重要】

CREATE TABLE 表名(

列名 数据类型 [约束] ,

列名 数据类型 [约束] ,

列名 数据类型 [约束]

);

-- 建表
create table user(
    username varchar(50),
    password varchar(50),
    age int,
    phone_num varchar(20),
    birthday date,
    money double
)

12.4 删除表

drop table 表名;删除表

-- 删除表
-- drop table 表名;
-- drop table if exists 表名;
drop table if exists user;

12.5 修改表【了解】alter

添加列

  • alter table 表名 add 添加的字段 数据类型;
-- 在user表中添加一个address字段
alter table user add address varchar(100);

修改列的数据类型

  • alter table 表名 modify 修改的字段 数据类型;
-- 在user表中修改birthday字段的类型为datetime类型
alter table user modify birthday datetime;

删除列

  • alter table 表名 drop 字段名;
-- 在user表中删除一个phone_num字段
alter table user drop phone_num;

修改列名

  • alter table 表名 change 旧列名 新列名 数据类型;
-- 在user表中将username改为name
alter table user change username name varchar(50)

13 表的约束【理解】

13.1 约束

约束:

  • 用于限制加入到表中的数据的类型和规范

13.2 约束的分类

  • 实体完整性
  • 域完整性
  • 引用完整性

13.3 实体完整性

  1. 主键约束
  • 主键的特点:非空+唯一
  1. 主键的语法:字段名 数据类型 primary key
  1. 唯一约束
  1. 唯一特点:某个字段在一列数据中是唯一的(可以为多个null)
  1. 唯一语法:字段名 数据类型 unique
  1. 自增长约束
  1. 自增长特点:一般与主键一起使用,每添加一条数据,主键自动生成,在原有的基础上加1
  2. 自增长语法: 字段名 数据类型 primary key auto_increment
  1. 联合主键约束
  • 联合主键特点:与主键的作用含义一样,只不过由多个字段一起组成主键
  • 应用场景:中间表
  • 自增长语法: primary key(字段1,字段2)


/*
  约束:
    实体完整性约束
      主键约束
        主键:指的是一行数据唯一标识的那一列
          自然主键:主键字段就是这个表的某个属性
          代理主键:使用一个与表无关字段来作为表的主键
        主键的特点:非空+唯一
                主键的语法:字段名 数据类型 primary key

            唯一约束
         唯一特点:某个字段在一列数据中是唯一的
                  唯一语法:字段名 数据类型 unique

            自增长约束
         自增长特点:一般与主键一起使用,每添加一条数据,主键自动生成,在原有的基础上加1   
         自增长语法: 字段名 数据类型 primary key auto_increment

             联合主键约束
        联合主键特点:与主键的作用含义一样,只不过由多个字段一起组成主键
                应用场景:中间表
        自增长语法: primary key(字段1,字段2)
*/
drop table if exists user;
create table user(
  id int primary key,
  name varchar(20),
  age int
)
insert into user values(1,'jack',30); 

insert into user (name,age) values('jack',30); -- 错误,违反主键约束
insert into user values(null,'jack',30); -- 错误,违反主键约束(非空)
insert into user values(1,'rose',30); -- 错误,违反主键约束(唯一)


drop table if exists user;
create table user(
  id int primary key,
  name varchar(20) unique,
  age int
)
insert into user values(1,'jack',30);


insert into user values(2,'jack',31);  -- 错误,违反唯一约束
insert into user values(3,null,33); 
insert into user values(4,null,34); 



drop table if exists user;
create table user(
  id int primary key auto_increment,
  name varchar(20) unique,
  age int
)


insert into user (name,age) values ('jack',33);
insert into user (name,age) values ('rose',33);
insert into user  values (null,'马冬梅',34);



drop table if exists user;
create table user(
  name varchar(20),
  age int,
  primary key(name,age)
)
insert into user values('jack',30);
insert into user values('jack',31);
insert into user values('rose',31);
insert into user values('jack',30); -- 错误,违反联合主键约束

13.4 域完整性

/*
    域完整性约束
      数据类型约束(必填)

      非空约束
         非空特点:添加数据的时候,不能为null
         非空语法:字段名 数据类型 not null

      默认值约束
         默认值特点:这一列数据如果不添加,则默认值生效
         默认值语法: 字段名 数据类型 default '默认值'

*/
drop table if exists user;
create table user(
  id int primary key auto_increment,
  name varchar(20) not null,
  age int
)
insert into user (name,age) values (null,33); -- 错误,违反非空约束
drop table if exists user;
create table user(
  id int primary key auto_increment,
  name varchar(20) default '宋小宝',
  age int
) 
insert into user (name,age) values (null,33); -- 注意:默认值不生效
insert into user (age) values (33); -- 默认值生效

13.5 引用完整性

引用完整性约束:

  • 外键约束
  • 语法:foreign key
  • 特点
  • 主表中有的从表中可以没有
  • 主表中没有的从表中不能有(从表中修改、增加)
  • 删除主表数据要保证从表中没有(主表中删除)
  • 总结:在实战开发中,如果能不使用外键的尽量就不使用外键。使用逻辑外键
/*
  引用完整性约束(在实际开发,如果能够不使用外键约束就不使用,我们可以使用逻辑外键)
    引用完整性约束:指的是多张表之间的引用约束
    主表(dept:主键)    从表(emp:外键)
        外键约束
       特点:
         1、主表中有的从表中可以没有,但是主表没有的从表一定不能有
         2、删除主表中的数据的时候,要保证从表没有与之关联的数据
         3、修改从表中数据的时候。要保证主表中存在
            
            语法:
        constraint 外键约束的名称 foreign key(外键字段) references 关联表(关联字段)

*/


drop table if exists tb_dept;
create table tb_dept(
  deptno int primary key,
  dname varchar(30),
  location varchar(30)
);

drop table if exists tb_emp;
create table tb_emp(
  empno int primary key,
  ename varchar(30),
  job varchar(30),
  deptno int,
  constraint fk_dept_emp foreign key(deptno) references tb_dept(deptno)
)
insert into tb_dept values(100,'开发部','金融港');
insert into tb_dept values(101,'人事部','光谷广场');
insert into tb_emp values(6666, 'jack','java开发',20000); -- 错误,违反了外键约束

insert into tb_emp values(6666, 'jack','java开发',100);
delete from tb_dept where deptno = 100; -- 错误,违反了外键约束
update tb_emp set deptno = 102 where empno = 6666;

14 权限管理【了解】

  • 创建用户
  • 语法:create user 用户名 identified by 用户密码
  • 用户授权
  • 语法:grant 权限名称(select、update、insert、alter、create…) on 数据库.数据表 to 用户
  • 回收权限
  • 语法:revoke 权限名称(select、update、insert、alter、create…) on 数据库.数据表 from 用户
  • 删除用户
  • 语法: drop user 用户名
-- 创建用户
create user 'cxk' identified by '123456';

-- 授权
-- grant all(select、delete、update、select、create、drop..) on *.* to 用户
-- *.* 所有表
grant select on java2108.emp to 'cxk'

-- 回收权限
-- revoke all on *.* from 用户
revoke select on java2108.emp from 'cxk';

-- 删除
-- drop user if exists 用户
drop user if exists 'cxk'

15 视图【了解】

15.1 概念

视图,虚拟表,从一个表或多个表中查询出来的表,作用和真实表一样,包含一系列带有行和列的数据。视图中,用户可以使用SELECT语句查询数据,也可以使用INSERT,UPDATE,DELETE修改记录,视图可以使用户操作方便,并保障数据库系统安全。

15.2 视图特点

  • 优点
  • 简单化,数据所见即所得。
  • 安全性,用户只能查询或修改他们所能见到得到的数据。
  • 逻辑独立性,可以屏蔽真实表结构变化带来的影响。
  • 缺点
  • 性能相对较差,简单的查询也会变得稍显复杂。
  • 修改不方便,特变是复杂的聚合视图基本无法修改。

15.3 视图的创建

语法:CREATE VIEW 视图名 AS 查询数据源表语句;

15.3.1 创建视图

-- 创建视图
create view myView as (select empno,ename,job,mgr,hiredate,deptno from emp)


15.3.2 使用视图

-- 查询视图
select * from myView;

15.4 视图的修改

  • 方式一:CREATE OR REPLACE VIEW 视图名 AS 查询语句
  • 方式二:ALTER VIEW 视图名 AS 查询语句

15.4.1 修改视图

-- 修改视图
-- 方式1:
create or replace view myView as((select empno,ename,job,hiredate,deptno from emp))
-- 方式2:
alter view myView as ((select empno,ename,hiredate,deptno from emp))

15.5 视图的删除

DROP VIEW 视图名

15.5.1 删除视图

-- 删除视图
drop view if exists myView;


  • 注意:删除视图不会影响原表

15.6 视图的注意事项

  • 注意:
  • 视图不会独立存储数据,原表发生改变,视图也发生改变。没有优化任何查询性能。
  • 如果视图包含以下结构中的一种,则视图不可更新
  • 聚合函数的结果
  • DISTINCT 去重后的结果
  • GROUP BY 分组后的结果
  • HAVING 筛选过滤后的结果
  • UNION、UNION ALL 联合后的结果

16 事务【理解】

16.1 事务的概念

**事务(transaction)**是一个原子操作。是一个最小执行单元。可以由一个或多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败,整个事务都执行失败。

16.2 事务的边界

  • 开始:连接到数据库,执行一条DML语句。 上一个事务结束后,又输入了一条DML语句,即事务的开始
  • 结束:
    1). 提交:
    a. 显示提交:commit;

b. 隐式提交:一条创建、删除的语句,正常退出(客户端退出连接);

2). 回滚:

a. 显示回滚:rollback;

b. 隐式回滚:非正常退出(断电、宕机),执行了创建、删除的语句,但是失败了,会为这个无效的语句执行回滚。

16.3 事务的原理

数据库会为每一个客户端都维护一个空间独立的缓存区(回滚段),一个事务中所有的增删改语句的执行结果都会缓存在回滚段中,只有当事务中所有SQL 语句均正常结束(commit),才会将回滚段中的数据同步到数据库。否则无论因为哪种原因失败,整个事务将回滚(rollback)。

16.4 事务的特性

  • Atomicity(原子性)

一个事务不可分割,要么一起执行成功,要么一起失败

  • Consistency(一致性)

事务操作的前后要保证的数据的一致

  • Isolation(隔离性)

一个事务的操作不能影响到另一个事务的执行

  • Durability(持久性)

一个事务操作完成对数据库的影响是永久

16.5 事务应用

应用环境:基于增删改语句的操作结果(均返回操作后受影响的行数),可通过程序逻辑手动控制事务提交或回滚

  • 事务完成转账
#A 账户给 B 账户转账。
#1.开启事务
set autocommit=0;  #禁止自动提交 set autocommit=1;#开启自动提交
#2.事务内数据操作语句
UPDATE ACCOUNT SET MONEY = MONEY-1000 WHERE ID = 1;
UPDATE ACCOUNT SET MONEY = MONEY+1000 WHERE ID = 2;
#3.事务内语句都成功了,执行 COMMIT;
COMMIT;
#4.事务内如果出现错误,执行 ROLLBACK;
ROLLBACK;
  • 注意:开启事务后,执行的语句均属于当前事务,成功再执行 COMIIT,失败要进行 ROLLBACK

16.6 事务的并发问题

  • 1、脏读:事务A读到事务B没有提交的数据
  • 2、不可重复读:事务A在同一个事务中,因为事务B修改了数据并提交,造成两次读取到的数据不一致
  • 3、幻读:事务A在同一个事务中,因为事务B新增了数据并提交,如果事务A修改数据,会出现多修改了一条数据,出现幻觉

16.7 如何解决事务并发问题

通过设置事务隔离级别可以解决以上问题

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)—Oracle默认的隔离级别
可重复读(repeatable-read)—MySQL默认隔离级别,幻读一般是可以接受的
串行化(serializable)–效率低

16.8 演示问题

  • 查看当前数据库的隔离级别
  • select @@tx_isolation;
  • 修改当前数据库的隔离级别
  • set session transaction isolation level 隔离级别
  • eg: set session transaction isolation level repeatable read;

17 SQL语言的分类

17.1 SQL语言分类

  • 数据查询语言DQL(Data Query Language):select、where、order by、group by、having 。【重要】
  • 数据定义语言DDL(Data Definition Language):create、alter、drop。
  • 数据操作语言DML(Data Manipulation Language):insert、update、delete 。 【重要】
  • 事务处理语言TPL(Transaction Process Language):commit、rollback 。 【重要】
  • 数据控制语言DCL(Data Control Language):grant、revoke。

补充 :

T,失败要进行 ROLLBACK**

16.6 事务的并发问题

  • 1、脏读:事务A读到事务B没有提交的数据
  • 2、不可重复读:事务A在同一个事务中,因为事务B修改了数据并提交,造成两次读取到的数据不一致
  • 3、幻读:事务A在同一个事务中,因为事务B新增了数据并提交,如果事务A修改数据,会出现多修改了一条数据,出现幻觉

16.7 如何解决事务并发问题

通过设置事务隔离级别可以解决以上问题

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)—Oracle默认的隔离级别
可重复读(repeatable-read)—MySQL默认隔离级别,幻读一般是可以接受的
串行化(serializable)–效率低

16.8 演示问题

  • 查看当前数据库的隔离级别
  • select @@tx_isolation;
  • 修改当前数据库的隔离级别
  • set session transaction isolation level 隔离级别
  • eg: set session transaction isolation level repeatable read;

17 SQL语言的分类

17.1 SQL语言分类

  • 数据查询语言DQL(Data Query Language):select、where、order by、group by、having 。【重要】
  • 数据定义语言DDL(Data Definition Language):create、alter、drop。
  • 数据操作语言DML(Data Manipulation Language):insert、update、delete 。 【重要】
  • 事务处理语言TPL(Transaction Process Language):commit、rollback 。 【重要】
  • 数据控制语言DCL(Data Control Language):grant、revoke。

补充 :

    相关实践学习
    如何在云端创建MySQL数据库
    开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
    全面了解阿里云能为你做什么
    阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
    目录
    相关文章
    |
    4天前
    |
    存储 关系型数据库 MySQL
    Mysql(4)—数据库索引
    数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
    31 3
    Mysql(4)—数据库索引
    |
    2天前
    |
    SQL Oracle 关系型数据库
    安装最新 MySQL 8.0 数据库(教学用)
    安装最新 MySQL 8.0 数据库(教学用)
    22 4
    |
    3天前
    |
    存储 关系型数据库 MySQL
    PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
    PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
    12 2
    |
    5天前
    |
    关系型数据库 MySQL Java
    Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
    这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
    26 0
    Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
    |
    7天前
    |
    Java 关系型数据库 MySQL
    springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
    这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
    11 0
    springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
    |
    3天前
    |
    SQL 存储 关系型数据库
    mysql 数据库空间统计sql
    mysql 数据库空间统计sql
    14 0
    |
    11天前
    |
    SQL 分布式计算 关系型数据库
    Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
    Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
    44 0
    |
    11天前
    |
    SQL 分布式计算 关系型数据库
    Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
    Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
    25 0
    |
    11天前
    |
    SQL 分布式计算 关系型数据库
    Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
    Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
    31 0
    |
    2月前
    |
    SQL druid Java
    Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
    Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
    52 3
    Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)