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

  • 相关阅读:
    Linux 开机运行sh 脚本 三种方法
    echarts legend 图例与文字对齐问题
    Spring Cloud Eureka面试题
    基于Java+SpringBoot+Mybatis+Vue+ElementUi的航空公司电子售票系统
    【精讲】vue2框架 GitHub数据获取(内含详细解析)
    深度学习入门-与学习相关的技巧
    Python学习三(面向对象)
    保姆级cat系统搭建过程
    .NET下数据库的负载均衡(有趣实验)
    3D打印机的使用教程( 超详细 )
  • 原文地址:https://blog.csdn.net/qq_61557294/article/details/126899974