Union关键字
union作用:合并查询结果集
案例:查询工作岗位是MANAGER和SALESMAN的员工?
select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
select ename,job from emp where job in('MANAGER','SALESMAN');
select ename,job from emp where job = 'MANAGER' union select ename,job from emp where job = 'SALESMAN';
像下面这样是错误的:union在进行结果集合并的时候,要求两个结果集的列数相同。 select ename,job from emp where job = 'MANAGER' union select ename from emp where job = 'SALESMAN';
// MYSQL可以结果集合并时列和列的数据类型不一致,oracle语法严格 ,不可以,其结果集合并时列和列的数据类型也要一致。 select ename,job from emp where job = 'MANAGER' union select ename,sal from emp where job = 'SALESMAN';
limit关键字
limit作用:将查询结果集的一部分取出来。通常使用在分页查询当中。 百度默认:一页显示10条记录。 分页的作用是为了提高用户的体验,因为一次全部都查出来,用户体验差。 可以一页一页翻页看。
完整用法:limit startIndex, length startIndex是起始下标,length是长度。 limit起始下标从0开始。substr的起始下标从1开始
缺省用法:limit 5; 这是取前5.
select ename,sal from emp order by sal desc limit 0,5;
注意:mysql当中limit在order by之后执行!!!!!!
取出工资排名在[3-5]名的员工? select ename,sal from emp order by sal desc limit 2, 3; 2表示起始位置从下标2开始,就是第三条记录。 3表示长度。
通用分页方法:
每页显示3条记录 第1页:limit 0,3 [0 1 2] 第2页:limit 3,3 [3 4 5] 第3页:limit 6,3 [6 7 8] 第4页:limit 9,3 [9 10 11]
每页显示pageSize条记录 第pageNo页:limit (pageNo - 1) * pageSize , pageSize
DQL语句总结
关于DQL语句的大总结: select ... from ... where ... group by ... having ... order by ... limit ...
执行顺序? 1.from 2.where 3.group by 4.having 5.select 6.order by 7.limit..
DDL及常见数据类型
create
建表的语法格式:
create table 表名(字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型);
create table 表名( 字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型 );
表名:建议以t_ 或者 tbl_开始,可读性强。见名知意。 字段名:见名知意。 表名和字段名都属于标识符。
drop
删除一个数据库
drop database [if exists] 库名; #if exists 如果库存在才删除
删除一张表:
drop table 表名;
Alter
对表结构的修改
什么是对表结构的修改? 添加一个字段,删除一个字段,修改一个字段!!!
第一:在实际的开发中,需求一旦确定之后,表一旦设计好之后,很少的 进行表结构的修改。因为开发进行中的时候,修改表结构,成本比较高。 修改表的结构,对应的java代码就需要进行大量的修改。成本是比较高的。 这个责任应该由设计人员来承担!
第二:由于修改表结构的操作很少,所以我们不需要掌握,如果有一天 真的要修改表结构,你可以使用工具!!!!
修改表结构的操作是不需要写到java程序中的。实际上也不是java程序员的范畴。
常见数据类型
varchar(最长255) 可变长度的字符串 比较智能,节省空间。 会根据实际的数据长度动态分配空间。
优点:节省空间 缺点:需要动态分配空间,速度慢。
char(最长255) 定长字符串 不管实际的数据长度是多少。 分配固定长度的空间去存储数据。 使用不恰当的时候,可能会导致空间的浪费。
优点:不需要动态分配空间,速度快。 缺点:使用不当可能会导致空间的浪费。
varchar和char我们应该怎么选择? 性别字段你选什么?因为性别是固定长度的字符串,所以选择char。 姓名字段你选什么?每一个人的名字长度不同,所以选择varchar。
int(最长11) 数字中的整数型。等同于java的int。
bigint 数字中的长整型。等同于java中的long。
float(数字a, 数字b) 其中数字a表示有效数字,数字b表示小数位 单精度浮点型数据
double(数字a, 数字b) 其中数字a表示有效数字,数字b表示小数位 双精度浮点型数据
date 短日期类型
datetime 长日期类型
clob 字符大对象 最多可以存储4G的字符串。 比如:存储一篇文章,存储一个说明。 超过255个字符的都要采用CLOB字符大对象来存储。 Character Large OBject:CLOB
blob 二进制大对象 Binary Large OBject 专门用来存储图片、声音、视频等流媒体数据。 往BLOB类型的字段上插入数据的时候,例如插入一个图片、视频等,需要使用IO流才行。
案例:
创建一个学生表? 学号、姓名、年龄、性别、邮箱地址 create table t_student( no int, name varchar(32), sex char(1), age int(3), email varchar(255) );
数据类型后括号内的数字表示内容的长度,int(3) 表示最多3位数
删除表: drop table t_student; // 当这张表不存在的时候会报错!
像下面这样删就不会报错 drop table if exists t_student;
DML
插入数据insert (DML)
语法格式: insert into 表名(字段名1,字段名2,字段名3...) values(值1,值2,值3);
注意:字段名和值要一一对应。
注意:insert语句但凡是执行成功了,那么必然会多一条记录。 没有给其它字段指定值的话,默认值是NULL。
注意:字段名可以省略,省略了的话等于都写了且按顺序写的
注意:数据库中的有一条命名规范: 所有的标识符都是全部小写,单词和单词之间使用下划线进行衔接。
修改update
语法格式: update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3... where 条件;
注意:没有条件限制会导致所有数据全部更新。
删除数据 delete
语法格式? delete from 表名 where 条件;
注意:没有条件,整张表的数据会全部删除!
delete from t_user where id = 2;
delete from t_user; // 删除所有!
快速创建一张表
mysql> create table emp2 as select * from emp;
原理: 将一个查询结果当做一张表新建,这个可以完成表的快速复制。表创建出来,同时表中的数据也存在了。
create table mytable as select empno,ename from emp where job = 'MANAGER';
将查询结果插入到一张表当中?insert相关的
create table dept_bak as select * from dept;
insert into dept_bak select * from dept; //很少用!
快速删除表中数据
快速删除表中的数据?【truncate比较重要,必须掌握】
//删除dept_bak表中的数据 delete from dept_bak; //这种删除数据的方式比较慢。
mysql> select * from dept_bak; Empty set (0.00 sec)
delete语句删除数据的原理?(DML操作) 表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放!!!(相当于把表中格子内容擦掉,但不会把格子删掉,还占了空间) 这种删除缺点是:删除效率比较低 这种删除优点是:支持回滚,后悔了可以再恢复数据!!!
truncate语句删除数据的原理? 这种删除效率比较高,表被一次截断,物理删除。(相当于把占的那片空间给截了) 这种删除缺点:不支持回滚。 这种删除优点:快速
用法:truncate table dept_bak; (这种操作属于DDL操作。)
大表非常大,上亿条记录???? 删除的时候,使用delete,也许需要执行很久才能删除完!效率较低。 可以选择使用truncate删除表中的数据。只需要不到1秒钟的时间就删除结束。效率较高。 但是使用truncate之前,必须仔细询问客户是否真的要删除,并警告删除之后不可恢复!
truncate是删除表中的数据,表还在!
删除表操作 drop table 表名; 会把表结构和表中的数据一起都删了
四大约束
什么是约束?
约束对应的英语单词:constraint 在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的 完整性、有效性!!!
约束的作用就是为了保证表中的数据有效!!
约束包括哪些?
非空约束:not null 唯一性约束: unique 主键约束: primary key (简称PK) 外键约束:foreign key(简称FK) 检查约束:check(mysql不支持,oracle支持)
非空约束:not null
非空约束not null约束的字段不能为NULL。 drop table if exists t_vip; create table t_vip( id int, name varchar(255) not null );
insert into t_vip(id) values(3); ERROR 1364 (HY000): Field 'name' doesn't have a default value
唯一性约束: unique
唯一性约束unique约束的字段不能重复,但是可以为NULL。 drop table if exists t_vip; create table t_vip( id int, name varchar(255) unique, email varchar(255) ); insert into t_vip(id,name,email) values(3,'wangwu','wangwu@123.com');
insert into t_vip(id,name,email) values(4,'wangwu','wangwu@sina.com'); ERROR 1062 (23000): Duplicate entry 'wangwu' for key 'name'
name字段虽然被unique约束了,但是可以为NULL。且可以有多个人的是null
新需求:name和email两个字段联合起来具有唯一性!!!! drop table if exists t_vip; create table t_vip( id int, name varchar(255) unique, // 约束直接添加到列后面的,叫做列级约束。 email varchar(255) unique ); 这张表这样创建是不符合我以上“新需求”的。 这样创建表示:name具有唯一性,email具有唯一性。各自唯一。
正确做法:
drop table if exists t_vip; create table t_vip( id int, name varchar(255), email varchar(255), unique(name,email) // 约束没有添加在列的后面,这种约束被称为表级约束。 );
需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束
not null只有列级约束,没有表级约束!
在mysql当中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段。(注意:oracle中不一样!)
主键约束(primary key,简称PK)
主键约束的相关术语?
主键约束:就是一种约束。 主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段 主键值:主键字段中的每一个值都叫做:主键值。
什么是主键?有啥用?
主键值是每一行记录的唯一标识。 主键值是每一行记录的身份证号!!!
记住:任何一张表都应该有主键(且仅有一个),没有主键,表无效!!
主键的特征:not null + unique(主键值不能是NULL,同时也不能重复!)
主键可以使用表级约束
表级约束主要是给多个字段联合起来添加约束
几个字段联合起来的主键叫 复合主键
在实际开发中不建议使用复合主键。建议使用单一主键
主键值建议使用: int bigint char 等类型。
不建议使用:varchar来做主键。主键值一般都是数字,一般都是定长的!
主键除了:单一主键和复合主键之外,还可以这样进行分类?
自然主键:主键值是一个自然数,和业务没关系。 业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!
在实际开发中使用业务主键多,还是使用自然主键多一些? 自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义。 业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候, 可能会影响到主键值,所以业务主键不建议使用。尽量使用自然主键。
在mysql当中,有一种机制,可以帮助我们自动维护一个主键值 drop table if exists t_vip; create table t_vip( id int primary key auto_increment, name varchar(255) );
auto_increment 表示自增,从1开始,以1递增!
外键约束(foreign key,简称FK)
外键约束涉及到的相关术语: 外键约束:一种约束(foreign key) 外键字段:该字段上添加了外键约束 外键值:外键字段当中的每一个值。
业务背景:
请设计数据库表,来描述“班级和学生”的信息?
第一种方案:班级和学生存储在一张表中???
t_student
no(pk) name classno classname
-------------------------------------------------------------------------------
1 jack 100 北京市大兴区亦庄镇第二中学高三1班
2 lucy 100 北京市大兴区亦庄镇第二中学高三1班
3 lilei 100 北京市大兴区亦庄镇第二中学高三1班
4 hanmeimei 100 北京市大兴区亦庄镇第二中学高三1班
5 zhangsan 101 北京市大兴区亦庄镇第二中学高三2班
6 lisi 101 北京市大兴区亦庄镇第二中学高三2班
7 wangwu 101 北京市大兴区亦庄镇第二中学高三2班
8 zhaoliu 101 北京市大兴区亦庄镇第二中学高三2班
分析以上方案的缺点:
数据冗余,空间浪费!!!!
这个设计是比较失败的!
第二种方案:班级一张表、学生一张表??
t_class 班级表
classno(pk) classname
------------------------------------------------------
100 北京市大兴区亦庄镇第二中学高三1班
101 北京市大兴区亦庄镇第二中学高三1班
t_student 学生表
no(pk) name cno(FK引用t_class这张表的classno)
----------------------------------------------------------------
1 jack 100
2 lucy 100
3 lilei 100
4 hanmeimei 100
5 zhangsan 101
6 lisi 101
7 wangwu 101
8 zhaoliu 101
当cno字段没有任何约束的时候,可能会导致数据无效。可能出现一个102,但是102班级不存在。
所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束。
那么:cno字段就是外键字段。cno字段中的每一个值都是外键值。
注意:理解即记住
删除表的顺序? 先删子,再删父。
创建表的顺序? 先创建父,再创建子。
删除数据的顺序? 先删子,再删父。
插入数据的顺序? 先插入父,再插入子。
create table t_class (
classno int primary key,
classname varchar(255);
);
create table t_student (
no int primary key auto_increment,
name varchar(255),
cno int,
foreign key(cno) references t_class(classno)
);
思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗? 不一定是主键,但至少具有unique约束。
即:外键引用的字段不一定是主键,但一定要有unique约束
测试:外键值可以为NULL吗? 外键只要满足至少含有unique约束即可,而有unique修饰的字段字段可以为NULL(而且可以有多个NULL),所以外键值当然可以为NULL。
存储引擎
什么是存储引擎,有什么用呢?
存储引擎是MySQL中特有的一个术语,其它数据库中没有。(Oracle中有,但是不叫这个名字) 实际上存储引擎是一个 表存储/组织数据 的方式 不同的存储引擎,表存储数据的方式不同。
怎么给表添加/指定“存储引擎”呢?
在建表的时候可以在最后小括号的")"的右边使用: ENGINE来指定存储引擎。 CHARSET来指定这张表的字符编码方式。
结论: mysql默认的存储引擎是:InnoDB mysql默认的字符编码方式是:utf8
建表时指定存储引擎,以及字符编码方式。 create table t_product( id int primary key, name varchar(255) )engine=InnoDB default charset=gbk;
怎么查看mysql支持哪些存储引擎呢?
命令: show engines \G
MySQL支持9大存储引擎,不同版本支持引擎不同,通过上面指令可以看出当前版本哪些支持
关于mysql常用的存储引擎的介绍
MyISAM存储引擎? 它管理的表具有以下特征: 使用三个文件表示每个表: 格式文件 — 存储表结构的定义(mytable.frm) 数据文件 — 存储表行的内容(mytable.MYD) 索引文件 — 存储表上索引(mytable.MYI):索引用于缩小扫描范围,提高查询效率的一种机制。 可被转换为压缩、只读表来节省空间
注意: 对于一张表来说,主键或者加有unique约束的字段上会自动创建索引。
MyISAM存储引擎特点:****可被转换为压缩、只读表来节省空间!
MyISAM不支持事务机制,安全性低。
InnoDB存储引擎 这是mysql默认的存储引擎,同时也是一个重量级的存储引擎。 InnoDB支持事务,支持数据库崩溃后自动恢复机制。 InnoDB存储引擎最主要的特点是:非常安全。
它管理的表具有下列主要特征: – 每个 InnoDB 表在数据库目录中以.frm 格式文件表示 – InnoDB 表空间 tablespace 被用于存储表的内容(表空间是一个逻辑名称。表空间存储数据和索引。)
– 提供一组用来记录事务性活动的日志文件 – 用 COMMIT(提交)、SAVEPOINT 及ROLLBACK(回滚)支持事务处理 – 提供全 ACID 兼容 – 在 MySQL 服务器崩溃后提供自动恢复 – 多版本(MVCC)和行级锁定 – 支持外键及引用的完整性,包括级联删除和更新
InnoDB最大的特点就是:支持事务,以保证数据的安全。
效率不是很高,并且也不能压缩,不能转换为只读,不能很好的节省存储空间。
MEMORY存储引擎? 使用 MEMORY 存储引擎的表,其数据存储在内存中,且行的长度固定, 这两个特点使得 MEMORY 存储引擎非常快。
MEMORY 存储引擎管理的表具有下列特征: – 在数据库目录内,每个表均以.frm 格式的文件表示。 – 表数据及索引被存储在内存中。(目的就是快,查询快!) – 表级锁机制。 – 不能包含 TEXT 或 BLOB 字段。
MEMORY 存储引擎以前被称为HEAP 引擎。
MEMORY引擎优点:查询效率是最高的。不需要和硬盘交互。****MEMORY引擎缺点:不安全,关机之后数据消失。因为数据和索引都是在内存当中。
版权归原作者 神偷怪盗基德 所有, 如有侵权,请联系我们删除。