华清远见-重庆中心-数据库阶段技知识点梳理

目录

数据的处理过程

数据库DataBase

数据库管理系统DataBase Manager System

数据库的分类

关系型数据库

非关系型数据库nosql

SQL

操作数据库

1.创建数据库

2.切换数据库

3.删除数据库

操作数据表

1.创建数据表

2.删除数据表

3.修改数据表

添加约束

1.添加非空约束

2.添加主键约束

3.添加唯一约束

4.添加默认值约束

5.添加外键约束

建表的同时添加约束

MySQL中常见的数据类型

约束

操作数据

数据添加insert

给所有字段赋值

给指定字段赋值

批量添加

数据修改update

修改单个字段的所有值

修改多个字段的所有值

根据条件修改(where子句)

指定值

指定范围

指定集合

空值

模糊查询

数据删除delete

删除所有

条件删除

数据查询select

查询所有字段

查询指定字段

字段重命名

查询指定条数

去重复

条件查询

排序

统计函数(聚合函数)

数学相关函数

字符串相关函数

时间相关函数

分组

group_concat()函数

实际业务对应sql

登录

注册

充值

删除

逻辑删除

物理删除

 嵌套查询

多表查询

数据库设计

实体关系模型

行列转换

视图View

创建视图

使用视图

删除视图

事务transaction

事务的特性ACID

原子性Atomicity

一致性Consistency

隔离性Isolation

持久性Durability

事务的使用

提交:commit

回滚:rollback

手动提交/回滚事务

事务并发可能出现的问题

事务隔离级别

查看事务隔离级别

设置事务隔离级别

触发器trigger

创建触发器

使用触发器

删除触发器

存储过程procedure

调用存储过程

定义存储过程

无参数

输入型参数

输出型参数

输入输出型参数

删除存储过程

MySQL编程

定义变量

给变量赋值

读取变量的值

条件语句

单分支if语句

双分支if语句

case语句

循环语句

while循环

repeat循环

loop循环

MySQL核心内容

SQL语句

数据库设计

JDBC

事务

存储引擎


数据的处理过程

前端 展示数据

后端 处理数据,得到有用的信息

数据库 保存数据

数据库DataBase

简称为 DB ,是 结构化管理 数据的仓库,称为 电子化的文件柜

数据库管理系统DataBase Manager System

简称 DMBS ,安装在操作系统上, 管理数据库的软件

数据库的分类

关系型数据库

  • 优点

    • 易于维护:都是使用表结构存储数据,格式一致
    • 使用方便:SQL语句通用,可用于不同关系型数据库
    • 复杂查询:可以通过SQL语句在多个表之间查询出复杂数据
  • 缺点

    • 读写性能差,尤其是还是数据的高效读写
    • 固定的表结构,灵活度少欠
    • 高并发读写时,硬盘I/O决定了读写速度
SQLServer
MySQL
Oracle

非关系型数据库nosql

数据通过对象的形式保存,对象可以是一个键值对、文档、图片等。

非关系型数据库的特点

  • 保存数据的格式多样
  • 对于海量数据的读写性能高
  • 不支持复杂查询
Redis

SQL

Structrued Query Language 结构化查询语言

用于操作关系型数据库的一门语言。可以用来创建、维护数据库和数据。

-- mysql中的注释

操作数据库

1.创建数据库

create database 数据库名;

2.切换数据库

use 数据库名;

3.删除数据库

drop database 数据库名;

操作数据表

1.创建数据表

create table 表名(
    字段名 数据类型 [字段特征],
    字段名 数据类型 [字段特征],
    ...
    字段名 数据类型 [字段特征]
)

2.删除数据表

drop table 表名;

3.修改数据表

  • 对表重命名

    alter table 旧表名 rename to 新表名;
  • 添加新字段

    alter table 表名 add column 字段名 数据类型 字段特征;
  • 修改字段

    alter table 表名 change 旧字段名 新字段名 数据类型 字段特征;
  • 删除字段

    alter table 表名 drop 字段名;

添加约束

1.添加非空约束

alter table 表名 change 旧字段名 新字段名 数据类型 not null;

2.添加主键约束

alter table 表名 add primary key(字段名);

3.添加唯一约束

alter table 表名 add unique(字段名);

4.添加默认值约束

alter table 表名 alter 字段名 set default '默认值';

5.添加外键约束

alter table 从表表名 add foreign key(从表外键字段) references 主表(主表主键字段)

 

建表的同时添加约束

-- 创建数据库gamedb
create database gamedb;
-- 切换数据库
use gamedb;
-- 创建游戏角色表hero
create table hero(
-- 编号 整型 非空     主键        自增 
    id    int  not null primary key auto_increment comment '编号',
-- 姓名 字符串     非空         唯一    
    name varchar(20) not null unique comment '姓名',
-- 定位       字符串             非空     
    position varchar(20) not null comment '定位',
-- 性别 字符串 非空     默认男
    sex char(1) not null default '男' comment '性别',
-- 价格 整型 非空         默认4800 
    price int not null default '4800' comment '价格',
-- 上架日期     
    shelf_date date  comment '上架日期'
)

-- 创建战斗表battle
create table battle(
    hero_id int not null ,
    position varchar(20),
    -- 外键  hero_id参考hero表中的id字段
    foreign key (hero_id) references hero(id)
)

MySQL中常见的数据类型

整型
tinyint短整型对应java中的byte和short
int整型对应java中的int
bigint长整型对应java中的long
浮点型
float单精度浮点型对应java中的float
double双精度浮点型对应java中的double
decimal(宽度,精度)指定保留的小数位数和整体宽度如decimal(4,2) 3.1415926-->3.14
字符串
char(长度)定长字符串char(10)表示占10个字符,就算保存了3个字符,也占10个字符,对应java中的String
varchar(长度)可变字符串varchar(10)表示最多占10个字符,保存了3个字符,旧占3个字符,对应java中的String
text文本
日期
date日期yyyy-MM-dd
time时间HH:mm:ss
datetime日期时间yyyy-MM-dd HH:mm:ss
timestamp(14或8)毫秒保存日期的毫秒数.14表示yyyyMMddHHmmss,8表示yyyyMMdd

约束

字段特征概念关键字
非空约束是否允许该字段为nullnull表示可以为空,not null表示不可以为空
主键约束主键(primary key)。用于区分表中的每条记录的一个字段。如果有现成的字段可以区分每条记录时,将该字段设置为主键字段;如果没有现成的字段可以区分每条记录时,通常会额外添加一个id字段用于设置为主键字段。通常一张表只有一个主键字段。primary key
唯一约束保证该字段值不能重复unique
默认值约束如果在不给该字段添加数据的情况下,保证该字段有一个默认值。default
外键约束在主从关系的表中,给从表的某个字段添加外键约束后,该字段的值只能来自于主表中的某个主键字段foreign key
references

 

操作数据

数据的操作,是指数据的增加create,修改update,查询read和删除delete。

简称为CURD。

数据添加insert

数据添加时,都是整行(一条记录)添加。不能只给一个字段添加数据。

如果只给某个字段添加数据,实际是修改。

给所有字段赋值

insert into 表名 values('值1','值2'...)
  • 表名后无需添加字段名,添加时保证值的顺序和字段的顺序一致
  • 遇到自增字段,不能省略不写,要使用0、null或default让其自动填充
  • 遇到有默认值的字段,不能省略不写,要使用default让其自动填充默认值
  • 遇到允许为空的字段,不能省略不写,要使用null让其设置为空

给指定字段赋值

insert into 表名(字段1,字段2...) values('值1','值2'...)
  • 没有默认值的非空字段必须要写出来
  • 表名后的字段顺序要和值的顺序一致

批量添加

可以用一个insert into语句添加多条记录

insert into 表名[(字段1,字段2)] values
    ('值1','值2'...),
    ('值1','值2'...),
    ...
    ('值1','值2'...)
  • 可以省略表名后的字段名
  • 值的顺序和字段的顺序一致
  • 如果一次添加多条记录时,优先使用批量添加,效率更高

数据修改update

修改单个字段的所有值

update 表名 set 字段 = 值;

修改多个字段的所有值

update 表名 set 字段1 = '值',字段2 = '值'...

根据条件修改(where子句)

update 表名 set 字段 = '值' where 条件

指定值

update 表名 set 字段 = '值' where 字段 = '值'

指定范围

  • 使用>、<、>=、<=表示范围,使用and、or、&&、||将多个条件关联

    update 表名 set 字段 = '值' where 字段
  • 使用"字段 between 值1 and 值2"表示字段在闭区间[值1,值2]

    update 表名 set 字段='值' where 字段 between 值1 and 值2
  • 使用!=或<>表示不等于

    update 表名 set 字段='值' where 字段<>值

指定集合

  • 在某个集合中 in

    update 表名 set 字段='值' where 字段 in ('值1','值2'...)
  • 不在某个集合中 not in

    update 表名 set 字段='值' where 字段 not in ('值1','值2'...)

空值

  • 使用is null表示空

    update 表名 set 字段 = '值' where 字段 is null
  • 使用is not null表示非空

    update 表名 set 字段 = '值' where 字段 is not null

模糊查询

-- 字段 like '%娜%'
-- 带有'娜'字

-- 字段 like '张%'
-- ‘张’字开头

-- 字段 like '%儿'
-- ‘儿’字结尾

-- 字段 like '%瑞_'
-- 倒数第二个字为‘瑞’

-- 字段 like '___'
-- 3个字

update 表名 set 字段 = '值' where 字段 like ‘%文字%’

数据删除delete

数据删除是删除一条或多条记录。

删除所有

delete from 表名;
-- 或
truncate table 表名;
  • delete会保留自增列删除前的值,删除后再添加时,自动从删除前的值开始自增
  • truncate会重置自增列的值。效率更高
  • 如果要删除主从关系且设置了外键的表中的数据,如果从表中有数据,不能直接删除主表中相关数据,先删除从表中的数据后,才能删除主表中的数据

条件删除

delete from 表 where 条件

删除时的条件同修饰时的条件语句

数据查询select

查询所有字段

select * from 表名;

查询指定字段

select 字段名1,字段名2... from 表名;

字段重命名

select 字段1 as '重命名',字段2 '重命名'... from 表名;

查询指定条数

-- 查询前N条记录
select * from 表名 limit N;

-- 查询从索引N开始的M条记录
select * from 表名 limit N,M;

-- 每页显示size条,第page页
select * from 表名 limit (page-1)*size,size

去重复

select distinct 字段名 from 表名;

条件查询

where子句,语法同修改、删除时的where

select * from 表名 where 条件;

排序

select * from 表名 where 条件 order by 排序字段 [ASC/DESC],排序字段 [ASC/DESC]...
  • 排序可以是升序或降序
    • 默认不写是升序asc
    • 降序需要写desc
  • 排序时如果有条件,where条件写在表名之后,排序之前
  • 多字段排序时,在order by之后写多个字段及排序规则,用逗号隔开
    • 按字段顺序优先排序

统计函数(聚合函数)

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 分组字段

按指定的字段进行分组,会将该字段值相同的记录归纳到同一组中。

分组通常配合统计函数使用。

如果统计函数作为条件,不能写在where之后,要写在having之后,

having子句放在分组之后。

-- 按图书作者分组,查询平均价格大于50的信息
select book_author,avg(book_price) from book_info 
group by book_author
having avg(book_price)>50

group_concat()函数

将分组后的数据拼接成字符串。

group_concat(字段1或字符串,字段2或字符串...)

select group_concat(字段1,字段2...) from 表名 group by 分组字段
-- 根据图书类型分组,查看每组下的图书名和作者
select group_concat(book_name,'--',book_author) from book_info group by type_id

实际业务对应sql

登录

接收账号密码查询用户表中是否存在记录

select * from 表 where 账号=? and 密码=?

如果能查询到数据,说明存在该用户,可以登录;如果查询结果为Null,说明用户名或密码错误

注册

接收账号密码,判断是否存在该账号,不存在则添加到用户表中

select * from 表 where 账号=?

insert into 表 values(null,账号,密码)

充值

登录成功后,修改余额字段

update 表 set 余额=余额+充值金额 where 用户编号=?

删除

逻辑删除

不删除数据,只是不显示数据

可以给表中添加"是否删除"字段,用0表示未删除,用1表示已删除。

如果删除数据时,执行修改操作,将"是否删除"字段的值为1。

update 表 set deleted=1 where 用户编号=?;

最终在查询所有时,加上"是否删除"=0条件

select * from 表 where deleted=0;

物理删除

将数据真正删除

delete from 表 where 用户编号=?

 嵌套查询

select * from 表 where 字段=(select * from 表 where 条件);
select * from 表,(select * from 表)t where 表.字段=t.字段;

多表查询

交叉连接 / 笛卡尔积
select * from 表1,表2...;
select * from 表1 cross/inner join 表2;
select * from 表1,表2 where 表1.字段=表2.字段;
select * from 表1 cross/inner join 表2 on 表1.字段=表2.字段;
外连接
左外连接
select * from 表1 left join 表2 on 表1.字段=表2.字段;-- 保证表1中的数据完整
右外连接
select * from 表1 right join 表2 on 表1.字段=表2.字段;-- 保证表2中的数据完整

数据库设计

实体关系模型

行列转换

如现有表score

转换为

select stu_id,stu_name,
sum(if(c_name='高等数学',cj,null)) as '高等数学',
sum(if(c_name='思修',cj,null)) as '思修',
sum(if(c_name='大学英语',cj,null)) as '大学英语',
sum(if(c_name='大学体育',cj,null)) as '大学体育'
from score
group by stu_id

视图View

视图可以当做数据库中的一个临时表,保存一些较为复杂的查询后的结果,

之后可以直接通过该视图查询数据,不需要再次编写复杂的sql语句。

视图同时可以隐藏一些查询细节,定制查询数据。

创建视图

create view 视图名 as
查询的sql语句;

使用视图

select * from 视图名

修改视图中的数据,会直接修改原始表中的数据

删除视图

drop view 视图名;
-- 查询平均分最高的课程名及其授课教师

-- 创建视图
create view myview as
select s.c_id,avg(cj)avg_cj from score s,course c where s.c_id = c.c_id
group by s.c_id

-- 视图可以当做表使用
select c_name,t_name from teach t2,teacher t1,course c,
(select c_id from myview where avg_cj=(select max(avg_cj) from myview))t
where t1.t_id=t2.t_id and t.c_id=t2.c_id and c.c_id=t2.c_id

-- 删除视图
drop view myview;

事务transaction

事务是由一组sql语句组成的执行单元,这些sql之间一般都相互依赖。

这个执行单元要么全部执行,要么全部不执行。

转账

1.select * from 表 where id =1 and money>=1000

2.update 表 set money=money-1000 where id=1

3.update 表 set money=money+1000 where id=2

以上的所有sql组成了一个转账的事务。

事务的特性ACID

原子性Atomicity

事务是最小的执行单元

一致性Consistency

事务执行前后,必须让所有数据保持一致状态。(总体数据守恒)

隔离性Isolation

事务并发时相互隔离,互不影响

持久性Durability

事务一旦提交,对数据的改变是永久的

事务的使用

提交:commit

回滚:rollback

mysql中事务是默认自动提交的。

查看事务自动提交开启状态:select @@autocommit 1表示开启自动提交 0表示关闭自动提交

设置事务不自动提交:set @@autocommit=0

如果关闭了事务自动提交,在执行某个事务途中,如果出错,可以使用rollback进行回滚,让数据回到事务执行之前的状态。

如果不出错,通过commit提交事务,一旦提交事务,无法进行回滚。

手动提交/回滚事务

1.关闭事务自动提交:set @@autocommit=0

2.开启事务:start transaction;

3.事务要执行的sql;

4.没有提交之前,如果要回滚,使用rollback;

5.如果要提交,使用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]

触发器trigger

如果要在更新某张表之前或之后,自动执行另一组sql时,可以使用触发器实现。

如表A是客户表,表B是操作日志表,对表A进行更新操作时,将操作的记录保存到表B中。

慎用触发器,因为如果有10000条记录,在修改所有记录时,触发器就会执行10000次,会花费很多时间。

创建触发器

create trigger 触发器名
触发时机 触发操作 on 表名 for each row
begin
    触发时执行的sql;
end

-- 创建操作日志表
create table log(
    log_id int not null primary key auto_increment,
    log_opt varchar(20) not null,
    log_time datetime not null
)

-- 创建触发器,在向客户表中添加记录后,自动向日志表中添加记录
create trigger mytrigger
after insert on customer for each row
begin
    insert into log values(null,'添加了数据',now())
end

使用触发器

一旦创建成功触发器,无需刻意调用,在执行相应的操作时,自动执行触发器

-- 只对customer表做插入操作,会自动向log表中添加记录
insert into customer values(null,'测试插入','123123',0,null);

删除触发器

drop trigger 触发器名;

存储过程procedure

类似于java中的方法,定义一组用于完成特定功能的sql语句。

定义存储过程后,通过调用存储过程名,就可以执行定义时的内容。

存储过程可以有参数。

调用存储过程

-- 调用无参数的存储过程
call 存储过程名();
-- 调用输入型参数的存储过程
call 存储过程名('实参');
-- 调用输出型参数的存储过程
call 存储过程名(@变量);
-- 调用输入输出型参数的存储过程
set @变量
call 存储过程名(@变量)

定义存储过程

create procedure 存储过程名([参数类型 参数名 参数数据类型])-- 参数类型分为输入型/输出型/输入输出型
begin
   sql语句;
end

无参数

create procedure 存储过程名()
begin 
    sql语句
end
-- 创建存储过程,查询每本图书的书名、作者、类型
CREATE PROCEDURE myproc1 () BEGIN
    SELECT
        book_name,
        book_author,
        type_name 
    FROM
        book_info bi,
        book_type bt 
    WHERE
        bi.type_id = bt.type_id;
END
-- 调用存储过程
call myproc1();

输入型参数

create procedure 存储过程名(in 形参名 数据类型)
begin 
    sql语句;
end
-- 根据图书类型查询该类型下的所有图书
CREATE PROCEDURE myproc2 (IN lx VARCHAR ( 20 )) 
BEGIN
    SELECT
        * 
    FROM
        book_info bi,
        book_type bt 
    WHERE
        bi.type_id = bt.type_id 
        AND type_name = lx;
END

-- 调用
call myproc2('杂志')

输出型参数

类似于java中有返回值的方法

create procedure 存储过程名(out 形参名 数据类型)
begin 
    sql语句;
    -- 通常需要将查询出的结果通过into赋值给形参
end
-- 根据作者查询图书数量
CREATE PROCEDURE myproc3 ( IN zz VARCHAR (20), OUT book_count INT ) 
BEGIN
-- 将查询的结果into到参数book_count中
    SELECT
        count( book_id ) INTO book_count 
    FROM
        book_info 
    WHERE
        book_author = zz;

    END
-- 调用存储过程,@x表示将存储过程的输出型参数保存到变量x中
call myproc3('金庸',@x)
-- 查询参数中保存的数据
select @x

输入输出型参数

create procedure 存储过程名(inout 形参名 数据类型)
begin 
    sql语句;
end
-- 查询书名中带有指定文字的图书名、作者和类型
create procedure myproc4(inout keyword varchar(20))
begin 
    SELECT
        book_name,
        book_author,
        type_name 
    FROM
        book_info bi,
        book_type bt 
    WHERE
        bi.type_id = bt.type_id 
        AND book_name LIKE concat('%',keyword,'%');
end 
-- 调用存储过程
set @keyword='龙';
call myproc4(@keyword);
select @keyword;

删除存储过程

drop procedure 存储过程名;

MySQL编程

在定义存储过程中,可以定义变量、使用流程控制语句等。

定义变量

create procedure 存储过程名()
begin 
    -- declare 变量名 数据类型;
    declare num int;
    declare name varchar(20);
end

给变量赋值

create procedure 存储过程名()
begin 
    declare num int;
    declare name varchar(20);
    -- 给num赋值 
    -- select 字段/值 into 变量 [from 表];
    select 123 into num;
    select book_name into name from book_info where book_id=1;
end

读取变量的值

create procedure 存储过程名()
begin 
    declare num int;
    declare name varchar(20);
    select 123 into num;
    select book_name into name from book_info where book_id=1;
    -- select 变量;
    select num;
    select name;
end
-- 创建存储过程,查询所有图书总数,保存到变量中
create procedure myproc5()
begin 
    -- 定义变量
    declare sum_num int;
    -- 给变量赋值
    select sum(book_num) into sum_num from book_info ;
    -- 打印变量的值
    select sum_num;
end
-- 调用存储过程
call myproc5()

条件语句

单分支if语句

if 条件
then 
    满足条件时执行的sql;
end if;
-- 根据作者查询图书库存,如果不足1000,输出'库存不足1000'
create procedure myproc6(in zz varchar(20))
begin
    -- 定义变量保存根据作者查询到的图书库存
    declare num int;
    -- 查询sql,将结果保存到变量中
    select sum(book_num) into num from book_info where book_author = zz ;
    -- 判断变量num 
    if num<1000
    then 
        select '库存不足1000';
    end if;
end

call myproc6('郭敬明')

双分支if语句

if 条件
then 
    满足条件时执行的sql;
else 
    不满足条件时执行的sql;
end if;
-- 根据图书类型查询图书数量,如果不足5,输出"不足5种图书",如果足够5,输出详情
create procedure myproc7(in lx varchar(20))
begin 
    -- 定义变量保存图书数量
    declare num int;
    -- 给变量赋值
    select count(book_id) into num 
    from book_info bi inner join book_type bt on bi.type_id=bt.type_id
    where type_name = lx;
    -- 判断
    if num>=5
    then
        select * from book_info bi inner join book_type bt on bi.type_id=bt.type_id where type_name=lx;
    else
        select '不足5种图书';
    end if;
end
-- 调用存储过程
call myproc7('小说')
call myproc7('漫画')

case语句

CASE 变量
    WHEN 值 THEN
        满足该值时执行sql语句;
    WHEN 值 THEN
        满足该值时执行sql语句;
    ELSE
        没有任何值满足时sql语句;
END CASE;
-- case语句
create procedure myproc8(in num int)
begin
    CASE num
        WHEN 1 THEN
            select '1';
        WHEN 5 THEN
            select '5';
        ELSE
            select '都不是';
    END CASE;
end
-- 调用
call myproc8(6)

循环语句

while循环

while 条件 do
    满足条件时执行的内容;
end while;
-- 添加10个客户
create procedure myproc9()
begin 
    -- 定义循环变量
    declare i int;
    -- 初始化循环变量
    select 1 into i;
    -- while循环
    while i<=10 do
        insert into customer values(null,concat('测试用户',i),'123123',0,null);
        -- 更新循环变量
        set i=i+1;
    end while;
end

call myproc9()

repeat循环

repeat
    循环体;
until 条件 end repeat;
-- repeat循环
create procedure myproc10()
begin 
    declare num int;
    select 50 into num;
    repeat 
        insert into customer values(null,concat('测试用户',num),'123123',0,null);
        set num=num+1;
    until num=60 end repeat;
end
-- 调用
call myproc10()

loop循环

循环名:loop
    循环体;
    if 条件 then leave 循环名;
    end if;
end loop;
-- loop循环
create procedure myproc11()
begin 
    declare num int ;
    select 100 into num;
    test:loop
        insert into customer values(null,concat('测试用户',num),'123123',0,null);
        set num=num-1;
        if num=90 then leave test;
        end if;
    end loop;    
end
-- 调用
call myproc11()

MySQL核心内容

SQL语句

  • 数据库和数据表的创建、修改、删除
  • 数据完整性(约束)
  • 单表增删改查CURD
  • 函数
  • 多表查询、嵌套查询

数据库设计

  • 实体关系模型(ER)
  • ER图
  • 范式

JDBC

  • 连接MySQL所需jar文件

    • 普通java工程需要手动导入jar文件
    • maven项目需要使用依赖自动导入jar文件
  • MySQL驱动名

    //mysql5.5之前版本
    Class.forName("com.mysql.jdbc.Driver");
    //mysql8之后版本
    Class.forName("com.mysql.cj.jdbc.Driver"); 
  • 连接数据库的字符串

    String url="jdbc:mysql://localhost:3306/数据库名?serverTimezone=Asia/Shanghai";
    String username="root";
    String password="密码";

事务

  • 事务的概念和特性

  • 事务并发时出现的问题

    • 脏读
    • 不可重复读
    • 幻读
  • 事务的隔离级别

    • read uncommitted 可能会出现脏读、不可重复读和幻读问题,效率最高
    • read committed 解决了脏读问题,可能会出现不可重复读和幻读问题
    • repeatable read MySQL默认 解决了脏读和不可重复读问题,可能会出现幻读问题
    • serializable 解决了脏读、不可重复读和幻读问题,效率最低

存储引擎

  • MySQL5.5版本之前,默认使用MyIsam存储引擎,不支持事务
  • MySQL5.5版本之后,默认使用InnoDB存储引擎,支持事务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值