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