目录
数据库
英语单词DataBase,简称DB
按照一定格式存储数据的一些文件的集合
就是存储数据的仓库,实际上就是一堆文件,这些文件中存储了相同类型的数据
用处
1.实现数据持久化到本地;
2.使用完整的管理系统统一管理,可以实现结构化查询,方便管理;
数据库管理系统
DataBaseManagement,简称DBMS
数据库管理系统是专门对数据库中的数据进行增删改查
常见的数据库管理系统:MySQL,Oracle,SQLserver等
SQL
结构化查询语言,程序员通过编写SQL语句,由数据库管理系统进行执行SQL语句,来对数据库中的数据进行增删改查
SQL是一套标准,学习的SQL语句在其他的数据库管理系统中也可以使用
三者之间的关系
数据库管理系统---执行--->SQL语句---操作-->数据库中的数据
MySQL数据库
注释
#单行注释
--单行注释
/*
*/多行注释
SQL语句
注:所有的SQL语句都是通用的,都以";"结尾,SQL语句不区分大小写
DDL
数据(结构)定义语言,主要操作的是表中的结构,不是表中的数据 常用的语句:create ,alter,drop
对数据库的操作
创建,删除数据库 CREATE DATABASE [if not exists] 数据库名 [ CHARSET utf8] 删除数据库 DROP DATABASE 数据库名 / [IF EXISTS数据库名]; 修改字符集 ALTER DATABASE 数据库名 CHARSET gbk
注:MySQL数据库不支持修改数据库名
对表的操作
创建表
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型
);
表名:建议以t_ 或者tbl_开始,可读性强
字段名:见名知意
字段的数据类型
字符型:(最长255)
char 定长的,会自动补全到定义的长度,不需要动态的分配空间,速度快,但是可能会造成空间的浪费
varchar 变长的,根据实际的长度动态分配空间来存储,节省空间,但是速度慢
日期型 :date 年月日
datetime 年月日时分秒
数值型:float
double 常用,精度更高
数据类型(M,D)
M指的是精度,数据的总长度
D指的是标度,小数点后的长度
整数型 :tinyint 1字节
smallint 2字节
mediumint 3字节
int 最常用 4字节 最长11
bigint 8字节
clod 字符大对象
最多可以存储4G的字符串
blod 二进制大对象,专门存储图片,声音,视频等流媒体数据
TEXT文本类型,可以存储更多字符
tinytext ,text,mediumtext,longtext
指定默认值:default
约束
约束如果没有在列的后面,就属于表级约束,需要给多个字段联合起来添加一个约束的时候,就需要用到表级约束
在MySQL中,如果一个字段同时被not null和unique约束的话,该字段就可以被当做主键
1.主键约束 primary key auto_increment
表中必须有一列的值能够唯一的表示一条记录,主键不能为空,主键列在一张表中只能有一个,且不能重复,MySQL支持主键列自动增长
2.不能为空(没有表级约束)
not null
约束的字段不能为null
3.唯一约束
unique
约束的字段不能重复,但是可以为null
unique(字段名1,字段名2)两个字段联合起来唯一
4.检查约束
check
5.外键约束(多表)
添加外键约束的是子表
删除表,先删除子,再删除父
创建表,先创建父,在创建子
foreign key(字段名) references 表名(字段名)
外键可以为null,外键引用的字段至少是具有唯一性,但不一定是主键
删除表
drop table [if exists ]表名
truncate table 表名(清空整张表)
物理删除,删除效率比较高,表被一次删除,但是不可以恢复
修改表名
RENAME TABLE 旧表名 TO 新表名
复制表结构
CREATE TABLE 新表名 LIKE 被复制表名;
DML
数据操作语言
插入数据
insert into 表名 (字段名1,字段名2,字段名3..) values (值1,值2,值3..);
修改数据
update 表名 set 字段名1=值1,字段名2=值2 where 条件
没有条件限制会导致所有数据全部更新
删除数据
delete from 表名 where 条件
数据在硬盘上的真实储存空间没有释放,删除效率比较低
注:没有条件,整张表的数据就会全部删除
DQL(数据查询语言)
查询数据,凡是带有select关键字的都是查询语句
简单查询
1.查询一个字段:select 字段名 from 表名
select 和from都是关键字,字段名和表名都是标识符
2.查询多个字段: select 字段名1,字段名2 from 表名
用逗号隔开即可
3.查询全部字段: 3.1 :select * from 表名(不建议用,效率低,可读性差)
3.2 select 全部字段名 from 表名
用as关键字给查询的字段名起别名
条件查询
查询表中符合条件的数据
select 字段名 from 表名 where 条件
条件:=, != , <>(不等于),>, <, >=, <=
between ....and 在两个值之间,必须遵循左小右大,闭区间,包含两边的值
is null 为空
is not null 不为空(注:在数据库中,null不能为等号衡量)
and 且
or 或 (and优先级高于or)
in 包含 ,相当于多个or,in后面跟的是具体的值
not in 不包含,不在这个范围内
not 取非
like 模糊查询,支持%或下划线匹配,%匹配任意多个字符._任意一个字符
排序
select 字段名 from 表名 order by 字段名(默认是升序)
select 字段名 from 表名 order by 字段名 desc 降序
select 字段名 from 表名 order by 字段名 asc 指定升序
多个字段排序
select 字段名 from 表名 order by 字段名1,字段名2
先按照字段1排序,只有字段1相等时才会根据字段2排序
数据处理函数
又被称为单行处理函数,一个输入对应一个输出
字符函数
lower 转为小写
upper 转为大写
substr 取子串,substr(被截取的字符串,起始下标,截取的长度)
注:起始下标从1开始
length():获取长度
trim 去空格
算数函数
round 四舍五入
rand 生成随机数
ifnull 可以将null转换为一个具体值,ifnull是空处理函数,专门处理空的,null只要参与运算,最终结果一定是null,ifnull(数据,被当作哪个值)
逻辑函数
case when 条件 then 结果1 when 条件 then 结果2 else 结果3 end;
日期函数
now():返回当前系统日期+时间
curdate():返回当前系统日期,不包含时间
curtime():返回当前时间,不包含日期
可以获取指定的部分,年、月、日、小时、分钟、秒
YEAR(日期列),MONTH(日期列),DAY(日期列) ,
HOUR(日期列) ,MINUTE(日期列) SECOND(日期列)
str_to_date:将日期格式的字符转换成指定格式的日期
date_format:将日期转换成字符串
datediff(big,small):返回两个日期相差的天数
format(字段名,'格式')'$99.99'
str_to_date:将字符串varchar类型转换为date类型
(字符串,日期格式)
date_format:将date类型转换为具有一定格式的varchar字符串类型
MySQL日期格式:
%Y年
%m月
%d日
%h时
%i分
%s秒
分组函数
多行处理函数,输入多行,最终输出一行
分类:
sum 求和
avg 平均值
max 最大值
min 最小值
count 计数
注:1.必须进行分组然后才能使用
2.分组函数自动忽略null,不需要提前对null进行处理
3.count(具体字段):表示统计该字段中所有不为null的元素的总数
count(*):表示统计表中的总行数,只要有一行数据,count++
分组查询
select ... from .... group by...
在一条select语句中,如果有group by 语句的话,select后面只能跟:参加分组的字段以及分组函数,其他的一律不能跟
使用having可以对分组之后的数据进一步操作,但是不能单独使用,只能与group by 联合使用
把查询结果去除重复记录
关键字 distinct
使用时必须放在所有字段的前面
执行顺序
select ...
from ...
where ...
group by...
having..
order by ..
执行顺序不可以改变,排序总是在最后执行
第一步form 第二步 where 第三步 group by 第四步having 第五步 select 第六步 order by
多表操作
在一个复杂的系统中,建议把不同的信息存储在不同的表中,但是表与表之间有联系,进行表的设计
连接查询
多张表联合起来查询数据,称为连接查询
分类
根据语法的年代进行分类
SQL92:1992年出现的语法
SQL99:1999年出现的语法
根据表连接的方式进行连接
内连接
查询的表是平等的关系
1.等值连接
SQL92:select ...
from....
where...
SOL99:select
from...
inner join...(inner可以省略,带着可读性更好)
on.....(连接条件,条件是等量关系)
SQL99连接的条件是独立的,如果还需要进一步筛选,再往后添加where
2.非等值连接
条件不是等量关系
3.自连接
技巧:一张表看成两张表
外连接
表存在主次关系
1.左连接(左外连接)
select..
from..
left join..(left关键字表示把左边的表看做是主表,为了将这张表中的全部数据查询出来,捎带着关联查询右边的表)
on...
2.右连接(右外连接)
select..
from..
right join..(right关键字表示把右边的表看做是主表,为了将这张表中的全部数据查询出来,捎带着关联查询左边的表)
on...
两者可以互换
全连接
笛卡尔积现象
当两张表进行连接查询时,没有任何的条件限制,就会出现笛卡尔积现象,是两张表条数的乘积
注:表的连接次数越多,效率越低,尽量避免表的笛卡尔积现象
多张表
语法:select...
from a
join b
on a和b的连接条件
join c
on a和c的连接条件
join d
on a和d的连接条件
一条SQL中内连接和外连接可以混合,都可以出现
子查询
select语句中嵌套select语句,被嵌套的select语句称为子查询
出现的位置:select
....(select)
from
....(select)
where
...(select)
where字句中出现子查询
找出比最低工资高的员工姓名和工资
第一步:查询最低工资
select min(..)
from....
第二步找出大于最低工资的
select ...,....
from ...
where...
第三步合并
将第一步的查询语句替换到第二步中具体结果中
from子句中的子查询
from后面的子查询,可以将子查询中的查询结果当做一张临时表
select子句中的子查询
union关键字
将查询结果连接起来,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,union可以减少匹配的次数,在减少匹配次数的情况下,还可以完成两个结果集的拼接
注意事项:进行结果集合并时,要求结果集的列数相同
数据类型相同
limit关键字
将查询结果提取一部分,通常使用在分页查询中
分页的目的是为了提高用户体验
limit startIndex,length
起始下标(从0开始),长度
注:limit在order by后面执行
分页
limit (页码-1)*记录条数,记录条数
数据库设计范式
第一范式:要求每一张表必须要有主键,每一个字段具有原子性
第二范式:建立在第一范式的基础上,要求所有的非主键字段完全依赖主键,不要部分依赖
第三范式:建立在第二范式的基础上,要求所有的非主键字段直接依赖主键,不要产生传递依赖
一对多:两张表,多的表加外键
一对一,外键唯一
多对多,三张表,关系表两个外键