MySQL数据库基础-全网最详细
Posted 李子捌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库基础-全网最详细相关的知识,希望对你有一定的参考价值。
一、操作数据库
1、创建数据库
CREATE DATABASE IF NOT EXISTS user;
2、删除数据库
DROP DATABASE IF EXISTS user;
3、使用数据库
-- 如果使用的表名或者字段名是一个特殊字符,则需要带``
USE `user`;
4、查看数据库
-- 查看所有的数据库
SHOW DATABASE;
二、数据库的列类型
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);
/* 向下取整 */
SELECT FLOOR(9.9);
/* 返回一个0-1之间的随机数 0.7898709874505838 */
SELECT RAND();
/* 符号函数 正数返回1、负数返回-1、0返回0*/
SELECT SIGN(-1)
2、字符串函数
/* 返回字符串的长度 */
SELECT CHAR_LENGTH('成功绝不是偶然')
/* 字符串拼接 */
SELECT CONCAT('李','子','捌')
/* 字符串插入 注意第一个参数是开始替换的位置索引从1开始,不是0开始, 第二个参数是替换的长度*/
SELECT INSERT('我是李子捌我热爱三国',7,2,'非常热爱');
/* 转大写 */
SELECT UPPER('liziba');
/* 转小写 */
SELECT LOWER('LIZIBA');
/* 从左边截取 */
SELECT LEFT('李子捌热爱编程',3);
/* 从右边截取 */
SELECT RIGHT('李子捌热爱编程',4);
/* 替换指定字符串 */
SELECT REPLACE('李子捌说李子捌热爱编程','李子捌','借力好风');
/* 字符串截取 第一个参数为起始索引,第二个参数为字符串长度*/
SELECT SUBSTR('李子捌说李子捌热爱编程',5, 7);
3、日期和时间函数
/* 获取当前日期 2021-01-01*/
SELECT CURRENT_DATE();
/* 获取当前日期 2021-01-01*/
SELECT CURDATE();
/* 获取当前日期 + 时间 2021-01-01 13:04:48 */
SELECT NOW();
/* 获取当前日期 + 时间 2021-0以上是关于MySQL数据库基础-全网最详细的主要内容,如果未能解决你的问题,请参考以下文章
六年开发经验,整理Mysql数据库技巧笔记,全网最详细的笔记集合!
Mysql数据库漏洞修复方法以及升级方法指南最详细全网独一份