数据库入门笔记(基础篇)

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中需要通过HostUser来唯一标识一 个用户。

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位小数

 案列: 

通过数据库的函数,生成一个六位数的随机验证码。
思路: 获取随机数可以通过 rand() 函数,但是获取出来的随机数是在 0-1 之间的,所以可以在其基础 上乘以1000000 ,然后舍弃小数部分,如果长度不足 6 位,补 0
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 。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。

 正常情况:转账这个操作, 需要分为以下这么三步来完成 , 三步完成之后, 张三减少1000, 而李四

增加 1000, 转账成功 :

 

异常情况 : 转账这个操作 , 也是分为以下这么三步来完成 , 在执行第三步是报错了 , 这样就导致张
三减少 1000 块钱 , 而李四的金额没变 , 这样就造成了数据的不一致 , 就出现问题了。

 

为了解决上述的问题,就需要通过数据的事务来完成,我们只需要在业务逻辑执行之前开启事务,执行 完毕后提交事务。如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态。

 

注意:默认MySQL的事务时自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务。

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表示对所有客户端有效

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值