数据库概念
数据库是“按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合。
数据库分类
网状结构数据库:美国通用电气公司IDS(Integrated Data Store),以节点形式存储和访问。
层次结构数据库:IBM公司IMS(Information Management System)定向有序的树状结构实现存储和访问。
关系结构数据库:Oracle、DB2、MySQL、SQL Server,MariaDB以表格(Table)存储,多表间建立关联关系,通过分类、合并、连接、选取等运算实现访问。
非关系型数据库:ElastecSearch、MongoDB、Redis,多数使用哈希表,表中以键值(key-value)的方式实现特定的键和一个指针指向的特定数据。
常见的数据库管理系统
Oracle,DB2,SQL Server,SQLLite,MySQL,MariaDB
MySQL下载与安装
官方网站 MySQL
一直next不需要任何操作
安装完成,finish
配置环境变量
系统属性,环境变量,系统变量找到path,编辑,添加,C:\Program Files\MySQL\MySQL Server 8.0\bin 完成,退出即可
客户端登陆:mysql -u root -p
SQL语言
约束
主键约束(primary key)
外键约束(foreign key)
自增约束(auto_increment)
唯一约束(unique)
非空约束(not null)
默认值(default)
DDL
数据库操作(熟悉即可)
SHOW DATABASES; #显示当前MySQL中包含的所有数据库
CREATE DATABASE mydb1; #创建mydb数据库
CREATE DATABASE mydb2 CHARACTER SET gbk; #创建数据库并设置编码格式为gbk
CREATE DATABASE IF NOT EXISTS mydb4; #如果mydb4数据库不存在,则创建;如果存在,则不创建。
SHOW CREATE DATABASE mydb2; #查看创建数据库时的基本信息
ALTER DATABASE mydb2 CHARACTER SET gbk; #修改数据库的字符集
DROP DATABASE mydb1; #删除数据库mydb1
select database(); #查看当前使用的数据库
USE mydb1; #使用mydb1数据库
数据表操作(熟悉即可)
show tables;-- 在mydb1中展示一下所有表
创建表(重要)
CREATE TABLE 表名(
列名 数据类型(长度) [约束],
列名 数据类型(长度) [约束],
....
列名 数据类型 [约束] //最后一列的末尾不加逗号
);
desc stu;查看表结构
ALTER TABLE subject ADD gradeId int;#在课程表基础上添加gradeId 列
ALTER TABLE subject DROP gradeId;#删除课程表中 gradeId 列
ALTER TABLE subject CHANGE subjectHours classHours int ;#修改课程表中 subjectHours 列为 classHours
ALTER TABLE subject rename sub;#修改课程表的subject 为 sub
DROP TABLE sub;#删除学生表
DML
插入
insert into 表名 (字段1,字段2,...) values (值1,值2,...);
insert into 表名 values (值1,值2,...);
更新/修改
update 表名 set 字段 = 新值 [, 字段2 = 新值2, ... ] [where 字段 = 值];
删除
delete from 表名 where 字段 = 值; -- 只删除符合条件的数据
DQL
单表查询
基本查询
select 字段1,字段2,... from 表名;
条件查询
select 字段1,字段2,... from 表名 where 字段 条件 值;
模糊查询
select 字段1,字段2,... from 表名 where 字段 like '_值%';
排序查询
select 字段1,字段2,... from 表名 order by 字段 [desc|asc];
聚合查询
count(expr) max(expr) min(expr) avg(expr) sum(expr)
去重查询
select count(distinct age) from stu;
分组查询
select 字段1,字段2,... from 表名 [where 字段 条件 值] group by 字段 having 字段 条件值;
多表联查
内连接
select 字段列表 from 表1 inner join 表2 on 表1.字段 = 表2.字段
外连接
select 字段列表 from 表1 left|right outer join 表2 on 表1.字段 = 表2.字段
子查询
将sql语句当表,写在from后面
将sql语句当条件,写在where后面
函数
字符串函数
函数 | 解释 |
CONCAT (string2 [,... ]) | 连接字串 |
LENGTH (string ) | string长度 |
REPLACE (str ,search_str ,replace_str ) | 在str中用replace_str替换search_str |
SUBSTRING (str , position [,length ]) | 从str的position开始,取length个字符 |
LTRIM (string2 ) RTRIM (string2 ) trim | 去除前端空格或后端空格 |
数学函数
CEILING (number2 ) | 向上取整 |
FLOOR (number2 ) | 向下取整 |
FORMAT (number,decimal_places ) | 保留小数位数,格式化format(x,y),对x保留y位小数,会四舍五入 |
RAND([seed]) | RAND([seed]),seed是种子,可不写.写了随机数固定 |
ROUND(x,[d]) | 将x四舍五入,d是保留的位数,可不写 |
TRUNCATE(X,D) | 截取 |
日期函数
函数 | 解释 |
SYSDATE() | 当前时间 |
CURRENT_DATE ( ) | 当前日期 |
CURRENT_TIME ( ) | 当前时间 |
CURRENT_TIMESTAMP ( ) | 当前时间戳 |
DATE (datetime ) | 返回datetime的日期部分 |
DATEDIFF (date1 ,date2 ) | 两个日期差 |
NOW ( ) | 当前时间 |
YEAR|MONTH|DATE (datetime ) | 年月日 |
日期字符串转换函数
函数 | 解释 | 说明 |
date_format(日期,模板)(8版本已经移除) | 日期 --> 字符串 | 格式化 |
str_to_date(字符串,模板) | 字符串 --> 日期 | 解析 |
流程函数
函数 | 解释 |
IF(expr1,expr2,expr3) | 如果expr1为真,则返回expr2,否则返回expr3,相对于是三目运算 |
IFNULL(expr1,expr2) | 如果 expr1不是NULL,则返回expr1,否则返回expr2; 一般用来替换NULL值,因为NULL值是不能参加运算的 |
CASE WHEN [expr1] THEN [result1]… ELSE [default] END | 如果expr是真, 返回result1,否则返回default |
事务
事务的概念
事务是一个原子操作。是一个最小执行单元。可以由一个或多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败,整个事务都执行失败。
事务的操作
开启事务 start transaction 或者 begin
提交事务 commit
回滚事务 rollback
事务的特性(ACID)
原子性
(Atomicity):指事务的整个操作是一个整体,要么都成功,要么都失败
一致性
(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。
隔离性
(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一 个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性
(Durability):指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。回滚不了的
事务的隔离级别
读未提交
-READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
读已提交
-READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。
(oracle 默认的)
可重复读-
REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。
(mysql 默认),行锁
串行化-
SERIALIZABLE: 避免赃读、不可重复读、虚读。
串行化,其实是表锁
隔离级别产生的问题
赃读:指一个事务读取了另一个事务未提交的数据。
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。一个事务读取到了另一个事务提交后的数据。(update)
虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。 (insert)