MySQL小白快速入门教程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一天掌握MySQL基础知识,达到能完成基本开发的要求

MySQL安装

Win mysql安装:Windows下安装MySQL详细教程 - m1racle - 博客园 (cnblogs.com)

Mac mysql安装:在MAC上安装mysql_码农伍的博客-CSDN博客_mac安装mysql

库操作

数据库连接

mysql -h 主机名 -P 端口 -u 用户名 -p 密码
mysql -h 127.0.0.1 -P 3306 -u root -p root

创建数据库

CREATE DATABASE [IF NOT EXISTS] 数据库名 CHARACTER SET 数据库采用的字符集 COLLATE 字符集的校对规则
  • CHARACTER SET:指定数据库采用的字符集,如果不指定字符集,默认utf8
  • COLLATE:指定数据库字符集的校对规则
  • utf8_bin 区分大小写
  • utf8_general_ci 不区分大小写
  • 默认是utf8_general_ci

CREATE DATABASE [IF NOT EXISTS] jwt CHARACTER SET utf8 COLLATE utf8_bin

删除数据库

DROP DATABASE [IF EXISTS ] 数据库名

查看所有数据库

SHOW DATABASES

查看数据库的定义信息

SHOW CREATE DATABASE `数据库名`
注:创建数据库、表的时候,为了规避关键字,可以使用反引号解决

备份数据库

#备份数据库
mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 路径/文件名.sql
#备份数据库中表
mysqldump -u 用户名 -p  数据库 表1 表2 表n > 路径/文件名.sql
注:该指令要在DOS下执行

恢复数据库

Source 路径/文件名.sql
注:该指令要进入mysql下执行

数据类型

数值型(整数)

类型 字节 最小值 最大值
TINYINT 1 -128 127
TINYINT(unsigned) 1 0 255
SMALLINT 2 -32768 32767
SMALLINT(unsigned) 2 0 65535
MEDIUMINT 3 -8388508 8388607
MEDIUMINT(unsigned) 3 0 16777215
INT 4 -2147483648 2147483647
INT(unsigned) 4 0 16777215
BIGINT 8 -9223372036854775808 9223372036854775807
BIGINT(unsigned) 8 0 18446744073709551615

CREATE TABLE t1 (id TINYINT);#默认是有符号的,-128~127
CREATE TABLE t2 (id TINYINT UNSIGNED);#指定unsinged,就是无符号0~255

数值型(bit)

数值型(小数)

字符串(char&varchar)

  • CHAR(size)
  • 固定长度字符串最大255 字符
  • VARCHAR(size) 0~65535 字节
  • 可变长度字符串最大65532 字节【本身还需要1-3个字节用于记录存放内容长度】
  • 如果表的编码是utf8 ,size = (65535-3) / 3 = 21844
  • 如果表的编码是gbk , size = (65535-3) / 2 = 32766
  • 查询速度 CHAR > VARCHAR,因此数据是定长时,推荐使用CHAR

如果 VARCHAR 不够用,可以使用mediumtext、text、longtext

日期类型

CREATE TABLE b_name (
  birthday DATE , -- 生日
  job_time DATETIME, -- 记录年月日时分秒
  login_time TIMESTAMP
  NOT NULL DEFAULT CURRENT_TIMESTAMP
  ON UPDATE CURRENT_TIMESTAMP); -- 登录时间, 如果希望login_time列自动更新, 需要配置
SELECT * FROM b_name;
INSERT INTO b_name(birthday, job_time)
VALUES('2022-11-11','2022-11-11 10:10:10');
-- 如果我们更新b_name表的某条记录,login_time列会自动的以当前时间进行更新

表操作

创建表

CREATE TABLE 表名(
    field1 datatype NOT NULL AUTO_INCREMENT,PRIMARY KEY,
    field2 datatype DEFAULT 'test',
    field3 datatype,
)character set 字符集 collate 校对规则 engine 引擎
注:
field:指定列名,datatype: 指定列类型(字段类型)
character set :如不指定则为所在数据库字符集
collate:如不指定则为所在数据库校对规则
engine:引擎(这个涉及内容较多,后面单独讲解)
  • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
  • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
  • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
  • DEFAULT关键字用于定义列的默认值

CREATE TABLE `user`(
  id INT,
  name VARCHAR (255),
  password VARCHAR (255),
  birthday DATE
)CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB ;

查看表结构

DESC 表名  -- 显示表结构,可以查看表的所有列

删除表

DROP TABLE [IF EXISTS] 表名

添加列

ALTER TABLE 表名
ADD 列名 数据类型 [DEFAULT expr]
-- 在员工表emp中增加一个image列,varchar类型(要求在resume后面),默认不为空,默认数据为test。
ALTER TABLE emp
ADD image VARCHAR(32) NOT NULL DEFAULT 'test'
AFTER RESUME
DESC emp -- 显示表结构,可以查看表的所有列

修改列

ALTER TABLE 表名
MODIFY 列名 数据类型 [DEFAULT expr]
-- 修改job列,使其长度为60。
ALTER TABLE emp
MODIFY job VARCHAR(60) NOT NULL DEFAULT 'test'

删除列

ALTER TABLE 表名
DROP 列名 
-- 删除sex列。
ALTER TABLE emp
DROP sex

修改表名

RENAME TABLE 表名 TO 新表名
-- 修改表名改为employee。
RENAME TABLE emp TO employee

修改表字符集

ALTER TABLE 表名 CHARACTER SET utf8
-- 修改表的字符集为utf8
ALTER TABLE employee CHARACTER SET utf8

修改列名

ALTER TABLE 表名
CHANGE 列名 新列名 数据类型 [DEFAULT expr]
-- 列名name 修改为user_name
ALTER TABLE employee
CHANGE `name` `user_name` VARCHAR(64) NOT NULL DEFAULT 'test'

CRUD语句

CRUD即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。

增加(Create)

-- 普通插入
INSERT INTO 表名 VALUE (value1,value2)
-- 指定要插入数据的列
INSERT INTO 表名 (column1,column2) VALUE (value1,value2) 
-- 批量插入(应注意SQL的长度限制)
INSERT INTO TABLE VALUES (value1,value2),(value1,value2)
-- 把一个表的数据插入到另一个表中(插入全部数据)
INSERT INTO 目标表 SELECT * FROM 来源表  [WHERE key=value]
-- 把一个表的数据插入到另一个表中(指定字段)
INSERT  INTO 目标表 (字段1, 字段2, ...) SELECT 字段1, 字段2,... FROM 来源表  [WHERE key=value]

查询(Retrieve)

SELECT column1,column2 FROM 表名
-- 查询表中所有学生的信息。
SELECT * FROM student;
-- 查询表中所有学生的姓名和对应的英语成绩。
SELECT `name`,english FROM student;
-- 过滤表中重复数据。
SELECT DISTINCT english FROM student;
-- 使用表达式对查询列运算
SELECT `name`, (chinese+english+math) FROM student;
-- 在所有学生总分加10 分的情况
SELECT `name`, (chinese + english + math + 10) FROM student;
-- 使用别名表示学生分数。
SELECT `name` , (chinese + english + math + 10) AS total_score FROM student;

更新(Update)

-- 一次更新一个字段
UPDATE table SET column1 = value1 WHERE 条件 -- 如果不加WHERE条件,UPDATE语句会默认更新所有表,慎用。
-- 一次更新多个字段
UPDATE table SET column1 = value1,column2 = value2 WHERE 条件
-- 将所有员工薪水修改为5000 元。
UPDATE employee SET salary = 5000
-- 将姓名为小妖怪的员工薪水修改为3000 元。
UPDATE employee SET salary = 3000 WHERE user_name = '小妖怪'
-- 将老妖怪的薪水在原有基础上增加1000 元
UPDATE employee SET salary = salary + 1000 WHERE user_name = '老妖怪'
-- 可以修改多个列的值
UPDATE employee SET salary = salary + 1000 , job = '码农' WHERE user_name = '老妖怪'
SELECT * FROM employee;

删除(Delete)

DELETE FROM 表名 WHERE column1 = value1
-- 删除表中名称为’老妖怪’的记录。
DELETE FROM employee WHERE user_name = '老妖怪';
-- 删除表中所有记录, 慎用。
DELETE FROM employee;

事务

事务用于保证数据的一致性它由一组相关的 dml 语句组成,该组的 dml 语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。

当执行事务操作时(dml语句),mysql会在表上加锁,防止其它用户改表的数据

事务的几个重要操作

  1. start transaction –开始一个事务
  2. savepoint 保存点名 –设置保存点
  3. rollback to 保存点名 –回退事务
  4. rollback –回退全部事务
  5. commit –提交事务,所有的操作生效,不能回退

-- 1. 创建一张测试表
CREATE TABLE test
( id INT,
`name` VARCHAR(32));
-- 2. 开始事务
START TRANSACTION
-- 3. 设置保存点
SAVEPOINT a
-- 执行dml 操作
INSERT INTO test VALUES(100, 'tom');
SELECT * FROM test;
SAVEPOINT b
-- 执行dml 操作
INSERT INTO test VALUES(200, 'jack');
-- 回退到b
ROLLBACK TO b
-- 继续回退a
ROLLBACK TO a
-- 如果这样, 表示直接回退到事务开始的状态.
ROLLBACK
-- 提交事务
COMMIT
  • 保存点(savepoint):保存点是事务中的点,用于取消部分事务,
  • 当执行回退事务(rollback)时,通过指定保存点可以回退到指定的点
  • 当提交事务(commit)时 ,会自动的删除该事务所定义的所有保存点,当执行了 commit 语句后,会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。

事务细节讨论

  • 1.如果不开始事务,默认情况下,dml 操作是自动提交的,不能回滚
  • 2.如果开始一个事务,你没有创建保存点,你可以执行 rollback,默认就是回退到你事务开始的状态
  • 3.你也可以在这个事务中(还没有提交时),创建多个保存点.比如: savepoint aaa; 执行dml,savepoint bbb;
  • 4.你可以在事务没有提交前,选择回退到哪个保存点
  • 5, mysql的事务机制需要 innodb 的存储引擎才可以使用,myisam不好使.
  • 6.开始一个事务 start transaction 或者 set autocommit=off;

事务隔离级别

1.多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。

2.如果不考虑隔离性,可能会引发如下问题:

  • 脏读(dirty read)
  • 当一个事务读取另一个事务尚未提交的改变(update,insert,delete)时,产生脏读
  • 不可重复读(nonrepeatable read)
  • 同一查询在同事务中多次进行,由于其他提交事务所做的修改或删除, 每次返回不同的结果集,此时发生不可重复读。
  • 幻读(phantom read)
  • 同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作, 每次返回不同的结果集,此时发生幻读。

1. 查看当前会话隔离级别
select @@tx_isolation;
2.查看系统当前隔离级别
select @@global.tx_isolation;
3. 设置当前会话隔离级别
set session transaction isolation level repeatable read;
4.设置系统当前隔离级别
set global transaction isolation level repeatable read;
5.mysql默认的事务隔离级别是repeatable read ,一般情况下,没有特殊
要求,没有必要修改(因为该级别可以满足绝大部分项目需求)

●全局修改,修改my.ini配置文件,在最后加上

#可选参数有: READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.

[mysqld]

transaction-isolation = REPEATABLE-READ

事务的ACID

  • 1.原子性(Atomicity)
  • 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 2.一致性(Consistency)
  • 事务必须使数据库从一个一致性状态变换到另外一个一致性状态
  • 3.隔离性(Isolation)
  • 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  • 4.持久性(Durability)
  • 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

日期函数

DAYOFWEEK(date)

返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC标准。

select DAYOFWEEK('1998-02-03')
-> 3

WEEKDAY(date)

返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。

mysql> select WEEKDAY('1997-10-04 22:23:00');
-> 5

DAYOFMONTH(date)

返回date的月份中日期,在1到31范围内。

mysql> select DAYOFMONTH('1998-02-03');
-> 3

DAYOFYEAR(date)

返回date在一年中的日数, 在1到366范围内。

mysql> select DAYOFYEAR('1998-02-03');
-> 34

DAYNAME(date)

返回date的星期名字。

mysql> select DAYNAME("1998-02-05");
-> 'Thursday'

MONTHNAME(date)

返回date的月份名字。

mysql> select MONTHNAME("1998-02-05");
-> 'February'

QUARTER(date)

返回date一年中的季度,范围1到4。

mysql> select QUARTER('98-04-01');
-> 2

WEEK(date)

对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,范围在0到52。

mysql> select WEEK('1998-02-20');
-> 7

WEEK(date,first)

2个参数形式WEEK()允许你指定星期是否开始于星期天或星期一。

如果第二个参数是0,星期从星期天开始,

如果第二个参数是1,从星期一开始。

mysql> select WEEK('1998-02-20',0);
-> 7

mysql> select WEEK('1998-02-20',1);
-> 8

YEAR(date)

返回date的年份,范围在1000到9999。

mysql> select YEAR('98-02-03');
-> 1998

MONTH(date)

返回date的月份,范围1到12。

mysql> select MONTH('1998-02-03');
-> 2

DAY(date)

返回date的月份,范围1到31。

mysql> select MONTH('1998-02-03');
-> 3

HOUR(time)

返回time的小时,范围是0到23。

mysql> select HOUR('10:05:03');
-> 10

MINUTE(time)

返回time的分钟,范围是0到59。

mysql> select MINUTE('98-02-03 10:05:03');
-> 5

SECOND(time)

回来time的秒数,范围是0到59。

mysql> select SECOND('10:05:03');
-> 3

PERIOD_ADD(P,N)

增加N个月到阶段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。

mysql> select PERIOD_ADD(9801,2);
-> 199803

PERIOD_DIFF(P1,P2)

返回在时期P1和P2之间月数,P1和P2应该以格式YYMM或YYYYMM。注意,时期参数P1和P2不是日期值。

mysql> select PERIOD_DIFF(9802,199703);
-> 11

DATE_ADD()

向日期添加指定的时间间隔。

DATE_ADD(date,INTERVAL expr type)
//interval是固定标志,expr 表示数量,可以为正负,表示加减,type表示日期类型 可以是yy,ww,dd等分别表示,年,周,天等
// 得到当前时间增加1个小时的结果
select date_add(now(),interval 1 hour)
// 得到当前时间增加1天的结果
select date_add(now(),interval 1 day)
// 得到当前时间减少72个小时的结果
select date_add(now(),interval -72 hour)
// 还有一些更加高级的用法,比如增加一天一小时一分一秒
// 但是如果你不太喜欢这种用法,你仍然可以使用等同于该数值的second来进行加减
date_add(now(),interval '1 1:1:1' day_second)

JOIN

SQL JOIN 用于把来自两个或多个表的行结合起来。

下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
存储 关系型数据库 MySQL
mysql安装教程mac
【4月更文挑战第21天】
|
5天前
|
关系型数据库 MySQL 网络安全
|
5天前
|
SQL 存储 关系型数据库
轻松入门MySQL:简明教程解析数据存储与管理(1)
轻松入门MySQL:简明教程解析数据存储与管理(1)
|
5天前
|
存储 关系型数据库 MySQL
MYSQL存储过程基础入门教程
MYSQL存储过程基础入门教程
14 0
|
5天前
|
关系型数据库 MySQL
MySQL入门基础教程
MySQL入门基础教程
18 0
|
5天前
|
关系型数据库 MySQL
mysql基础教程
mysql基础教程
11 0
|
4天前
|
存储 关系型数据库 MySQL
《MySQL 入门教程》第 05 篇 账户和权限,Java高并发编程详解深入理解pdf
《MySQL 入门教程》第 05 篇 账户和权限,Java高并发编程详解深入理解pdf
|
5天前
|
SQL 关系型数据库 MySQL
MySQL最新版8.1.0安装配置教程
本文章,是对自己在安装最新版MySQL最新版8.1.0安装配置的一个详细过程吧,中间也有很多不清楚的地方,但是经过自己的多次对,工具环境以及软件环境的配置,现在对于这个的安装也算得心应手吧,不仅仅是一种总结,更是对自己经验的一种积累.
|
5天前
|
存储 安全 关系型数据库
MySQL中使用percona-xtrabackup工具 三种备份及恢复 (超详细教程)
MySQL中使用percona-xtrabackup工具 三种备份及恢复 (超详细教程)
|
5天前
|
关系型数据库 MySQL Linux
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程