Java最新《遇见狂神说》MySQL从入门到删库(一)(1),中信银行Java笔试题

最后,附一张自己面试前准备的脑图:

image

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典

  • Java核心知识整理

image

  • Spring全家桶(实战系列)

image.png

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

image

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

| double | 双精度浮点数 | 8个字节 |

| decimal | 字符串形式的浮点数 | 金融计算的时候,一般是使用decimal |

字符串

| 类型 | 说明 | 最大长度 |

| — | — | — |

| char[(M)] | 固定长字符串,检索快但费时间 | 0~255个字节 |

| varchar[(M)] | 可变字符串 | 0~65535个字节 |

| tinytext | 微型文本串 | 2^8 -1个字节 |

| text | 文本串 | 2^16-1个字节 |

时间日期

java.util.Date

| 类型 | 说明 |

| — | — |

| date | YYYY-MM-DD,日期格式 |

| time | HH:mm:ss,时间格式 |

| datetime | YYYY-MM-DD hh: mm: ss,最常用的时间格式 |

| timestamp | YYYYMMDDhhmmss格式表示的时间戳,1970.1.1到现在的毫秒数 |

| year | YYYY格式的年份值 |

null

  • 没有值,未知

  • 注意,不要使用NULL进行运算,因为结果为NULL

1.3 数据库的字段属性(重点)


在这里插入图片描述

Unsigned:

  • 无符号的整数

  • 声明了该数据列不允许声明为负数

zerofill:

  • 0填充的

  • 不足的位数,使用0来填充 【如int(3), 5则为005】

Auto_InCrement:

  • 自动增长的,每添加一条数据,自动在上一条记录的基础上 + 1 (默认)

  • 通常用来设计唯一的主键,且必须是整数类型

  • 可以自定义设计主键自增的起始值和步长(一般不用)

NULL和 NOT NULL:

  • 默认为NULL,即没有插入该列的数值

  • 如果设置为 NOT NULL,则该列必须有值

default:

  • 设置默认的值!

  • sex,默认值为男,如果不指定该列的值,则会有默认值为“男”的值

1.4 创建数据库表(重点)


  • 创建一个school数据库

  • 创建学生表

  • 学号int

  • 姓名varchar

  • 密码varchar

  • 性别varchar

  • 出生日期datetime

  • 家庭住址varchar

  • 邮箱varchar

– 创建数据库 school

CREATE DATABASE IF NOT EXISTS school;

– 删除数据库 student

DROP DATABASE IF EXISTS student;

– 注意点:表的名称和字段尽量使用 `` 括起来

– 创建学生表

CREATE TABLE IF NOT EXISTS student (

id INT(4) NOT NULL AUTO_INCREMENT COMMENT ‘主键’, – id 不为空,自增

name VARCHAR(30) NOT NULL DEFAULT ‘林晓’ COMMENT ‘姓名’, – name 不为空,默认为林晓

pwd VARCHAR(20) NOT NULL DEFAULT ‘123456’ COMMENT ‘密码’, – pwd 不为空,默认为123456

sex VARCHAR(2) NOT NULL DEFAULT ‘男’ COMMENT ‘性别’, – sex 不为空,默认为男

birthday DATETIME DEFAULT NULL COMMENT ‘出生日期’, – birthdat 默认为空

address VARCHAR(100) DEFAULT NULL COMMENT ‘家庭住址’, – address 默认为空

email VARCHAR(50) DEFAULT NULL COMMENT ‘邮箱’, – email默认为空

PRIMARY KEY (id) – 主键,一般一个表只有一个唯一的主键

)ENGINE=INNODB DEFAULT CHARSET=utf8;

格式

CREATE TABLE [IF NOT EXISTS] 表名(

字段名 列类型 [属性] [索引] [注释],

字段名 列类型 [属性] [索引] [注释],

字段名 列类型 [属性] [索引] [注释]

)[表类型][表的字符集设置][注释]

常用命令

SHOW CREATE DATABASE school – 查看创建数据库的语句

SHOW CREATE TABLE student – 查看student数据表的定义语句

DESC student – 显示表的结构

1.5 数据表的类型


常见的有两种类型:

  • INNODB 默认使用

  • MYISAM 早些年使用的

| | MYISAM | INNODB |

| — | — | — |

| 事务支持 | 不支持 | 支持 |

| 数据行锁定 | 不支持 | 支持 |

| 外键约束 | 不支持 | 支持 |

| 全文索引 | 支持 | 不支持 |

| 表空间的大小 | 较小 | 较大,约为2倍 |

常规的使用操作

  • MYISAM 节约空间,速度较快

  • INNODB 安全性高,事务的处理,多表多用户操作

数据表的存储位置

MySQL数据表以文件方式存放在磁盘中

  • 位置 : Mysql安装目录\data 目录下

1.6 修改删除表


修改表(ALTER TABLE)

  • 修改表名alter table 旧表名 rename as 新表名

– 修改表名 alter table 旧表名 rename as 新表名

ALTER TABLE teacher RENAME AS teacher1

  • 添加字段alter table 表名 add 字段名 列属性[属性]

– 增加表的字段 alter table 表名 ADD 字段名 列属性

ALTER TABLE teacher1 ADD age INT(11)

  • 修改字段

  • alter table 表名 modify 字段名 列属性[属性]

  • alter table 表名 change 旧字段名 列属性[属性]

– 修改表的字段 (1.重命名 2.修改约束)

– ALTER TABLE 表名 MODIFY 字段名 列属性[]

ALTER TABLE teacher1 MODIFY age VARCAHAR(11) – 修改约束

– ALTER TABLE 表名 CHANGE 旧名字 新名字 列属性[]

ALTER TABLE teacher1 CHANGE age age1 INT(1) – 重命名字段

  • 删除字段alter table 表名 drop 字段名

– 删除表的字段 ALTER TABLE 表名 drop 字段名

alter table teacher1 drop age1

最终结论

  • change 用来字段重命名,不能修改字段类型和约束

  • modify 不用来字段重命名,只能修改字段类型和约束

删除表

  • 删除表DROP TABLE [IF EXISTS] 表名

– 删除表

DROP TABLE [IF EXISTS] teacher1

2.MySQL数据管理

=============================================================================

2.1 外键(了解)


  • 创建外键

方式一: 创建子表同时创建外键

  • 学生表的gradeid字段,要去引用年级表的 gradeid

    1. 定义外键key
    1. 给这个外键添加约束(执行引用)

– 年级表

create table grade(

gradeid int(10) not null auto_increment comment ‘年纪id’,

gradename varchar(50) noy null comment ‘年级名称’,

primary key(gradeid)

)engine=innodb default charset = utf8;

– 学生表

– 学生表的gradeid字段,要去引用年级表的 gradeid

– 1. 定义外键key

– 2. 给这个外键添加约束(执行引用)

create table if not exists student (

id INT(4) NOT NULL AUTO_INCREMENT COMMENT ‘学号’,

name varchar(30) NOT NULL DEFAULT ‘匿名’ COMMENT ‘姓名’,

pwd varchar(20) NOT NULL DEFAULT ‘123456’ COMMENT ‘密码’,

sex varchar(2) NOT NULL DEFAULT ‘女’ COMMENT ‘性别’,

birthday DATETIME DEFAULT NULL COMMENT ‘出生日期’,

address varchar(100) DEFAULT NULL COMMENT ‘家庭住址’,

gradeid int(10) noy null comment ‘学生的年级’,

email varchar(50) DEFAULT NULL COMMENT ‘邮箱’,

PRIMARY KEY(id),

– 1. 定义外键 FK_gradeid

KEY FK_gradeid(gradeid),

– 2. 给这个外键添加约束

CONSTRAINT FK_gradeid FOREIGN KEY(gradeid) references grade(gradeid)

)ENGINE = INNODB DEFAULT CHARSET = utf8;

方式二:创建表成功后,添加外键约束

– 创建表的时候没有外键关系

alter table studnet add constraint FK_gradeid foreign key(gradeid) references grade(gradeid),

以上操作都是物理外键,数据库级别的外键,我们不建议使用!

最佳实践

  • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)

  • 我们想使用多张表的数据,想使用外键(程序去实现)

注意:删除具有主外键关系的表时,要先删子表,后删主表

2.2 DML语言(记住)


数据库意义:数据存储,数据管理

DML语言:数据操作语言

  • Insert

  • update

  • delete

2.3 添加


insert

语法

– 插入数据(添加)

insert into 表名([字段名1,字段2,字段3]) values(‘值1’),(‘值2’),(‘值3’);

注意

  • 字段或值之间用英文逗号隔开

  • 可同时插入多条数据,values 后用英文逗号隔开

  • 由于主键自增我们可以省略(如果不写表的字段,它就会一一匹配)

  • 一般写插入语句,我们一定要数据和字段一一对应!

  • 字段是可以省略的,但是后面的值必须要一一对应

– 向grade表中的gradename字段插入

insert into grade(gradename) values(‘大四’);

– 插入多个字段

insert into grade(gradename)

values(‘大二’),(‘大一’);

– 数据和字段一一对应!

insert into student(name,pwd,sex) values(‘张三’,‘aaaa’,‘男’);

2.4 修改


update

语法

update 表名 set colnum_name = value,[…] where [条件]

注意事项

  1. colnum_name 是数据库的列,尽量带上``

  2. 条件,筛选的条件,如果没有指定,则会修改所有的列

  3. value ,是一个具体的值,也可以是一个变量

  4. 多个设置的属性之间,使用英文逗号隔开

update student set name=‘狂神’ where id = 1;

– 不指定条件的情况下,会改动所有表!

update student set name=‘长江7号’;

– 修改多个属性

update student set name=‘狂神’,email=‘12123@qq.com’ where id between 2 and 5;

– 通过多个条件定位数据

update student set name=‘长江7号’ where name=‘狂神’ and sex=‘男’;

| 操作符 | 含义 | 范围 | 结果 |

| — | — | — | — |

| = | 等于 | 5=6 | false |

| <>或 != | 不等于 | 5<>6 | true |

| > | 大于 | | |

| < | 小于 | | |

| <= | 小于等于 | | |

| >= | 大于等于 | | |

| between…and… | 在某个范围内 | [2,5] | |

| and | && | 5>1 and 1>2 | false |

| or | || | 5>1or 1>2 | true |

2.5 删除


delete 命令

语法: delete from 表名 [where 条件]

– 删除数据,如不指定条件则删除该表的所有列数据

delete from student;

– 删除指定数据

delete from student where id = 1;

truncate 命令

作用: 完全清空一个数据库表,表的结构和索引约束不会变

– 清空student 表

truncate student;

delete 和 truncate 区别

  • 相同点: 都能删除数据,都不会删除表结构,但truncate速度更快

  • 不同点

  • truncate 重新设置 自增列,计数器会归零

  • truncate 不会影响事务

3. DQL 查询数据(最重点)

===================================================================================

3.1DQL


(Date Query Language): 数据查询语言

  • 所有的查询操作都用它 ,select

  • 简单 和 复杂的查询都能做

  • 数据库中最核心的语言,最重要的语句

3.2Select语句


基本语法select 字段 from 表

– 查询全部学生

select * from student;

– 查询指定字段

select StudentNo,StudentName from student;

AS子句作为别名

作用:

  • 可给数据列取一个新别名

  • 可给表取一个新别名

  • 也可以给查询结果取一个新别名

– 别名,给结果起一个名字 AS 可以给字段起别名,也可以给表起别名(AS关键词可以省略)

select StudentNo As 学号,StudentName AS 学生姓名 from student AS S

– 函数 拼接字符串Concat(a,b)

select concat(‘姓名’,StudentName) AS 新名字 from student

语法: SELECT 字段1,字段2,..... FROM 表

3.3去重distinct


作用:去掉 select 查询返回的记录结果中重复的记录(返回所有列的值都相同),只返回一条

– 查询一下有哪些同学参加了考试,成绩

select * from result; – 查询全部的考试成绩

select StudentNo from result; – 查询有哪些同学参加了考试

select distinct StudentNo from result; – 发现重复数据,去重

数据库的列(表达式)

  • select 表达式 from 表

  • 数据库中的表达式: 文本值 ,列 , Null ,函数 , 计算表达式 , 系统变量

select version() – 查询系统版本(函数)

select 100*3-1 AS 计算结果 – 用来计算(表达式)

select @@auto_increment_increment – 查询自增的步长(变量)

– 学员考试成绩 + 1 查看

select StudentNo,StudentResult + 1 AS ‘提分后’ from result;

3.4where条件子句


作用: 检索数据中符合条件的值

搜索的条件由一个或者多个表达式组成,结果为布尔值!

逻辑运算符

| 运算符 | 语法 | 描述 |

| — | — | — |

| and && | a and b a&&b | 逻辑与,两个都为真,结果为真 |

| or || | a or b a || b | 逻辑或,其中一个为真,则结果为真 |

| Not ! | not a !a | 逻辑非,真为假,假为真 |

尽量使用英文字母

– 查询考试成绩在 95 ~ 100分之间的

select studentNo,StudentResult

from result

where StudentResult>=95 and StudentResult<=100

3.5模糊查询


模糊查询:比较运算符

| 运算符 | 语法 | 描述 |

| — | — | — |

| is null | a is null | 如果操作符为null,结果为真 |

| is not null | a is not null | 如果操作符不为null,结果为真 |

| between | a between and c | 若a在b和c之间,则结果为真 |

| like | a like b | SQL匹配,如果a匹配b,则结果为真 |

| in | a in(a1,a2,a3…) | 假设a在a1或者a2…,则结果为真 |

– 除了1000号同学,要其他同学的成绩

SELECT studentno,studentresult

FROM result

WHERE studentno!=1000;

– 使用NOT

SELECT studentno,studentresult

FROM result

WHERE NOT studentno=1000;

– 查询 1001,1002,1003号学员

select Sno,Sname

from student

where Sno in (1001,1002,1003);

– 查询在北京的学生

select Sno,Sname

from student

where Address in (‘安徽’,‘河南洛阳’);

– 查询姓刘的同学的学号及姓名

– like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符)

SELECT studentno,studentname FROM student

WHERE studentname LIKE ‘刘%’;

– 查询姓刘的同学,后面只有两个字的

SELECT studentno,studentname FROM student

WHERE studentname LIKE ‘刘__’;

– 查询姓名中含有 嘉 字的

SELECT studentno,studentname FROM student

WHERE studentname LIKE ‘%嘉%’;

– 查询出生日期没有填写的同学

– 不能直接写=NULL , 这是代表错误的 , 用 is null

SELECT studentname FROM student

WHERE BornDate IS NULL;

– 查询出生日期填写的同学

SELECT studentname FROM student

WHERE BornDate IS NOT NULL;

– 查询没有写家庭住址的同学(空字符串不等于null)

SELECT studentname FROM student

WHERE Address=‘’ OR Address IS NULL;

  • 注意: % _只能在like里面使用

  • in 里面是确切的集合

3.6连接查询


  • 内连接inner join :查询两个表中的结果集中的交集

  • 左外连接left join:以左表为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充

  • 右外连接right join:以右表为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充

数据库的搭建如下:

  • 创建一个school数据库

  • 创建学生表student

  • 创建年级表grade

  • 创建科目表subject

  • 创建成绩表result

– 创建一个school数据库

CREATE DATABASE IF NOT EXISTS school;

– 创建学生表

CREATE TABLE IF NOT EXISTS student(

studentno INT(4) NOT NULL COMMENT ‘学号’,

loginpwd VARCHAR(20) DEFAULT NULL,

studentname VARCHAR(20) DEFAULT NULL COMMENT ‘学生姓名’,

sex TINYINT(1) DEFAULT NULL COMMENT ‘性别,0或1’,

gradeid INT(11) DEFAULT NULL COMMENT ‘年级编号’,

phone VARCHAR(50) NOT NULL COMMENT ‘联系电话,允许为空’,

address VARCHAR(255) NOT NULL COMMENT ‘地址,允许为空’,

borndate DATETIME DEFAULT NULL COMMENT ‘出生时间’,

email VARCHAR (50) NOT NULL COMMENT ‘邮箱账号允许为空’,

identitycard VARCHAR(18) DEFAULT NULL COMMENT ‘身份证号’,

PRIMARY KEY (studentno),

UNIQUE KEY identitycard(identitycard),

KEY email (email)

)ENGINE=MYISAM DEFAULT CHARSET=utf8;

– 创建年级表

CREATE TABLE IF NOT EXISTS grade(

gradeid INT(11) NOT NULL AUTO_INCREMENT COMMENT ‘年级编号’,

gradename VARCHAR(50) NOT NULL COMMENT ‘年级名称’,

PRIMARY KEY (gradeid)

) ENGINE=INNODB AUTO_INCREMENT = 6 DEFAULT CHARSET = utf8;

– 创建科目表

CREATE TABLE IF NOT EXISTS subject(

subjectnoINT(11) NOT NULL AUTO_INCREMENT COMMENT ‘课程编号’,

subjectname VARCHAR(50) DEFAULT NULL COMMENT ‘课程名称’,

classhour INT(4) DEFAULT NULL COMMENT ‘学时’,

gradeid INT(4) DEFAULT NULL COMMENT ‘年级编号’,

PRIMARY KEY (subjectno)

)ENGINE = INNODB AUTO_INCREMENT = 19 DEFAULT CHARSET = utf8;

– 创建成绩表

CREATE TABLE IF NOT EXISTS result(

studentno INT(4) NOT NULL COMMENT ‘学号’,

subjectno INT(4) NOT NULL COMMENT ‘课程编号’,

examdate DATETIME NOT NULL COMMENT ‘考试日期’,

studentresult INT (4) NOT NULL COMMENT ‘考试成绩’,

KEY subjectno (subjectno)

)ENGINE = INNODB DEFAULT CHARSET = utf8;

JOIN 对比

在这里插入图片描述

inner join

  • 分析查询的字段来自哪些表 (来自两个表就用连接查询)

  • 确定交叉点(这两个表中哪个数据是相同的)

  • 判断条件: 学生表中的 studentNo = 成绩表中的 studentNo

在这里插入图片描述

查询参加了考试的同学的学号,姓名,科目编号,分数

  1. 学号,姓名 studentNo,studentName 在student表中

  2. 科目编号,分数 SubjectNo,StudentResult 在result表中

  3. 两个表中 studentNo 是相同的

select t1.studentNo,studentName,SubjectNo,StudentResult

from student as t1

inner join result as t2

– 既在student表里查,student表连接result,

– 两个表连起来,都有studentNo,所以要指向一个表的studentNo查

on t1.studentNo = t2.studentNo;

right join

select t1.studentNo,studentName,SubjectNo,StudentResult

from student t1

right join result t2

on t1.studentNo = t2.studentNo;

Java高频面试专题合集解析:

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

更多Java架构进阶资料展示

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

55380.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0F1Z2Vuc3Rlcm5fUVhM,size_16,color_FFFFFF,t_70#pic_center)

查询参加了考试的同学的学号,姓名,科目编号,分数

  1. 学号,姓名 studentNo,studentName 在student表中

  2. 科目编号,分数 SubjectNo,StudentResult 在result表中

  3. 两个表中 studentNo 是相同的

select t1.studentNo,studentName,SubjectNo,StudentResult

from student as t1

inner join result as t2

– 既在student表里查,student表连接result,

– 两个表连起来,都有studentNo,所以要指向一个表的studentNo查

on t1.studentNo = t2.studentNo;

right join

select t1.studentNo,studentName,SubjectNo,StudentResult

from student t1

right join result t2

on t1.studentNo = t2.studentNo;

Java高频面试专题合集解析:

[外链图片转存中…(img-hEyaBrNZ-1715416430514)]

当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!

[外链图片转存中…(img-KShMHyEK-1715416430514)]

更多Java架构进阶资料展示

[外链图片转存中…(img-j6IHyEWa-1715416430515)]

[外链图片转存中…(img-CWePkilF-1715416430515)]

[外链图片转存中…(img-VFbnFHL3-1715416430515)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 41
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值