MySQL小结

MySQL

SQL语句的分类:

DQL(数据库查询语言): 查询语句,凡是select语句都是DQL

DML(数据操作语言): insert delete update,对表当中的数据进行增删改。

DDL(数据定义语言): create drop alter,对表结构的增删改。

TCL(事务控制语言): commit提交事务,rollback回滚事务。(TCL中的TTransaction

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
	..;

分组函数:对“某一组”数据进行操作。

sumcountavgmaxmin总共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 协议 ,转载请注明出处!