MySQL总结

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 一.SQL语句简介1.什么是SQL?SQL(Structured Query Language):结构化查询语言其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”




一.SQL语句简介


1.什么是SQL?


SQL(Structured Query Language):结构化查询语言

其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”


2.SQL分类


(1)DDL(Data Definition Language):数据库定义语言

用来定义数据库对象(数据库,表,列)。关键字:create,drop,alter等

(2)DML(Data Manipulation Language):数据库操作语言

用来对数据库表中的数据进行增删改。关键字:insert,delete,update等

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

用来查询数据表中的记录(数据) 。关键字:select,where等

(4)DCL(Data Control Language):数据控制语言(用的不多,了解即可)


二.MySql常用数据类型


0f269340095f424b8ef799c0d7950cdb.png


三.数据库操作


1.创建数据库


(1)使用指令创建数据库


CREATE DATABASE IF NOT EXISTS db1;


①创建数据库:

create database 数据库名称

②创建数据库,先判断不存在,再去创建

create database if not exists 数据库名称;

(2)创建一个使用utf8字符集的数据库


CREATE DATABASE db2 CHARACTER SET utf8;


(3)创建一个使用utf_8字符集,并带校对规则的数据库


CREATE DATABASE db3 CHARACTER SET utf8 COLLATE utf8_bin;

(4)校对规则utf8_bin区分大小,默认utf_8_general_ci 不区分大小写(如Tom和tom一样)


2.查询和删除数据库


(1)查看当前数据库服务器中的所有数据库


SHOW DATABASES;


(2)查看创建的db2数据库的定义信息


SHOW CREATE DATABASE db2;


(3)在创建数据库,表的时候,为了避免关键字,可以使用反引号解决(比如数据库名为关键字create)


CREATE DATABASE `create`;


(4)删除数据库


DROP DATABASE db1;


3.备份/恢复数据库


(1)备份,要在DOS下执行指令

mysqldump -u 用户名 -p -B 数据库1,数据库2,数据库n > 文件名.sql;


mysqldump -u root -p -B db2 > d:\\db2.sql;


(2)恢复数据库(注意:要在DOS中进入MySQL命令行再执行)


source d:\\db2.sql;


补充(备份库中的表):mysqldump -u 用户名 -p 数据库 表1 表2 表n > 文件名.sql;


四.表操作


1.创建表


CREATE TABLE table_name(
  field1 datatype,
  field2 datatype,
  field3 datatype 
)character set 字符集 collate 校对规则 engine 存储引擎


(1)field:指定列名

(2)datatype:指定列类型(字段类型)

(3)character set:如果不指定则为所在数据库字符集

(4)collate:如果不指定则为所在数据库校对规则

(5)engine:引擎


2.修改/查看表


(1)添加列

ALTER TABLE tablename

ADD (column1 datatype [表达式语句]

,column2 datatype [表达式语句);


-- t_user表上新增一个varchar类型的image列(要求在email后面)
ALTER TABLE t_user 
  ADD image VARCHAR (32) NOT NULL DEFAULT ''
  AFTER email;


(2)修改列

ALTER TABLE tablename

MODIFY (column1 datatype [表达式语句];

,column2 datatype [表达式语句))

(3)删除列

ALTER TABLE tablename

DROP column;

(4)修改表名

RENAME TABLE 表名 to 新表名;

(5)修改表字符集

alter table 表名 character set 字符集;

(6)desc 表名; // 查看表的结构


五.CRUD语句


1.Insert语句


insert into 表名(列名1,列名2,...列名n) values(值1,值2,...,值n);


细节:

(1)插入的数据要与字段的数据类型相同,比如把‘abc’添加到int类型会报错

(2)数据的长度应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中

(3)在values中列出的数据位置必须与被加入的列的排列位置相对应

(4)字符和日期类型数据应包含在单引号中

(5)列可以插入空值(前提是该字段允许为空)

(6)如果是给表中的所有字段添加数据,可以不写前面的字段名称


insert into 表名 values(值1,值2,...值n);


(7)默认值的使用,当不给某个字段值时,如果有默认值就会添加,否则报错


2.Delete语句


delete from 表名 [where 条件];


(1)如果不加条件,则删除表中所有记录

(2)如果要删除所有记录

①delete from 表名; – 不推荐使用。有多少条记录就会执行多少次删除操作

②TRUNCATE TABLE 表名; – 推荐使用,效率更高,先删除表,然后再创建一张一样的表


3.Update语句


update 表名 set 列名1 = 值1,列名2 = 值2,…[where 条件];

(1)set子句指示要修改哪些列和要赋予那些值

(2)where子句指定应更新哪些列;如果没有where子句,则更新所有的行

(3)如果需要修改多个字段,可以通过set 字段1=值1,字段2=值2…


4.Select语句


4.1 语法:


select
  字段列表
from
  表名列表
where
  条件列表
group by
  分组字段
having
  分组之后的条件
limit
  分页限定


b5ca6bd8dbcc415482fe9e9c3643cc2a.png


4.2 基础查询

(1)多个字段的查询


select 字段名1,字段名2...from 表名;


注意:如果查询所有字段,则可以使用*来替代字段列表

(2)去除重复:distinct

(4)起别名:as(as也可以省略)


select columnname as 别名 from 表名;


4.3 排序查询

(1)语法:order by 子句

select * from 表名 order by 排序字段1 排序方式1,排序字段2 排序方式2...

(2)排序方式:

①ASC:升序,默认的

②DESC:降序

(3)order by 子句应位于select语句的结尾

4.4 分页查询

(1)语法:limit 开始的索引,每页查询的条数

(2)公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数


SELECT * FROM t_product WHERE STATUS = 1 ORDER BY priority DESC LIMIT 0,4;


(3)limit是一个MySQL“方言”

4.5 分组统计

(1)使用group by子句对列进行分组


select  column1,column2,column3 ... from 表名 group by column;


(2)使用having子句对分组后的结构进行过滤


select column1,column2,column3... 
    from  表名
    group by column having AVG(sal) < 2000;



五.函数


1.统计函数count


(1)count:返回行的总数


select count(*) | count(列名) from table_name [where 条件


注意:count(*)和count(列名)的区别?

count(*):返回满足条件的记录的行数

②count(列名):统计满足条件的某列有多少个,但是会排除 null

(2)合计函数max/min


select max(列名) from 表名 [where 条件]


2.字符串相关函数


(1)CHARSET(str)]// 返回字符串字符集(例如utf8)

(2)CONCAT(string1[,…]) // 连接字符串,将多个列拼接成一列

(3)INSTR(string,substring) // 返回substring在string中出现的位置,没有则返回0

(4)将string转换成大/小写

①UCASE(string) // 转换成大写

②LCASE(string) // 转换成小写

(5)从string中取length个字符串

①LEFT(string,length) // 从string中的左边起取length个字符串

②RIGHT(string,length) // 从string中的右边起取length个字符串

(6)LENGTH(string) // 获取string长度(按照字节)

(7)REPLACE(str,search_str,replace_str) // 在str中用replace_str替换search_str

(8)STRCMP(string1,string2) // 逐字符比较两个字符串的大小(大于返回1,等于返回0,小于返回-1)

(9)SUBSTRING(str,position[,length]) // 从str的position开始[从1开始计算],取length个字符串

(10)TRIM(string) // 去除前后端空格

①LTRIM(string) // 去除前端空格

②RTRIM(string) // 去除后端空格

例子:


-- (1)CHARSET(str) 返回字符串字符集(例如utf8)
SELECT CHARSET(ename) FROM emp;
-- (2)CONCAT(string1[,...]) 连接字符串,将多个列拼接成一列
SELECT CONCAT(ename,' 工作是 ',job) FROM emp;
-- (3)INSTR(string,substring) 返回substring在string中出现的位置,没有则返回0
-- DUAL 亚元表(是一个系统表,可以作为测试表使用)
SELECT INSTR('xuexiJava','Java') FROM DUAL;
-- (4.1)UCASE(string) 转换成大写
SELECT UCASE(ename) FROM emp;
-- (4.2)LCASE(string) 转换成小写
SELECT LCASE(ename) FROM emp;
-- (5.1)LEFT(string,length) 从string中的左边起取length个字符串
-- (5.2)RIGHT(string,length) 从string中的右边起取length个字符串
SELECT LEFT(ename,2) FROM emp;
-- (6)LENGTH(string) 获取string长度(按照字节)
SELECT LENGTH(ename) FROM emp;
-- (7)REPLACE(str,search_str,replace_str) 在str中用replace_str替换search_str
-- 将manager替换成 经理
SELECT ename,REPLACE(job,'MANAGER','经理') FROM emp;
-- (8)STRCMP(string1,string2) 逐字符比较两个字符串的大小(大于返回1,等于返回0,小于返回-1)
SELECT STRCMP('你好','好好') FROM DUAL;
-- (9)SUBSTRING(str,position[,length])
SELECT SUBSTRING(ename,1,3) FROM emp;
--(10)trim(string) // 去除前后端空格
SELECT LTRIM(' 我爱学java ') FROM emp;
SELECT RTRIM(' 我爱学JavaScript ') FROM emp;
SELECT TRIM(' 我爱学习 ') FROM emp;


六.MySQL约束


约束用于对表中的数据进行限定,从而保证数据的正确性、有效性和完整性。在MySQL中,约束包括:primary key(主键约束),not null(非空约束),unique(唯一约束),foreign key(外键约束)和check约束五种。


1.primary key(主键)约束


1.1 primary key(主键)的基本使用

字段名 字段类型 primary key

1.2 primary key的细节说明

(1)primary key不能重复,且不能为null

(2)一张表最多只能有一个主键,但可以是复合主键


CREATE TABLE t18(
     id INT,
    `name` VARCHAR ( 32 ), 
     email VARCHAR ( 32 ),
     PRIMARY KEY(id,`name`) -- 这里就是复合主键
    );


(3)主键的指定方式有两种

①直接在字段名后指定:字段名 primary key


CREATE TABLE t19(
   id INT ,
  `name` VARCHAR(32) PRIMARY KEY, -- 直接在字段名后写
   email VARCHAR(32)
);


②在表定义的最后写: primary key(列名)


CREATE TABLE t20(
   id INT,
  `name` VARCHAR(32),
  email VARCHAR(32),
  PRIMARY KEY(`name`) -- 在表定义最后写 primary key(列名)


(4)使用desc表名,可以看到primary key的使用情况

(5)在实际开发中,每个表往往都会设计一个主键


2.not null(非空)


如果在列上定义了not null,那么某一列的值不能为null

字段名 字段类型 not null


3.unique(唯一)


(1)当定义了唯一约束后,该列值是不能重复的

字段名 字段类型 unique

(2)使用细节

①如果没有指定not null,则unique字段可以有多个null

②一张表可以有多个unique字段


4.foreign key(外键)


(1)让表与表之间产生关系,从而保证数据的正确性

FOREIGN KEY(本表字段名) REFERENCES 主表名(主键名/unique字段名)

FOREIGN KEY(本表字段名) REFERENCES 主表名(主键名/unique字段名)


-- 创建主表

CREATE TABLE my_class(

id INT PRIMARY key, -- 班级编号

`name` VARCHAR(32) NOT NULL DEFAULT '');

--  创建从表

CREATE TABLE my_stu(

id INT PRIMARY KEY, -- 学生编号

`name` VARCHAR(32) NOT NULL DEFAULT '',

class_id INT, -- 学生所在班级的编号

--  下面指定外键关系

FOREIGN KEY (class_id) REFERENCES my_class(id));


659c4ac2fa7945fe979757fd1ed1e6f5.png


(2)使用细节:

①外键约束要定义在从表上,主表必须具有主键约束或是unique约束。

②表的类型是innodb,这样的表才支持外键

③外键字段的类型要和主表中关联字段的类型一致(长度可以不同)

④外键字段的值,必须要在主表关联的字段中出现过,或者为null(前提是允许为null)

⑤一旦建立了外建约束,主表数据就不能随意删除了


5.check约束


(1)用于强制行数据必须满足的条件,假定在sal列定义了check约束,并要求在sal列值在1000~2000之间,那么不在1000~2000之间就会提示错误。

(2)Oracle和sql server均支持check,MySQL8之后才支持check


CREATE TABLE t23 (
  id INT PRIMARY KEY,
  `name` VARCHAR(32) ,
  sex VARCHAR(6) CHECK (sex IN('man','woman')),
  sal DOUBLE CHECK ( sal > 1000 AND sal < 2000)
);


七.索引


1.索引的原理


(1)没有索引为什么会慢?

因为需要全表扫描

(2)使用索引为什么会快?

形成一个索引的数据结构,比如二叉树


48807f486bf54457b6a5faff6e101c79.png


(3)索引的代价

①磁盘占用

②影响dml语句(update、delete、insert)语句的效率

但是我们的项目中主要为查询select语句,所以可以忽略


2.索引的类型


(1)主键索引,主键自动成为主索引(类型Primary key)

(2)唯一索引(UNIQUE)

(3)普通索引(INDEX)

(4)全文索引(FULLTEXT)[适合于MyISAM]

开发中考虑使用:全文搜索Slor和ElasticSearch(ES)


3.创建索引


-- 创建表
CREATE TABLE t25 (id INT, `name` VARCHAR (32)) ;
-- 3.1 查询表中是否有索引
SHOW INDEXES FROM t25 ;
-- 3.2添加索引
-- (1)添加唯一索引
CREATE UNIQUE INDEX id_index ON t25 (id) ;
-- (2)添加普通索引方式1
CREATE INDEX id_index ON t25 (id) ;
-- (2)添加普通索引方式2
ALTER TABLE t25 ADD INDEX id_index (id);
-- 如何选择
-- 1.如果某列的值,是不会重复的,则优先考虑使用unique索引,否则使用普通索引
-- (3)添加主键索引
CREATE TABLE t26 (id INT, `name` VARCHAR (32)) ;
ALTER TABLE t26 ADD PRIMARY KEY (id) ;


4.删除索引



-- 删除索引
DROP INDEX id_index ON t25;
-- 删除主键索引
ALTER TABLE t26 DROP PRIMARY KEY;
-- 修改索引,先删除,再添加新的索引


5.查询索引


-- 查询索引
-- 方式1
SHOW INDEX FROM t25;
-- 方式2
SHOW INDEXES FROM t25;
-- 方式3
SHOW KEYS FROM t25;
-- 方式4(索引字段key的值为MUL,该方法没有前面的方法查询结果详细)
DESC t25;


6.哪些列上适合使用索引:


(1)较频繁的作为查询条件字段的应该建立索引

(2)唯一性太差的字段不适合单独创建索引,既使频繁作为查询条件

例如性别:select * from emp where sex = ‘男’;

(3)更新非常频繁的字段不适合创建索引

(4)不会出现在where子句中的字段不该创建索引


八.多表查询


下面都已这两张表为例子


d024d37f9a134e33b3376967d4945067.png


1.内连接查询

(1)隐式内连接:使用where条件消除无用数据

例子:

– 查询所有员工信息和对应的部门信息


SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;


343e613498c0481d8f11b9037905cdc1.png


– 查询员工表的名称、性别,部门表的名称


select emp.`name`,emp.`gender`,dept.`name` from emp,dept where emp.`dept_id` = dept.`id`



f6e749760da94d50b934e48788d943e7 (1).png


(2)显示内连接

语法:select 字段列表 from 表名1 [inner] join 表名2 on 条件

例如:


-- 查询所有员工信息和对应的部门信息
SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;
-- 或者
select * from emp join dept on emp.`dept_id` = dept.`id`;


2.外链接查询(以下面stu和exam两张表为例)


e71c367f72c44119a885250fa114f446.png


f819d01639ae41cdaa37bca3d2f8bb39.png


(1)左外链接

①语法:select 字段列表 from 左表 left [outer] join 右表 on 条件;

②查询的是左表所有数据及其交集的部分。

③例子:


-- 查询所有人的成绩,如果没有成绩,也要显示该人的姓名和id,成绩显示为空
SELECT stu.`id`,stu.`name`,exam.`grade` FROM stu LEFT JOIN exam ON stu.`id`=exam.`id`;


d2fb0894ef124f6f8a8f32dcfd9aaca7.png


(2)右外链接:

①语法:select 字段列表 from 左表 right [outer] join 右表 on 条件;

②查询的是右表所有数据及其交集的部分

③例子:


-- 显示所有成绩,如果没有名字匹配显示为空
SELECT stu.`id`,stu.`name`,exam.`grade`FROM stu RIGHT JOIN exam ON stu.`id`=exam.`id`;


9f7b7ddcaeb14ae0b485b7559559e8bd.png


3.自连接查询

(1)自连接的特点:

①把同一张表当做两张表使用

②需要给表取别名(表名 表列名)

③列名不明确,可以指定列的别名(列名 as 列的别名)

(2)例子:


abda16b43e3a491aad597db96e078fe4.png


-- 要求:显示公司员工名字和他的上级的名字
select
   worker.ename as '职员名',
   boss.ename as '上级名'
from
   emp worker,
   emp boss
where
  worker.mgr = boss.empno; 


九.事务


1.什么是事务:

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


2.事务和锁

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

3.mysql数据库控制台事务的几个重要操作

(1)start transaction – 开始一个事务

(2)savepoint 保存点名 – 设置保存点

(3)rollback to 保存点名 – 回退事务

(4)rollback – 回退全部事务

(5)commit – 提交事务,所有的操作生效,不能回退


4.事务的隔离级别

多个事务之间是隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题


400f118ea9ec4d5b80f5b96757b93979.png


(1)读未提交:允许Transaction1读取Transaction2未提交的修改。

(2)读已提交:要求Transaction1只能读取Transaction2已提交的修改。

(3)可重复读:确保Transaction1可以多次从一个字段中读取到相同的值,即Transaction1执行期间禁止

其它事务对这个字段进行更新。

(4)串行化:确保Transaction1可以多次从一个表中读取到相同的行,在Transaction1执行期间,禁止其它

事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。

注意:

①Oracle默认为读已提交,MySQL默认为可重复读

②加锁:如果他发现一个事务中有一张表正在操作,没有提交;另一个事务操作时,他会卡在这个地方,他不会操作

5.存在问题

(1)脏读:当一个事务读取到另一个事务尚未提交的改变(update,insert,delete)时,产生脏读

(2)不可重复度:不可重复读是指在事务1内,读取了一个数据,事务1还没有结束时,事务2也访问了这个数据,修改或删除了这个数据,并提交。紧接着,事务1又读取这个数据。由于事务2的修改,那么事务1两次读到的数据可能是不一样的,因此称为是不可重复读。

(事务1想读取开启事务那一刻的数据,结果却读到了修改或删除后的数据)

(3)幻读:幻读是指在事务1内,读取了一个数据,事务1还没有结束时,事务2也访问了这个数据,添加了这个数据,并提交。紧接着,事务1又读取这个数据。由于事务2的添加,那么事务1两次读到的数据可能是不一样的,因此称为是幻读。

(事务1想读取事务开启那一刻的数据,结果却读到了添加后的数据)


6.存储引擎


197f1ee3d046445da1963e6462e29deb (1).png


(1)InnoDB:

①支持事务

②支持外键

③支持行级锁

(2)MyISAM

①添加速度快

②不支持外键和事务

③支持表级锁

(3)memory

①数据存储在内存中(关闭mysql服务,数据丢失,但表还在)

②执行速度快(没有IO读写)

③默认支持索引(hash表)


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
SQL 搜索推荐 关系型数据库
MySQL 入门教程:全网最全,MySQL 增删改查高级命令硬核总结
MySQL 入门教程:全网最全,MySQL 增删改查高级命令硬核总结
147 0
MySQL 入门教程:全网最全,MySQL 增删改查高级命令硬核总结
|
SQL 存储 Oracle
(一)MySQL_数据库概述技术总结
简介:MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,2008年被Sun公司收购,2009年Sun 被Oracle收购。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
247 6
(一)MySQL_数据库概述技术总结
Kam
|
SQL 存储 关系型数据库
|
SQL 存储 前端开发
|
关系型数据库 MySQL 数据库
【MySQL】MySQL命令总结 | 数据库与数据表的创建删除与查询
【MySQL】MySQL命令总结 | 数据库与数据表的创建删除与查询
193 0
|
存储 SQL 关系型数据库
MYSQL约束的总结和小练习
约束笔记: 1:主键约束默认是唯一且非空的 2:AUTO_INCREMENT在MYSQL8.0中会将自增主键保存到重做日志中,即使关闭后重启,存储引擎innoDB仍然会根据重做日志初始化计数器内存值。 3:设置了外键约束后,如果要删除主表的内容,则需要先把从表的相关内容给删除。 4:建表时一般设置not null default '' 或default 0,因为nul这个特殊值不好比较,而且查找效率低。 5:外键约束不能跨引擎使用,且mysql中其有一定成本,不适合大并发SQL操作,开发中一般在.
205 0
MYSQL约束的总结和小练习
|
存储 SQL JSON
MySQL技能树学习总结
MySQL技能树学习总结
239 0
MySQL技能树学习总结
|
SQL 存储 数据可视化
|
SQL 关系型数据库 MySQL
mysql中lock tables与unlock tables(锁表/解锁)使用总结
mysql中lock tables与unlock tables(锁表/解锁)使用总结
396 0
|
关系型数据库 MySQL
Mysql常用语法总结
Mysql常用语法总结
109 0