利用数据结构储存数据的仓库
操纵和管理数据的一套系统软件
关系型的数据库管理系统(RDBMS)
处理结构化数据(行和列)
非关系型数据库管理系统(Nosql)
数据多样性
关系的复杂性
高并发和高IO操作
redis/HBase/mongoDB/Neo4
开源免费的关系型的数据库管理系统。
利用表(数据库表)存储和管理数据,行称为记录,列称为字段。
管理多个数据库,每个数据库中管理多张表。
支持千万级的数据量。
支持GPL许可证。
1996年由MySQL AB公司开发完成;
2000年正式开源;
2008,mysql被sun公司以10亿美元收购
2009,sun被oracle以74亿美元收购
https://oracle.com
https://dev.mysql.com/downloads/
https://blog.csdn.net/a805814077/article/details/99707096
mysql -uroot -p密码
show database; 显示数据库
use dbname;切换数据库
show tables;展示表
客户端,利用图形界面来展示数据(友好),navicat,sqlyog等
结构化查询语言。关系数据库通用语言
结束的标识是:
字符串数据用引号;
大小不敏感
DDL(Data Definition Language):数据定义语言(结构)
实现数据库对象的操作(创建,修改和销毁)
create / alter / drop
DML(Data Manipulation Language):数据操作语言(数据)
增删改
insert / delete / update
DQL(Data Definition Language):数据查询语言
select
TCL(Transaction Control Language):事物的控制语句
comit / rollback(回滚)
DCL(Data Control Language):数据控制语言(授权)
grant / revoke
数据定义语言,用于操作数据库对象的结构
# 创建数据库
create database [if not exists] bd1906;
#销毁
drop database [if exists] bd1906;
1.创建表
create table student{
sid int,
sname VARCHAR(20),
age int,
gender VARCHAR(10)
};
# 查看表的状态
desc student;
2.修改结构(添加字段,销毁字段,修改字段(字段名称,类型,长度,位置,约束等))
alter table tname add/drop/change/modify colname coltype... first|after
* 添加字段
追加字段
alter table student add email varchar(20);
添加到首列
alter table student add phone char(11) first;
指定位置
alter table student add card char(18) after sid;
* 销毁字段
alter table student drop card;
* 修改字段
alter table student modify colname 类型 约束...
alter table student change 旧字段名称 新字段名称 类型 约束...
# 修改字段名称
alter table student change email semail varchar(20);
# 修改字段的类型和长度
alter table student modify name varchar(50);
# 修改位置
alter table student modify semail varchar(20) after
3.销毁表
drop table student;
4.修改表的名称
rename table student to stu;
5.清空表
truncate table stu;
delete,truncate和drop的区别?
delete删除(清空)某一条数据
truncate不改变机构,只清空数据和重置。
drop销毁表结构;
数值类型:
整数:
int / bigint
浮点数: float(10,2):长度是10,小数点后的位数是2 double(16,4):长度为16,小数点后的位数是4 decimal(m,n)金额等数据时必须使用decimal
字符串类型:必须指明长度
char(n):固定长度
varchar(n):可变长度
日期类型:
date:日期
time:时间
datetime:日期和时间
timestamp:时间戳
其他类型:
text: 文本类型
blob: 而进行数据类型
enum() / set() / json()
数据的准确性和可靠性
实体完整性
实体指的就是记录,就是保证记录是准确的,不重复的
# 场景1:创建表的同时添加约束
create table student(
sid int primary key,
sname varchar(20)
);
create table student(
sid int,
sname varchar(20),
primary key(sid)
);
# 场景2:表已经存在(主键字段绝对不能存在重复的数据)
alter table stu add constraint PK_ID primary key (sid);
# 注意:
1.每张表必须有主键,但是有且只能有一个,允许有联合主键
2.主键字段一般数据类型和长度尽可能小
3.主键字段不要使用业务段
create table student(
card char(18) unique
)
alter table stu add constraint UQ_CARD unique (card);
* 主键自增
auto_increment:默认从1开始增加1
域完整性
域:字段
类型约束
not null:非空约束
default:默认值
引用完整性
其中一张表的字段取值需要依赖于另一张表
外键约束
alter table emp add constraint FK_DEPTNO foreign key(deptno) references dept(deptno)
# 结果集 resultest
select 1 + 1 sum;
select 2 - 1;
select 1 * 1;
select 5 / 2;# 2.5
select 5 div 2;# 取整
select 3 / 0;# null
select 5 % 2;
#比较运算符
select 1 > 2;# 0
select 2 > 1;# 1
select 1 != 2;
select 1 <> 2;# 不等于
#逻辑运算符
select 1 > 2 and 2 > 1;
select 1 > 2 or 2 > 1;
select !(1 > 2);
# 位运算符,二进制算
select 2 & 3; #2 10 11 10
select 2 | 3; #3 10 11 11
select 2 ^ 3; #1 10 11 01
insert into tname[(col1,col2...)] values(val1,val2...);
# 1.insert 给所有的字段添加值,值的顺序必须和表中字段的顺序一致
insert into stu values(5,'zl',30,'man');
# 2.部分字段添加值,值的顺序和前面字段的声明顺序一致
insert into stu(sname,age,gender) values('zw',30,'man');
# 3.添加三条记录
insert into stu(sname,age,gender) values('zw',30,'man'),('zw',31,'man'),('zw',33,'man');
# 4.表复制
# 创建一个和stu结构相同的表
create table student select * from stu where 0=1;
#插入stu表所有的数据到student表
insert into student() select *from stu;
update tname set coll = val1,col2 = val2...[where条件]
如果需要唯一确定某条记录,最好使用主键作为条件
delete from tname [where 条件]
drop,truncate和delete区别?
drop:销毁整个表的结构
truncate:表及巩固没有删除,清空所有的数据,重置了自增的结构
delete:删除数据,只与数据有关,与结构无关
select 字段/表达式(控制结果集的内容)
from 表/视图/结果集(控制从什么地方查询)
where 条件(简单,组合条件等)
order by 字段(排序 asc|desc)
group by 字段(分组)
having 条件(分组之后再过滤)
# DQL
# 1.查询emp表中所遇的记录信息。
select * from emp;
# 2.查询emp表中所遇的员工名称和薪水
select ename,sal from emp;
# 3.在emp表中查询员工编号为7788的员工的姓名和所在的部门编号
select ename,deptno from emp where empno = 7788;
# 4.在emp表查询20号部门工资超过2000的员工信息
select * from emp where sal >= 2000and deptno = 20;
# 5.在emp表中查询员工编号为7369,7521,7788的员工信息
select * from emp where empno = 7369||empno = 7521 || empno = 7788;
# 6.查询工资在1000到2000之间的员工信息
select * from emp where sal >= 1000 and sal<=2000;
select * from emp where sal between 1000 and 2000;
# 7.在emp表中查询员工编号为7369,7521,7788的员工信息(集合查询)。
select * from emp where empno in (7369,7521,7788);
# 8.查询emp表中所有的职位信息(去重 distinct)
select distinct job from emp;
# 9.查询员工工资提升15%之后的员工姓名和薪水。(别名 [as] 别名)
select ename,sal*1.15 sal from emp;
# 10.在emp表中查询没有奖金的员工信息(空判断 --> is null)。
select * from emp where comm is null;
# 11.按照工资升序查询员工信息(order by 字段 [asc] | desc)
select * from emp order by sal,empno desc;
# 12.查询ename以s开头的所有的员工的信息(模糊查询 like)%:0到多个字符。
select * from emp where ename like 's%';
select * from emp where ename like '%n';
select * from emp where ename like '%s%'; # 包含
# 第二个 _:代表一个字符
select * from emp where ename like '_l%';
# 13.查询前五条记录(限制结果查询 limit index,length)
select * from emp limit 5;
select * from emp limit 1,5;
函数
# 1.1数学函数
select abs(-16); # 绝对值
select floor(12.5);# 向下取整
select ceil(-12.3);# 向上取整
select round(12.46,-1)# 四舍五入
select PI();# π
select mod(5,2);# 取模运算
select pow(2,3);# n次方
select sqrt(25);# 开平方
select rand(); #[0,1)随机数
字符函数
select length('this is an apple');# 计算字符长度
select length(ename) from emp;# 计算指定字符长度
select lower('THIS IS');# 转换为小写
select UPPER('this is');# 转换为大写
select SUBSTR('abcde',1,2);# 截取
select REPLACE('abcde','bc','ggg');# 替换
select TRIM(' a bc ');# 去空格
select lpad('abc',10,'*');# 在左边添加('字符串',总长度,填充物)
select rpad('abc',10,'*');# 在右边添加('字符串',总长度,填充物)
日期函数
select SYSDATE();# 获取系统时间
select NOW();
select CURRENT_DATE();
select CURRENT_TIME();
select CURRENT_TIMESTAMP();
select YEAR('1998-09-08');
select MONTH(NOW());
select DAY(NOW());
#实现日期运算
select DATE_ADD('2019-07-03',INTERVAL 2 week);
#获取指定时间该月的最后一天
select LAST_DAY(date)
select max(sal) from emp;
select min(sal) from emp;
select avg(sal) from emp;
# 统计记录数
select count(*) from emp;
# 统计该字段不为空的数目
select count(comm) from emp;
select sum(sal) from emp;
group by 字段
# 获取每个职位的平均工资
select ename,job,avg(sal) from emp group by job;
使用分组函数,select自居中能够出现聚合函数和分组的字段
having:分完组之后再次实现检索(条件)
1.where子句在group by 之前
2.where子句中不能使用聚合函数,having中可以使用聚合函数
select deptno,avg(sal) from emp GROUP BY deptno having avg(sal) >= 2000;
select MD5('root');
select sha('root');
select password('root');
mysql的核心是存储引擎
存储引擎本质是数据库底层的软件组织,涉及到增删改查操作,涉及到数据如何存储,事物的支持,锁的水平,并发的处理等。
mysql中支持多种存储引擎,采用插件式的方式实现设置mysql5.5之后默认采用的存储引擎是innoDB。
show engines;
InnoDB: 支持事物,行级锁,以及外键。适合做高并发,以及增删改较多的场景。
如何配置存储引擎:
my.ini --> default_storage_engine=innodb
保证数据一致性。
由一系列的dml操作组成,要么同时成功,要么同时失败。
在数据库中,任何的增删改操作都必须在事物的环境下运行。
# 开启事物
一组dml操作
# 提交/回滚事物
# 查看事物的自动提交,默认开启
show variables like '%autocommit%';
如果事物自动提交开启,默认会将每一个dml操作当做单独的事物进行处理
如果将多个dml操作放在同一事物:
1.关闭事物的自动提交
set autocommit = 0;
2.手动开启事物(显式开始事务)
begin/start transaction;
3.一组dml操作
#如果未显示开启事务,执行第一句增删改操作时会隐式开启事务
update account set money = money + 1000 where id = 2;
update account set money = money - 1000 where id = 1
4.手机提交事物(回滚)
commit;(持久化数据到文件中)
事务的四大特性
并发事务产生的问题
脏读
t2事务读到t1事物未提交的数据
不可重复读
t2事务在可读范围内,t1事物修改了该数据并且进行了事物提交。
t2在多次读取的过程中发现数据不一致。
幻读(虚读)
t2事物在可读范围内,t1事物删除记录并且进行了事物提交
t2在多次读取过程中发现数据数目不一致。
事务的隔离级别
1. 管理用户
1. 添加用户:
语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
2. 删除用户:
语法:DROP USER '用户名'@'主机名';
3. 修改用户密码:
UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi';
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');
# mysql中忘记了root用户的密码?
1.net stop mysql;(需要管理员权限)
2.使用无验证方式启动mysql服务:mysqld --skip-grrant-tables
3.打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
4.use mysql;
5.update user set password = password('你的新密码')where user = 'root';
6.关闭两个窗口
7.打开任务管理器,时候互动结束mysqld.exe的进程
8.启动mysql服务
9.使用新密码登录
4. 查询用户:
-- 1. 切换到mysql数据库
USE myql;
-- 2. 查询user表
SELECT * FROM USER;
# 通配符: % 表示可以在任意主机使用用户登录数据库
2. 权限管理:
1. 查询权限:
-- 查询权限
SHOW GRANTS FOR '用户名'@'主机名';
SHOW GRANTS FOR 'lisi'@'%';
2. 授予权限:
-- 授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
-- 给张三用户授予所有权限,在任意数据库任意表上
GRANT ALL ON * .* TO 'zhangsan'@'localhost';
3. 撤销权限:
-- 撤销权限:
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';