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、数值类型

TINYINT1 byte(-128,127)(0,255)小整数值
SMALLINT2 bytes(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4 bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 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)单精度 浮点数值
DOUBLE8 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、日期和时间类型

DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

3、字符串类型

CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-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以上是关于MySQL数据库基础-全网最详细的主要内容,如果未能解决你的问题,请参考以下文章

全网最详细的新手入门Mysql命令和基础,小白必看!

Mysql NDB Cluster 集群搭建实战全网最详细

六年开发经验,整理Mysql数据库技巧笔记,全网最详细的笔记集合!

Mysql数据库漏洞修复方法以及升级方法指南最详细全网独一份

全网最细MySQL事务!!!(万字长文详细分析四个隔离级别)这还能不懂?(强烈建议收藏)

本地Navicat连接阿里云数据库RDS for MySQL(全网最详细,没有之一!)