MySQL小结
MySQL
SQL语句的分类:
DQL(数据库查询语言): 查询语句,凡是select
语句都是DQL
。
DML(数据操作语言): insert delete update
,对表当中的数据进行增删改。
DDL(数据定义语言): create drop alter
,对表结构的增删改。
TCL(事务控制语言): commit
提交事务,rollback
回滚事务。(TCL
中的T
是Transaction
)
DCL(数据控制语言): grant
授权,revoke
撤销权限等。
增删改查的术语:CRUD操作
Create(增)、Retrieve(检索)、Update(修改)、Delete(删除)
DQL
# sql语句执行顺序
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
limit 7
..;
分组函数:对“某一组”数据进行操作。
sum
、count
、avg
、max
、min
总共5个,还有另一个名字:多行处理函数,即输入多行,最终输出的结果是1行。
注意:
- 自动忽略
null
。 分组函数不可直接使用在
where
子句当中。count(*)
:不是统计某个字段中数据的个数,而是统计总记录条数(和某个字段无关);count(comm)
:表示统计comm字段中不为NULL的数据总数量。
group by 和 having
group by
:按照某个字段或者某些字段进行分组。having
:对分组之后的数据进行再次过滤。
注意:
- 分组函数一般都会和group by联合使用。且任何一个分组函数都是在group by语句执行结束之后才会执行。
- 当一条语句使用group by时,select后只能出现参加分组的字段,以及分组函数。
distinct
去除重复记录。
注意:
- distinct只能出现在所有字段的最前面。
select distinct deptno, job from emp;
是后面所有字段联合去重。
limit (重点中的重点,分页查询)
limit是mysql特有的,其他数据库中没有不通用。
limit取结果集中的部分数据,这是它的作用。
语法机制:
limit startIndex, length startIndex表示起始位置,从0开始,0表示第一条数据。 length表示取几个 # 直接写一个数字,前面startIndex默认为0
limit是sql语句最后执行的一个环节
DDL
创建表
MySQL常用数据类型
| 类型 | 描述 |
| :—————————————: | :—————————————————————————————: |
| Char(长度) | 定长字符串,存储空间大小固定,适合作为主键或外键 |
| Varchar(长度) | 变长字符串,存储空间等于实际数据空间 |
| double(有效数字位数,小数位) | 数值型 |
| Float(有效数字位数,小数位) | 数值型 |
| Int(长度) | 整型 |
| bigint(长度) | 长整型 |
| Date | 日期型 年月日 |
| DateTime | 日期型 年月日 时分秒 毫秒 |
| time | 日期型 时分秒 |
| BLOB | Binary Large OBject(二进制大对象, 存储图片、视频等流媒体信息) |
| CLOB | Character Large OBject(字符大对象,存储较大文本,比如,可以存储4G的字符串) |
| 其他…… | |
约束(Constraint)
- 非空约束(not null):约束的字段不能为NULL
- 唯一约束(unique):约束的字段不能重复
- 主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)
- 外键约束(foreign key):。。。(简称FK)
- 检查约束(check):注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持。
1. 唯一性约束(unique)
- 唯一约束修饰的字段具有唯一性,不能重复。但可以为NULL。
- 注意:not null约束只有列级约束,没有表级约束。
2. 主键约束(primary key)
- 主键相关术语:主键约束、主键字段、主键值。
- 主键值是这行记录在这张表当中的唯一标识。
3. 外键约束(foreign key)
foreign key(classno) references t_class(cno)
- 外键值可以为
NULL
- 外键字段不一定是主键,但至少具有
unique
约束。
索引
添加索引是给某一个字段,或者某些字段添加索引。
最根本的原理是缩小了扫描的范围。索引虽然可以提高检索效率,但是不能随意的添加索引,因为索引也是数据库当中的对象,也需要数据库不断地维护。是有维护成本的。比如,表中的数据经常被修改这样就不适合添加索引,因为数据一旦修改,索引需要重新排序,进行维护。
字段添加索引的条件:数据量庞大;该字段很少的DML操作;该字段经常出现在where子句中。
创建索引:
create index 索引名称 on 表名(字段名);
- 删除索引:
drop index 索引名称 on 表名;
- 索引底层采用的数据结构是:B Tree。
实现原理:通过B Tree缩小扫描范围,底层索引进行了排序,分区,索引会携带数据在表中的“物理地址”,最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是最高的。
索引的分类
单一索引:给单个字段添加索引
复合索引:给多个字段联合起来添加1个索引
主键索引:主键上会自动添加索引
唯一索引:有
unique
约束的字段上会自动添加索引。。。
模糊查询的时候,第一个通配符使用的是
%
,这个时候索引是失效的。
视图(view)
- 视图就是站在不同的角度去看到数据。(同一张表的数据,通过不同的角度去看待)。
- 创建视图:
create view myview as select empno, ename, from emp;
- 删除视图:
drop view myview;
- 对视图进行增删改查,会影响到原表数据。(通过视图影响原表数据的,不是直接操作的原表)
- 视图的作用:视图可以隐藏表的实现细节。保密级别较高的系统,数据库只对外提供相关的视图,java程序员只对视图对象进行CRUD。
表的设计经典设计方案
- 多对多? 三张表,关系表两个外键
- 一对多?两张表,多的表加外键
- 一对一?主键共享;外键唯一
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!