《遇见狂神说》MySQL从入门到删库(一),3轮技术面和1轮Hr面拿下offer

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

逻辑运算符

| 运算符 | 语法 | 描述 |

| — | — | — |

| 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;

left join

select t1.studentNo,studentName,SubjectNo,StudentResult

from student t1

left join result t2

on t1.studentNo = t2.studentNo;

  • 左表是 student,先从 student里面查学生学号,学生姓名

  • 即使右表result表中没有和学生学号,学生姓名匹配的科目编号,分数

  • 也会返回所有的值,只是科目编号、分数为null

| studentNo | studentName | SubjectNo | StudentResult |

| — | — | — | — |

| 1001 | 孙大圣 | null | null |

3.7总结与区别


| 操作 | 描述 | |

| — | — | — |

| inner join | 如果表中至少有一个匹配,就返回行 | |

| left join | 会从左表中返回所有的值,即使右表中没有匹配 | |

| right join | 会从右表中返回所有的值,即使左表中没有匹配 | |

– 查询缺考的同学

select t1.studentNo,studentName,SubjectNo,StudentResult

from student t1

left join result t2

on t1.studentNo = t2.studentNo

where StudentResult = null;

– 查询了参加考试的同学信息: 学号,学生姓名,科目名,考试成绩

– 1.学号,学生姓名 student表

– 2.科目名 subject表

– 3.分数 result表

– 具体实现

select t1.studentNo,studentName,SubjectName,StudentResult

from student t1

right join result t2

on t1.studentNo = t2.studentNo

– 查询考试的信息,要以考试那张表去连,左连就是以左边的表为基准

– 再在上面所查询的结果中连接第三张表

inner join subject t3

on t2.SubjectNo = t3.SubjectNo;

语法

  • join(连接的表) on(判断条件) 连接查询

  • where 等值查询

3.8自连接(了解)


数据库建立:

  • 创建分类表

  • 在分类表中插入数据

– 创建分类表

CREATE TABLE IF NOT EXISTS category (

categoryid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ‘主题ID’,

pid INT(10) NOT NULL COMMENT ‘父ID’,

categoryName VARCHAR(50) NOT NULL COMMENT ‘主题名字’,

PRIMARY KEY(categoryid)

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

– 在分类表中插入

INSERT INTO category(categoryid,pid,categoryName)

VALUES

(2,1,‘信息技术’),

(3,1,‘软件开发’),

(4,3,‘数据库’),

(5,1,‘美术设计’),

(6,3,‘web开发’),

(7,5,‘PS技术’),

(8,2,‘办公信息’);

在这里插入图片描述


  • 自己的表和自己的表连接,一张表拆为两张一样的表即可

父类

| categoryid | categoryName |

| — | — |

| 2 | 信息技术 |

| 3 | 软件开发 |

| 5 | 美术设计 |

子类

| pid | categoryid | categoryName |

| — | — | — |

| 3 | 4 | 数据库 |

| 2 | 8 | 办公信息 |

| 3 | 6 | web开发 |

| 5 | 7 | ps技术 |

解释:数据库的pid是3,说明数据库在软件开发下,数据库自己的分类idcategoryid是4

操作:查询父类对应的子类关系

| 父类 | 子类 |

| — | — |

| 信息技术 | 办公信息 |

| 软件开发 | 数据库 |

| 软件开发 | web开发 |

| 美术设计 | ps技术 |

查询父类对应的子类关系

select a.categoryName AS ‘父栏目’,b.categoryName AS ‘子栏目’

from category AS a,category AS b

where a.categoryid = b.pid;

在这里插入图片描述

3.9分页和排序


  • 分页 limit

  • 排序 order by

  • 升序:ASC

  • 降序:DESC


排序语法: order by 通过哪个字段排序 怎么排

– 通过科目成绩升序排列

order by StudentResult ASC;


分页语法

  • 完整语法:limit 起始下标,页面的大小

  • 缺省语法:limit 5 这是取前5

  • 注意:mysql当中limitorder by之后执行!!

  • 第一页 ,显示5条数据

limit 0,5;

  • 第二页 ,显示5条数据

limit 5,5;

  • 第三页

limit 10,5;

  • 第n页

limit(n-1) * pageSize,pageSize

  • pageSize:页面大小

  • (n-1) * pageSize: 起始值

  • 数据总数/页面大小 = 总页数

例题:

查询JAVA第一学年课程成绩排名前十的学生,并且分数要大于80的学生信息(学号,姓名,课程名称,考试成绩)

  • 学号,姓名 ➡ 在student表

  • 课程名称 ➡ 在subject表

  • 考试成绩 ➡ 在result表

select t1.studentNo,StudentName,SubjectName,StudentResult

from student t1

inner join result t2

on t1.StudentNo = t2.StudentNo

inner join subject t3

on t3.SubjectNo = t2.SubjectNo

where SubjectName = ‘JAVA第一学年’ and StudentResult >= 80;

order by studentResult DESC

limit 0,10;

4.MySQL函数

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

4.1常用函数(了解)


  1. 数学运算

– 数学运算

select ABS(-8); – 绝对值8

select celiling(9.4) – 向上取整 10

select floor(9.4) – 向下取整 9

select rand() – 返回一个 0~1 之间的随机数

select sing(10) – 判断一个数的符号 0返回0 负数返回-1,正数返回1

  1. 字符串函数

– 字符串函数

select char_length(‘即使再小的帆也能远航’) – 字符串长度 10

select concat(‘我’,‘要’,‘加油’) – 拼接字符串

select lower(‘KUANG’) – 转小写

select upper(‘kuang’) – 转大写

select instr(‘kuangshen’,‘h’) – 返回第一次出现的子串的索引

select replace(‘坚持就能成功’,‘坚持’,‘努力’) – 替换出现的指定字符串

select substr(‘坚持就能成功’,2,3) – 返回指定的字符串(源字符串,截取的位置,截取的长度)

select reverse(‘Hello’) – 反转字符串

  1. 时间和日期函数(记住)

– 时间和日期函数(记住)

select current_data() – 获取当前日期

select curdate() – 获取当前日期

select now() – 获取当前的时间

select localtime() – 本地时间

select sysdate() – 系统时间

select year(now()) – 年

select month(now()) – 月

select day(nowue()) – 日

4.2聚合函数


| 函数名称 | 描述 |

| — | — |

| COUNT() | 返回满足Select条件的记录总和数 |

| SUM() | 返回数字字段或表达式列作统计,返回一列的总和 |

| AVG() | 通常为数值字段或表达列作统计,返回一列的平均值 |

| MAX() | 可以为数值字段,字符字段或表达式列作统计,返回最大的值 |

| MIN() | 可以为数值字段,字符字段或表达式列作统计,返回最小的值 |

– count(指定列/字段)

select count(Studentname) from student;

– count(*)

select count(*) from student;

– count(1) 推荐

select count(1) from student;

上述三种sql语句返回的结果是相同的,都是有多少个学生姓名,那么它们有什么区别呢?

  • count(指定列/字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null的记录。

  • count(*)包括了所有的列,相当于行数,在统计结果的时候,包含字段为null 的记录

  • count(1) 用1代表代码行,在统计结果的时候,包含字段为null 的记录


下面它们之间的一些对比:

  1. 在表没有主键时,count(1)count(*)

  2. 有主键时,主键作为计算条件,count(主键)效率最高

  3. 若表格只有一个字段,则count(*)效率较高


其他聚合函数用法

select sum(‘StudentResult’) AS 总和 from result;

select avg(‘StudentResult’) AS 平均分 from result;

select max(‘StudentResult’) AS 最高分 from result;

select min(‘StudentResult’) AS 最低分 from result;

4.3MD5加密(扩展)


MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。

实现数据加密

  1. 新建一个表 testmd5

CREATE TABLE testmd5 (

id INT(4) NOT NULL,

name VARCHAR(20) NOT NULL,

pwd VARCHAR(50) NOT NULL,

PRIMARY KEY (id)

) ENGINE=INNODB DEFAULT CHARSET=utf8

  1. 插入一些数据

INSERT INTO testmd5 VALUES

(1,‘kuangshen’,‘123456’),

(2,‘1 qinjiang’,‘456789’)

  1. 如果我们要对pwd这一列数据进行加密,语法是:

update testmd5 set pwd = md5(pwd);

  1. 如果单独对某个用户(如kuangshen)的密码加密

INSERT INTO testmd5 VALUES

(3,‘kuangshen2’,‘123456’)

update testmd5 set pwd = md5(pwd)

where name = ‘kuangshen2’;

  1. 插入新的数据自动加密

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

结语

小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。

我们选择的这个行业就一直要持续的学习,又很吃青春饭。

虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。

送给每一位想学习Java小伙伴,用来提升自己。

在这里插入图片描述

本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-c6GDXexT-1712681675849)]
[外链图片转存中…(img-kWRiVdq3-1712681675849)]
[外链图片转存中…(img-U6IonXCW-1712681675850)]
[外链图片转存中…(img-DNnslyDa-1712681675850)]
[外链图片转存中…(img-3QID9du3-1712681675850)]
[外链图片转存中…(img-tU9xgbHF-1712681675851)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-uaJWV03P-1712681675851)]

结语

小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。

我们选择的这个行业就一直要持续的学习,又很吃青春饭。

虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。

送给每一位想学习Java小伙伴,用来提升自己。

[外链图片转存中…(img-ehVYZVSh-1712681675851)]

本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-dZKoV1Wh-1712681675851)]

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值