mysql
2020-06-22 10:29:36 2 举报
AI智能生成
mysql个人总结
作者其他创作
大纲/内容
DDL对数据库和表的操作
对数据库的操作
增加
创建数据库:create database 数据库名;
删除
删除数据库:drop database 数据库名;
修改
修改数据库的字符集:alter database 数据库名 character set utf8;
查看
使用数据库: use 数据库名;
当前正在使用的数据库:select database();
查看数据库的定义结构:show create database 数据名;
查看所有的数据库:show databases;
对表的操作
增加
创建表:create table 表( 列 类型 [约束], 列 类型 [约束] ... );
增加一列:alter table 表 add 字段 类型 约束;
添加索引:create index 索引名 on 表名(列,列,列);
删除
删除一列: alter table 表名 drop 列名;
删除表: drop table 表名;
删除表:drop table if exists 表名;
删除索引:alter table 表名 drop index 索引名
修改
修改表名: rename table 旧表名 to 新表名;
修改列的类型约束:alter table 表 modify 字段 类型 约束;
修改列的名:alter table 表 change 旧列 新列 类型 约束;
查看表:
查看数据库有哪些表:show tables;
查看表结构:desc 表名
查看表的创建结构:show create table 表名
MySql常见的类型
数值类型
tinyint---byte
smallint----shrot
int----int
bigint----long
float----float
double----double
bool,boolean---boolean
字符串类型
char(固定长度)/varchar----String
文本
text
longtext
时间日期
date
datetime
TimeStamp
char和varchar的区别
固定长度 char(n) eg: char(20), 最大能存放20个字符. ‘aaa’, 还是占20个字符的空间
可变长度 varchar(n) eg:varchar(20), 最大能存放20个字符. ‘aaa’, 占3个字符的空间
约束
主键约束primary key
非空(not null)+唯一(uinque) auto_increment主键自增
唯一约束
唯一(uinque)唯一约束, 后面的数据不能和前面重复
非空约束
非空(not null)列不能有null值
DML对表的数据增删改
对表数据的增删改
增加
insert into 表名 values(值,值,值);
insert into 表(列,列..) values(值,值..)
删除
delete from 表 [where 条件]
修改
update 表 set 列 =值, 列 =值 [where 条件]
delete和truncate的区别
delete 删除表中的数据,表结构还在; 删除后的数据可以找回,一条一条的删除.
truncate 删除是把表直接drop掉,然后再创建一个同样的新表。删除的数据不能找回。执行速 度比delete快
注意事项
工作里面的删除 物理删除: 真正的删除了, 数据不在, 使用delete就属于物理删除
逻辑删除: 没有真正的删除, 数据还在. 搞一个标记, 其实逻辑删除是更新 eg: status 1 启用 0 禁用
逻辑删除: 没有真正的删除, 数据还在. 搞一个标记, 其实逻辑删除是更新 eg: status 1 启用 0 禁用
DQL对表数据查询操作
对表数据查询操作
查询所有的列的记
select * form 表
查询某张表特定列的记
select 列名,列名,列名... from 表
去重查询
select distinct price from 表名
别名查询
select 列名 as 别名 as ,列名 as from 表 //列别名 as可以不写
select 别名.* from 表 as 别名 //表别名
select 别名.* from 表 as 别名 //表别名
运算查询(+,-,*,/等)
select pname ,price+10 from product;
条件查询
区间查询
select ... from 表 where 列 between...and...
select ... from 表 where 列 in(值,值..)
模糊查询
select ... from 表 where 列 like '张%' --查询姓张的用户, 名字的字数没有限制
select ... from 表 where 列 like '张_' --查询姓张的用户 并且名字是两个的字的
多条件查询
select ... from 表 where 条件1 and 条件2 and 条件3
任意条件查询
select ... from 表 where 条件1 or 条件2 or 条件3
排序查询
单列排序
组合排序
select 字段名 from 表名 [where 条件] order by 字段名 [asc|desc]; //asc: 升序,默认 值; desc: 降序
select 字段名 from 表名 [where 条件] order by 字段名 [asc|desc],字段名 [asc|desc]; //asc: 升序,默认 值; desc: 降序
分组查询
语法
select 字段1,字段2... from 表名 [where 条件] group by 列 [having 条件];
注意事项
分组的目的就是为了统计,一般分组会跟聚合函数一起使用
聚合函数
注意事项
聚合函数会忽略null值的 if(exp,0)
语法
select 聚合函数(列) from 表名;
函数
max() 最大值
min() 最小值
sum() 求和
avg() 平均值
count() 统计数量
分页查询
语法
select ... from .... limit a ,b.
注意事项
a起始行数,从0开始计数,如果省略,默认就是0; a=(当前页码-1)*b;
b: 返回的行数
分页算法
eg: 分页查询学生, 每一页查询4条 b=4; a=(当前页码-1)*b;
第一页: a=0, b=4;
第二页: a=4, b=4;
第三页: a=8, b=4;
第一页: a=0, b=4;
第二页: a=4, b=4;
第三页: a=8, b=4;
where字句和having字句的区别
对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据, 即先过滤再分组。
where后面不可以使用聚合函数
where后面不可以使用聚合函数
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤
having后面可以使用聚合函数
having后面可以使用聚合函数
条件查询小结
select...from...where...
select...from...where...order by...
select...from...where...limit...
select...from...where...order by...limit...
select...from...where...group by...order by...limit
多表的关系
一对多
在多的一方添加外键,指向少的一方的主键
多对多
新建一张中间表,至少包含两个列,都作为外键,分别指向各自的主键
一对一
一张表建立唯一约束,并作为外键指向另一张表的主键
一张表就可以体现一对一的关系
外键
语法
alter table 表名 add foreign key(列) references 表名 (列)
作用
维护多表的关系, 保证引用数据的完整性
注意事项
外键的这个列的类型必须和参照列的类型一致 参照列必须是主键
多表查询
连接查询
内连接
隐式内连接
select ... from 表名1,表名2 where 表名1.列 = 表名2.列
显示内连接
select ... from 表名1 join 表名2 on 表名1.列 = 表名2.列
外连接
左外连接
select ... from 表名1 left join 表名2 on 表名1.列 = 表名2.列
右外连接
select ... from 表名1 right join 表名2 on 表名1.列 = 表名2.列
内连接和外连接的区别
内连接: 查询的是公共部分,满足连接条件的部分
左外连接:以join左边表为主表, 查询出左边表的所有的数据. 再通过连接条件匹配出右边表的数 据, 如果满足连接条件, 展示右边表的数据; 如果不满足, 右边的数据通过null代替
子查询
单行单列
子查询的结果是单行单列(一个值情况), 一般放在where后面作为条件, 通过=,>,<,<>
select ... from ... where 列 = (子查询)
单行多列
子查询的结果是单列多行, 一般放在where后面作为条件, 通过in
select ... from ... where 列 in (子查询)
多行多列(虚表,加别名)
子查询的结果是多行多列, 一般放在from后面作为虚拟表, 需要给虚拟表取别名
select ... from (子查询) as 别名
DCL
对数据库的权限进行分配
事务
概念
逻辑上的一组操作,组成这组操作的单元要么全部成功,要么全部失败
作用
保证一组操作全部成功或者失败
事务管理
mysql默认开启事务
一条sql语句就是一个事务
手动开启事务
方式一
rollback;回滚
commit;提交
start transaction;开启事务
方式二
查看MYSQL中事务是否自动提交 ,show variables like '%commit%'
设置自动提交的参数为OFF ,set autocommit = 0;-- 0:OFF 1:ON1
回滚点
概念
在某些成功的操作完成之后,后续的操作有可能成功有可能失败,但是不管成功还是失败,前面操作 都已经成功,可以在当前成功的位置设置一个回滚点。可以供后续失败操作返回到该位置,而不是返回 所有操作,这个点称之为回滚点。
回滚点的操作语句
设置回滚点:savepoint 名字
回到回滚点:rollback to 名字
总结
设置回滚点可以让我们在失败的时候回到回滚点,而不是回到事务开启的时候
应用场景
插入大量的数据的时候. 1亿条数据 需要插入很久. 要求: 1亿条数据是一个整体,要么全部插入成功的 要么都不插入成功
事务的特性
原子性A
事务是一组不可分割的工作单位,事务中的操作要么全部成功,要么全部失败
一致性C
事务前后的数据的完整性必须保持一致
隔离性I
多个并发事务之间数据要相互隔离,不会相互影响,事务之间互不干扰
持久性D
一旦事务提交之后,对数据库的数据改变是永久性的,接下来即使数据库发生故障,也不会受影响
事务的隔离级别
不考虑隔离级别会现3中情况
脏读
一个事务读取另一个事务未提交的数据
不可重复读
在一个事务中多次读取数据内容不一致,而我们要求读取的结果一致。一般由update更新导致的
幻读
在一个事务中多次读取数据的数量不相同,而我们要求读取的数量相同。insert和delete导致的
隔离级别
读未提交 read uncommitted
会出现脏读、不可重复读和幻读
设置隔离级别读已提交解决脏读、但不能解决不可重复读和幻读
读已提交 read committed
会出现不可重复读和幻读
设置隔离级别为可重复读解决可重复读,但不能解决幻读
可重复读
repeatable read
会出现幻读
设置隔离级别为串行化解决幻读
串行化
类似单线程操作,其他事务挂起
备份和还原
备份
备份数据库
mysqldump -u root - p 密码 数据库名 >路径
备份表
mysqldump - u root - p 密码 数据库名 表名 >路径
还原
登录数据库 mysql -u root - p 密码
source 文件路径
source 文件路径
开启binlog日志
常见函数
if(expr1,expr2,expr3):expr1为true就返回 expr2, 否则返回expr3
除了0和null之外都返回1,否者否则返回0 ---弱语言类型
除了0和null之外都返回1,否者否则返回0 ---弱语言类型
ifnull(expr1,expr2) : expr1不为null,就返回它。否则就返回expr2(聚合函数忽略空值可以用)
concat(str1, str2, ...) : 连接起来
concat_ws(separator, str1, str2, ...)
upper(str)
lower(str)
trim(str) 移除两侧空格
substr()
current_date()
current_time()
now()
#2的3次方select pow(2,3)
#随机函数select rand()
#向下取整select floor(3.14)
#向上取整select ceil(3.1)
0 条评论
下一页