1.1数据库相关概念
名称 | 全称 | 简称 |
数据库 | 存储数据的仓库,数据是有组织的进行存储 | DataBase(DB) |
数据库管理系统 | 操纵和管理数据库的大型软件 | DataBase Management System (DBMS) |
SQL | 操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 | Structured Quary Language(SQL) |
1.2数据模型
1)关系型数据库
概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库,基于二维表存储
2)关系型数据库特点:
a.使用表存储数据,格式统一,便于维护。
b.使用SQL语言操作,标准统一,使用方便。
2.SQL
全程Structured Query Language,结构化查询语句。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。
2.1SQL通用语法
1).SQL语句可以单行或多行书写,以分号结尾。
2).SQL语句可以单独使用空格/缩进来增强语句的可读性。
3).Mysql数据库的SQL语句不区分大小写,关键字建议使用大写。
4)注释:
- 单行注释:-- 注释内容 或 # 注释内容
- 多行注释:/*注释内容*/
2.2SQL分类
SQL语句,根据其功能,主要分为四类:DDL,DML,DQL,DCL.
分类 | 全称 | 说明 |
DDL |
Data Definition
Language
| 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML |
Data Manipulation
Language
| 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL |
Data Query Language
| 数据查询语言,用来查询数据库中表的记录 |
DCL |
Data Control Language
| 数据控制语言,用来创建数据用户,控制数据库的访问权限 |
2.3DDL
数据定义语言,用来定义数据库对象(数据库,表,字段)
2.3.1 数据库操作
1).查询所有数据库
select databases;
2).查询当前数据库
select database();
3).创建数据库
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序 规则];
注:方括号里是可选项,以下都是
4)删除数据库
drop database [if exists] 数据库名;
5)切换数据库
use 数据库名;
2.3.2表操作
2.3.2.1表操作-查询创建
1)查询当前数据库所有表
show tables;
2)查看指定表结构
desc 表名;
3)查询指定表的建表语句
show create table 表名;
4)创建表结构
create table 表名(
字段1 字段1类型[comment 字段1注释],
字段1 字段1类型[comment 字段1注释],
....
)[comment 表注释];
2.3.2.2 表操作-数据类型
MySQL数据类型主要有三类:数值类型,字符串类型,日期时间类型。
1)数值类型
2)字符串类型
char与varchar都可以描述字符串,char是定长字符串,指定长度多长,就占用多少个字符,和字段值的长度无关。而varchar是变长字符串,指定的长度为最大占用长度。相对来说。char的性能会更高些。
3)日期类型
2.3.2.4 表操作-修改
1)添加字段
alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];
2)修改数据类型
alter table 表名 modify 字段名 新数据类型(长度);
modify 调整,修改,变更
3)修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];
4)删除字段
alter table 表名 drop 字段名;
5)修改表名
alter table 表名 rename to 新表名;
2.3.2.5 表操作-删除
1)删除表
drop table [if exists] 表名;
2)删除指定表,并重新创建表
truncate table 表名;
2.4 DML
数据操作语言,用来对数据库表中的数据进行增删改
2.4.1 添加数据
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,...);
2.4.2 修改数据
语法
update 表名 set 字段名1=值1,字段名2=值2,...[where 条件];
2.4.3 删除数据
delete from 表名 [where 条件];
2.5 DQL
2.5.1 语法结构
select
字段列表
from
表明列表
where
条件
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
2.5.2 基础查询
1)查询多个字段
select 字段1,字段2,... from 表名
SELECT * FROM 表名 ;
2)字段设置别名
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
或
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;
3)去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
2.5.3 条件查询
1)语法
select 字段列表 from 表名 where 条件列表;
2)条件
常见的比较运算符:
常见的逻辑运算符:
2.5.4 聚合函数
1)常见的聚合函数
2)语法
select 聚合函数(字段列表) from 表名;
注意:null值是不参与所有聚合函数运算的。
2.5.5 分组查询
1)语法
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
2)where与having区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
2.5.6 排序查询
1)语法
select 字段列表 from 表名 order by 字段1,排序方式1,字段2 排序方式2;
如果两个数据按照方式一排序相等,则按照方式二排序。
2)排序方式
- asc:升序(默认值)
- desc:降序
- 如果是升序,可以不指定排序方式asc;
- 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序;
2.5.7 分页查询
1)语法
select 字段列表 from 表名 limit 起始索引,查询记录数;
注意事项:
- 起始索引从0开始,起始索引=(查询页码-1) * 每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是limit。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10;
2.5.8with子句
with子句提供了一种定义临时关系的方式,这个定义只对包含with子句的查询有效。
with 临时表名(属性列) as (select 属性1,属性2,... from 已知表)
select 属性 from 临时表,已知表 where 条件;
2.5.9 执行顺序
注:执行顺序对使用别名很重要。
2.6 DCL
DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户,控制数据库的访问权限。
2.6.1 管理用户
select * from myspl.user;
查询结果含义:其中 Host代表当前用户访问的主机, 如果为localhost, 仅代表只能够在当前本机访问,是不可以 远程访问的。 User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯一标识一 个用户。
2.6.2 权限控制
MySQL中定义了很多权限,但是常用的就一下几种:
权限 | 说明 |
all,all privileges | 所有权限 |
select | 查询权限 |
insert | 插入权限 |
update | 修改数据 |
delete | 删除数据 |
alter | 修改表 |
drop | 删除数据库/表/视图 |
create | 创建数据库/表 |
1)查询权限
show grants for '用户名'@'主机名';
2)授予权限
grants 权限列表 on 数据库名.表名 to '用户名'@'主机名';
3)撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
注意事项:
- 多个权限之间,使用逗号分隔
- 授权时,数据库名和表名可以使用 * 进行通配,代表所有
3.函数
3.1 字符串函数
常用的字符串函数:
基础用法:
1.select 函数;
2.用在更新数据
3.作为条件语句
3.2 数值函数
常见的数值函数:
函数 | 功能 |
ceil(x) | 向上取整 |
floor(x) | 向下取整 |
mod(x,y) | 返回x/y的模 |
rand() | 返回0~1内的随机数 |
round(x,y) | 求参数x的四舍五入的值,保留y位小数 |
案列:
select lpad (round(rand()*1000000,0),6,'0');
3.3 日期函数
常见日期函数:
函数 | 功能 |
curdate() | 返回当前日期 |
curtime() | 返回当前时间 |
now() | 返回当前日期和时间 |
year(date) | 获取指定date的年份 |
month(date) | 获取指定date的月份 |
day(date) | 获取指定date的日期 |
date_add(date,interval expr type) | 返回一个日期/时间加上一个时间1间隔erpr后的时间值 |
datediff(date1,date2) | 返回起始时间date1和结束时间date2之间的天数 |
3.4 流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。
演示:
select ifnull('ok','Default');
4 .约束
4.1 概述
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中的数据的正确,有效性和完整性。
分类:
注意:约束时作用于表中字段上的,可以在创建表/修改表的时候添加约束。
4.2外键约束
4.2.1 介绍
外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
4.2.2 语法
1)添加外键
create table 表名(
字段名 数据类型,
...
[constraint] [外键命名称 ] foreign key (外键字段名) references 主表 (主表列明)
);
alter table 表名 add constraint 外键名称 foreign key (外键字段名)
references 主表(主表列明);
2) 添加外键
alter table 表名 drop foreign key 外键名称;
4.2.3 删除/更新行为
添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为,具体的删除。更新行为有以下几种:
行为 | 说明 |
no action | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应的外键,如果有则不允许删除/更新。(与restrict一致)默认行为 |
restrict | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与no action 一致)默认行为 |
cascade (级联) |
当在父表中删除
/
更新对应记录时,首先检查该记录是否有对应外键,如果有,则 也删除/
更新外键在子表中的记录。
|
set null
|
当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表 中该外键值为null
(这就要求该外键允许取
null
)。
|
set default | 父表有变更时,子表将外键设置成一个默认的值(Innodb不支持) |
具体语法:
alter table 表名 add constraint 外键名称 foreign key (外键字段) references
主表名(主表字段名) on update 约束行为;
注:在一般的业务系统中,不会修改一张表的主键值。
5. 多表查询
5.1 多表关系
- 一对多(多对一)
- 多对多
- 一对一
5.1.1 一对多
- 案例:部门与员工的关系
- 关系:一个部门对应多个员工,一个员共对应一个部门
- 实现:在多的一方建立外键,指向一的一方外键
5.1.2 多对多
- 案例:学生与课程的关系
- 关系:一个学生可以选修多门课程。一门课程也可以供多个学生选择
- 实现:建立第三张中间表,中间表至少包含两个外键,分别是关联两方主键
- 如:
5.1.3 一对一
- 案例:用户与用户详情的关系
- 关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其它详情字段放在另一张表中,以提升操作效率
- 实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(unique)
5.2内连接
内连接:相当于A,B交集部分数据
内连接的语法分为两种:隐式内连接,显示内连接
1)隐式内连接
select 字段列表 from 表1,表2 where 条件...;
2)显示内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
5.3 外连接
外连接分为两种,分别是:左外连接 和 右外连接,具体的语法结构为:
1)左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件...;
左外连接相当于查询表(左表)的所有数据,当然也包含表1和表2交集部分的数据。
2)右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件...;
右链接相当于查询表2(右表)的所有数据,当然也包含表1和表2交集部分的数据。
注意:左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺序就可以了。而我们在日常开发使用时,更偏向于左外连接。
3)全外连接
select 参数列表 from 表1 full outer join 表2 on 条件...;
全外连接相当于查询两个表的所有数据。
5.4 子查询
5.4.1概述
SQL语句中嵌套select语句,称为嵌套查询,又称为子查询。
select * from t1 where coumn1 = (select coumn1 from t2);
子查询外部的语句可以是insert/update/delete/select的任何一个。
5.4.2 分类
根据查询结构结构不同,分为:
A. 标量子查询(子查询结构为单个值)
B. 列子查询(子查询结构为一列)
C. 行子查询(子查询结果为一行)
D. 表子查询(子查询结果为多行多列)
根据子查询的位置,分为:
A. where之后
B. from之后
C. select之后
5.4.3 标量子查询
子查询返回的结果是单个值(数字,字符串,日期等),最简单的形式,这种子查询称为标量子查询。
常用的操作符:= <> > >= < <=
5.4.4 列子查询
子查询返回的结果为一个列(可以多行),这种查询称为列子查询。
常用的操作符:in,not in ,any ,some ,all
5.4.5 行子查询
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:= ,<> ,in ,not in
5.4.6 表子查询
子查询返回的结果为是多行多列,这种子查询称为表子查询。
常用的操作符:in
6. 事务
6.1 事务简介
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
比如:张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加
正常情况:转账这个操作, 需要分为以下这么三步来完成 , 三步完成之后, 张三减少1000, 而李四
6.2 事务操作
6.2.1 控制事务一
1).查看/设置事务提交方式
1 select @@autocommit;
2 set @@autocommit=0;
2) .提交事务
commit
3).回滚事务
rollback
注意:上述的这种方式,我们修改了事务的自动提交行为,把默认的自动提交修改为了手动提交,此时我们执行的DML语句都不会提交,需要手动的执行commit进行提交。
6.2.2 控制事务二
1)开启事务
start transaction 或 begin;
2)提交事务
commit
3)回滚事务
rollback
6.3 事务四大特性
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的该表就是永久的。
上述就是事务的四大特性,简称ACID。
6.4 并发事务问题
1)脏读:一个事务读到另一个事务还没有提交的数据。
比如B读取到了A未提交的数据。
2)不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
事务A两次读取同一条记录,但是读取到的数据却是不一样的。
3)幻读:一个事务按照条件查询数据时,没有对应的数据行,但是插入数据时,又发现这行数据已经存在,好像出现了 "幻影";
6.5 事务隔离级别
为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有一下几种:
1)查询事务隔离级别
select @@transaction_isolation;
2)设置事务隔离级别
set [session | global] transaction isolation level {read uncommited | read commited | repeatable read | serializable};
{}表示事务的隔离级别,四选一
session表示针对于当前客户端有效
global表示对所有客户端有效