学习视频
一边复习一边跟着老师敲的笔记,本来想改一改的,又觉得老师这个挺好的,没必要改。
一、数据库的好处
1、可以持久化到数据库
2、机构化查询
二、数据库的常见概念
1、DB:数据库,存储数据的容器
2、DBMS:数据库管理系统,又称之为数据库软件或数据库产品,用于创建或管理DB
3、SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言。
三、数据库存储数据的特点
1、数据库存放到表中,然后表再放到库中。
2、一个库可以有多张表,每张表具有唯一的表名用来标识自己。
3、表中有一个或多个列,列又称之为“字段”,相当于Java中的“属性”。
4、表中的每一行数据,相当于Java中的“对象”。
四、常见的数据库管理系统
MySQL、Oracle、Db2、SQL server
MySQL的优点
1、开源、免费、成本低
2、性能高、移植性高
3、体积小、便于安装
MySQL服务器的启动和停止
方式一:通过命令行
net start 服务名
net stop 服务名
方式二:计算机→右击→管理→服务
MySQL服务的登录和退出
登录:mysql 【-h 主机名 -p 端口号】 -u 用户名 -p密码
退出:exit 或者 Ctrl+C
DQL语言
基础查询
一、语法
select 查询列表
from 表名;
二、特点
1、查询列表可以是字段、常量、表达式、函数、也可以是多个
2、查询结果是一个虚拟表
三、示例
1、查询单个字段
select 字段名 from 表名;
2、查询多个字段
select 字段名,字段名 from 表名;
3、查询所有字段
select * from 表名;
4、查询常量
select 常量值;
5、查询函数
select 函数名(实参列表);
6、查询表达式
select 1000/20;
7、起别名
(1)as
(2)空格
8、去重
select distinct 字段名 from 表名;
9、+
作用:做加法运算
select 数值+数值; 直接运算
select 字符+数值; 先企图将字符转换为数值,如果转换成功,则继续运算,否则转换成0再继续运算。
select null+数值; 结果都为null
10、concat函数
功能:拼接字符
select concat(字符1,字符2,…);
11、ifnull函数
功能:判断某字段或表达式是否为null,如果为null,返回指定的值,否则返回原本的值。
select ifnull(字段名,0) from 表名;
12、isnull函数
功能:判断某字段是否为null,如果是,则返回1,否则返回0
条件查询
一、语法
select 查询列表
from 表名
where 筛选条件
二、筛选条件的分类
1、简单条件运算符
< > = <> != <= >= <=>安全等于
2、逻辑运算符
&& and
|| or
! not
3、模糊查询
like:一般搭配通配符使用,用于判断字符型或数值型
通配符:_下划线任意单个字符,%百分号任意多个字符。
between and
in
is null /is not null:用于判断null值
is null PK <=>
普通类型的数值 | null值 | 可读性 | |
---|---|---|---|
is null | × | √ | √ |
<=> | √ | √ | × |
排序查询
一、语法
select 查询列表
from 表
where 筛选条件
order by 排序列表【asc|desc】
二、特点
1、asc:升序,如果不写默认升序
desc:降序
2、排序列表支持单个字符、多个字符、函数、表达式、别名
3、order by 的位置一般在查询语句的最后(除limit语句外)
常见函数
一、概述
功能:类似于Java中的方法
好处:提高重用性和隐藏实现细节
调用:select 函数名(实例列表);
二、单行函数
1、字符函数
concat:连接
substr:截取子串
upper:变大写
lower:变小写
replace:替换
length:获取字节长度
train:去前后空格
lpad:左填充
rpad:右填充
instr:获取子串第一次出现的索引
2、数学函数
round:四舍五入
ceil:向上取整
floor:向下取整
mod:取模
truncate:截断
rand:获取随机数,返回0-1之间的小数
3、日期函数
now:返回当前日期+时间
year:返回年
month:返回月
day:返回日
date_format:返回日期转换成字符
curdate:返回当前日期
str_to_date:将字符转换成日期
curtime:返回当前时间
hour:小时
minute:分钟
second:秒
datediff:返回两个日期相差的天数
monthname:以英文形式返回月
4、其他函数
version 当前数据库服务器版本
database 当前打开的数据库
user 当前用户
password(‘字符’):返回该字符的密码形式
md5(‘字符’):返回该字符的md5的密码形式
5、流程控制函数
- if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2
- case情况1
case 变量或表达式或字段
when 常量1 then 值1
when 常量2 then 值2
…
else 值a
end - case情况2
case
when 条件1 then 值1
when 条件2 then 值2
…
else 值a
end
分组函数
1、分类
max 最大值
min 最小值
avg 平均值
sum 求和
count 计算个数
2、特点
(1)语法
select max(字段) from 表名;
(2)支持的类型
sum和avg一般用于处理数值型
max、min、count可以处理任何数值类型
(3)以上分组函数都忽略null
(4)都可以搭配distinct使用,实现去重的统计
例:select sum(distinct 字段) from 表名;
(5)count函数
count(字段):统计该字段非空值的个数
count(*):统计结果集的行数
count(1):统计结果集的行数
效率上:
MyISAM存储引擎:count(*)最高
InnoDB:count(*)和count(1)效率>count(字段)
(6)和分组函数一同查询的字段,要求是group by后出现的字段
分组查询
一、语法
select 分组函数,分组后的字段
from 表名
【where 筛选条件】
group by 分组的字段
【having 分组后的筛选】
【order by 排序列表】
执行顺序:from👉where👉group by👉having👉select👉order by
二、特点
使用关键字 | 筛选的表 | 位置 | |
---|---|---|---|
分组前筛选 | where | 原始表 | group by的前面 |
分组后筛选 | having | 分组后的结果 | group by的后面 |
连接查询
一、含义
当查询中涉及到了多个表的字段,需要使用多表连接
select 字段1,字段2
from 表1,表2…
笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决:添加有效的连接条件
二、语法
1、等值连接
select 查询列表
from 表1 别名,表2 别名
where 表1.key = 表2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by排序字段】
特点:
- 一般为表起别名
- 多表的顺序可以调换
- n表连接至少需要n-1个连接条件
- 等值连接的结果是多表的交集部分
2、非等值连接
select 查询列表
from 表1 别名,表2 别名
where 非等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by排序字段】
3、自连接
select 查询列表
from 表 别名1,表 别名2
where 等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by排序字段】
4、内连接
select 查询列表
from 表1 别名
inner join 表2 别名 on 连接条件
【where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 字句;】
特点:
- 多表的顺序可以调换
- 内连接的结果=多表的交集
- n表连接至少需要n-1个连接条件
5、外连接
select 查询列表
from 表1 别名
left|right|full【outer】 join 表2 别名 on 连接条件
【where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 字句;】
特点:
- 查询的结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配则显示null
- full join 两边都是主表
- 一般用于查询除了交集部分的剩余的不匹配的行
6、交叉连接
select 查询列表
from 表1 别名
cross join 表2 别名;
特点:
类似于笛卡尔乘积
子查询
一、含义
嵌套在其他语句内部的select语句成为子查询或内查询
外面的语句可以是insert、update、select等,一般select比较多
外面如果为select语句,则此语句称之为外查询或主查询
二、分类
1、按出现位置
select后面
仅仅支持标量子查询
from后面
表子查询
where或者having后面
标量子查询
列子查询
行子查询
exists后面
标量子查询
列子查询
行子查询
表子查询
2、按结果集的行列
标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
表子查询:结果集为多行多列
分页查询
一、应用场景
当要查询的条目数太多,一页显示不全
二、语法
select 查询列表
from 表
limit 【offset,】size;
offset代表的是起始的条目索引,默认从0开始
size代表的是显示的条目数
公式:
假如要显示的页数为page,每一页条目数为size
select 查询列表
from 表
limit (page-1)*size,size;
联合查询
一、含义
union:合并、联合、将多次查询结果合并成一个结果
二、语法
查询语句1:
union 【all】
查询语句2:
union 【all】
…
三、意义
1、将一条比较复杂的查询语句拆分成多条语句
2、适用于查询多个表的时候,查询的列基本是一致
四、特点
1、要求多条查询语句的查询列数必须一致
2、要求多条查询语句的查询的各列类型、顺序最好一致
3、union 去重,union all包含重复项
查询总结
语法:
select 查询列表 7
from 表1 别名 1
连接类型 join 表2 别名 2
on 连接条件 3
where 筛选 4
group by 分组列表 5
having 筛选 6
order by 排序列表 8
limit 起始条目索引,条目数; 9
DML语言
插入
一、方法一
语法:
insert into() 表名(字段名…) value(值…)
特点:
1、要求值的类型和字段的类型要一致或兼容
2、字段的个数和顺序不一定和原始表中的字段个数和顺序一致
但必须保证值和字段一一对应
3、假如表中有可以为null的字段,可以通过以下两种方式插入null值
(1)字段和值都省略
(2)字段写上,值使用null
4、字段和值的个数必须一致
5、字段名可以省略,默认所有列
二、方式二
语法:
insert into 表名 set 字段=值,字段=值…
两种方式的区别:
1、方式一支持一次插入多行,语法如下:
insert into 表 【(字段名,…)】 value(值,…),(值,…),…
2、方式一支持子查询,语法如下:
insert into 表名
查询语句;
修改
一、修改单表的记录(⭐)
语法:
update 表名 set 字段=值,字段=值 【where 筛选条件】;
二、修改多表的记录【补充】
语法:
update 表1 别名
left|right|inner join 表2 别名
on 连接条件
set 字段=值,字段=值
【where 筛选条件】;
删除
方式一:使用delete
一、删除单表的记录(⭐)
语法:
delete from 表名 【where 筛选条件】;
二、级联删除【补充】
语法:
delete 别名1,别名2 from 表1 别名
left|right|inner join 表2 别名
on 连接条件
【where 筛选条件】;
方式二:使用truncate
语法:
truncate table 表名;
两种方式的区别【面试题】(⭐)
1、truncate删除后,如果再插入,标识列从1开始
delete删除后,如果再插入,标识列从断点开始
2、delete可以添加筛选条件
truncate不可以添加筛选条件
3、truncate效率高
4、truncate没有返回值
delete可以返回受影响的行数
5、truncate不可以回滚
delete可以回滚
DDL语言
库的管理
一、创建库
create database 【if not exists】 库名 【character set 字符集名】;
二、修改库
alter database 库名 character set 字符集名;
三、删除库
drop database 【if exists】 库名;
表的管理
一、创建表(⭐)
create table 【if not exists】 表名 (
字段名 字段类型 【约束】,
字段名 字段类型 【约束】,
…
字段名 字段类型 【约束】
)
二、修改表
1、添加列
alter table 表名 add column 列名 类型【first|after 字段名】;
2、修改列的类型或约束
alter table 表名 modify column 列名 新类型 【新约束】;
3、修改列名
alter table 表名 change column 旧列名 新列名 类型;
4、删除列
alter table 表名 drop column 列名;
5、修改表名
alter table 表名 rename 【to】 新表名;
三、删除表
drop table 【if exists】表名;
四、复制表
1、复制表的结构
create table 表名 like 表名;
2、复制表的结构+数据
create table 表名
select 查询列表 from 旧表 【where 筛选】
数据类型
一、数值型
1.整形
tynyint | smallint | mediumint | int/integer | bigint |
---|---|---|---|---|
1 | 2 | 3 | 4 | 8 |
特点: | ||||
(1)都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号 | ||||
(2)如果超出了范围,都会报out or range 异常,插入临界值 | ||||
(3)长度可以不指定,默认会有一个长度 | ||||
长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号的整形 |
2.浮点型
定点数:decimal(M,D)
浮点数:float(M,D)、double(M,D)
特点:
(1)M代表整数部位+小数部位的个位,D代表小数部位
(2)如果超出范围,则报out or range异常,并且插入临界值
(3)M和D都可以省略,但对于定点数,M默认为10,D默认为0
(4)如果精度要求较高,则优先考虑使用定点数
二、字符型
char、varchar、binary、varbinary、enum、set、text、blob
char:固定长度的字符,写法为char(M),最大长度不能超过M,其中M可以省略,默认为1
varchar:可变长度的字符,写法为varchar(M),最大长度不能超过M,其中M可以省略
三、日期型
year 年
date 日期
time 时间
datetime 日期+时间 8
timestamp 日期+时间 4 比较容易受时区、语法模式、版本的影响,更能反应当前时区的真实时间
常见的约束
含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
分类:六大约束
NOT NULL :非空,用于保证该字段的值不能为空
比如姓名、学号等
DEFAULT:默认,用于保证该字段有默认值
比如性别
PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
比如学号、员工编号等
UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
比如座位号
CHECK:检查约束【Mysql中不支持】
比如年龄、性别
FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在从表添加外键约束,用于引用主表中某列的值
比如学生表的专业编号,员工表的部门编号,员工表的工种编号
主键和唯一的区别:
1、一个表至多有一个主键,但是可以有多个唯一
2、主键不允许为空,唯一可以为空
主键和唯一的相同点
都具有唯一性
都支持组合键,但不推荐
添加约束的时机:
1、创建表时
2、修改表时
约束的添加分类:
列级约束:
六大约束语法上都支持,但外键约束没有效果
表级约束
除了非空、默认,其他都支持
创建表时添加约束
create(
字段名 字段类型 PRIMARY KEY , #主键
字段名 字段类型 not null , #非空
字段名 字段类型 UNIQUE, #唯一
字段名 字段类型 DEFAULT, #默认
constraint 约束名 foreign key(字段名) references 主表 (被引用列)
)
TCL语言
事务
一、含义
事物:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行
二、特点(ACID)
A原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
C一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态
I隔离性:一个事物不受其他事物的干扰,多个事物相互隔离
D持久性:一个事物一旦提交,则永久的持久化到本地
三、事务的使用步骤(⭐)
了解:
隐式(自动)事务:没有明显的开启和技术,本身就是一条事务可以自动提交,比如insert、update、delete
显示事务:具有明显的开启和结束
使用显示事务:
(1)开启事务
set autocommit=0;
start transaction; #可以省略
(2)缩写一组逻辑sql语句
注意:sql语句支持的是insert、update、delete
设置回滚点:
savepoint 回滚点名;
(3)结束事务
提交:commit
回滚:rollback
回滚到指定的地方:rollback to 回滚点名;
四、并发事务
1、事务的并发问题是如何发生的?
多个事务 同时 操作 同一个数据库的相同数据时
2、并发问题有哪些
脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据
不可重复读:一个事务多次读取,结果不一样
幻读:是指当事务不是独立执行时发生的一种现象。例如,第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行,同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
3、如何解决并发问题?
通过设置隔离级别来解决并发问题
4、隔离级别
Read Uncommitted(RU):读取未提交内容。所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(RC):读取已提交内容。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。有不可重复读的问题,并发读取数据时会发生。
Repeatable Read(RR):这是MySQL默认隔离级别,可重复读。解决了不可重复读的问题,但是有幻读的问题,可通过MVCC解决(InnoDB)。
Serializable:可串行化。通过强制事务排序,使之不会发生冲突,解决幻读的问题。会在每个读取的行上枷锁,效率低。
一般来说,低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。然而,低级别的隔离级别可能会导致一些问题,如脏读和不可重复读。因此,在实践中,通常推荐使用中级别的隔离级别,如MySQL的默认隔离级别RR。
视图
一、含义
MySQL5.1版本出现的新特性,视图是一种虚拟表,它是基于一个或多个实际表的查询结果集。与实际表一样,视图可以被查询和操作。视图可以看作是一个动态生成的数据表,其内容是从其他表中选择、过滤和计算得到的。
好处:
1、简化sql语句
2、提高了sql的重用性
3、保护基表的数据,提高了安全性
二、创建
CREATE VIEW view_name
AS
查询语句;
三、修改
方式一:
create or replace view 视图名
as
查询语句;
方式二:
alter view 视图名
as
查询语句;
四、删除
drop view 视图1,视图2…;
五、查看
desc 视图名;
show create view 视图名;
六、使用
1、插入
insert
2、修改
update
3、删除
delete
4、查看
select
注意:视图一般用于查询,而不是更新的,所以具备以下特点的视图都不允许更新
(1)包含分组函数、group by、distinct、having、union
(2)join
(3)常量视图
(4)where后的子查询用到了from中的表
(5)用到了不可更新的视图
七、视图和表的对比
关键字 | 是否占用物理空间 | 使用 | |
---|---|---|---|
视图 | view | 占用较小,只保存sql逻辑 | 一般用于查询 |
表 | table | 保存实际的数据 | 增删改查 |