MySQL个人学习笔记

本文介绍了数据库的基础知识,包括关系型和非关系型数据库的分类,以及数据库、表和记录的结构。详细阐述了常用的数据库操作如创建、查看和删除数据库及表,以及字段约束如主键、唯一和外键等。还涵盖了SQL查询语句,如选择、过滤、排序、分组和联查,以及事务处理和索引的使用。此外,提到了视图的概念及其优缺点,并对比了Oracle与MySQL的区别。最后,讨论了SQL查询优化的策略。

1. 数据库

1.1 概述

存储数据,管理数据的仓库

1.2 分类

关系型数据库:
是指存的数据有关系,每行就是每个用户的信息,每列就是要具体描述的数据
非关系型数据库:
是指数据间的关系不紧密甚至没有关系。

1.3 结构

数据库-表-记录

2. 常用操作

2.1 数据库操作

1.查看数据库
show databases;
2.新建数据库
create database 数据库名;
3.(!!!谨慎操作)删除数据库
drop database 数据库名;
4.使用数据库
use 数据库名;

2.2 表操作

1.查看表
show tables;
2.创建表
–create table 表名 (字段名称 字段类型(字段长度),字段名称 字段类型(字段长度));
3.删除表
drop table 表名;
4.查看表结构
desc 表名;
5.增加表的列
alter table 表名 add column 字段名 字段类型(字段长度)
6.新增表的记录
insert into 表名 values(字段1的值,字段2的值,字段3的值);
7.查询表的所有记录
select * from 表名;
8.修改表的记录
update 表名 set 字段名 = 新值
9.删除表的所有记录
delete from 表名;

3. 字段约束

3.1 主键约束

primary key
给字段添加主键约束,主键约束字段的值唯一并且不能为空.
auto_increment
一般给主键添加自动递增,由数据库自动维护,从1开始每个值依次+1

3.2 非空约束

not null
非空约束的字段值不能为空

3.3 唯一约束

unique
给字段加唯一约束,字段的值不能重复

3.4 外键约束

foreign key
外键字段的内容是引用另一表的字段内容

3.5 默认约束

default
默认给字段赋值

3.6 检查约束

cheak
输入值时超过范围就 报错

4. 基本函数

4.1 常用函数

#转小写
select lower(字段名) from 表名;
#转大写
select upper(字段名) from 表名;
#获取长度
select length(字段名) from 表名;
#截取子串
select substr(字段名,1,3) from 表名;(截取从第1个字符开始的3个字符)
#拼接字符串
select concat(字段名,要拼接的值) from 表名;
#替换字段
select replace(字段名,要替换的值,替换成哪个值) from 表名;
#如果为null
select ifnull(字段名,0) from 表名;
#四舍五入 & 向上取整 & 向下取整
select round(字段名),ceil(字段名),floor(字段名) from 表名;
#uuid
select uuid();
#当前年月日时分秒
select now();
#当前年、当前月、当前日、当前时、当前分、当前秒
select year(now()),month(now()),day(now()),hour(now()),minute(now()),second(now());

4.2 条件查询

#给结果去重
select distinct 字段名 from 表名;
#where用来过滤查询的数据
select * from 表名 where 字段名=值
#两个条件间的关系: and(并且) or(或者)
select * from 表名 where 字段=值 and 字段=值
select * from 表名 where 字段=值 or 字段=值
#模糊查询 like %是0~n个字符 是一个字符
#以a开头-高效
select * from 表名 where 字段名 like ‘a%’
#以a结尾
select * from 表名 where 字段名 like ‘%a’
#包含a
select * from 表名 where 字段名 like ‘%a%’
#a后面有两个字符的 下划线代表1个字符
select * from 表名 where 字段名 like 'a
_’
#null 对字段值为null的处理
select * from 表名 where 字段名 is null
select * from 表名 where 字段名 is not null
#between and [1000,2000] 在1000~2000间
select * from 表名 where 字段名>=1000 and 字段名<=2000
select * from 表名 where 字段名 between 1000 and 2000
#limit 分页
select * from 表名 limit 3; #取前三条
select * from 表名 limit 1,3; #从第2条开始,总共取3条
select * from 表名 limit 2,2; #从第3条开始,总共取2条
#order by 排序
select * from 表名 order by 字段名 asc#默认升序,可以省略asc
select * from 表名 order by 字段名 desc #降序

4.3 分组

group by
#如果出现了聚合函数(max min avg count sum),非聚合列,必须分组
#having和group by是固定搭配,用来过滤分组后的数据
#having里只能用查出来的结果
#where里不能出现聚合函数

4.4 聚合函数

最大值:max()
最小值:min()
求和:sum()
平均数:avg()
计数:count()
select max(字段名),min(字段名),sum(字段名),avg(字段名) from 表名;

5. 事务

5.1 ACID特点

原子性:多条SQL是密不可分的,整体的结果要么全成功,要么全失败
一致性:保证数据的守恒,总和不变
隔离性:数据库支持高并发,但是操作之间是独立的,被隔离的
持久性:是指SQL语句对数据库的操作(增删改),影响是永久的

5.2 隔离级别

读未提交:性能好,但是数据不安全
读已提交:性能稍差,但是数据安全 --Oracle默认级别
可重复读:性能更差点,数据更安全–MySQL默认级别
串行化:读写都加锁,性能最差,数据最安全,不能并发

6. 多表联查

6.1 笛卡尔积

把两个表的数据都拼接起来
select * from 表1,表2;
这种查询方式称为笛卡尔积,在内存中构建一个大大的结果集,再进行数据的过滤。
既耗费资源,又浪费时间

6.2 连接 join

  1. 内连接 inner join
    两边都对应有记录的才展示,其他去掉
  2. 左(外)连接 left join
    左边表中的数据都出现,右边没有数据以NULL填充
  3. 右(外)连接 right join
    右边表中的数据都出现,左边没有数据以NULL填充

6.3 子查询

在查询的SQL中嵌套查询,称为子查询

7. 索引

7.1 概述

高效获取数据的数据结构
单值索引:一个索引包含一个字段
唯一索引:字段的值必须唯一,允许有空值;主键会自动创建唯一索引
复合索引:一个索引包含多个字段

7.2 语法

创建单值索引:creat index 索引名 on 表名(字段名);
查看索引:show index from 表名;
创建唯一索引:alter table 表名 add unique(字段名);
创建复合索引:alter table 表名 add index
索引名 (字段名,字段名); 使用时遵循最左特性:优先使用最左边的
删除索引:alter table 表名 drop index 索引名
检查是否使用索引:SQL语句前加 explain 查看SQL的执行计划

7.3 总结

优点:索引提高数据检索效率,类似于书的目录,索引表对数据进行了排序。
缺点:索引也要占用内存,每次增删改查也要更新对应的索引文件

8. 视图

8.1 概述

当做一个表来用,缓存了上一次的查询结果

8.2 语法

创建视图:creat view 视图名 as SQL语句;
使用视图:select * from 视图名;

8.3 总结

优点:
SQL只写一次,就会缓存在视图中,查询快
缺点:
数据都是重复的,占内存。视图无法优化

9. Oracle与MySQL的一些区别

默认日期格式:
日-月-年
修改日期格式:
alter session set nls_date_format = ‘yyyy-mm-dd’;
特有方法 decode():
select decode(字段名,值1,返回值1,值2,返回值2,…值n,返回值n) from 表名
分页与MySQl不同:
rownum select * from 表名 where rownum <=2

10. SQL优化

  1. 查询SQL,尽量用列名代替*
  2. 尽量使用数字代替字符类型,比如用0,1代替男,女
  3. 避免在查询时返回大量数据合理利用分页limit
  4. where过滤时,尽量把范围控制到最小
  5. where过滤时,尽量不要使用or连接多个条件
  6. where过滤时,尽量不要用 !=
  7. where过滤时,like用来做模糊查询,尽量确定开始元素
  8. 创建索引不要太多,索引单表建议最多5个
  9. 通常name会加索引,因为数据多,提高查询效率
  10. 使用explain关键字,查看SQL执行计划(看SQL有没有用索引看key的值)
  11. MySQL会给每条SQL进行事务的处理,新增数据量大时尽量用一条语句
  12. 要删除大量数据时,最好分批次删除
  13. 伪删除,发起了update不是delete,修改记录的状态而不是删除
  14. group by实现分组,最好分组前进行where过滤数据到最少
  15. inner join 、left join、right join,优先使用inner join
  16. 小表驱动大表,小的数据集驱动大的数据集,从而让性能更优
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值