0


MySQL基础学习总结(三)

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引擎缺点:不安全,关机之后数据消失。因为数据和索引都是在内存当中。

标签: mysql 学习 数据库

本文转载自: https://blog.csdn.net/qq_61557294/article/details/126899974
版权归原作者 神偷怪盗基德 所有, 如有侵权,请联系我们删除。

“MySQL基础学习总结(三)”的评论:

还没有评论