MySQL数据库基础-全网最详细,Java中高级面试必知必会

二、数据库的列类型

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

1、数值类型


| TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 |

| :-: | — | — | — | — |

| SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |

| MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |

| INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |

| BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |

| FLOAT | 4 bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |

| DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |

| DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |

2、日期和时间类型


| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |

| — | — | — | — | — |

| TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |

| YEAR | 1 | 1901/2155 | YYYY | 年份值 |

| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |

| TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |

3、字符串类型


| CHAR | 0-255 bytes | 定长字符串 |

| — | — | — |

| VARCHAR | 0-65535 bytes | 变长字符串 |

| TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |

| TINYTEXT | 0-255 bytes | 短文本字符串 |

| BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |

| TEXT | 0-65 535 bytes | 长文本数据 |

| MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |

| MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |

| LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |

| LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |

三、MySQL 创建数据表

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

1、通用语法


– CREATE TABLE table_name (column_name column_type);

CREATE TABLE user (

id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘主键ID’,

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

age int(11) DEFAULT NULL COMMENT ‘年龄’,

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

version int(10) NOT NULL DEFAULT ‘1’ COMMENT ‘版本’,

gmt_create datetime DEFAULT NULL COMMENT ‘创建时间’,

gmt_update datetime DEFAULT NULL COMMENT ‘修改时间’,

is_delete int(1) DEFAULT NULL COMMENT ‘伪删除’,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

  • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。

  • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。

  • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。

  • ENGINE 设置存储引擎,CHARSET 设置编码,COLLATE排序规则

四、删除数据库表

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

1、通用语法


– DROP TABLE table_name

DROP TABLE user;

五、插入数据

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

1、通用语法


–INSERT INTO table_name (field1, field2, field3…) VALUES (values1, values2, values2…);

– 字段与value一一对应

INSERT INTO user (name, age, email, version, gmt_create, gmt_update, is_delete) VALUES (‘李子捌’, ‘18’, ‘1057301174@qq.com’, 1, NOW(), NOW(), 1);

– 没有字段名则需要顺序一致

INSERT INTO user VALUES (8, ‘李子捌’, 18, ‘1057301174@qq.com’, 1, NOW(), NOW(), 1);

INSERT INTO user SET name = ‘李子捌’, age = 18;

六、查询语句

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

1、通用语法


–SELECT column_name,column_nameFROM table_name[WHERE Clause][LIMIT N][ OFFSET M]

select * from user;

  • 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。

  • SELECT 命令可以读取一条或者多条记录。

  • 可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据

  • 可以使用 WHERE 语句来包含任何条件。

  • 可以使用 LIMIT 属性来设定返回的记录数。

  • 可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。

七、MySQL WHERE 子句

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

1、通用语法


–SELECT field1, field2,…fieldN FROM table_name1, table_name2…[WHERE condition1 [AND [OR]] condition2…

SELECT name, age FROM user WHERE name = ‘李子捌’ or age = 18;

  • 可以在 WHERE 子句中指定任何条件。

  • 可以使用 AND 或者 OR 指定一个或多个条件。

八、MySQL UPDATE 更新

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

1、通用语法


– UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]

UPDATE user SET age = 3 WHERE name = ‘李子捌’ AND email = ‘1057301174@qq.com’;

  • 可以同时更新一个或多个字段。

  • 可以在 WHERE 子句中指定任何条件。

  • 可以在一个单独表中同时更新数据。

九、MySQL DELETE 语句

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

1、通用语法


– DELETE FROM table_name [WHERE Clause]

DELETE FROM user WHERE name = ‘李子捌’;

  • 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。

  • 可以在 WHERE 子句中指定任何条件

十、MySQL LIKE 子句

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

1、通用语法


– SELECT field1, field2,…fieldN FROM table_name WHERE field1 LIKE condition1 [AND [OR]] filed2 = ‘somevalue’

SELECT name, age, email FROM user WHERE name LIKE ‘%捌’;

– 百分号可在左边、右边、两边

– ‘%捌’ ‘捌%’ ‘%捌%’

– 以捌结尾 以捌开头 包含捌

https://blog.csdn.net/daemon329/article/details/106170743

十一、DQL语言

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

DQL(Data Query Language数据查询语言)

  • 查询数据库数据,如select语句

  • 简单的单表查询或者夺标的复杂查询和嵌套查询

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

  • 使用的频率最高的语言

1、select完整语法


SELECT [ALL | DISTINCT]

{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,…]}

FROM table_name [as table_alias]

[left | right | inner join table_name2] – 联合查询

[WHERE …] – 指定满足结果的条件

[GROUP BY …] – 指定结果按照那些字段来分组

[HAVING] – 过滤分组必须满足的次要条件

[ORDER BY …] – 指定查询记录按照一个或者多个条件排序

[LIMIT {[offset,]row_count | row_countOFFSET offset}]; – 指定查询记录从哪条到哪条

注意: []代表可选,{}代表必选

2、指定查询字段


– 查询所有的学生信息(速度慢不推荐使用)

SELECT * FROM student;

– 查询指定列(学号,姓名)

SELECT studentno,studentname FROM student;

使用AS 子句作为别名

作用:

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

  • 可以给表取一个新的别名

  • 可以把计算后的结果用一个别名代替

– 为列取一个别名

SELECT studentno AS 学号, studentname AS 姓名 FROM student;

– 为表取一个别名

SELECT studentno AS 学号, studentname AS 姓名 FROM student AS s;

– 使用AS为查询的结果取一个名字 CONCAT()函数字符串拼接,在studentname数据前面拼接 姓名:

SELECT CONCAT(‘姓名:’, studentname) AS 新姓名 FROM student;

DISTINCT 关键字的使用

作用:

  • 去掉SELECT查询的记录中重复的记录

– 查看哪些同学参加了考试(学号) 去除重复项

– 查询成绩表

SELECT * FROM result;

– 查询成绩表中的学号,及查询哪些同学参加了考试(有成绩的学生)

SELECT studentno FROM result;

– 根据学号去重

SELECT DISTINCT studentno FROM result;

使用表达式的列

数据库中的表达式:一般由文本、列值、null、函数和操作符组成

应用场景:

  • SELECT语句中返回结果列中使用

  • SELECT语句中ORDER BY ,HAVING等子句使用

  • DML语句中的where条件语句中使用的表达式

– selcet查询中可以使用表达式

SELECT @@auto_increment_increment; – 查询自增步长

SELECT VERSION(); – 查询版本号

SELECT 88*3-1 AS 计算结果; – 表达式

– 学员考试成绩集体提分一分查看

SELECT studentno,studentresult+1 AS ‘分数加1’ FROM result;

3、where条件语句


作用:

  • 用于检索数据表中符合条件的记录

搜索的条件可以由一个或者多个逻辑表达式组成,结果一般为真或假

逻辑操作符

| 运算符号 | 作用 |

| :-- | :-- |

| NOT 或 ! | 逻辑非 |

| AND | 逻辑与 |

| OR | 逻辑或 |

| XOR | 逻辑异或 |

– 指定字段全表

SELECT Studentno,StudentResult FROM result;

– 查询成绩在95-100之间的 ADN 也可以写成 &&

SELECT studentno,studentresult

FROM result

WHERE studentresult >=95 AND studentresult <=100;

– 模糊查询(对应的词:精确查询)

SELECT studentno,studentresult

FROM result

WHERE studentresult BETWEEN 95 AND 100;

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

SELECT studentno,studentresult

FROM result

WHERE studentno != 888

– 除了888号同学,要其他同学的成绩 使用not

SELECT studentno,studentresult

FROM result

WHERE NOT studentno = 888

算术运算符

| 运算符 | 作用 |

| :-- | :-- |

| + | 加法 |

| - | 减法 |

| * | 乘法 |

| / 或 DIV | 除法 |

| % 或 MOD | 取余 |

比较操作符

| | | |

| :-- | :-- | :-- |

| 符号 | 描述 | 备注 |

| = | 等于 | |

| <>, != | 不等于 | |

| > | 大于 | |

| < | 小于 | |

| <= | 小于等于 | |

| >= | 大于等于 | |

| BETWEEN | 在两值之间 | >=min&&<=max |

| NOT BETWEEN | 不在两值之间 | |

| IN | 在集合中 | |

| NOT IN | 不在集合中 | |

| <=> | 严格比较两个NULL值是否相等 | 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 |

| LIKE | 模糊匹配 | |

| REGEXP 或 RLIKE | 正则式匹配 | |

| IS NULL | 为空 | |

| IS NOT NULL | 不为空 | |

注意:

  • 数值类型之间才能使用算术运算符

  • 相同的数据类型之间才能比较

– 模糊查询 between and \ like \ in \ null

– LIKE

– 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 ‘李__’;

– 查询姓名中含有 捌 字的

SELECT studentno,studentname FROM student

WHERE studentname LIKE ‘%捌%’;

– 查询姓名中含有特殊字符的需要使用转义符号 ‘’

– 自定义转义符关键字: ESCAPE ‘:’

– IN

– 查询学号为1000,1001,1002的学生姓名

SELECT studentno,studentname FROM student

WHERE studentno IN (1000,1001,1002);

– 查询地址在深圳,长沙,娄底的学生

SELECT studentno,studentname,address FROM student

WHERE address IN (‘深圳’,‘长沙’,‘娄底’);

– NULL

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

– 不能直接写=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;

4、连接查询


| 操作符名称 | 描述 |

| — | — |

| INNER JOIN | 如果表中至少一个匹配,则返回 |

| LEFT JOIN | 返回左表的所有行,右表匹配行 |

| RIGHT JOIN | 返回右表的所有行,左表匹配行 |

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LQR1TnC2-1622729395022)(C:\Users\Leon Plious\Desktop\u=813688978,869557195&fm=15&gp=0.jpg)]

/*

连接查询

如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询

内连接 inner join

查询两个表中的结果集中的交集

外连接 outer join

左外连接 left join

(以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)

右外连接 right join

(以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)

等值连接和非等值连接

自连接

*/

– 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)

SELECT * FROM student;

SELECT * FROM result;

/*思路:

(1):分析需求,确定查询的列来源于两个类,student result,连接查询

(2):确定使用哪种连接查询?(内连接)

*/

SELECT s.studentno, studentname, subjectno, studentresult

FROM student s

INNER JOIN result r

ON s.studentno = r.studentno;

– 右连接实现

SELECT s.studentno, studentname, subjectno, studentresult

FROM student s

RIGHT JOIN result r

ON s.studentno = r.studentno;

– 左连接(注意左表为student,没有成绩的学生信息也会被查出)

SELECT s.studentno, studentname, subjectno, studentresult

FROM student s

LEFT JOIN result r

ON s.studentno = r.studentno;

– 等值连接

SELECT s.studentno, studentname, subjectno, studentresult

FROM student s, result r

WHERE s.studentno = r.studentno;

– 查一下缺考的同学(左连接应用场景)

SELECT s.studentno, studentname, subjectno, studentresult

FROM student s

LEFT JOIN result r

ON s.studentno = r.studentno

WHERE studentresult IS NULL;

– 查询参加了考试的同学信息(学号,学生姓名,科目名,分数)

SELECT s.studentno, studentname, subjectno, subjectname, studentresult

FROM student s

INNER JOIN result r

ON s.studentno = r.studentnos

INNER JOIN subject sub

ON sub.subjectno = r.subjectno

自连接

/*

自连接

数据表与自身进行连接

需求:从一个包含栏目ID , 栏目名称和父栏目ID的表中

查询父栏目名称和其他子栏目名称

*/

– 创建一个表

CREATE TABLE 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’,‘办公信息’);

– 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)

– 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)

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

FROM category AS a, category AS b

WHERE a.categoryid = b.pid

5、排序和分页


– 排序

/**

语法 : ORDER BY

ORDER BY 语句用于根据指定的列对结果集进行排序。

ORDER BY 语句默认按照ASC升序对记录进行排序。

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

*/

– 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)

– 按成绩降序排序

SELECT s.sudentno, studentname, subjectname, sudentresult

FROM student s

INNER JOIN result r

ON r.sudentno = s.sudentno

INNER JOIN subject sub

ON sub.subjectno = r.subjectno

WHERE subjectname = ’ 数据库结构-1’

ORDER BY sudentresult DESC;

– 分页

/**

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

pageNo pageSize

LIMIT (pageNo - 1)*pageSize, pageSize

*/

– 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)

– 按成绩降序排序

– 每页显示100条数据

SELECT s.sudentno, studentname, subjectname, sudentresult

FROM student s

INNER JOIN result r

ON r.sudentno = s.sudentno

INNER JOIN subject sub

ON sub.subjectno = r.subjectno

WHERE subjectname = ’ 数据库结构-1’

ORDER BY sudentresult DESC

LIMIT 0, 100;

6、子查询


/*============== 子查询 ================

什么是子查询?

在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句

嵌套查询可由多个子查询组成,求解的方式是由里及外;

子查询返回的结果一般都是集合,故而建议使用IN关键字;

*/

– 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列

SELECT studentno, subjectno, studentresult

FROM result

WHERE subjectno=(

SELECT subjectno FROM subjct

WHERE subjectname = ‘数据库结构-1’

) ORDER BY studentresult DESC;

– 查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名

SELECT studentno, studentname

FROM student

WHERE studentno IN(

SELECT studentno

FROM result

WHERE studentresult >=80 AND subjectno = (

SELECT subjectno

FROM subjct

WHERE subjectname = ‘高等数学-2’

)

)

十二、MySQL函数

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

1、数据函数


/* 取绝对值 */

SELECT ABS(-10);

/* 向上取整 */

SELECT CEILING(9.1);

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

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

,并且成绩降序排列

SELECT studentno, subjectno, studentresult

FROM result

WHERE subjectno=(

SELECT subjectno FROM subjct

WHERE subjectname = ‘数据库结构-1’

) ORDER BY studentresult DESC;

– 查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名

SELECT studentno, studentname

FROM student

WHERE studentno IN(

SELECT studentno

FROM result

WHERE studentresult >=80 AND subjectno = (

SELECT subjectno

FROM subjct

WHERE subjectname = ‘高等数学-2’

)

)

十二、MySQL函数

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

1、数据函数


/* 取绝对值 */

SELECT ABS(-10);

/* 向上取整 */

SELECT CEILING(9.1);

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

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-1CdespVI-1710835589985)]
[外链图片转存中…(img-M4H7XfsF-1710835589985)]
[外链图片转存中…(img-FAJDOgta-1710835589986)]

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

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-l1qsR1pH-1710835589986)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值