Py学习  »  DATABASE

MySQL基础知识(2021最新版教程)

1_byte • 3 年前 • 49 次点击  


一、MySQL简介

MySQL是一种开放源代码的关系型数据库管理系统,使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理。

MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。

因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。

注:以上内容来自百度百科


提示:以下是本篇文章正文内容,所有内容均为我学习MySQL过程中做的笔记,欢迎阅读!
在这里插入图片描述

关于SQL语句的注意事项:

1、SQL语句中的 [ ] 中的内容为可选,可以写也可以不写。

2、每个SQL语句句末的分号可以写也可以不写。

3、SQL语句对大小写不敏感,大写小写都行。-- 为注释符号。

4、除了汉字,所有的SQL语句必须是英文状态下输入的才行,不然会报错。

5、数据库名、表名或字段名上的``符号(我叫它斜引号),这个符号不是单引号,而是tab键上面的那个键的符号,这个符号可写可不写。如果你的数据库名、表名或字段名是一个特殊字符或者关键字时,就需要带上这个符号。

二、数据库操作

2.1、创建数据库

基本语法:

CREATE DATABASE [IF NOT EXISTS] 数据库名;
  • 1
  • 1

举例,创建一个名为stu的数据库:

CREATE DATABASE IF NOT EXISTS stu;
  • 1
  • 1

在创建数据库时,我们应该要使用 IF NOT EXISTS 进行判断创建的数据库是否已经存在,这样可以避免运行SQL语句出现报错。

2.2、删除数据库

基本语法:

DROP DATABASE [IF EXISTS] 数据库名;
  • 1
  • 1

举例,删除一个名为stu的数据库:

DROP DATABASE IF EXISTS stu;
  • 1
  • 1

2.3、使用数据库

基本语法:

USE 数据库名;
  • 1
  • 1

举例,使用一个名为stu的数据库:

USE stu;
  • 1
  • 1

值得注意的是,如果你的数据库名、表名或字段名是一个特殊字符或者关键字时,就需要带``,这个符号不是单引号,而是tab键上面的那个键的符号,即斜引号。

举例,使用数据库名为stu或table的数据库:

USE `stu`;
USE `table`;
  • 1
  • 2
  • 1
  • 2

2.4、查看数据库

基本语法:

SHOW DATABASE;
  • 1
  • 1

指查看所有的数据库。

三、数据库列的类型

3.1、数值类型

类型名 描述
tinyint 十分小的数据,只占1个字节
smallint 较小的数据,占2个字节
mediumint 中等大小的数据,占3个字节
int 标准的整数,占4个字节(常用)
bigint 较大的数据,占8个字节
float 浮点数,占4个字节
double 浮点数,占8个字节
decimal 字符串形式的浮点数,占8个字节

3.2、字符串类型

类型名 描述
char 固定的字符串大小,范围0~255
varchar 可变字符串,范围0~65535(常用)
tinytext 微型文本,范围2^8-1
text 文本串,范围2^16-1

3.3、时间与日期类型

类型名 描述
date 日期,格式为YY-MM-DD
time 时间,格式为HH:mm:ss
datetime 日期与时间,格式为YY-MM-DD HH:mm:ss (常用)
timestamp 时间戳,从1970年1月1日到现在的毫秒数
year 年份

四、数据库的字段属性

4.1、字段属性

Unsigned: Unsigned属性,指无符号的整数,如果声明了该属性,则该字段对应的列的数据不能为负数。

zerofill: zerofill属性,指0填充,即不足的位数用0来填充。

自增: 自动在上一条记录的基础上加1(默认),一般用来设置唯一的主键。可以自定义自增的起始值和步长。

非空: 如果设置为not null,则必须填写值,否则会报错;如果设置为null,可以不填写值,则默认值为null。

默认: 设置为默认的值,如果不指定该列的值,则会有默认值。

五、数据库表的操作

5.1、表的创建

基本语法:

CREATE TABLE [IF NOT EXISTS] `表名` (
		`字段名` 列类型 [属性] [索引] [注释],
		`字段名` 列类型 [属性] [索引] [注释],


    

		...
		`字段名` 列类型 [属性] [索引] [注释]
)[表的类型] [字符集设置] [注释]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

举例,创建一个student表:

CREATE TABLE IF NOT EXISTS `student` (
		`id` INT(10) NOT NULL auto_increment COMMENT '学号',
		`name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
		`age` INT(3) NOT NULL COMMENT '年龄',
		PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

-- `id`: 字段名(列名),要用斜引号``,在tab键上方
-- INT(10): 列类型与长度
-- NOT NULL: 非空
-- auto_increment: 自增
-- COMMENT: 注释,后面是字符串,要用单引号或双引号
-- PRIMARY KEY: 设置字段`id`为主键,即学号为主键

-- 注意:每个字段之间需要用逗号隔开
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

5.2、表的修改与删除

修改表的基本语法:

-- 修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
-- 增加表的字段
ALTER TABLE 表名 ADD 字段名 列类型
-- 修改表的字段约束
ALTER TABLE 表名 MODIFY 字段名 列类型 [类属性]
-- 修改表的字段名(重命名)
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 [列类型] [列属性]
-- 删除表的字段
ALTER TABLE 表名 DROP 字段名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

举例,修改表名、字段名、字段约束以及删除字段:

-- 修改表名
ALTER TABLE student RENAME AS student1
-- 增加表的字段
ALTER TABLE student1 ADD sex INT(2)
-- 修改表的字段约束
ALTER TABLE student1 MODIFY age VARCHAR(12)
-- 修改表的字段名(重命名)
ALTER TABLE student1 CHANGE age age1 INT(2)



    
-- 删除表的字段
ALTER TABLE student1 DROP age1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

删除表的基本语法:

DROP TABLE [IF EXISTS] 表名
  • 1
  • 1

举例,删除student表:

DROP TABLE IF EXISTS student
  • 1
  • 1

六、DML语言数据管理

6.1、DML语言

DML语言,即数据库操作语言,包括数据的插入、修改与删除操作,即insert、update、delete。

6.2、插入数据

基本语法:

INSERT INTO 表名([字段名1],[字段名2],[字段名3],...) 
VALUES(1,2,3,...)
  • 1
  • 2
  • 1
  • 2

字段名1对应值1,字段名2对应值2,字段名n对应值n,一定要一一对应。

举例,在student表中插入值:

INSERT INTO `student`(`id`,`name`,`age`) VALUES(202101,'酷酷的猿',20)
  • 1
  • 1

或者也可以这样写:

INSERT INTO `student` 
VALUES(202101,'酷酷的猿',20)
  • 1
  • 2
  • 1
  • 2

我一般会把斜引号也省略,因为student并不是一个特殊字符。

6.3、修改数据

基本语法:

UPDATE 表名 SET 字段名1=1,字段名2=2,... 
WHERE 条件语句
  • 1
  • 2
  • 1
  • 2

举例,修改student表中学号为202101的学生的姓名和年龄:

UPDATE `student` SET `name`='张三',`age`=21 
WHERE id = 202101
  • 1
  • 2
  • 1
  • 2

也可以只修改一个:




    
UPDATE `student` SET `name`='张三' WHERE id = 202101
  • 1
  • 1

6.4、删除数据

基本语法:

--删除表的所有数据
DELETE FROM 表名
--删除指定的数据
DELETE FROM 表名 WHERE 条件语句
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

举例,删除表的数据:

--删除表的所有数据
DELETE FROM `student`
--删除指定的数据
DELETE FROM `student` WHERE id = 202101
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

DELETE 命令可以使用 TRUNCATE 命令替代,推荐使用 TRUNCATE (TRUNCATE命令会重新设置自增列,不会影响事务)。

七、SQL语句的操作符

7.1、操作符及其含义

操作符 含义
= 等于
<> 或 != 不等于
> 大于
< 小于
>= 大等于
<= 小等于
BETWEEN … AND … 在某个范围内
AND 用于连接多个条件,相当于 &&
OR 用于连接多个条件,相当于 ll

八、DQL查询数据

8.1、Select语句

基本语法:

-- 查询全部记录
SELECT * FROM 表名
-- 查询指定字段
SELECT 字段名1,字段名2,字段名3,... FROM 表名
-- 查询指定字段,并设置别名,别名不需要加引号
SELECT 字段名1 AS 别名1,字段名2 AS 别名2,字段名3 AS 别名3 FROM 表名
-- 去重查询,去掉重复的记录
SELECT DISTINCT 字段名 FROM 表名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

举例:

-- 查询全部学生
SELECT * FROM `student`
-- 查询指定字段
SELECT `id`,`name`,`age` FROM `student`
-- 查询指定字段,并设置别名,别名不需要加引号
SELECT `id` AS 学号,`name` AS 姓名,`age` AS 年龄 FROM `student`
-- 去重查询,去掉重复的记录
SELECT DISTINCT `name` FROM `


    
student`
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

8.2、Where语句

基本语法:

SELECT ... FROM 表名 WHERE 条件语句
  • 1
  • 1

举例:

-- 条件查询
SELECT * FROM `student` WHERE age>=18 AND age<= 22
SELECT * FROM `student` WHERE age>=18 && age<= 22
SELECT * FROM `student` WHERE age BETWEEN 18 AND 22
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

8.3、模糊查询

举例:

-- 查询姓张的学生,如张三、张小明,名字后面有任意个字
SELECT * FROM `student` WHERE `name` LIKE '张%'
-- 查询姓张的学生,如张三,名字后面只有一个字
SELECT * FROM `student` WHERE `name` LIKE '张_'
-- 查询姓张的学生,如张大爷,名字后面有两个字
SELECT * FROM `student` WHERE `name` LIKE '张__'
-- 查询名字中间有‘三’的学生,如张三丰,名字后面有两个字
SELECT * FROM `student` WHERE `name` LIKE '%三%'

-- 查询学号为202101,202102,202103的学生
SELECT * FROM `student` WHERE  id IN (202101,202102,202103)

-- 查询年龄不为空的学生的姓名
SELECT `name` FROM `student` WHERE  age IS NOT NULL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

8.4、JoinOn联表查询

基本语法:

-- 查询相同的记录,至少有一个匹配就会返回
SELECT 别名1.字段名1 别名2.字段名2 FROM 左表表名 别名 INNER JOIN 右表表名 别名 ON 别名1.字段名 = 别名2.字段名

-- 左查询
-- 即使右表中没有匹配,也会从左表中返回所有的值
SELECT 别名1.字段名1 别名2.字段名2 FROM 左表表名 别名 LEFT JOIN 右表表名 别名 ON


    
 别名1.字段名 = 别名2.字段名

-- 右查询
-- 即使左表中没有匹配,也会从右表中返回所有的值
SELECT 别名1.字段名1 别名2.字段名2 FROM 左表表名 别名 RIGHT JOIN 右表表名 别名 ON 别名1.字段名 = 别名2.字段名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

举例,联表查询:

-- 查询student表与result表中学号相同的记录,至少有一个匹配就会返回
SELECT s.id s.name FROM student s INNER JOIN result r ON s.id = r.id

-- 查询student表与result表中学号相同的记录,以左表为准
-- 即使右表中没有匹配,也会从左表中返回所有的值
SELECT s.id s.name FROM student s LEFT JOIN result r ON s.id = r.id

-- 右查询
-- 查询student表与result表中学号相同的记录,以右表为准
-- 即使左表中没有匹配,也会从右表中返回所有的值
SELECT s.id s.name FROM student s RIGHT JOIN result r ON s.id = r.id
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

8.5、分页和排序

基本语法:

-- 降序排列
ORDER BY 字段名 DESC
-- 升序排列
ORDER BY 字段名 ASC
-- 分页查询
LIMIT 起始值,页面的大小
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

举例:

-- 降序排列
SELECT * FROM student WHERE age = 20 ORDER BY id DESC
-- 升序排列
SELECT * FROM student WHERE age = 20 ORDER BY id ASC
-- 分页,第1页,查询第1-5条数据
SELECT * FROM student WHERE age = 20 ORDER BY id ASC LIMIT 0,5
-- 分页,第2页,查询第6-10条数据
SELECT * FROM student WHERE age = 20 ORDER BY id ASC LIMIT 5,5
-- 分页,第3页,查询第11-15条数据
SELECT * FROM student WHERE age = 20 ORDER BY id ASC LIMIT1 10,5

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

8.6、子查询

基本语法:

SELECT name,age 
FROM `student` s 
INNER JOIN `result` r 
ON s.id = r.id
INNER JOIN `subject` sub
ON r.subNo = sub.subNo
WHERE subName = 'MySQL从入门到删库跑路'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

九、MySQL常用函数

可以前往MySQL官网查看: MySQL官方文档

在这里插入图片描述

十、MySQL事务

注:MySQL事务(以下内容来自菜鸟教程)

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

事务用来管理 insert,update,delete 语句。一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

10.1、原子性

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

10.2、一致性

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

10.3、隔离性

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

10.4、持久性

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

十一、总结

这篇文章是我在学习MySQL过程中总结的基础知识,总结的目的是为了方便今后查阅。如果你想系统的学习MySQL,建议查阅官方文档,或者前往B站、菜鸟教程等网站进行学习。

在这里插入图片描述

等一下,为什么每次给我点赞的小伙伴,个个都长得那么帅、那么漂亮,又那么有素质呢,我真是搞不懂!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/106180
 
49 次点击