子查询
select语句嵌套select语句,被嵌套的select语句被称为子查询
where子句中的子查询
from中的子查询
注:from后面的子查询,可以将子查询的查询结果当作一张临时表
最终结果
select后出现的子查询(了解)
union合并查询结果集
union的效率更高一些,对于表连接来说,没连接一次新表,则匹配次数满足笛卡尔积,成倍的翻
但是union可以减少匹配次数,在减少匹配次数的情况下还可以完成两个结果集的拼接。
union把乘法变成加法
union在进行结果集合并的时候,要求两个结果集列数相同,数据类型一致
limit
limit是将查询结果集的一部分取出来,通常使用在分页查询中
完整用法,limit ,startIndex(起始下标,从0开始),length长度
缺省用法:limit 5,取前五
注:limit在order by之后执行
通用分页
mysql数据类型
int:整型 bigint:长整型等同于long
double:双精度浮点型 float:单精度浮点型 date:短日期类型
datetime:长日期类型 clob:字符大对象,最多存4G的字符串,超过255字符的都要用clob存储
blob:二进制大对象:专门存储图片,声音,视频等流媒体数据
t_movie 电影表(专门存储电影信息)
删除表
insert
语法格式:insert into 表明(字段名1,字段名2,字段名3) values(值1,值2,值3);
字段名和值要一一对应,数量和数据类型要对应
insert但凡执行成功,那么必然会多一条记录,没有给其他字段指定值的话,默认是NULL
default指定默认值
insert语句中的字段名省略的话,等于都写上了,所以值也要都写上
insert一次插入多条记录
insert插入日期
数字格式化:format
格式化数字:format(数字,'格式')
str_to_date:将字符串类型转换成date类型
date_format:将date类型转换成具有一定格式的varchar字符串类型
注:数据库中有一条命名规范:所有的标识符都是全部小写,单词和单词之间使用下划线进行衔接
mysql日期格式
如果提供的日期字符串%Y-%m-%d是这个格式,str_to_date函数就不需要了
date_format日期格式化
将日期转换成特定格式的字符串
date_format(日期类型数据,'日期格式')
这个函数通常使用在查询日期方面,设置展示的日期格式
date和datetime区别
date是短日期,只包括年月日信息
datetime是长日期:包括年月日时分秒信息
mysql段日期默认格式:%Y-%m-%d
mysql长日期默认格式:%Y-%m-%d %h:%i:%s
在mysql中获取系统当前时间now()
update
注:没有条件限制会导致所有数据全部更新
delete
delete from 表名 where 条件
没有条件,整张表的数据会全部删除
快速创建表
将查询结果插入到一张表中(insert)相关
快速删除表中数据
delete(属于DML)语句删除数据的原理:表中数据被删除,但是这个数据在硬盘上的真实存储空间不会被释放,缺点:删除效率比较低,优点:支持回滚(roll back),后悔了可以再恢复数据
truncate(属于DDL)语句删除数据,删除效率比较高,表被一次截断,物理删除
缺点:不支持回滚,优点:快速删除,使用前必须仔细询问客户是否真的要删除
truncate是删除表中的数据,表还在
drop table:不是删除表中的数据,而是把表删除
对表结构的增删改
在实际的开发中,需求一旦确定后,表一旦设计好之后,很少的进行表结构的增删改,因为开发进行中时,修改表结构,成本比较高,修改表的结构,对应的java代码就需要进行大量的修改,成本比较高,责任由设计人员承担
修改表结构的操作不需要写到java程序中
约束
在创建表的时候,可以给表中的字段加上一些约束,来保证这个表中数据的完整性,有效性
包括:
非空约束:not null
约束字段不能为null
唯一性约束:unique
字段不能重复,但可以为NULL,name字段都为NULL没问题
两个字段联合唯一
需要给多个字段你联合起来添加某一个约束的时候,需要使用表级约束
not null和unique联合
在mysql中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段(注:oracle中不一样)
主键约束:primary key
主键约束:一种约束
主键字段:加了主键约束的字段
主键值:主键字段的每一个值都叫主键值
主键值是每一行记录的唯一标识
任何一张表都应该有主键,没有主键,表无效
主键特征:not null+unique
1个字段做主键叫单一主键,多个字段做主键叫复合主键
在实际开发中不建议使用复合主键
一张表,主键约束只能添加一个
主键值建议使用int,bigint,char等类型,不建议使用varchar做主键,主键一般都是数字,一般都是定长的
自然主键:主键是一个自然数,和业务没关系(用的多,因为主键只要做到不重复就行,不需要有意义)
业务主键:主键值和业务紧密关联,缺点:主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值
尽量使用自然主键
自动维护一个主键值auto_increment
外键约束:foreign key
删除表顺序:先删子,再删父
创建表顺序:先创建父,在创建子
删除数据顺序:先删子再删父
插入顺序:先插入父,再插子
检查约束:check(mysql不支持,oracle支持)
xxx.sql称为sql脚本文件,sql脚本文件中编写了大量的sql语句,执行sql脚本时,该文件中所有的sql语句全部执行,批量执行sql语句,可以使用sql文件
存储引擎(了解)
添加指定存储引擎
MyISAM不支持事务机制
优点:可转换为压缩,只读表来节省空间
索引是一本书的目录,缩小扫描范围,提高查询效率的机制
对于一张表来说,只要是主键,或者加有unique约束的字段会自动创建索引
InnoDB最大的特点是支持事务,以保证数据的安全
事务
一个事务就是一个完整的业务逻辑
只有DML(insert,delete,update)语句才有事务这一说,其它语句和事务无关
只有以上三个语句是对数据库中的数据进行增删改(增删改考虑安全问题)
事务是如何实现的
提交事务:commit语句
回滚事务:rollback语句
事务对应的单词transaction
mysql当中默认是支持自动提交事务(每执行一条DML语句,就提交一次)
回滚永远都是只能回滚到上一次的提交点
将mysql的自动提交机制关闭:start transaction
事务的4个特性
1.原子性:说明事务是最小的工作单元,不可再分
2.一致性:所有事务中,在同一个事物中,所有操作必须同时成功,或者同时失败,以保证数据的一致性
3.隔离性
4.持久性: 事务最终结束的一个保障,事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上
事务之间的隔离级别
读未提交:read uncommitted 事务A可以读取到事务B未提交的数据,这种隔离级别存在脏读现象(读到了脏数据)这种隔离级别一般都是理论上的,大多数隔离级别都是二档起步
读已提交:read committed 事务A只能读取到事务B提交之后的数据,解决了脏读现象,这种隔离级别不可重复读取数据
每一次读到的数据绝对真实,Oracle数据默认
可重复读:repeatable read 事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的,即使事务B将数据已经修改并且提交,事务A读取到的数据还是没有改变,解决了不可重复读取数据。
存在的问题:会出现幻读,每一次读到的数据都是幻象,不够真实, MySQL中默认级别为可重复读
序列化(串行化):serializable 最高隔离级别,效率最低,解决了所有级别,表示事务排队,不能并发
例:设置全局事务隔离级别为read uncommitted
验证各种隔离级别
查看隔离级别:select @@tx_isolation
验证read committed
验证repetable read
索引
在数据库表上添加的,是为了提高查询效率的一种机制,一张表的一个字段可以添加一个索引,多个字段联合起来也可以添加索引,索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制
遵循左小右大原则存放,采用中序遍历方式存取数据
索引实现原理
在任何数据库中主键上都会自动添加索引对象,id字段自动有索引,另外mysql当中,一个字段上如果有unique约束的话,也会自动创建索引对象
在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号
在mysql当中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MyISAM存储引擎中,索引存储在一个.MYI文件中。在InnoDB存储引擎中索引存储在一个逻辑名称叫做tablespace中,在MEMORY存储引擎当中索引被存储在内存中,不管索引存储在哪里,索引在mysql当中都是一个树的形式(自平衡二叉树)
在mysql中,主键上以及unique字段上都会自动添加索引
索引创建和删除
查看一个SQL语句是否使用了索引
索引失效
索引是各种数据库进行优化的重要手段,优化的时候优先考虑的因素就是索引
视图
view:站在不同的角度去看待同一份数据
创建删除视图对象
只有DQL语句才能以view的形式创建
DBA命令
重点掌握数据的导入和导出
6.1、将数据库当中的数据导出
在windows的dos命令窗口中执行:(导出整个库)
mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p333
在windows的dos命令窗口中执行:(导出指定数据库当中的指定表)
mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot –p123
6.2、导入数据
create database bjpowernode;
use bjpowernode;
source D:\bjpowernode.sql
数据库设计三范式
什么是设计范式?
设计表的依据。按照这个三范式设计的表不会出现数据冗余。
第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。
第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。
提醒:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。